// 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/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() = default;
  ~APIBindingPerfBrowserTest() override = default;

  void SetUpOnMainThread() override {
    ExtensionBrowserTest::SetUpOnMainThread();
    EXPECT_TRUE(embedded_test_server()->Start());
  }

  base::TimeDelta RunTestAndReportTime() {
    return base::Milliseconds(
        content::EvalJs(
            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
