1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file.
4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/browser/service_worker/service_worker_dispatcher_host.h"
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/command_line.h"
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/files/file_path.h"
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/run_loop.h"
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/browser/browser_thread_impl.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/service_worker/embedded_worker_instance.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/service_worker/embedded_worker_registry.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/service_worker/embedded_worker_test_helper.h"
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/browser/service_worker/service_worker_context_core.h"
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/browser/service_worker/service_worker_context_wrapper.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/common/service_worker/embedded_worker_messages.h"
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/common/service_worker/service_worker_messages.h"
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/common/content_switches.h"
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h"
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace content {
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)static const int kRenderProcessId = 1;
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class TestingServiceWorkerDispatcherHost : public ServiceWorkerDispatcherHost {
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public:
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TestingServiceWorkerDispatcherHost(
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      int process_id,
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ServiceWorkerContextWrapper* context_wrapper,
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EmbeddedWorkerTestHelper* helper)
32effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      : ServiceWorkerDispatcherHost(process_id, NULL),
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        bad_messages_received_count_(0),
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        helper_(helper) {
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    Init(context_wrapper);
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual bool Send(IPC::Message* message) OVERRIDE {
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return helper_->Send(message);
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  IPC::TestSink* ipc_sink() { return helper_->ipc_sink(); }
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void BadMessageReceived() OVERRIDE {
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ++bad_messages_received_count_;
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int bad_messages_received_count_;
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) protected:
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EmbeddedWorkerTestHelper* helper_;
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual ~TestingServiceWorkerDispatcherHost() {}
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)class ServiceWorkerDispatcherHostTest : public testing::Test {
566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) protected:
576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ServiceWorkerDispatcherHostTest()
586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      : browser_thread_bundle_(TestBrowserThreadBundle::IO_MAINLOOP) {}
596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  virtual void SetUp() {
616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    helper_.reset(new EmbeddedWorkerTestHelper(kRenderProcessId));
626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    dispatcher_host_ = new TestingServiceWorkerDispatcherHost(
636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        kRenderProcessId, context_wrapper(), helper_.get());
646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  virtual void TearDown() {
676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    helper_.reset();
686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ServiceWorkerContextCore* context() { return helper_->context(); }
716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ServiceWorkerContextWrapper* context_wrapper() {
726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    return helper_->context_wrapper();
736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void SendRegister(int64 provider_id, GURL pattern, GURL worker_url) {
766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    dispatcher_host_->OnMessageReceived(
776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        ServiceWorkerHostMsg_RegisterServiceWorker(
786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)            -1, -1, provider_id, pattern, worker_url));
796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    base::RunLoop().RunUntilIdle();
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void Register(int64 provider_id,
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                GURL pattern,
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                GURL worker_url,
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                uint32 expected_message) {
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    SendRegister(provider_id, pattern, worker_url);
876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_TRUE(dispatcher_host_->ipc_sink()->GetUniqueMessageMatching(
886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        expected_message));
896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    dispatcher_host_->ipc_sink()->ClearMessages();
906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void SendUnregister(int64 provider_id, GURL pattern) {
936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    dispatcher_host_->OnMessageReceived(
946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        ServiceWorkerHostMsg_UnregisterServiceWorker(
956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)            -1, -1, provider_id, pattern));
966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    base::RunLoop().RunUntilIdle();
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void Unregister(int64 provider_id, GURL pattern, uint32 expected_message) {
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    SendUnregister(provider_id, pattern);
1016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_TRUE(dispatcher_host_->ipc_sink()->GetUniqueMessageMatching(
1026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        expected_message));
1036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    dispatcher_host_->ipc_sink()->ClearMessages();
1046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
1056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void SendGetRegistration(int64 provider_id, GURL document_url) {
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    dispatcher_host_->OnMessageReceived(
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ServiceWorkerHostMsg_GetRegistration(
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            -1, -1, provider_id, document_url));
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::RunLoop().RunUntilIdle();
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void GetRegistration(int64 provider_id,
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       GURL document_url,
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       uint32 expected_message) {
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    SendGetRegistration(provider_id, document_url);
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_TRUE(dispatcher_host_->ipc_sink()->GetUniqueMessageMatching(
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        expected_message));
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    dispatcher_host_->ipc_sink()->ClearMessages();
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  TestBrowserThreadBundle browser_thread_bundle_;
1236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  scoped_ptr<EmbeddedWorkerTestHelper> helper_;
1246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  scoped_refptr<TestingServiceWorkerDispatcherHost> dispatcher_host_;
1256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)};
1266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
127116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ServiceWorkerDispatcherHostTest, Register_SameOrigin) {
128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const int64 kProviderId = 99;  // Dummy value
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<ServiceWorkerProviderHost> host(new ServiceWorkerProviderHost(
130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      kRenderProcessId, kProviderId, context()->AsWeakPtr(), NULL));
131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  host->SetDocumentUrl(GURL("https://www.example.com/foo"));
132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::WeakPtr<ServiceWorkerProviderHost> provider_host = host->AsWeakPtr();
133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  context()->AddProviderHost(host.Pass());
134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  Register(kProviderId,
1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)           GURL("https://www.example.com/"),
137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch           GURL("https://www.example.com/bar"),
138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch           ServiceWorkerMsg_ServiceWorkerRegistered::ID);
139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
141116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ServiceWorkerDispatcherHostTest, Register_CrossOrigin) {
1426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  const int64 kProviderId = 99;  // Dummy value
1436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  scoped_ptr<ServiceWorkerProviderHost> host(new ServiceWorkerProviderHost(
1446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      kRenderProcessId, kProviderId, context()->AsWeakPtr(), NULL));
145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  host->SetDocumentUrl(GURL("https://www.example.com/foo"));
1466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  base::WeakPtr<ServiceWorkerProviderHost> provider_host = host->AsWeakPtr();
1476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  context()->AddProviderHost(host.Pass());
1486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Script has a different host
150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SendRegister(kProviderId,
1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               GURL("https://www.example.com/"),
152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               GURL("https://foo.example.com/bar"));
153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(1, dispatcher_host_->bad_messages_received_count_);
154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Scope has a different host
156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SendRegister(kProviderId,
1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               GURL("https://foo.example.com/"),
158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               GURL("https://www.example.com/bar"));
159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(2, dispatcher_host_->bad_messages_received_count_);
160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Script has a different port
162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SendRegister(kProviderId,
1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               GURL("https://www.example.com/"),
164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               GURL("https://www.example.com:8080/bar"));
165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(3, dispatcher_host_->bad_messages_received_count_);
166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Scope has a different transport
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SendRegister(kProviderId,
1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               GURL("wss://www.example.com/"),
170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               GURL("https://www.example.com/bar"));
171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(4, dispatcher_host_->bad_messages_received_count_);
172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Script and scope have different hosts
174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SendRegister(kProviderId,
1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               GURL("https://foo.example.com/"),
176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               GURL("https://foo.example.com/bar"));
177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(5, dispatcher_host_->bad_messages_received_count_);
178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Script and scope URLs are invalid
180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SendRegister(kProviderId,
181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               GURL(),
182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               GURL("h@ttps://@"));
183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(6, dispatcher_host_->bad_messages_received_count_);
1846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
1856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
186116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ServiceWorkerDispatcherHostTest, Unregister_SameOrigin) {
1876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  const int64 kProviderId = 99;  // Dummy value
1886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  scoped_ptr<ServiceWorkerProviderHost> host(new ServiceWorkerProviderHost(
1896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      kRenderProcessId, kProviderId, context()->AsWeakPtr(), NULL));
1906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  host->SetDocumentUrl(GURL("http://www.example.com/foo"));
1916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  base::WeakPtr<ServiceWorkerProviderHost> provider_host = host->AsWeakPtr();
1926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  context()->AddProviderHost(host.Pass());
1936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  Unregister(kProviderId,
1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)             GURL("http://www.example.com/"),
1966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)             ServiceWorkerMsg_ServiceWorkerUnregistered::ID);
1976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
1986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
199116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ServiceWorkerDispatcherHostTest, Unregister_CrossOrigin) {
200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const int64 kProviderId = 99;  // Dummy value
201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<ServiceWorkerProviderHost> host(new ServiceWorkerProviderHost(
202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      kRenderProcessId, kProviderId, context()->AsWeakPtr(), NULL));
203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  host->SetDocumentUrl(GURL("http://www.example.com/foo"));
204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::WeakPtr<ServiceWorkerProviderHost> provider_host = host->AsWeakPtr();
205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  context()->AddProviderHost(host.Pass());
206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  SendUnregister(kProviderId, GURL("http://foo.example.com/"));
208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(1, dispatcher_host_->bad_messages_received_count_);
209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(ServiceWorkerDispatcherHostTest, EarlyContextDeletion) {
2125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  helper_->ShutdownContext();
213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Let the shutdown reach the simulated IO thread.
215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  Register(-1,
218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch           GURL(),
219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch           GURL(),
220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch           ServiceWorkerMsg_ServiceWorkerRegistrationError::ID);
221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(ServiceWorkerDispatcherHostTest, ProviderCreatedAndDestroyed) {
224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const int kProviderId = 1001;  // Test with a value != kRenderProcessId.
225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  dispatcher_host_->OnMessageReceived(
227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ServiceWorkerHostMsg_ProviderCreated(kProviderId));
228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(context()->GetProviderHost(kRenderProcessId, kProviderId));
229f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Two with the same ID should be seen as a bad message.
2316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  dispatcher_host_->OnMessageReceived(
232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ServiceWorkerHostMsg_ProviderCreated(kProviderId));
2336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  EXPECT_EQ(1, dispatcher_host_->bad_messages_received_count_);
234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  dispatcher_host_->OnMessageReceived(
236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ServiceWorkerHostMsg_ProviderDestroyed(kProviderId));
237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(context()->GetProviderHost(kRenderProcessId, kProviderId));
238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
239f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Destroying an ID that does not exist warrants a bad message.
2406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  dispatcher_host_->OnMessageReceived(
241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ServiceWorkerHostMsg_ProviderDestroyed(kProviderId));
2426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  EXPECT_EQ(2, dispatcher_host_->bad_messages_received_count_);
243f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Deletion of the dispatcher_host should cause providers for that
245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // process to get deleted as well.
2466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  dispatcher_host_->OnMessageReceived(
247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ServiceWorkerHostMsg_ProviderCreated(kProviderId));
248f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(context()->GetProviderHost(kRenderProcessId, kProviderId));
2496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  EXPECT_TRUE(dispatcher_host_->HasOneRef());
2506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  dispatcher_host_ = NULL;
251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(context()->GetProviderHost(kRenderProcessId, kProviderId));
252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
253f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(ServiceWorkerDispatcherHostTest, GetRegistration_SameOrigin) {
2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const int64 kProviderId = 99;  // Dummy value
2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<ServiceWorkerProviderHost> host(new ServiceWorkerProviderHost(
2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      kRenderProcessId, kProviderId, context()->AsWeakPtr(), NULL));
2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  host->SetDocumentUrl(GURL("https://www.example.com/foo"));
2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::WeakPtr<ServiceWorkerProviderHost> provider_host = host->AsWeakPtr();
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  context()->AddProviderHost(host.Pass());
2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GetRegistration(kProviderId,
2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                  GURL("https://www.example.com/"),
2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                  ServiceWorkerMsg_DidGetRegistration::ID);
2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(ServiceWorkerDispatcherHostTest, GetRegistration_CrossOrigin) {
2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const int64 kProviderId = 99;  // Dummy value
2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<ServiceWorkerProviderHost> host(new ServiceWorkerProviderHost(
2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      kRenderProcessId, kProviderId, context()->AsWeakPtr(), NULL));
2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  host->SetDocumentUrl(GURL("https://www.example.com/foo"));
2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::WeakPtr<ServiceWorkerProviderHost> provider_host = host->AsWeakPtr();
2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  context()->AddProviderHost(host.Pass());
2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SendGetRegistration(kProviderId, GURL("https://foo.example.com/"));
2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, dispatcher_host_->bad_messages_received_count_);
2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(ServiceWorkerDispatcherHostTest, GetRegistration_EarlyContextDeletion) {
2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  helper_->ShutdownContext();
2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Let the shutdown reach the simulated IO thread.
2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::RunLoop().RunUntilIdle();
2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GetRegistration(-1,
2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                  GURL(),
2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                  ServiceWorkerMsg_ServiceWorkerGetRegistrationError::ID);
2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
290f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace content
291