Home | History | Annotate | Download | only in declarative
      1 // Copyright (c) 2012 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 "chrome/browser/extensions/api/declarative/initializing_rules_registry.h"
      6 
      7 #include <algorithm>
      8 
      9 #include "base/message_loop/message_loop.h"
     10 #include "chrome/browser/extensions/api/declarative/test_rules_registry.h"
     11 #include "content/public/test/test_browser_thread.h"
     12 #include "testing/gtest/include/gtest/gtest.h"
     13 
     14 namespace {
     15 const char kExtensionId[] = "foobar";
     16 const char kRuleId[] = "foo";
     17 }  // namespace
     18 
     19 namespace extensions {
     20 
     21 TEST(InitializingRulesRegistryTest, FillOptionalIdentifiers) {
     22   base::MessageLoopForUI message_loop;
     23   content::TestBrowserThread thread(content::BrowserThread::UI, &message_loop);
     24 
     25   std::string error;
     26   scoped_refptr<RulesRegistry> registry = new InitializingRulesRegistry(
     27       new TestRulesRegistry(content::BrowserThread::UI, "" /*event_name*/));
     28   InitializingRulesRegistry* init_registry =
     29       static_cast<InitializingRulesRegistry*>(registry.get());
     30 
     31   // Add rules and check that their identifiers are filled and unique.
     32 
     33   std::vector<linked_ptr<RulesRegistry::Rule> > add_rules;
     34   add_rules.push_back(make_linked_ptr(new RulesRegistry::Rule));
     35   add_rules.push_back(make_linked_ptr(new RulesRegistry::Rule));
     36   error = registry->AddRules(kExtensionId, add_rules);
     37   EXPECT_TRUE(error.empty());
     38 
     39   std::vector<linked_ptr<RulesRegistry::Rule> > get_rules;
     40   error = registry->GetAllRules(kExtensionId, &get_rules);
     41   EXPECT_TRUE(error.empty());
     42 
     43   ASSERT_EQ(2u, get_rules.size());
     44 
     45   ASSERT_TRUE(get_rules[0]->id.get());
     46   EXPECT_NE("", *get_rules[0]->id);
     47 
     48   ASSERT_TRUE(get_rules[1]->id.get());
     49   EXPECT_NE("", *get_rules[1]->id);
     50 
     51   EXPECT_NE(*get_rules[0]->id, *get_rules[1]->id);
     52 
     53   EXPECT_EQ(1u /*extensions*/ + 2u /*rules*/,
     54             init_registry->GetNumberOfUsedRuleIdentifiersForTesting());
     55 
     56   // Check that we cannot add a new rule with the same ID.
     57 
     58   std::vector<linked_ptr<RulesRegistry::Rule> > add_rules_2;
     59   add_rules_2.push_back(make_linked_ptr(new RulesRegistry::Rule));
     60   add_rules_2[0]->id.reset(new std::string(*get_rules[0]->id));
     61   error = registry->AddRules(kExtensionId, add_rules_2);
     62   EXPECT_FALSE(error.empty());
     63 
     64   std::vector<linked_ptr<RulesRegistry::Rule> > get_rules_2;
     65   error = registry->GetAllRules(kExtensionId, &get_rules_2);
     66   EXPECT_TRUE(error.empty());
     67   ASSERT_EQ(2u, get_rules_2.size());
     68   EXPECT_EQ(1u /*extensions*/ + 2u /*rules*/,
     69             init_registry->GetNumberOfUsedRuleIdentifiersForTesting());
     70 
     71   // Check that we can register the old rule IDs once they were unregistered.
     72 
     73   std::vector<std::string> remove_rules_3;
     74   remove_rules_3.push_back(*get_rules[0]->id);
     75   error = registry->RemoveRules(kExtensionId, remove_rules_3);
     76   EXPECT_TRUE(error.empty());
     77 
     78   EXPECT_EQ(1u /*extensions*/ + 1u /*rules*/,
     79             init_registry->GetNumberOfUsedRuleIdentifiersForTesting());
     80 
     81   std::vector<linked_ptr<RulesRegistry::Rule> > get_rules_3a;
     82   error = registry->GetAllRules(kExtensionId, &get_rules_3a);
     83   EXPECT_TRUE(error.empty());
     84   ASSERT_EQ(1u, get_rules_3a.size());
     85 
     86   std::vector<linked_ptr<RulesRegistry::Rule> > add_rules_3;
     87   add_rules_3.push_back(make_linked_ptr(new RulesRegistry::Rule));
     88   add_rules_3[0]->id.reset(new std::string(*get_rules[0]->id));
     89   error = registry->AddRules(kExtensionId, add_rules_3);
     90   EXPECT_TRUE(error.empty());
     91   EXPECT_EQ(1u /*extensions*/ + 2u /*rules*/,
     92             init_registry->GetNumberOfUsedRuleIdentifiersForTesting());
     93 
     94   std::vector<linked_ptr<RulesRegistry::Rule> > get_rules_3b;
     95   error = registry->GetAllRules(kExtensionId, &get_rules_3b);
     96   EXPECT_TRUE(error.empty());
     97   ASSERT_EQ(2u, get_rules_3b.size());
     98 
     99   // Check that we can register a rule with an ID that is not modified.
    100 
    101   error = registry->RemoveAllRules(kExtensionId);
    102   EXPECT_TRUE(error.empty());
    103   EXPECT_EQ(0u /*extensions*/ + 0u /*rules*/,
    104             init_registry->GetNumberOfUsedRuleIdentifiersForTesting());
    105 
    106   std::vector<linked_ptr<RulesRegistry::Rule> > get_rules_4a;
    107   error = registry->GetAllRules(kExtensionId, &get_rules_4a);
    108   EXPECT_TRUE(error.empty());
    109   ASSERT_TRUE(get_rules_4a.empty());
    110 
    111   std::vector<linked_ptr<RulesRegistry::Rule> > add_rules_4;
    112   add_rules_4.push_back(make_linked_ptr(new RulesRegistry::Rule));
    113   add_rules_4[0]->id.reset(new std::string(kRuleId));
    114   error = registry->AddRules(kExtensionId, add_rules_4);
    115   EXPECT_TRUE(error.empty());
    116 
    117   EXPECT_EQ(1u /*extensions*/ + 1u /*rules*/,
    118             init_registry->GetNumberOfUsedRuleIdentifiersForTesting());
    119 
    120   std::vector<linked_ptr<RulesRegistry::Rule> > get_rules_4b;
    121   error = registry->GetAllRules(kExtensionId, &get_rules_4b);
    122   EXPECT_TRUE(error.empty());
    123 
    124   ASSERT_EQ(1u, get_rules_4b.size());
    125 
    126   ASSERT_TRUE(get_rules_4b[0]->id.get());
    127   EXPECT_EQ(kRuleId, *get_rules_4b[0]->id);
    128 
    129   registry->OnExtensionUnloaded(kExtensionId);
    130   EXPECT_EQ(0u /*extensions*/ + 0u /*rules*/,
    131             init_registry->GetNumberOfUsedRuleIdentifiersForTesting());
    132 
    133   // Make sure that deletion traits of registry are executed.
    134   registry = NULL;
    135   message_loop.RunUntilIdle();
    136 }
    137 
    138 TEST(InitializingRulesRegistryTest, FillOptionalPriority) {
    139   base::MessageLoopForUI message_loop;
    140   content::TestBrowserThread thread(content::BrowserThread::UI, &message_loop);
    141 
    142   std::string error;
    143   scoped_refptr<RulesRegistry> registry = new InitializingRulesRegistry(
    144       new TestRulesRegistry(content::BrowserThread::UI, "" /*event_name*/));
    145 
    146   // Add rules and check that their priorities are filled if they are empty.
    147 
    148   std::vector<linked_ptr<RulesRegistry::Rule> > add_rules;
    149   add_rules.push_back(make_linked_ptr(new RulesRegistry::Rule));
    150   add_rules[0]->priority.reset(new int(2));
    151   add_rules.push_back(make_linked_ptr(new RulesRegistry::Rule));
    152   error = registry->AddRules(kExtensionId, add_rules);
    153   EXPECT_TRUE(error.empty());
    154 
    155   std::vector<linked_ptr<RulesRegistry::Rule> > get_rules;
    156   error = registry->GetAllRules(kExtensionId, &get_rules);
    157   EXPECT_TRUE(error.empty());
    158 
    159   ASSERT_EQ(2u, get_rules.size());
    160 
    161   ASSERT_TRUE(get_rules[0]->priority.get());
    162   ASSERT_TRUE(get_rules[1]->priority.get());
    163 
    164   // Verify the precondition so that the following EXPECT_EQ statements work.
    165   EXPECT_GT(InitializingRulesRegistry::DEFAULT_PRIORITY, 2);
    166   EXPECT_EQ(2, std::min(*get_rules[0]->priority, *get_rules[1]->priority));
    167   EXPECT_EQ(InitializingRulesRegistry::DEFAULT_PRIORITY,
    168             std::max(*get_rules[0]->priority, *get_rules[1]->priority));
    169 
    170   // Make sure that deletion traits of registry are executed.
    171   registry = NULL;
    172   message_loop.RunUntilIdle();
    173 }
    174 
    175 }  // namespace extensions
    176