15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2013 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/extension_registry.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <string>
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/ref_counted.h"
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/strings/string_util.h"
11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "extensions/browser/extension_registry_observer.h"
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/browser/uninstall_reason.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/common/test_util.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace extensions {
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace {
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)typedef testing::Test ExtensionRegistryTest;
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochtesting::AssertionResult HasSingleExtension(
22effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const ExtensionList& list,
23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const scoped_refptr<const Extension>& extension) {
24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (list.empty())
25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return testing::AssertionFailure() << "No extensions in list";
26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (list.size() > 1)
27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return testing::AssertionFailure() << list.size()
28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                       << " extensions, expected 1";
29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  const Extension* did_load = list[0].get();
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (did_load != extension.get())
31effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return testing::AssertionFailure() << "Expected " << extension->id()
32effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                       << " found " << did_load->id();
33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return testing::AssertionSuccess();
34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass TestObserver : public ExtensionRegistryObserver {
37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public:
38effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void Reset() {
39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    loaded_.clear();
40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    unloaded_.clear();
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    installed_.clear();
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    uninstalled_.clear();
43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
44effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
45effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  const ExtensionList& loaded() { return loaded_; }
46effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  const ExtensionList& unloaded() { return unloaded_; }
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const ExtensionList& installed() { return installed_; }
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const ExtensionList& uninstalled() { return uninstalled_; }
49effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch private:
51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void OnExtensionLoaded(content::BrowserContext* browser_context,
52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                 const Extension* extension) OVERRIDE {
53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    loaded_.push_back(extension);
54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
56c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void OnExtensionUnloaded(content::BrowserContext* browser_context,
570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                   const Extension* extension,
580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                   UnloadedExtensionInfo::Reason reason)
590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      OVERRIDE {
60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    unloaded_.push_back(extension);
61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
62effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnExtensionWillBeInstalled(
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      content::BrowserContext* browser_context,
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const Extension* extension,
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      bool is_update,
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      bool from_ephemeral,
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const std::string& old_name) OVERRIDE {
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    installed_.push_back(extension);
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void OnExtensionUninstalled(
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      content::BrowserContext* browser_context,
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const Extension* extension,
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::UninstallReason reason) OVERRIDE {
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    uninstalled_.push_back(extension);
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void OnShutdown(extensions::ExtensionRegistry* registry) OVERRIDE {
8046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    Reset();
8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
83effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ExtensionList loaded_;
84effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ExtensionList unloaded_;
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ExtensionList installed_;
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ExtensionList uninstalled_;
87effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch};
88effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ExtensionRegistryTest, FillAndClearRegistry) {
90c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ExtensionRegistry registry(NULL);
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<Extension> extension1 = test_util::CreateEmptyExtension("id1");
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<Extension> extension2 = test_util::CreateEmptyExtension("id2");
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<Extension> extension3 = test_util::CreateEmptyExtension("id3");
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<Extension> extension4 = test_util::CreateEmptyExtension("id4");
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // All the sets start empty.
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0u, registry.enabled_extensions().size());
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0u, registry.disabled_extensions().size());
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0u, registry.terminated_extensions().size());
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0u, registry.blacklisted_extensions().size());
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Extensions can be added to each set.
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  registry.AddEnabled(extension1);
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  registry.AddDisabled(extension2);
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  registry.AddTerminated(extension3);
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  registry.AddBlacklisted(extension4);
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1u, registry.enabled_extensions().size());
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1u, registry.disabled_extensions().size());
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1u, registry.terminated_extensions().size());
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1u, registry.blacklisted_extensions().size());
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Clearing the registry clears all sets.
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  registry.ClearAll();
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0u, registry.enabled_extensions().size());
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0u, registry.disabled_extensions().size());
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0u, registry.terminated_extensions().size());
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0u, registry.blacklisted_extensions().size());
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// A simple test of adding and removing things from sets.
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ExtensionRegistryTest, AddAndRemoveExtensionFromRegistry) {
124c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ExtensionRegistry registry(NULL);
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Adding an extension works.
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<Extension> extension = test_util::CreateEmptyExtension("id");
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(registry.AddEnabled(extension));
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1u, registry.enabled_extensions().size());
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The extension was only added to one set.
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0u, registry.disabled_extensions().size());
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0u, registry.terminated_extensions().size());
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0u, registry.blacklisted_extensions().size());
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Removing an extension works.
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(registry.RemoveEnabled(extension->id()));
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0u, registry.enabled_extensions().size());
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Trying to remove an extension that isn't in the set fails cleanly.
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(registry.RemoveEnabled(extension->id()));
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ExtensionRegistryTest, AddExtensionToRegistryTwice) {
145c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ExtensionRegistry registry(NULL);
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<Extension> extension = test_util::CreateEmptyExtension("id");
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // An extension can exist in two sets at once. It would be nice to eliminate
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // this functionality, but some users of ExtensionRegistry need it.
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(registry.AddEnabled(extension));
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(registry.AddDisabled(extension));
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1u, registry.enabled_extensions().size());
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1u, registry.disabled_extensions().size());
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0u, registry.terminated_extensions().size());
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0u, registry.blacklisted_extensions().size());
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ExtensionRegistryTest, GetExtensionById) {
160c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ExtensionRegistry registry(NULL);
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Trying to get an extension fails cleanly when the sets are empty.
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      registry.GetExtensionById("id", ExtensionRegistry::EVERYTHING));
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<Extension> enabled = test_util::CreateEmptyExtension("enabled");
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<Extension> disabled =
1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      test_util::CreateEmptyExtension("disabled");
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<Extension> terminated =
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      test_util::CreateEmptyExtension("terminated");
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<Extension> blacklisted =
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      test_util::CreateEmptyExtension("blacklisted");
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Add an extension to each set.
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  registry.AddEnabled(enabled);
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  registry.AddDisabled(disabled);
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  registry.AddTerminated(terminated);
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  registry.AddBlacklisted(blacklisted);
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Enabled is part of everything and the enabled list.
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      registry.GetExtensionById("enabled", ExtensionRegistry::EVERYTHING));
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      registry.GetExtensionById("enabled", ExtensionRegistry::ENABLED));
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      registry.GetExtensionById("enabled", ExtensionRegistry::DISABLED));
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      registry.GetExtensionById("enabled", ExtensionRegistry::TERMINATED));
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      registry.GetExtensionById("enabled", ExtensionRegistry::BLACKLISTED));
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Disabled is part of everything and the disabled list.
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      registry.GetExtensionById("disabled", ExtensionRegistry::EVERYTHING));
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      registry.GetExtensionById("disabled", ExtensionRegistry::ENABLED));
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      registry.GetExtensionById("disabled", ExtensionRegistry::DISABLED));
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      registry.GetExtensionById("disabled", ExtensionRegistry::TERMINATED));
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      registry.GetExtensionById("disabled", ExtensionRegistry::BLACKLISTED));
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Terminated is part of everything and the terminated list.
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      registry.GetExtensionById("terminated", ExtensionRegistry::EVERYTHING));
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      registry.GetExtensionById("terminated", ExtensionRegistry::ENABLED));
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      registry.GetExtensionById("terminated", ExtensionRegistry::DISABLED));
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      registry.GetExtensionById("terminated", ExtensionRegistry::TERMINATED));
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      registry.GetExtensionById("terminated", ExtensionRegistry::BLACKLISTED));
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Blacklisted is part of everything and the blacklisted list.
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      registry.GetExtensionById("blacklisted", ExtensionRegistry::EVERYTHING));
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      registry.GetExtensionById("blacklisted", ExtensionRegistry::ENABLED));
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      registry.GetExtensionById("blacklisted", ExtensionRegistry::DISABLED));
2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(
2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      registry.GetExtensionById("blacklisted", ExtensionRegistry::TERMINATED));
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(
2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      registry.GetExtensionById("blacklisted", ExtensionRegistry::BLACKLISTED));
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Enabled can be found with multiple flags set.
2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(registry.GetExtensionById(
2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "enabled", ExtensionRegistry::ENABLED | ExtensionRegistry::TERMINATED));
2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Enabled isn't found if the wrong flags are set.
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(registry.GetExtensionById(
2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "enabled", ExtensionRegistry::DISABLED | ExtensionRegistry::BLACKLISTED));
2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
237effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(ExtensionRegistryTest, Observer) {
238c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ExtensionRegistry registry(NULL);
239effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  TestObserver observer;
240effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  registry.AddObserver(&observer);
241effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
242effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(observer.loaded().empty());
243effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(observer.unloaded().empty());
244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(observer.installed().empty());
245effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
246effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_refptr<const Extension> extension =
2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      test_util::CreateEmptyExtension("id");
248effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  registry.TriggerOnWillBeInstalled(
2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      extension.get(), false, false, base::EmptyString());
251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(HasSingleExtension(observer.installed(), extension.get()));
252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
253effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  registry.AddEnabled(extension);
2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  registry.TriggerOnLoaded(extension.get());
255effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  registry.TriggerOnWillBeInstalled(extension.get(), true, false, "foo");
257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
258effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(HasSingleExtension(observer.loaded(), extension.get()));
259effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(observer.unloaded().empty());
26046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  registry.Shutdown();
261effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
262effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  registry.RemoveEnabled(extension->id());
2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  registry.TriggerOnUnloaded(extension.get(),
2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             UnloadedExtensionInfo::REASON_DISABLE);
265effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
266effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(observer.loaded().empty());
267effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(HasSingleExtension(observer.unloaded(), extension.get()));
26846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  registry.Shutdown();
269effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  registry.TriggerOnUninstalled(extension.get(),
2715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                extensions::UNINSTALL_REASON_FOR_TESTING);
272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(observer.installed().empty());
273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(HasSingleExtension(observer.uninstalled(), extension.get()));
274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
275effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  registry.RemoveObserver(&observer);
276effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
277effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace
2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace extensions
280