| // 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()); |
| } |