Commit bd75dc34 authored by dyaroshev's avatar dyaroshev Committed by Commit bot

Preparing components_perftests for adding more benchmarks.

This patch creates a complete main for components perftests from
components unittests main and switches components perftests to using
testing/perf instead of base/perf.

BUG=648992

Review-Url: https://codereview.chromium.org/2358063002
Cr-Commit-Position: refs/heads/master@{#427043}
parent 80fa4d7b
......@@ -56,7 +56,6 @@ test("components_unittests") {
deps = [
"//base",
"//base/test:test_support",
"//components/autofill/core/browser:unit_tests",
"//components/autofill/core/common:unit_tests",
"//components/base32:unit_tests",
......@@ -133,6 +132,7 @@ test("components_unittests") {
"//components/sync_bookmarks:unit_tests",
"//components/sync_sessions:unit_tests",
"//components/syncable_prefs:unit_tests",
"//components/test:test_support",
"//components/translate/core/browser:unit_tests",
"//components/translate/core/common:unit_tests",
"//components/translate/core/language_detection:unit_tests",
......@@ -146,14 +146,6 @@ test("components_unittests") {
"//components/variations/service:unit_tests",
"//components/web_resource:unit_tests",
"//components/webdata/common:unit_tests",
# Direct dependencies of components/test/run_all_unittests.cc.
"//components/content_settings/core/common",
"//mojo/edk/system",
"//net",
"//testing/gtest",
"//ui/base",
"//ui/resources:ui_test_pak",
]
if (enable_nacl) {
......@@ -207,11 +199,6 @@ test("components_unittests") {
"//components/web_cache/browser:unit_tests",
"//components/webcrypto:unit_tests",
"//components/zoom:unit_tests",
# These are the deps required by the code in this target.
"//components/policy/core/browser",
"//content/test:test_support",
"//ui/gl:test_support",
]
data_deps = [
......@@ -475,6 +462,7 @@ if (!is_ios) {
test("components_perftests") {
sources = [
"test/run_all_perftests.cc",
"visitedlink/test/visitedlink_perftest.cc",
]
......@@ -483,11 +471,8 @@ if (!is_ios) {
deps = [
"//base",
"//base/test:test_support",
"//components/test:test_support",
"//components/visitedlink/browser",
"//content/test:test_support",
"//mojo/edk/test:run_all_perftests",
"//testing/gtest",
"//testing/perf",
"//url",
]
......
# Copyright 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
source_set("test_support") {
testonly = true
sources = [
"components_test_suite.cc",
"components_test_suite.h",
]
deps = [
"//components/content_settings/core/common",
"//components/gcm_driver:gcm_driver",
"//components/signin/core/browser",
"//mojo/edk/system",
"//net",
"//testing/gtest",
"//ui/base",
"//ui/resources:ui_test_pak",
]
public_deps = [
"//base/test:test_support",
]
if (!is_ios) {
deps += [
"//components/invalidation/impl",
"//components/policy/core/browser",
"//components/safe_json",
"//ui/gl:test_support",
]
public_deps += [ "//content/test:test_support" ]
}
}
......@@ -10,7 +10,7 @@ include_rules = [
]
specific_include_rules = {
"run_all_unittests\.cc": [
"components_test_suite\.cc": [
"+mojo/edk/embedder/embedder.h",
],
}
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/test/components_test_suite.h"
#include <memory>
#include "base/bind.h"
#include "base/command_line.h"
#include "base/files/file_path.h"
#include "base/macros.h"
#include "base/memory/ptr_util.h"
#include "base/metrics/statistics_recorder.h"
#include "base/path_service.h"
#include "base/test/launcher/unit_test_launcher.h"
#include "base/test/test_suite.h"
#include "build/build_config.h"
#include "components/content_settings/core/common/content_settings_pattern.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/base/ui_base_paths.h"
#include "url/url_util.h"
#if !defined(OS_IOS)
#include "content/public/test/test_content_client_initializer.h"
#include "content/public/test/unittest_test_suite.h"
#include "mojo/edk/embedder/embedder.h"
#include "ui/gl/test/gl_surface_test_support.h"
#endif
#if defined(OS_ANDROID)
#include "base/android/jni_android.h"
#include "components/gcm_driver/instance_id/android/component_jni_registrar.h"
#include "components/invalidation/impl/android/component_jni_registrar.h"
#include "components/policy/core/browser/android/component_jni_registrar.h"
#include "components/safe_json/android/component_jni_registrar.h"
#include "components/signin/core/browser/android/component_jni_registrar.h"
#include "content/public/test/test_utils.h"
#include "net/android/net_jni_registrar.h"
#include "ui/base/android/ui_base_jni_registrar.h"
#include "ui/gfx/android/gfx_jni_registrar.h"
#endif
namespace {
class ComponentsTestSuite : public base::TestSuite {
public:
ComponentsTestSuite(int argc, char** argv) : base::TestSuite(argc, argv) {}
private:
void Initialize() override {
base::TestSuite::Initialize();
// Initialize the histograms subsystem, so that any histograms hit in tests
// are correctly registered with the statistics recorder and can be queried
// by tests.
base::StatisticsRecorder::Initialize();
#if !defined(OS_IOS)
gl::GLSurfaceTestSupport::InitializeOneOff();
#endif
#if defined(OS_ANDROID)
// Register JNI bindings for android.
JNIEnv* env = base::android::AttachCurrentThread();
ASSERT_TRUE(content::RegisterJniForTesting(env));
ASSERT_TRUE(gfx::android::RegisterJni(env));
ASSERT_TRUE(instance_id::android::RegisterInstanceIDJni(env));
ASSERT_TRUE(invalidation::android::RegisterInvalidationJni(env));
ASSERT_TRUE(policy::android::RegisterPolicy(env));
ASSERT_TRUE(safe_json::android::RegisterSafeJsonJni(env));
ASSERT_TRUE(signin::android::RegisterSigninJni(env));
ASSERT_TRUE(net::android::RegisterJni(env));
ASSERT_TRUE(ui::android::RegisterJni(env));
#endif
ui::RegisterPathProvider();
base::FilePath pak_path;
#if defined(OS_ANDROID)
PathService::Get(ui::DIR_RESOURCE_PAKS_ANDROID, &pak_path);
#else
PathService::Get(base::DIR_MODULE, &pak_path);
#endif
base::FilePath ui_test_pak_path;
ASSERT_TRUE(PathService::Get(ui::UI_TEST_PAK, &ui_test_pak_path));
ui::ResourceBundle::InitSharedInstanceWithPakPath(ui_test_pak_path);
ui::ResourceBundle::GetSharedInstance().AddDataPackFromPath(
pak_path.AppendASCII("components_tests_resources.pak"),
ui::SCALE_FACTOR_NONE);
// These schemes need to be added globally to pass tests of
// autocomplete_input_unittest.cc and content_settings_pattern*
url::AddStandardScheme("chrome", url::SCHEME_WITHOUT_PORT);
url::AddStandardScheme("chrome-extension", url::SCHEME_WITHOUT_PORT);
url::AddStandardScheme("chrome-devtools", url::SCHEME_WITHOUT_PORT);
url::AddStandardScheme("chrome-search", url::SCHEME_WITHOUT_PORT);
// Not using kExtensionScheme to avoid the dependency to extensions.
ContentSettingsPattern::SetNonWildcardDomainNonPortScheme(
"chrome-extension");
}
void Shutdown() override {
ui::ResourceBundle::CleanupSharedInstance();
base::TestSuite::Shutdown();
}
DISALLOW_COPY_AND_ASSIGN(ComponentsTestSuite);
};
class ComponentsUnitTestEventListener : public testing::EmptyTestEventListener {
public:
ComponentsUnitTestEventListener() {}
~ComponentsUnitTestEventListener() override {}
void OnTestStart(const testing::TestInfo& test_info) override {
#if !defined(OS_IOS)
content_initializer_.reset(new content::TestContentClientInitializer());
#endif
}
void OnTestEnd(const testing::TestInfo& test_info) override {
#if !defined(OS_IOS)
content_initializer_.reset();
#endif
}
private:
#if !defined(OS_IOS)
std::unique_ptr<content::TestContentClientInitializer> content_initializer_;
#endif
DISALLOW_COPY_AND_ASSIGN(ComponentsUnitTestEventListener);
};
} // namespace
base::RunTestSuiteCallback GetLaunchCallback(int argc, char** argv) {
#if !defined(OS_IOS)
auto test_suite = base::MakeUnique<content::UnitTestTestSuite>(
new ComponentsTestSuite(argc, argv));
#else
auto test_suite = base::MakeUnique<ComponentsTestSuite>(argc, argv);
#endif
// The listener will set up common test environment for all components unit
// tests.
testing::TestEventListeners& listeners =
testing::UnitTest::GetInstance()->listeners();
listeners.Append(new ComponentsUnitTestEventListener());
#if !defined(OS_IOS)
mojo::edk::Init();
return base::Bind(&content::UnitTestTestSuite::Run, std::move(test_suite));
#else
return base::Bind(&base::TestSuite::Run, std::move(test_suite));
#endif
}
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_TEST_COMPONENTS_TEST_SUITE_H_
#define COMPONENTS_TEST_COMPONENTS_TEST_SUITE_H_
#include "base/test/launcher/unit_test_launcher.h"
base::RunTestSuiteCallback GetLaunchCallback(int argc, char** argv);
#endif // COMPONENTS_TEST_COMPONENTS_TEST_SUITE_H_
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/test/components_test_suite.h"
int main(int argc, char** argv) {
return base::LaunchUnitTestsSerially(argc, argv,
GetLaunchCallback(argc, argv));
}
......@@ -2,161 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <memory>
#include "base/bind.h"
#include "base/command_line.h"
#include "base/files/file_path.h"
#include "base/macros.h"
#include "base/metrics/statistics_recorder.h"
#include "base/path_service.h"
#include "base/test/launcher/unit_test_launcher.h"
#include "base/test/test_suite.h"
#include "build/build_config.h"
#include "components/content_settings/core/common/content_settings_pattern.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/base/ui_base_paths.h"
#include "url/url_util.h"
#if !defined(OS_IOS)
#include "content/public/test/test_content_client_initializer.h"
#include "content/public/test/unittest_test_suite.h"
#include "mojo/edk/embedder/embedder.h"
#include "ui/gl/test/gl_surface_test_support.h"
#endif
#if defined(OS_ANDROID)
#include "base/android/jni_android.h"
#include "components/gcm_driver/instance_id/android/component_jni_registrar.h"
#include "components/invalidation/impl/android/component_jni_registrar.h"
#include "components/policy/core/browser/android/component_jni_registrar.h"
#include "components/safe_json/android/component_jni_registrar.h"
#include "components/signin/core/browser/android/component_jni_registrar.h"
#include "content/public/test/test_utils.h"
#include "net/android/net_jni_registrar.h"
#include "ui/base/android/ui_base_jni_registrar.h"
#include "ui/gfx/android/gfx_jni_registrar.h"
#endif
namespace {
class ComponentsTestSuite : public base::TestSuite {
public:
ComponentsTestSuite(int argc, char** argv) : base::TestSuite(argc, argv) {}
private:
void Initialize() override {
base::TestSuite::Initialize();
// Initialize the histograms subsystem, so that any histograms hit in tests
// are correctly registered with the statistics recorder and can be queried
// by tests.
base::StatisticsRecorder::Initialize();
#if !defined(OS_IOS)
gl::GLSurfaceTestSupport::InitializeOneOff();
#endif
#if defined(OS_ANDROID)
// Register JNI bindings for android.
JNIEnv* env = base::android::AttachCurrentThread();
ASSERT_TRUE(content::RegisterJniForTesting(env));
ASSERT_TRUE(gfx::android::RegisterJni(env));
ASSERT_TRUE(instance_id::android::RegisterInstanceIDJni(env));
ASSERT_TRUE(invalidation::android::RegisterInvalidationJni(env));
ASSERT_TRUE(policy::android::RegisterPolicy(env));
ASSERT_TRUE(safe_json::android::RegisterSafeJsonJni(env));
ASSERT_TRUE(signin::android::RegisterSigninJni(env));
ASSERT_TRUE(net::android::RegisterJni(env));
ASSERT_TRUE(ui::android::RegisterJni(env));
#endif
ui::RegisterPathProvider();
base::FilePath pak_path;
#if defined(OS_ANDROID)
PathService::Get(ui::DIR_RESOURCE_PAKS_ANDROID, &pak_path);
#else
PathService::Get(base::DIR_MODULE, &pak_path);
#endif
base::FilePath ui_test_pak_path;
ASSERT_TRUE(PathService::Get(ui::UI_TEST_PAK, &ui_test_pak_path));
ui::ResourceBundle::InitSharedInstanceWithPakPath(ui_test_pak_path);
ui::ResourceBundle::GetSharedInstance().AddDataPackFromPath(
pak_path.AppendASCII("components_tests_resources.pak"),
ui::SCALE_FACTOR_NONE);
// These schemes need to be added globally to pass tests of
// autocomplete_input_unittest.cc and content_settings_pattern*
url::AddStandardScheme("chrome", url::SCHEME_WITHOUT_PORT);
url::AddStandardScheme("chrome-extension", url::SCHEME_WITHOUT_PORT);
url::AddStandardScheme("chrome-devtools", url::SCHEME_WITHOUT_PORT);
url::AddStandardScheme("chrome-search", url::SCHEME_WITHOUT_PORT);
// Not using kExtensionScheme to avoid the dependency to extensions.
ContentSettingsPattern::SetNonWildcardDomainNonPortScheme(
"chrome-extension");
}
void Shutdown() override {
ui::ResourceBundle::CleanupSharedInstance();
base::TestSuite::Shutdown();
}
DISALLOW_COPY_AND_ASSIGN(ComponentsTestSuite);
};
class ComponentsUnitTestEventListener : public testing::EmptyTestEventListener {
public:
ComponentsUnitTestEventListener() {}
~ComponentsUnitTestEventListener() override {}
void OnTestStart(const testing::TestInfo& test_info) override {
#if !defined(OS_IOS)
content_initializer_.reset(new content::TestContentClientInitializer());
#endif
}
void OnTestEnd(const testing::TestInfo& test_info) override {
#if !defined(OS_IOS)
content_initializer_.reset();
#endif
}
private:
#if !defined(OS_IOS)
std::unique_ptr<content::TestContentClientInitializer> content_initializer_;
#endif
DISALLOW_COPY_AND_ASSIGN(ComponentsUnitTestEventListener);
};
} // namespace
#include "components/test/components_test_suite.h"
int main(int argc, char** argv) {
#if !defined(OS_IOS)
content::UnitTestTestSuite test_suite(new ComponentsTestSuite(argc, argv));
#else
ComponentsTestSuite test_suite(argc, argv);
#endif
// The listener will set up common test environment for all components unit
// tests.
testing::TestEventListeners& listeners =
testing::UnitTest::GetInstance()->listeners();
listeners.Append(new ComponentsUnitTestEventListener());
#if !defined(OS_IOS)
mojo::edk::Init();
return base::LaunchUnitTests(argc, argv,
base::Bind(&content::UnitTestTestSuite::Run,
base::Unretained(&test_suite)));
#else
return base::LaunchUnitTests(
argc, argv, base::Bind(&base::TestSuite::Run,
base::Unretained(&test_suite)));
#endif
return base::LaunchUnitTests(argc, argv, GetLaunchCallback(argc, argv));
}
......@@ -9,14 +9,13 @@
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/strings/stringprintf.h"
#include "base/test/perf_log.h"
#include "base/test/perf_time_logger.h"
#include "base/test/test_file_util.h"
#include "base/timer/elapsed_timer.h"
#include "components/visitedlink/browser/visitedlink_master.h"
#include "content/public/test/test_browser_thread_bundle.h"
#include "content/public/test/test_utils.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "testing/perf/perf_test.h"
#include "url/gurl.h"
using base::TimeDelta;
......@@ -25,6 +24,39 @@ namespace visitedlink {
namespace {
// Designed like base/test/perf_time_logger but uses testing/perf instead of
// base/test/perf* to report timings.
class TimeLogger {
public:
explicit TimeLogger(std::string test_name);
~TimeLogger();
void Done();
private:
bool logged_;
std::string test_name_;
base::ElapsedTimer timer_;
DISALLOW_COPY_AND_ASSIGN(TimeLogger);
};
TimeLogger::TimeLogger(std::string test_name)
: logged_(false), test_name_(std::move(test_name)) {}
TimeLogger::~TimeLogger() {
if (!logged_)
Done();
}
void TimeLogger::Done() {
// We use a floating-point millisecond value because it is more
// intuitive than microseconds and we want more precision than
// integer milliseconds.
perf_test::PrintResult(test_name_, std::string(), std::string(),
timer_.Elapsed().InMillisecondsF(), "ms", true);
logged_ = true;
}
// how we generate URLs, note that the two strings should be the same length
const int add_count = 10000;
const int load_test_add_count = 250000;
......@@ -86,7 +118,7 @@ TEST_F(VisitedLink, TestAddAndQuery) {
ASSERT_TRUE(master.Init());
content::RunAllBlockingPoolTasksUntilIdle();
base::PerfTimeLogger timer("Visited_link_add_and_query");
TimeLogger timer("Visited_link_add_and_query");
// first check without anything in the table
CheckVisited(master, added_prefix, 0, add_count);
......@@ -111,13 +143,13 @@ TEST_F(VisitedLink, TestAddAndQuery) {
TEST_F(VisitedLink, TestLoad) {
// create a big DB
{
base::PerfTimeLogger table_initialization_timer("Table_initialization");
TimeLogger table_initialization_timer("Table_initialization");
VisitedLinkMaster master(new DummyVisitedLinkEventListener(),
NULL, true, true, db_path_, 0);
// time init with empty table
base::PerfTimeLogger initTimer("Empty_visited_link_init");
TimeLogger initTimer("Empty_visited_link_init");
bool success = master.Init();
content::RunAllBlockingPoolTasksUntilIdle();
initTimer.Done();
......@@ -130,7 +162,7 @@ TEST_F(VisitedLink, TestLoad) {
FillTable(master, added_prefix, 0, load_test_add_count);
// time writing the file out out
base::PerfTimeLogger flushTimer("Visited_link_database_flush");
TimeLogger flushTimer("Visited_link_database_flush");
master.RewriteFile();
// TODO(maruel): Without calling FlushFileBuffers(master.file_); you don't
// know really how much time it took to write the file.
......@@ -196,10 +228,13 @@ TEST_F(VisitedLink, TestLoad) {
cold_sum += cold_load_times[i];
hot_sum += hot_load_times[i];
}
base::LogPerfResult(
"Visited_link_cold_load_time", cold_sum / cold_load_times.size(), "ms");
base::LogPerfResult(
"Visited_link_hot_load_time", hot_sum / hot_load_times.size(), "ms");
perf_test::PrintResult("Visited_link_cold_load_time", std::string(),
std::string(), cold_sum / cold_load_times.size(), "ms",
true);
perf_test::PrintResult("Visited_link_hot_load_time", std::string(),
std::string(), hot_sum / hot_load_times.size(), "ms",
true);
}
} // namespace visitedlink
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment