1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "extensions/browser/runtime_data.h" 6 7 #include <string> 8 9 #include "base/memory/ref_counted.h" 10 #include "extensions/browser/extension_registry.h" 11 #include "extensions/common/extension.h" 12 #include "extensions/common/extension_builder.h" 13 #include "extensions/common/test_util.h" 14 #include "extensions/common/value_builder.h" 15 #include "testing/gtest/include/gtest/gtest.h" 16 17 namespace extensions { 18 namespace { 19 20 // Creates a very simple extension with a background page. 21 scoped_refptr<Extension> CreateExtensionWithBackgroundPage() { 22 return ExtensionBuilder() 23 .SetManifest( 24 DictionaryBuilder() 25 .Set("name", "test") 26 .Set("version", "0.1") 27 .Set("background", DictionaryBuilder().Set("page", "bg.html"))) 28 .SetID("id2") 29 .Build(); 30 } 31 32 class RuntimeDataTest : public testing::Test { 33 public: 34 RuntimeDataTest() : registry_(NULL), runtime_data_(®istry_) {} 35 virtual ~RuntimeDataTest() {} 36 37 protected: 38 ExtensionRegistry registry_; 39 RuntimeData runtime_data_; 40 41 private: 42 DISALLOW_COPY_AND_ASSIGN(RuntimeDataTest); 43 }; 44 45 TEST_F(RuntimeDataTest, IsBackgroundPageReady) { 46 // An extension without a background page is always considered ready. 47 scoped_refptr<Extension> no_background = test_util::CreateEmptyExtension(); 48 EXPECT_TRUE(runtime_data_.IsBackgroundPageReady(no_background.get())); 49 50 // An extension with a background page is not ready until the flag is set. 51 scoped_refptr<Extension> with_background = 52 CreateExtensionWithBackgroundPage(); 53 EXPECT_FALSE(runtime_data_.IsBackgroundPageReady(with_background.get())); 54 55 // The flag can be toggled. 56 runtime_data_.SetBackgroundPageReady(with_background.get(), true); 57 EXPECT_TRUE(runtime_data_.IsBackgroundPageReady(with_background.get())); 58 runtime_data_.SetBackgroundPageReady(with_background.get(), false); 59 EXPECT_FALSE(runtime_data_.IsBackgroundPageReady(with_background.get())); 60 } 61 62 TEST_F(RuntimeDataTest, IsBeingUpgraded) { 63 scoped_refptr<Extension> extension = test_util::CreateEmptyExtension(); 64 65 // An extension is not being upgraded until the flag is set. 66 EXPECT_FALSE(runtime_data_.IsBeingUpgraded(extension.get())); 67 68 // The flag can be toggled. 69 runtime_data_.SetBeingUpgraded(extension.get(), true); 70 EXPECT_TRUE(runtime_data_.IsBeingUpgraded(extension.get())); 71 runtime_data_.SetBeingUpgraded(extension.get(), false); 72 EXPECT_FALSE(runtime_data_.IsBeingUpgraded(extension.get())); 73 } 74 75 TEST_F(RuntimeDataTest, HasUsedWebRequest) { 76 scoped_refptr<Extension> extension = test_util::CreateEmptyExtension(); 77 78 // An extension has not used web request until the flag is set. 79 EXPECT_FALSE(runtime_data_.HasUsedWebRequest(extension.get())); 80 81 // The flag can be toggled. 82 runtime_data_.SetHasUsedWebRequest(extension.get(), true); 83 EXPECT_TRUE(runtime_data_.HasUsedWebRequest(extension.get())); 84 runtime_data_.SetHasUsedWebRequest(extension.get(), false); 85 EXPECT_FALSE(runtime_data_.HasUsedWebRequest(extension.get())); 86 } 87 88 // Unloading an extension stops tracking it. 89 TEST_F(RuntimeDataTest, OnExtensionUnloaded) { 90 scoped_refptr<Extension> extension = CreateExtensionWithBackgroundPage(); 91 runtime_data_.SetBackgroundPageReady(extension.get(), true); 92 ASSERT_TRUE(runtime_data_.HasExtensionForTesting(extension.get())); 93 94 runtime_data_.OnExtensionUnloaded( 95 NULL, extension.get(), UnloadedExtensionInfo::REASON_DISABLE); 96 EXPECT_FALSE(runtime_data_.HasExtensionForTesting(extension.get())); 97 } 98 99 } // namespace 100 } // namespace extensions 101