Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(71)

Unified Diff: content/browser/service_worker/service_worker_browsertest.cc

Issue 145033012: Make ServiceWorkerVersion::{Start,Stop}Worker take callback (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | content/browser/service_worker/service_worker_version.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 b2f2a26afd71bcd67c7ea7d7b83b1968813fa40f..a4ec6389e45a7396e7507ae2e53ce71addacb25d 100644
--- a/content/browser/service_worker/service_worker_browsertest.cc
+++ b/content/browser/service_worker/service_worker_browsertest.cc
@@ -11,6 +11,9 @@
#include "content/browser/service_worker/embedded_worker_registry.h"
#include "content/browser/service_worker/service_worker_context_core.h"
#include "content/browser/service_worker/service_worker_context_wrapper.h"
+#include "content/browser/service_worker/service_worker_registration.h"
+#include "content/browser/service_worker/service_worker_version.h"
+#include "content/common/service_worker/service_worker_messages.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/storage_partition.h"
@@ -23,14 +26,44 @@
namespace content {
-class ServiceWorkerBrowserTest : public ContentBrowserTest,
- public EmbeddedWorkerInstance::Observer {
- public:
- typedef ServiceWorkerBrowserTest self;
+namespace {
- ServiceWorkerBrowserTest()
- : last_worker_status_(EmbeddedWorkerInstance::STOPPED) {}
- virtual ~ServiceWorkerBrowserTest() {}
+void RunAndQuit(const base::Closure& closure,
+ const base::Closure& quit,
+ base::MessageLoopProxy* original_message_loop) {
+ closure.Run();
+ original_message_loop->PostTask(FROM_HERE, quit);
+}
+
+void RunOnIOThread(const base::Closure& closure) {
+ base::RunLoop run_loop;
+ BrowserThread::PostTask(
+ BrowserThread::IO, FROM_HERE,
+ base::Bind(&RunAndQuit, closure, run_loop.QuitClosure(),
+ base::MessageLoopProxy::current()));
+ run_loop.Run();
+}
+
+// TODO(kinuko): Factor out these common test helpers to a separate file.
+template <typename Arg>
+void VerifyResult(const tracked_objects::Location& where,
+ const base::Closure& quit,
+ Arg expected, Arg actual) {
+ EXPECT_EQ(expected, actual) << where.ToString();
+ BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, quit);
+}
+
+template <typename Arg> base::Callback<void(Arg)>
+CreateVerifier(const tracked_objects::Location& where,
+ const base::Closure& quit, Arg expected) {
+ return base::Bind(&VerifyResult<Arg>, where, quit, expected);
+}
+
+} // namespace
+
+class ServiceWorkerBrowserTest : public ContentBrowserTest {
+ protected:
+ typedef ServiceWorkerBrowserTest self;
virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
command_line->AppendSwitch(switches::kEnableServiceWorker);
@@ -44,37 +77,62 @@ class ServiceWorkerBrowserTest : public ContentBrowserTest,
}
virtual void TearDownOnMainThread() OVERRIDE {
- base::RunLoop run_loop;
- BrowserThread::PostTask(
- BrowserThread::IO, FROM_HERE,
- base::Bind(&self::TearDownOnIOThread, this, run_loop.QuitClosure()));
- run_loop.Run();
+ RunOnIOThread(base::Bind(&self::TearDownOnIOThread, this));
wrapper_ = NULL;
}
- void TearDownOnIOThread(const base::Closure& done_closure) {
+ virtual void TearDownOnIOThread() {}
+
+ ServiceWorkerContextWrapper* wrapper() { return wrapper_.get(); }
+
+ void AssociateProcessToWorker(EmbeddedWorkerInstance* worker) {
+ // TODO(kinuko): this manual wiring should go away when this gets wired
+ // in the actual code path.
+ ServiceWorkerProviderHost* provider_host = GetRegisteredProviderHost();
+ worker->AddProcessReference(provider_host->process_id());
+ }
+
+ private:
+ ServiceWorkerProviderHost* GetRegisteredProviderHost() {
+ // Assumes only one provider host is registered at this point.
+ std::vector<ServiceWorkerProviderHost*> providers;
+ wrapper_->context()->GetAllProviderHosts(&providers);
+ DCHECK_EQ(1U, providers.size());
+ return providers[0];
+ }
+
+ scoped_refptr<ServiceWorkerContextWrapper> wrapper_;
+};
+
+class EmbeddedWorkerBrowserTest : public ServiceWorkerBrowserTest,
+ public EmbeddedWorkerInstance::Observer {
+ public:
+ typedef EmbeddedWorkerBrowserTest self;
+
+ EmbeddedWorkerBrowserTest()
+ : last_worker_status_(EmbeddedWorkerInstance::STOPPED) {}
+ virtual ~EmbeddedWorkerBrowserTest() {}
+
+ virtual void TearDownOnIOThread() OVERRIDE {
if (worker_) {
worker_->RemoveObserver(this);
worker_.reset();
}
- BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done_closure);
}
- void StartEmbeddedWorkerOnIOThread() {
+ void StartOnIOThread() {
ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO));
- worker_ = wrapper_->context()->embedded_worker_registry()->CreateWorker();
+ worker_ = wrapper()->context()->embedded_worker_registry()->CreateWorker();
EXPECT_EQ(EmbeddedWorkerInstance::STOPPED, worker_->status());
worker_->AddObserver(this);
- // TODO(kinuko): this manual wiring should go away when this gets wired
- // in the actual code path.
- ServiceWorkerProviderHost* provider_host = GetRegisteredProviderHost();
- worker_->AddProcessReference(provider_host->process_id());
+ AssociateProcessToWorker(worker_.get());
const int64 service_worker_version_id = 33L;
const GURL script_url = embedded_test_server()->GetURL(
"/service_worker/worker.js");
- const bool started = worker_->Start(service_worker_version_id, script_url);
+ const bool started = worker_->Start(
+ service_worker_version_id, script_url);
last_worker_status_ = worker_->status();
EXPECT_TRUE(started);
@@ -84,7 +142,7 @@ class ServiceWorkerBrowserTest : public ContentBrowserTest,
done_closure_.Run();
}
- void StopEmbeddedWorkerOnIOThread() {
+ void StopOnIOThread() {
ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO));
EXPECT_EQ(EmbeddedWorkerInstance::RUNNING, worker_->status());
@@ -99,7 +157,7 @@ class ServiceWorkerBrowserTest : public ContentBrowserTest,
}
protected:
- // Embe3ddedWorkerInstance::Observer overrides:
+ // EmbeddedWorkerInstance::Observer overrides:
virtual void OnStarted() OVERRIDE {
ASSERT_TRUE(worker_ != NULL);
ASSERT_FALSE(done_closure_.is_null());
@@ -116,15 +174,6 @@ class ServiceWorkerBrowserTest : public ContentBrowserTest,
NOTREACHED();
}
- ServiceWorkerProviderHost* GetRegisteredProviderHost() {
- // Assumes only one provider host is registered at this point.
- std::vector<ServiceWorkerProviderHost*> providers;
- wrapper_->context()->GetAllProviderHosts(&providers);
- DCHECK_EQ(1U, providers.size());
- return providers[0];
- }
-
- scoped_refptr<ServiceWorkerContextWrapper> wrapper_;
scoped_ptr<EmbeddedWorkerInstance> worker_;
EmbeddedWorkerInstance::Status last_worker_status_;
@@ -133,7 +182,55 @@ class ServiceWorkerBrowserTest : public ContentBrowserTest,
base::Closure done_closure_;
};
-IN_PROC_BROWSER_TEST_F(ServiceWorkerBrowserTest, EmbeddedWorkerBasic) {
+class ServiceWorkerVersionBrowserTest : public ServiceWorkerBrowserTest {
+ public:
+ typedef ServiceWorkerVersionBrowserTest self;
+
+ ServiceWorkerVersionBrowserTest() {}
+ virtual ~ServiceWorkerVersionBrowserTest() {}
+
+ virtual void TearDownOnIOThread() OVERRIDE {
+ if (registration_) {
+ registration_->Shutdown();
+ registration_ = NULL;
+ }
+ if (version_) {
+ version_->Shutdown();
+ version_ = NULL;
+ }
+ }
+
+ void StartOnIOThread(const std::string& worker_url,
+ ServiceWorkerStatusCode expected,
+ const base::Closure& done) {
+ ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO));
+
+ const int64 registration_id = 1L;
+ const int64 version_id = 1L;
+ registration_ = new ServiceWorkerRegistration(
+ embedded_test_server()->GetURL("/*"),
+ embedded_test_server()->GetURL(worker_url),
+ registration_id);
+ version_ = new ServiceWorkerVersion(
+ registration_,
+ wrapper()->context()->embedded_worker_registry(),
+ version_id);
+ AssociateProcessToWorker(version_->embedded_worker());
+ version_->StartWorker(CreateVerifier(FROM_HERE, done, expected));
+ }
+
+ void StopOnIOThread(const base::Closure& done) {
+ ASSERT_TRUE(version_);
+ version_->StopWorker(
+ CreateVerifier(FROM_HERE, done, SERVICE_WORKER_OK));
+ }
+
+ protected:
+ scoped_refptr<ServiceWorkerRegistration> registration_;
+ scoped_refptr<ServiceWorkerVersion> version_;
+};
+
+IN_PROC_BROWSER_TEST_F(EmbeddedWorkerBrowserTest, StartAndStop) {
// Navigate to the page to set up a provider.
NavigateToURLBlockUntilNavigationsComplete(
shell(), embedded_test_server()->GetURL("/service_worker/index.html"), 1);
@@ -141,9 +238,8 @@ IN_PROC_BROWSER_TEST_F(ServiceWorkerBrowserTest, EmbeddedWorkerBasic) {
// Start a worker and wait until OnStarted() is called.
base::RunLoop start_run_loop;
done_closure_ = start_run_loop.QuitClosure();
- BrowserThread::PostTask(
- BrowserThread::IO, FROM_HERE,
- base::Bind(&self::StartEmbeddedWorkerOnIOThread, this));
+ BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
+ base::Bind(&self::StartOnIOThread, this));
start_run_loop.Run();
ASSERT_EQ(EmbeddedWorkerInstance::RUNNING, last_worker_status_);
@@ -151,12 +247,48 @@ IN_PROC_BROWSER_TEST_F(ServiceWorkerBrowserTest, EmbeddedWorkerBasic) {
// Stop a worker and wait until OnStopped() is called.
base::RunLoop stop_run_loop;
done_closure_ = stop_run_loop.QuitClosure();
- BrowserThread::PostTask(
- BrowserThread::IO, FROM_HERE,
- base::Bind(&self::StopEmbeddedWorkerOnIOThread, this));
+ BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
+ base::Bind(&self::StopOnIOThread, this));
stop_run_loop.Run();
ASSERT_EQ(EmbeddedWorkerInstance::STOPPED, last_worker_status_);
}
+IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, StartAndStop) {
+ // Navigate to the page to set up a provider.
+ NavigateToURLBlockUntilNavigationsComplete(
+ shell(), embedded_test_server()->GetURL("/service_worker/index.html"), 1);
+
+ // Start a worker.
+ base::RunLoop start_run_loop;
+ BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
+ base::Bind(&self::StartOnIOThread, this,
+ "/service_worker/worker.js",
+ SERVICE_WORKER_OK,
+ start_run_loop.QuitClosure()));
+ start_run_loop.Run();
+
+ // Stop the worker.
+ base::RunLoop stop_run_loop;
+ BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
+ base::Bind(&self::StopOnIOThread, this,
+ stop_run_loop.QuitClosure()));
+ stop_run_loop.Run();
+}
+
+IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, StartNotFound) {
+ // Navigate to the page to set up a provider.
+ NavigateToURLBlockUntilNavigationsComplete(
+ shell(), embedded_test_server()->GetURL("/service_worker/index.html"), 1);
+
+ // Start a worker for nonexistent URL.
+ base::RunLoop start_run_loop;
+ BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
+ base::Bind(&self::StartOnIOThread, this,
+ "/service_worker/nonexistent.js",
+ SERVICE_WORKER_ERROR_START_WORKER_FAILED,
+ start_run_loop.QuitClosure()));
+ start_run_loop.Run();
+}
+
} // namespace content
« no previous file with comments | « no previous file | content/browser/service_worker/service_worker_version.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698