blob: 01fd55f8ce5906608ebddfafb36aaf45e8bc58b9 [file] [log] [blame]
// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/time/time.h"
#include "chrome/browser/extensions/extension_browsertest.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/test/base/ui_test_utils.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "extensions/test/test_extension_dir.h"
namespace extensions {
namespace {
// TODO(jbroman, devlin): This should ultimately be replaced with some more
// sophisticated testing (e.g. in Telemetry) which is tracked on the perf bots.
// These tests are designed to exercise the extension API bindings
// system and measure performance with and without native bindings.
// They are designed to be run locally, and there isn't much benefit to
// running them on the bots. For this reason, they are all disabled.
// To run them, append the --gtest_also_run_disabled_tests flag to the
// test executable.
#define LOCAL_TEST(TestName) DISABLED_ ## TestName
class APIBindingPerfBrowserTest : public ExtensionBrowserTest {
public:
APIBindingPerfBrowserTest(const APIBindingPerfBrowserTest&) = delete;
APIBindingPerfBrowserTest& operator=(const APIBindingPerfBrowserTest&) =
delete;
protected:
APIBindingPerfBrowserTest() {}
~APIBindingPerfBrowserTest() override {}
void SetUpOnMainThread() override {
ExtensionBrowserTest::SetUpOnMainThread();
EXPECT_TRUE(embedded_test_server()->Start());
}
base::TimeDelta RunTestAndReportTime() {
return base::Milliseconds(
content::EvalJs(
browser()->tab_strip_model()->GetActiveWebContents(),
"new Promise(resolve => runTest(time => resolve(time)))")
.ExtractDouble());
}
};
constexpr char kSimpleContentScriptManifest[] =
R"({
"name": "Perf test extension",
"version": "0",
"manifest_version": 2,
"content_scripts": [ {
"all_frames": true,
"matches": [ "<all_urls>" ],
"run_at": "document_end",
"js": [ "content_script.js" ]
} ],
"permissions": [ "storage" ]
})";
IN_PROC_BROWSER_TEST_F(APIBindingPerfBrowserTest,
LOCAL_TEST(ManyFramesWithNoContentScript)) {
ASSERT_TRUE(ui_test_utils::NavigateToURL(
browser(), embedded_test_server()->GetURL(
"/extensions/perf_tests/many_frames.html")));
base::TimeDelta time_elapsed = RunTestAndReportTime();
LOG(INFO) << "Executed in " << time_elapsed.InMillisecondsF() << " ms";
}
IN_PROC_BROWSER_TEST_F(APIBindingPerfBrowserTest,
LOCAL_TEST(ManyFramesWithEmptyContentScript)) {
TestExtensionDir extension_dir;
extension_dir.WriteManifest(kSimpleContentScriptManifest);
extension_dir.WriteFile(FILE_PATH_LITERAL("content_script.js"),
"// This space intentionally left blank.");
ASSERT_TRUE(LoadExtension(extension_dir.UnpackedPath()));
ASSERT_TRUE(ui_test_utils::NavigateToURL(
browser(), embedded_test_server()->GetURL(
"/extensions/perf_tests/many_frames.html")));
base::TimeDelta time_elapsed = RunTestAndReportTime();
LOG(INFO) << "Executed in " << time_elapsed.InMillisecondsF() << " ms";
}
IN_PROC_BROWSER_TEST_F(APIBindingPerfBrowserTest,
LOCAL_TEST(ManyFramesWithStorageAndRuntime)) {
TestExtensionDir extension_dir;
extension_dir.WriteManifest(kSimpleContentScriptManifest);
extension_dir.WriteFile(FILE_PATH_LITERAL("content_script.js"),
"chrome.storage.onChanged.addListener;"
"chrome.runtime.onMessage.addListener;");
ASSERT_TRUE(LoadExtension(extension_dir.UnpackedPath()));
ASSERT_TRUE(ui_test_utils::NavigateToURL(
browser(), embedded_test_server()->GetURL(
"/extensions/perf_tests/many_frames.html")));
base::TimeDelta time_elapsed = RunTestAndReportTime();
LOG(INFO) << "Executed in " << time_elapsed.InMillisecondsF() << " ms";
}
} // namespace
} // namespace extensions