// Copyright 2018 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 "extensions/browser/browsertest_util.h"

#include <string>

#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/strings/string_number_conversions.h"
#include "extensions/common/constants.h"
#include "extensions/common/extension.h"
#include "extensions/shell/test/shell_apitest.h"
#include "extensions/test/result_catcher.h"
#include "testing/gtest/include/gtest/gtest-spi.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace extensions {
namespace browsertest_util {

namespace {

class ExtensionBrowsertestUtilTest : public ShellApiTest {
 public:
  ExtensionBrowsertestUtilTest() = default;
  ~ExtensionBrowsertestUtilTest() override = default;

  void SetUpOnMainThread() override {
    ShellApiTest::SetUpOnMainThread();

    extension_ = LoadExtension("extension");
    ASSERT_TRUE(extension_.get());

    // Wait for the test result to ensure the extension has loaded.
    // TODO(michaelpg): Implement a real extension readiness observer.
    ResultCatcher catcher;
    ASSERT_TRUE(catcher.GetNextResult());
  }

 protected:
  const Extension* extension() const { return extension_.get(); }

 private:
  scoped_refptr<const Extension> extension_;

  DISALLOW_COPY_AND_ASSIGN(ExtensionBrowsertestUtilTest);
};

IN_PROC_BROWSER_TEST_F(ExtensionBrowsertestUtilTest,
                       ExecuteScriptInBackgroundPage) {
  EXPECT_EQ(extension()->id(),
            ExecuteScriptInBackgroundPage(
                browser_context(), extension()->id(),
                "window.domAutomationController.send(chrome.runtime.id);"));

  // Check that executing a script doesn't block the browser process.
  EXPECT_EQ(std::string("/") + extensions::kGeneratedBackgroundPageFilename,
            ExecuteScriptInBackgroundPage(
                browser_context(), extension()->id(),
                "chrome.runtime.getBackgroundPage(function(result) {\n"
                "  let url = new URL(result.location.href);\n"
                "  window.domAutomationController.send(url.pathname);\n"
                "});"));

  // An argument that isn't a string should cause a failure, not a hang.
  EXPECT_NONFATAL_FAILURE(
      ExecuteScriptInBackgroundPage(browser_context(), extension()->id(),
                                    "window.domAutomationController.send(3);"),
      "send(3)");
}

IN_PROC_BROWSER_TEST_F(ExtensionBrowsertestUtilTest,
                       ExecuteScriptInBackgroundPageNoWait) {
  // Run an arbitrary script to check that we don't wait for a response.
  ASSERT_TRUE(ExecuteScriptInBackgroundPageNoWait(
      browser_context(), extension()->id(), "let foo = 0;"));

  // Run a script asynchronously that passes the test.
  ResultCatcher catcher;
  ASSERT_TRUE(ExecuteScriptInBackgroundPageNoWait(
      browser_context(), extension()->id(), "chrome.test.notifyPass();"));
  ASSERT_TRUE(catcher.GetNextResult());

  // Specifying a non-existent extension should add a non-fatal failure.
  EXPECT_NONFATAL_FAILURE(
      EXPECT_FALSE(ExecuteScriptInBackgroundPageNoWait(
          browser_context(), "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "")),
      "Extension aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa has no background page.");
}

}  // namespace

}  // namespace browsertest_util
}  // namespace extensions
