// 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 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 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