Index: content/browser/service_worker/service_worker_browsertest.cc |
diff --git a/content/browser/service_worker/service_worker_browsertest.cc b/content/browser/service_worker/service_worker_browsertest.cc |
index 6011d1ac2fc9e44ee4df0b4865f358a63c720e60..23b63849312bf03f9e88ff5d9c8f849f644779bd 100644 |
--- a/content/browser/service_worker/service_worker_browsertest.cc |
+++ b/content/browser/service_worker/service_worker_browsertest.cc |
@@ -22,6 +22,7 @@ |
#include "base/strings/string_number_conversions.h" |
#include "base/strings/stringprintf.h" |
#include "base/strings/utf_string_conversions.h" |
+#include "base/test/simple_test_tick_clock.h" |
#include "base/threading/thread_task_runner_handle.h" |
#include "base/time/time.h" |
#include "build/build_config.h" |
@@ -1255,6 +1256,72 @@ IN_PROC_BROWSER_TEST_P(ServiceWorkerVersionBrowserTest, FetchWithoutSaveData) { |
SetBrowserClientForTesting(old_client); |
} |
+IN_PROC_BROWSER_TEST_P(ServiceWorkerVersionBrowserTest, MessageSelf) { |
+ const base::string16 activateMsg = base::ASCIIToUTF16("ACTIVATE"); |
+ const base::string16 messageMsg = base::ASCIIToUTF16("MESSAGE"); |
falken
2016/11/21 08:01:48
nit: activateMsg isn't used, and naming style shou
|
+ |
+ RunOnIOThread(base::Bind(&self::SetUpRegistrationOnIOThread, |
+ base::Unretained(this), |
+ "/service_worker/worker_message_to_self.js")); |
+ base::SimpleTestTickClock* tick_clock = new base::SimpleTestTickClock(); |
+ tick_clock->SetNowTicks(base::TimeTicks::Now()); |
+ version_->SetTickClockForTesting(base::WrapUnique(tick_clock)); |
+ |
+ ConsoleListener console_listener; |
+ RunOnIOThread(base::Bind(&EmbeddedWorkerInstance::AddListener, |
+ base::Unretained(version_->embedded_worker()), |
+ &console_listener)); |
+ |
+ ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
+ base::RunLoop run_loop; |
+ BrowserThread::PostTask( |
+ BrowserThread::IO, FROM_HERE, |
+ base::Bind(&self::ActivateOnIOThread, base::Unretained(this), |
+ run_loop.QuitClosure(), &status)); |
+ run_loop.Run(); |
+ ASSERT_EQ(SERVICE_WORKER_OK, status); |
+ |
+ base::TimeDelta request_timeout = base::TimeDelta::FromMinutes( |
+ ServiceWorkerVersion::kRequestTimeoutMinutes); |
+ base::TimeDelta remaining = base::TimeDelta::FromSeconds(10); |
+ |
+ console_listener.WaitForConsoleMessages(1); |
+ EXPECT_EQ(messageMsg, console_listener.messages()[0]); |
+ EXPECT_EQ(request_timeout, version_->remaining_timeout()); |
+ |
+ // Advance clock some, but not enough to trigger the timeout. |
+ tick_clock->Advance(request_timeout - remaining); |
+ EXPECT_EQ(remaining, version_->remaining_timeout()); |
+ |
+ // Wait for another onmessage event. |
+ console_listener.WaitForConsoleMessages(2); |
+ EXPECT_EQ(messageMsg, console_listener.messages()[1]); |
+ // Timeout should not have changed. |
+ EXPECT_EQ(remaining, version_->remaining_timeout()); |
+ |
+ // Advance clock enough to trigger the timeout. |
+ tick_clock->Advance(remaining * 2); |
+ EXPECT_LT(version_->remaining_timeout(), base::TimeDelta()); |
+ RunOnIOThread(base::Bind(&ServiceWorkerVersion::OnTimeoutTimer, version_)); |
+ |
+ // Advance clock more to trigger idle timeout. |
+ tick_clock->Advance(base::TimeDelta::FromSeconds( |
+ ServiceWorkerVersion::kIdleWorkerTimeoutSeconds)); |
+ RunOnIOThread(base::Bind(&ServiceWorkerVersion::OnTimeoutTimer, version_)); |
+ |
+ // Worker should be stopping. |
+ EXPECT_EQ(EmbeddedWorkerStatus::STOPPING, version_->running_status()); |
+ |
+ // One more message event might already have been queued before advancing the |
+ // time, but no other message events should have triggered while stopping |
+ // worker. |
+ EXPECT_LE(console_listener.messages().size(), 3u); |
+ |
falken
2016/11/21 08:01:48
It'd be slightly nicer if this could verify that t
Marijn Kruisselbrink
2016/12/01 19:54:29
Unfortunately I couldn't even figure out how to ma
|
+ RunOnIOThread(base::Bind(&EmbeddedWorkerInstance::RemoveListener, |
+ base::Unretained(version_->embedded_worker()), |
+ &console_listener)); |
+} |
+ |
IN_PROC_BROWSER_TEST_P(ServiceWorkerBrowserTest, FetchPageWithSaveData) { |
const char kPageUrl[] = "/service_worker/handle_fetch.html"; |
const char kWorkerUrl[] = "/service_worker/add_save_data_to_title.js"; |