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