service_worker_registration_unittest.cc revision 6e8cce623b6e4fe0c9e4af605d675dd9d0338c38
1f2477e01787aa58f445919b809d89e252beef54fTorne (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_registration.h"
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/logging.h"
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/message_loop/message_loop.h"
10010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/run_loop.h"
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/browser/browser_thread_impl.h"
12c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/browser/service_worker/service_worker_context_core.h"
136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/browser/service_worker/service_worker_registration_handle.h"
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "url/gurl.h"
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace content {
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class ServiceWorkerRegistrationTest : public testing::Test {
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public:
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ServiceWorkerRegistrationTest()
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      : io_thread_(BrowserThread::IO, &message_loop_) {}
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void SetUp() OVERRIDE {
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    context_.reset(
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        new ServiceWorkerContextCore(base::FilePath(),
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     base::MessageLoopProxy::current(),
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     base::MessageLoopProxy::current(),
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     base::MessageLoopProxy::current(),
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     NULL,
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     NULL,
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     NULL));
33c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    context_ptr_ = context_->AsWeakPtr();
34c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void TearDown() OVERRIDE {
37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    context_.reset();
38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    base::RunLoop().RunUntilIdle();
39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  class RegistrationListener : public ServiceWorkerRegistration::Listener {
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)   public:
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    RegistrationListener() {}
446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ~RegistrationListener() {
456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      if (observed_registration_)
466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        observed_registration_->RemoveListener(this);
476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    virtual void OnVersionAttributesChanged(
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        ServiceWorkerRegistration* registration,
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        ChangedVersionAttributesMask changed_mask,
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        const ServiceWorkerRegistrationInfo& info) OVERRIDE {
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      observed_registration_ = registration;
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      observed_changed_mask_ = changed_mask;
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      observed_info_ = info;
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    virtual void OnRegistrationFailed(
596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        ServiceWorkerRegistration* registration) OVERRIDE {
606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      NOTREACHED();
616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    void Reset() {
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      observed_registration_ = NULL;
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      observed_changed_mask_ = ChangedVersionAttributesMask();
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      observed_info_ = ServiceWorkerRegistrationInfo();
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    scoped_refptr<ServiceWorkerRegistration> observed_registration_;
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ChangedVersionAttributesMask observed_changed_mask_;
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ServiceWorkerRegistrationInfo observed_info_;
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  };
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) protected:
75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_ptr<ServiceWorkerContextCore> context_;
76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  base::WeakPtr<ServiceWorkerContextCore> context_ptr_;
77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::MessageLoopForIO message_loop_;
78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  BrowserThreadImpl io_thread_;
79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ServiceWorkerRegistrationTest, SetAndUnsetVersions) {
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const GURL kScope("http://www.example.not/");
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const GURL kScript("http://www.example.not/service_worker.js");
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int64 kRegistrationId = 1L;
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_refptr<ServiceWorkerRegistration> registration =
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      new ServiceWorkerRegistration(
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          kScope,
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          kScript,
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          kRegistrationId,
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          context_ptr_);
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const int64 version_1_id = 1L;
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const int64 version_2_id = 2L;
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_refptr<ServiceWorkerVersion> version_1 =
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      new ServiceWorkerVersion(registration, version_1_id, context_ptr_);
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_refptr<ServiceWorkerVersion> version_2 =
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      new ServiceWorkerVersion(registration, version_2_id, context_ptr_);
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RegistrationListener listener;
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  registration->AddListener(&listener);
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  registration->SetActiveVersion(version_1);
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(version_1, registration->active_version());
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(registration, listener.observed_registration_);
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(ChangedVersionAttributesMask::ACTIVE_VERSION,
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            listener.observed_changed_mask_.changed());
1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(kScope, listener.observed_info_.pattern);
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(kScript, listener.observed_info_.script_url);
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(version_1_id, listener.observed_info_.active_version.version_id);
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(listener.observed_info_.installing_version.is_null);
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(listener.observed_info_.waiting_version.is_null);
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(listener.observed_info_.controlling_version.is_null);
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  listener.Reset();
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  registration->SetInstallingVersion(version_2);
1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(version_2, registration->installing_version());
1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(ChangedVersionAttributesMask::INSTALLING_VERSION,
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            listener.observed_changed_mask_.changed());
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(version_1_id, listener.observed_info_.active_version.version_id);
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(version_2_id,
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            listener.observed_info_.installing_version.version_id);
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(listener.observed_info_.waiting_version.is_null);
1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(listener.observed_info_.controlling_version.is_null);
1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  listener.Reset();
1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  registration->SetWaitingVersion(version_2);
1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(version_2, registration->waiting_version());
1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(registration->installing_version());
1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(listener.observed_changed_mask_.waiting_changed());
1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(listener.observed_changed_mask_.installing_changed());
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(version_1_id, listener.observed_info_.active_version.version_id);
1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(version_2_id, listener.observed_info_.waiting_version.version_id);
1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(listener.observed_info_.installing_version.is_null);
1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(listener.observed_info_.controlling_version.is_null);
1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  listener.Reset();
1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  registration->UnsetVersion(version_2);
1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(registration->waiting_version());
1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(ChangedVersionAttributesMask::WAITING_VERSION,
1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            listener.observed_changed_mask_.changed());
1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(version_1_id, listener.observed_info_.active_version.version_id);
1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(listener.observed_info_.waiting_version.is_null);
1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(listener.observed_info_.installing_version.is_null);
1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(listener.observed_info_.controlling_version.is_null);
1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(ServiceWorkerRegistrationTest, FailedRegistrationNoCrash) {
1516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  const GURL kScope("http://www.example.not/");
1526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  const GURL kScript("http://www.example.not/service_worker.js");
1536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  int64 kRegistrationId = 1L;
1546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  int kProviderId = 1;
1556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  scoped_refptr<ServiceWorkerRegistration> registration =
1566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      new ServiceWorkerRegistration(
1576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          kScope,
1586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          kScript,
1596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          kRegistrationId,
1606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          context_ptr_);
1616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  scoped_ptr<ServiceWorkerRegistrationHandle> handle(
1626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      new ServiceWorkerRegistrationHandle(context_ptr_,
1636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                          NULL,
1646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                          kProviderId,
1656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                          registration.get()));
1666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  registration->NotifyRegistrationFailed();
1676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Don't crash when handle gets destructed.
1686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace content
171