1a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// found in the LICENSE file.
4a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
5a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/basictypes.h"
6a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/memory/weak_ptr.h"
703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/thread_task_runner_handle.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/browser/service_worker/embedded_worker_test_helper.h"
9a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "content/browser/service_worker/service_worker_context_core.h"
10a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "content/browser/service_worker/service_worker_provider_host.h"
110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "content/browser/service_worker/service_worker_register_job.h"
12a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "content/browser/service_worker/service_worker_registration.h"
13a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "content/browser/service_worker/service_worker_version.h"
14a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "content/public/test/test_browser_thread_bundle.h"
15a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
16a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
17a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochnamespace content {
18a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
19a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochstatic const int kRenderProcessId = 33;  // Dummy process ID for testing.
20a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
21a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass ServiceWorkerProviderHostTest : public testing::Test {
22a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch protected:
23a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ServiceWorkerProviderHostTest()
24a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      : thread_bundle_(TestBrowserThreadBundle::IO_MAINLOOP) {}
25a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual ~ServiceWorkerProviderHostTest() {}
26a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
27a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual void SetUp() OVERRIDE {
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    helper_.reset(new EmbeddedWorkerTestHelper(kRenderProcessId));
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    context_ = helper_->context();
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    pattern_ = GURL("http://www.example.com/");
310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    script_url_ = GURL("http://www.example.com/service_worker.js");
32a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    registration_ = new ServiceWorkerRegistration(
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        pattern_, 1L, context_->AsWeakPtr());
34a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    version_ = new ServiceWorkerVersion(
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        registration_.get(), script_url_, 1L, context_->AsWeakPtr());
36a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    // Prepare provider hosts (for the same process).
38a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    scoped_ptr<ServiceWorkerProviderHost> host1(new ServiceWorkerProviderHost(
39a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        kRenderProcessId, 1 /* provider_id */,
40a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        context_->AsWeakPtr(), NULL));
41a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    scoped_ptr<ServiceWorkerProviderHost> host2(new ServiceWorkerProviderHost(
42a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        kRenderProcessId, 2 /* provider_id */,
43a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        context_->AsWeakPtr(), NULL));
44a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    provider_host1_ = host1->AsWeakPtr();
45a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    provider_host2_ = host2->AsWeakPtr();
46a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    context_->AddProviderHost(make_scoped_ptr(host1.release()));
47a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    context_->AddProviderHost(make_scoped_ptr(host2.release()));
48a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
49a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
50a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual void TearDown() OVERRIDE {
51a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    version_ = 0;
52a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    registration_ = 0;
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    helper_.reset();
54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
55a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool HasProcessToRun() const {
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return context_->process_manager()->PatternHasProcessToRun(pattern_);
586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
60a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  content::TestBrowserThreadBundle thread_bundle_;
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<EmbeddedWorkerTestHelper> helper_;
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ServiceWorkerContextCore* context_;
63a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  scoped_refptr<ServiceWorkerRegistration> registration_;
64a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  scoped_refptr<ServiceWorkerVersion> version_;
65a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  base::WeakPtr<ServiceWorkerProviderHost> provider_host1_;
66a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  base::WeakPtr<ServiceWorkerProviderHost> provider_host2_;
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GURL pattern_;
680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  GURL script_url_;
69a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
70a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch private:
71a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  DISALLOW_COPY_AND_ASSIGN(ServiceWorkerProviderHostTest);
72a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch};
73a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
74a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(ServiceWorkerProviderHostTest, SetActiveVersion_ProcessStatus) {
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  provider_host1_->AssociateRegistration(registration_.get());
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(HasProcessToRun());
77a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
78a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Associating version_ to a provider_host's active version will internally
79a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // add the provider_host's process ref to the version.
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  registration_->SetActiveVersion(version_.get());
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(HasProcessToRun());
82a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
83a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Re-associating the same version and provider_host should just work too.
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  registration_->SetActiveVersion(version_.get());
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(HasProcessToRun());
86a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
87a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Resetting the provider_host's active version should remove process refs
88a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // from the version.
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  provider_host1_->DisassociateRegistration();
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_FALSE(HasProcessToRun());
91a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
92a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
93a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(ServiceWorkerProviderHostTest,
94a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch       SetActiveVersion_MultipleHostsForSameProcess) {
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  provider_host1_->AssociateRegistration(registration_.get());
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  provider_host2_->AssociateRegistration(registration_.get());
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(HasProcessToRun());
98a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
99a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Associating version_ to two providers as active version.
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  registration_->SetActiveVersion(version_.get());
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(HasProcessToRun());
102a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
103a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Disassociating one provider_host shouldn't remove all process refs
104a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // from the version yet.
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  provider_host1_->DisassociateRegistration();
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(HasProcessToRun());
107a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
108a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Disassociating the other provider_host will remove all process refs.
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  provider_host2_->DisassociateRegistration();
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_FALSE(HasProcessToRun());
111a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
112a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ServiceWorkerProviderHostTest, SetWaitingVersion_ProcessStatus) {
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  provider_host1_->AssociateRegistration(registration_.get());
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(HasProcessToRun());
116a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Associating version_ to a provider_host's waiting version will internally
118a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // add the provider_host's process ref to the version.
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  registration_->SetWaitingVersion(version_.get());
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(HasProcessToRun());
121a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
122a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Re-associating the same version and provider_host should just work too.
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  registration_->SetWaitingVersion(version_.get());
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(HasProcessToRun());
125a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Resetting the provider_host's waiting version should remove process refs
127a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // from the version.
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  provider_host1_->DisassociateRegistration();
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_FALSE(HasProcessToRun());
130a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
131a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
132a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(ServiceWorkerProviderHostTest,
133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)       SetWaitingVersion_MultipleHostsForSameProcess) {
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  provider_host1_->AssociateRegistration(registration_.get());
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  provider_host2_->AssociateRegistration(registration_.get());
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(HasProcessToRun());
137a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Associating version_ to two providers as waiting version.
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  registration_->SetWaitingVersion(version_.get());
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(HasProcessToRun());
141a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
142a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Disassociating one provider_host shouldn't remove all process refs
143a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // from the version yet.
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  provider_host1_->DisassociateRegistration();
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(HasProcessToRun());
146a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
147a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Disassociating the other provider_host will remove all process refs.
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  provider_host2_->DisassociateRegistration();
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_FALSE(HasProcessToRun());
1500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
1510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
152a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}  // namespace content
153