|  | // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "chrome/browser/extensions/extension_warning_service.h" | 
|  |  | 
|  | #include "chrome/browser/profiles/profile.h" | 
|  | #include "chrome/browser/ui/global_error/global_error_service.h" | 
|  | #include "chrome/browser/ui/global_error/global_error_service_factory.h" | 
|  | #include "chrome/test/base/testing_profile.h" | 
|  | #include "testing/gmock/include/gmock/gmock.h" | 
|  | #include "testing/gtest/include/gtest/gtest.h" | 
|  |  | 
|  | namespace extensions { | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | class TestExtensionWarningService : public ExtensionWarningService { | 
|  | public: | 
|  | explicit TestExtensionWarningService(Profile* profile) | 
|  | : ExtensionWarningService(profile) { | 
|  | } | 
|  | virtual ~TestExtensionWarningService() {} | 
|  |  | 
|  | void AddWarning(const ExtensionWarning& warning) { | 
|  | ExtensionWarningSet warnings; | 
|  | warnings.insert(warning); | 
|  | AddWarnings(warnings); | 
|  | } | 
|  | }; | 
|  |  | 
|  | class MockObserver : public ExtensionWarningService::Observer { | 
|  | public: | 
|  | virtual ~MockObserver() {} | 
|  | MOCK_METHOD0(ExtensionWarningsChanged, void()); | 
|  | }; | 
|  |  | 
|  | const char* ext1_id = "extension1"; | 
|  | const char* ext2_id = "extension2"; | 
|  | const ExtensionWarning::WarningType warning_1 = | 
|  | ExtensionWarning::kNetworkDelay; | 
|  | const ExtensionWarning::WarningType warning_2 = | 
|  | ExtensionWarning::kNetworkConflict; | 
|  |  | 
|  | }  // namespace | 
|  |  | 
|  | // Check that inserting a warning triggers notifications, whereas inserting | 
|  | // the same warning again is silent. | 
|  | TEST(ExtensionWarningServiceTest, SetWarning) { | 
|  | TestingProfile profile; | 
|  | TestExtensionWarningService warning_service(&profile); | 
|  | MockObserver observer; | 
|  | warning_service.AddObserver(&observer); | 
|  |  | 
|  | // Insert warning for the first time. | 
|  | EXPECT_CALL(observer, ExtensionWarningsChanged()); | 
|  | warning_service.AddWarning( | 
|  | ExtensionWarning::CreateNetworkDelayWarning(ext1_id)); | 
|  | testing::Mock::VerifyAndClearExpectations(&warning_service); | 
|  |  | 
|  | // Second insertion of same warning does not trigger anything. | 
|  | warning_service.AddWarning( | 
|  | ExtensionWarning::CreateNetworkDelayWarning(ext1_id)); | 
|  | testing::Mock::VerifyAndClearExpectations(&warning_service); | 
|  |  | 
|  | warning_service.RemoveObserver(&observer); | 
|  | } | 
|  |  | 
|  | // Check that ClearWarnings deletes exactly the specified warnings and | 
|  | // triggers notifications where appropriate. | 
|  | TEST(ExtensionWarningServiceTest, ClearWarnings) { | 
|  | TestingProfile profile; | 
|  | TestExtensionWarningService warning_service(&profile); | 
|  | MockObserver observer; | 
|  | warning_service.AddObserver(&observer); | 
|  |  | 
|  | // Insert two unique warnings in one batch. | 
|  | EXPECT_CALL(observer, ExtensionWarningsChanged()); | 
|  | ExtensionWarningSet warning_set; | 
|  | warning_set.insert(ExtensionWarning::CreateNetworkDelayWarning(ext1_id)); | 
|  | warning_set.insert(ExtensionWarning::CreateNetworkConflictWarning(ext2_id)); | 
|  | warning_service.AddWarnings(warning_set); | 
|  | testing::Mock::VerifyAndClearExpectations(&warning_service); | 
|  |  | 
|  | // Remove one warning and check that the badge remains. | 
|  | EXPECT_CALL(observer, ExtensionWarningsChanged()); | 
|  | std::set<ExtensionWarning::WarningType> to_clear; | 
|  | to_clear.insert(warning_2); | 
|  | warning_service.ClearWarnings(to_clear); | 
|  | testing::Mock::VerifyAndClearExpectations(&warning_service); | 
|  |  | 
|  | // Check that the correct warnings appear in |warnings|. | 
|  | std::set<ExtensionWarning::WarningType> existing_warnings = | 
|  | warning_service.GetWarningTypesAffectingExtension(ext1_id); | 
|  | EXPECT_EQ(1u, existing_warnings.size()); | 
|  | existing_warnings = | 
|  | warning_service.GetWarningTypesAffectingExtension(ext2_id); | 
|  | EXPECT_EQ(0u, existing_warnings.size()); | 
|  |  | 
|  | // Remove the other one warning. | 
|  | EXPECT_CALL(observer, ExtensionWarningsChanged()); | 
|  | to_clear.insert(warning_1); | 
|  | warning_service.ClearWarnings(to_clear); | 
|  | testing::Mock::VerifyAndClearExpectations(&warning_service); | 
|  |  | 
|  | // Check that not warnings remain. | 
|  | existing_warnings = | 
|  | warning_service.GetWarningTypesAffectingExtension(ext1_id); | 
|  | EXPECT_EQ(0u, existing_warnings.size()); | 
|  | existing_warnings = | 
|  | warning_service.GetWarningTypesAffectingExtension(ext2_id); | 
|  | EXPECT_EQ(0u, existing_warnings.size()); | 
|  |  | 
|  | warning_service.RemoveObserver(&observer); | 
|  | } | 
|  |  | 
|  | }  // namespace extensions |