15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/runtime_data.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <string>
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/ref_counted.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_registry.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/common/extension.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/common/extension_builder.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/test_util.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/common/value_builder.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace extensions {
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace {
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Creates a very simple extension with a background page.
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_refptr<Extension> CreateExtensionWithBackgroundPage() {
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return ExtensionBuilder()
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      .SetManifest(
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)           DictionaryBuilder()
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)             .Set("name", "test")
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)             .Set("version", "0.1")
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)             .Set("background", DictionaryBuilder().Set("page", "bg.html")))
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      .SetID("id2")
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      .Build();
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class RuntimeDataTest : public testing::Test {
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
34c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  RuntimeDataTest() : registry_(NULL), runtime_data_(&registry_) {}
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~RuntimeDataTest() {}
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected:
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ExtensionRegistry registry_;
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RuntimeData runtime_data_;
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(RuntimeDataTest);
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(RuntimeDataTest, IsBackgroundPageReady) {
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // An extension without a background page is always considered ready.
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<Extension> no_background = test_util::CreateEmptyExtension();
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(runtime_data_.IsBackgroundPageReady(no_background.get()));
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // An extension with a background page is not ready until the flag is set.
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<Extension> with_background =
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      CreateExtensionWithBackgroundPage();
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(runtime_data_.IsBackgroundPageReady(with_background.get()));
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The flag can be toggled.
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  runtime_data_.SetBackgroundPageReady(with_background.get(), true);
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(runtime_data_.IsBackgroundPageReady(with_background.get()));
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  runtime_data_.SetBackgroundPageReady(with_background.get(), false);
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(runtime_data_.IsBackgroundPageReady(with_background.get()));
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(RuntimeDataTest, IsBeingUpgraded) {
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<Extension> extension = test_util::CreateEmptyExtension();
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // An extension is not being upgraded until the flag is set.
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(runtime_data_.IsBeingUpgraded(extension.get()));
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The flag can be toggled.
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  runtime_data_.SetBeingUpgraded(extension.get(), true);
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(runtime_data_.IsBeingUpgraded(extension.get()));
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  runtime_data_.SetBeingUpgraded(extension.get(), false);
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(runtime_data_.IsBeingUpgraded(extension.get()));
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(RuntimeDataTest, HasUsedWebRequest) {
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<Extension> extension = test_util::CreateEmptyExtension();
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // An extension has not used web request until the flag is set.
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(runtime_data_.HasUsedWebRequest(extension.get()));
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The flag can be toggled.
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  runtime_data_.SetHasUsedWebRequest(extension.get(), true);
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(runtime_data_.HasUsedWebRequest(extension.get()));
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  runtime_data_.SetHasUsedWebRequest(extension.get(), false);
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(runtime_data_.HasUsedWebRequest(extension.get()));
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Unloading an extension stops tracking it.
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(RuntimeDataTest, OnExtensionUnloaded) {
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<Extension> extension = CreateExtensionWithBackgroundPage();
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  runtime_data_.SetBackgroundPageReady(extension.get(), true);
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(runtime_data_.HasExtensionForTesting(extension.get()));
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  runtime_data_.OnExtensionUnloaded(
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      NULL, extension.get(), UnloadedExtensionInfo::REASON_DISABLE);
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(runtime_data_.HasExtensionForTesting(extension.get()));
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace extensions
101