• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/extension_warning_service.h"
6 
7 #include "chrome/browser/profiles/profile.h"
8 #include "chrome/browser/ui/global_error/global_error_service.h"
9 #include "chrome/browser/ui/global_error/global_error_service_factory.h"
10 #include "chrome/test/base/testing_profile.h"
11 #include "testing/gmock/include/gmock/gmock.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13 
14 namespace extensions {
15 
16 namespace {
17 
18 class TestExtensionWarningService : public ExtensionWarningService {
19  public:
TestExtensionWarningService(Profile * profile)20   explicit TestExtensionWarningService(Profile* profile)
21       : ExtensionWarningService(profile) {
22   }
~TestExtensionWarningService()23   virtual ~TestExtensionWarningService() {}
24 
AddWarning(const ExtensionWarning & warning)25   void AddWarning(const ExtensionWarning& warning) {
26     ExtensionWarningSet warnings;
27     warnings.insert(warning);
28     AddWarnings(warnings);
29   }
30 };
31 
32 class MockObserver : public ExtensionWarningService::Observer {
33  public:
~MockObserver()34   virtual ~MockObserver() {}
35   MOCK_METHOD0(ExtensionWarningsChanged, void());
36 };
37 
38 const char* ext1_id = "extension1";
39 const char* ext2_id = "extension2";
40 const ExtensionWarning::WarningType warning_1 =
41     ExtensionWarning::kNetworkDelay;
42 const ExtensionWarning::WarningType warning_2 =
43     ExtensionWarning::kNetworkConflict;
44 
45 }  // namespace
46 
47 // Check that inserting a warning triggers notifications, whereas inserting
48 // the same warning again is silent.
TEST(ExtensionWarningServiceTest,SetWarning)49 TEST(ExtensionWarningServiceTest, SetWarning) {
50   TestingProfile profile;
51   TestExtensionWarningService warning_service(&profile);
52   MockObserver observer;
53   warning_service.AddObserver(&observer);
54 
55   // Insert warning for the first time.
56   EXPECT_CALL(observer, ExtensionWarningsChanged());
57   warning_service.AddWarning(
58       ExtensionWarning::CreateNetworkDelayWarning(ext1_id));
59   testing::Mock::VerifyAndClearExpectations(&warning_service);
60 
61   // Second insertion of same warning does not trigger anything.
62   warning_service.AddWarning(
63       ExtensionWarning::CreateNetworkDelayWarning(ext1_id));
64   testing::Mock::VerifyAndClearExpectations(&warning_service);
65 
66   warning_service.RemoveObserver(&observer);
67 }
68 
69 // Check that ClearWarnings deletes exactly the specified warnings and
70 // triggers notifications where appropriate.
TEST(ExtensionWarningServiceTest,ClearWarnings)71 TEST(ExtensionWarningServiceTest, ClearWarnings) {
72   TestingProfile profile;
73   TestExtensionWarningService warning_service(&profile);
74   MockObserver observer;
75   warning_service.AddObserver(&observer);
76 
77   // Insert two unique warnings in one batch.
78   EXPECT_CALL(observer, ExtensionWarningsChanged());
79   ExtensionWarningSet warning_set;
80   warning_set.insert(ExtensionWarning::CreateNetworkDelayWarning(ext1_id));
81   warning_set.insert(ExtensionWarning::CreateNetworkConflictWarning(ext2_id));
82   warning_service.AddWarnings(warning_set);
83   testing::Mock::VerifyAndClearExpectations(&warning_service);
84 
85   // Remove one warning and check that the badge remains.
86   EXPECT_CALL(observer, ExtensionWarningsChanged());
87   std::set<ExtensionWarning::WarningType> to_clear;
88   to_clear.insert(warning_2);
89   warning_service.ClearWarnings(to_clear);
90   testing::Mock::VerifyAndClearExpectations(&warning_service);
91 
92   // Check that the correct warnings appear in |warnings|.
93   std::set<ExtensionWarning::WarningType> existing_warnings =
94       warning_service.GetWarningTypesAffectingExtension(ext1_id);
95   EXPECT_EQ(1u, existing_warnings.size());
96   existing_warnings =
97       warning_service.GetWarningTypesAffectingExtension(ext2_id);
98   EXPECT_EQ(0u, existing_warnings.size());
99 
100   // Remove the other one warning.
101   EXPECT_CALL(observer, ExtensionWarningsChanged());
102   to_clear.insert(warning_1);
103   warning_service.ClearWarnings(to_clear);
104   testing::Mock::VerifyAndClearExpectations(&warning_service);
105 
106   // Check that not warnings remain.
107   existing_warnings =
108       warning_service.GetWarningTypesAffectingExtension(ext1_id);
109   EXPECT_EQ(0u, existing_warnings.size());
110   existing_warnings =
111       warning_service.GetWarningTypesAffectingExtension(ext2_id);
112   EXPECT_EQ(0u, existing_warnings.size());
113 
114   warning_service.RemoveObserver(&observer);
115 }
116 
117 }  // namespace extensions
118