service_worker_registration_unittest.cc revision 5f1c94371a64b3196d4be9466099bb892df9b88e
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"
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "url/gurl.h"
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace content {
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class ServiceWorkerRegistrationTest : public testing::Test {
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public:
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ServiceWorkerRegistrationTest()
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      : io_thread_(BrowserThread::IO, &message_loop_) {}
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
23c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void SetUp() OVERRIDE {
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    context_.reset(
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        new ServiceWorkerContextCore(base::FilePath(),
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     base::MessageLoopProxy::current(),
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     base::MessageLoopProxy::current(),
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     base::MessageLoopProxy::current(),
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     NULL,
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     NULL,
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     NULL));
32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    context_ptr_ = context_->AsWeakPtr();
33c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void TearDown() OVERRIDE {
36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    context_.reset();
37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    base::RunLoop().RunUntilIdle();
38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  class RegistrationListener : public ServiceWorkerRegistration::Listener {
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)   public:
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    RegistrationListener() {}
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ~RegistrationListener() {}
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    virtual void OnVersionAttributesChanged(
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        ServiceWorkerRegistration* registration,
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        ChangedVersionAttributesMask changed_mask,
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        const ServiceWorkerRegistrationInfo& info) OVERRIDE {
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      observed_registration_ = registration;
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      observed_changed_mask_ = changed_mask;
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      observed_info_ = info;
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    void Reset() {
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      observed_registration_ = NULL;
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      observed_changed_mask_ = ChangedVersionAttributesMask();
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      observed_info_ = ServiceWorkerRegistrationInfo();
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    scoped_refptr<ServiceWorkerRegistration> observed_registration_;
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ChangedVersionAttributesMask observed_changed_mask_;
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ServiceWorkerRegistrationInfo observed_info_;
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  };
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) protected:
66c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_ptr<ServiceWorkerContextCore> context_;
67c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  base::WeakPtr<ServiceWorkerContextCore> context_ptr_;
68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::MessageLoopForIO message_loop_;
69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  BrowserThreadImpl io_thread_;
70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ServiceWorkerRegistrationTest, SetAndUnsetVersions) {
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const GURL kScope("http://www.example.not/");
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const GURL kScript("http://www.example.not/service_worker.js");
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int64 kRegistrationId = 1L;
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_refptr<ServiceWorkerRegistration> registration =
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      new ServiceWorkerRegistration(
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          kScope,
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          kScript,
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          kRegistrationId,
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          context_ptr_);
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const int64 version_1_id = 1L;
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const int64 version_2_id = 2L;
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_refptr<ServiceWorkerVersion> version_1 =
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      new ServiceWorkerVersion(registration, version_1_id, context_ptr_);
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_refptr<ServiceWorkerVersion> version_2 =
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      new ServiceWorkerVersion(registration, version_2_id, context_ptr_);
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RegistrationListener listener;
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  registration->AddListener(&listener);
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  registration->SetActiveVersion(version_1);
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(version_1, registration->active_version());
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(registration, listener.observed_registration_);
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(ChangedVersionAttributesMask::ACTIVE_VERSION,
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            listener.observed_changed_mask_.changed());
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(kScope, listener.observed_info_.pattern);
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(kScript, listener.observed_info_.script_url);
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(version_1_id, listener.observed_info_.active_version.version_id);
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(listener.observed_info_.installing_version.is_null);
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(listener.observed_info_.waiting_version.is_null);
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(listener.observed_info_.controlling_version.is_null);
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  listener.Reset();
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  registration->SetInstallingVersion(version_2);
1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(version_2, registration->installing_version());
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(ChangedVersionAttributesMask::INSTALLING_VERSION,
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            listener.observed_changed_mask_.changed());
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(version_1_id, listener.observed_info_.active_version.version_id);
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(version_2_id,
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            listener.observed_info_.installing_version.version_id);
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(listener.observed_info_.waiting_version.is_null);
1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(listener.observed_info_.controlling_version.is_null);
1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  listener.Reset();
1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  registration->SetWaitingVersion(version_2);
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(version_2, registration->waiting_version());
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(registration->installing_version());
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(listener.observed_changed_mask_.waiting_changed());
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(listener.observed_changed_mask_.installing_changed());
1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(version_1_id, listener.observed_info_.active_version.version_id);
1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(version_2_id, listener.observed_info_.waiting_version.version_id);
1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(listener.observed_info_.installing_version.is_null);
1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(listener.observed_info_.controlling_version.is_null);
1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  listener.Reset();
1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  registration->UnsetVersion(version_2);
1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(registration->waiting_version());
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(ChangedVersionAttributesMask::WAITING_VERSION,
1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            listener.observed_changed_mask_.changed());
1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(version_1_id, listener.observed_info_.active_version.version_id);
1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(listener.observed_info_.waiting_version.is_null);
1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(listener.observed_info_.installing_version.is_null);
1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(listener.observed_info_.controlling_version.is_null);
1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace content
142