blob: 2fbe5a859aa06ededdeb0fceee7375e9e57a7e53 [file] [log] [blame]
// Copyright 2019 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 "base/callback_forward.h"
#include "base/strings/stringprintf.h"
#include "base/time/time.h"
#include "build/build_config.h"
#include "chrome/browser/lifetime/application_lifetime.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "content/public/test/browser_test_utils.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "net/test/embedded_test_server/http_request.h"
#include "net/test/embedded_test_server/http_response.h"
namespace {
// Scripts run by this test are defined in
// chrome/test/data/background_sync/background_sync_browsertest.js.
// URL of the test helper page that helps drive these tests.
const char kHelperPage[] = "/background_sync/background_sync_browsertest.html";
const char kTagName[] = "test";
const char kSuccessfulOperationPrefix[] = "ok - ";
} // namespace
class BackgroundSyncBrowserTest : public InProcessBrowserTest {
public:
BackgroundSyncBrowserTest() = default;
~BackgroundSyncBrowserTest() override = default;
void SetUpOnMainThread() override {
https_server_ = std::make_unique<net::EmbeddedTestServer>(
net::EmbeddedTestServer::TYPE_HTTPS);
https_server_->RegisterRequestHandler(base::BindRepeating(
&BackgroundSyncBrowserTest::HandleRequest, base::Unretained(this)));
https_server_->AddDefaultHandlers(GetChromeTestDataDir());
ASSERT_TRUE(https_server_->Start());
SetUpBrowser(browser());
}
void SetUpBrowser(Browser* browser) {
// Load the helper page that helps drive these tests.
ui_test_utils::NavigateToURL(browser, https_server_->GetURL(kHelperPage));
// Register the Service Worker that's required for Background Sync. The
// behaviour without an activated worker is covered by layout tests.
{
std::string script_result;
ASSERT_TRUE(RunScript("RegisterServiceWorker()", &script_result));
ASSERT_EQ("ok - service worker registered", script_result);
}
}
// ---------------------------------------------------------------------------
// Helper functions.
// Runs the |script| in the current tab and writes the output to |*result|.
bool RunScript(const std::string& script, std::string* result) {
return content::ExecuteScriptAndExtractString(
browser()->tab_strip_model()->GetActiveWebContents()->GetMainFrame(),
script, result);
}
// Intercepts all requests.
std::unique_ptr<net::test_server::HttpResponse> HandleRequest(
const net::test_server::HttpRequest& request) {
if (request.GetURL().query() == "syncreceived") {
time_when_sync_event_received_ = base::Time::Now();
}
// The default handlers will take care of this request.
return nullptr;
}
std::string BuildScriptString(const std::string& function,
const std::string& argument) {
return base::StringPrintf("%s('%s');", function.c_str(), argument.c_str());
}
std::string BuildExpectedResult(const std::string& tag,
const std::string& action) {
return base::StringPrintf("%s%s %s", kSuccessfulOperationPrefix,
tag.c_str(), action.c_str());
}
bool HasTag(const std::string& tag) {
std::string script_result;
EXPECT_TRUE(RunScript(BuildScriptString("hasTag", tag), &script_result));
return script_result == BuildExpectedResult(tag, "found");
}
protected:
base::Time time_when_sync_event_received_;
private:
std::unique_ptr<net::EmbeddedTestServer> https_server_;
DISALLOW_COPY_AND_ASSIGN(BackgroundSyncBrowserTest);
};
IN_PROC_BROWSER_TEST_F(BackgroundSyncBrowserTest, VerifyShutdownBehavior) {
EXPECT_FALSE(HasTag(kTagName));
chrome::CloseAllBrowsers();
chrome::AttemptExit();
RunUntilBrowserProcessQuits();
EXPECT_LE(time_when_sync_event_received_, base::Time::Now());
}