// 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_set.h" #include "chrome/browser/extensions/extension_global_error_badge.h" #include "chrome/browser/ui/global_error_service.h" #include "chrome/browser/ui/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 { class MockExtensionWarningSet : public ExtensionWarningSet { public: explicit MockExtensionWarningSet(Profile* profile) : ExtensionWarningSet(profile) { } virtual ~MockExtensionWarningSet() {} MOCK_METHOD0(NotifyWarningsChanged, void()); }; bool HasBadge(Profile* profile) { GlobalErrorService* service = GlobalErrorServiceFactory::GetForProfile(profile); return service->GetGlobalErrorByMenuItemCommandID( ExtensionGlobalErrorBadge::GetMenuItemCommandID()) != NULL; } const char* ext1_id = "extension1"; const char* ext2_id = "extension2"; const ExtensionWarningSet::WarningType warning_1 = ExtensionWarningSet::kNetworkDelay; const ExtensionWarningSet::WarningType warning_2 = ExtensionWarningSet::kNetworkConflict; } // namespace // Check that inserting a warning triggers notifications, whereas inserting // the same warning again is silent. TEST(ExtensionWarningSetTest, SetWarning) { TestingProfile profile; MockExtensionWarningSet warnings(&profile); // Insert warning for the first time. EXPECT_CALL(warnings, NotifyWarningsChanged()); warnings.SetWarning(warning_1, ext1_id); testing::Mock::VerifyAndClearExpectations(&warnings); EXPECT_TRUE(HasBadge(&profile)); // Second insertion of same warning does not trigger anything. warnings.SetWarning(warning_1, ext1_id); testing::Mock::VerifyAndClearExpectations(&warnings); } // Check that ClearWarnings deletes exactly the specified warnings and // triggers notifications where appropriate. TEST(ExtensionWarningSetTest, ClearWarnings) { TestingProfile profile; MockExtensionWarningSet warnings(&profile); // Insert two unique warnings. EXPECT_CALL(warnings, NotifyWarningsChanged()).Times(2); warnings.SetWarning(warning_1, ext1_id); warnings.SetWarning(warning_2, ext2_id); testing::Mock::VerifyAndClearExpectations(&warnings); EXPECT_TRUE(HasBadge(&profile)); // Remove one warning and check that the badge remains. EXPECT_CALL(warnings, NotifyWarningsChanged()); std::set to_clear; to_clear.insert(warning_2); warnings.ClearWarnings(to_clear); testing::Mock::VerifyAndClearExpectations(&warnings); EXPECT_TRUE(HasBadge(&profile)); // Check that the correct warnings appear in |warnings|. std::set existing_warnings; warnings.GetWarningsAffectingExtension(ext1_id, &existing_warnings); EXPECT_EQ(1u, existing_warnings.size()); warnings.GetWarningsAffectingExtension(ext2_id, &existing_warnings); EXPECT_EQ(0u, existing_warnings.size()); // Remove the other one warning and check that badge disappears. EXPECT_CALL(warnings, NotifyWarningsChanged()); to_clear.insert(warning_1); warnings.ClearWarnings(to_clear); testing::Mock::VerifyAndClearExpectations(&warnings); EXPECT_FALSE(HasBadge(&profile)); // Check that not warnings remain. warnings.GetWarningsAffectingExtension(ext1_id, &existing_warnings); EXPECT_EQ(0u, existing_warnings.size()); warnings.GetWarningsAffectingExtension(ext2_id, &existing_warnings); EXPECT_EQ(0u, existing_warnings.size()); } // Check that no badge appears if it has been suppressed for a specific // warning. TEST(ExtensionWarningSetTest, SuppressBadgeForCurrentWarnings) { TestingProfile profile; MockExtensionWarningSet warnings(&profile); // Insert first warning. EXPECT_CALL(warnings, NotifyWarningsChanged()); warnings.SetWarning(warning_1, ext1_id); testing::Mock::VerifyAndClearExpectations(&warnings); EXPECT_TRUE(HasBadge(&profile)); // Suppress first warning. warnings.SuppressBadgeForCurrentWarnings(); testing::Mock::VerifyAndClearExpectations(&warnings); EXPECT_FALSE(HasBadge(&profile)); // Simulate deinstallation of extension. std::set to_clear; warnings.GetWarningsAffectingExtension(ext1_id, &to_clear); EXPECT_CALL(warnings, NotifyWarningsChanged()); warnings.ClearWarnings(to_clear); testing::Mock::VerifyAndClearExpectations(&warnings); // Set first warning again and verify that not badge is shown this time. EXPECT_CALL(warnings, NotifyWarningsChanged()); warnings.SetWarning(warning_1, ext1_id); testing::Mock::VerifyAndClearExpectations(&warnings); EXPECT_FALSE(HasBadge(&profile)); // Set second warning and verify that it shows a badge. EXPECT_CALL(warnings, NotifyWarningsChanged()); warnings.SetWarning(warning_2, ext2_id); testing::Mock::VerifyAndClearExpectations(&warnings); EXPECT_TRUE(HasBadge(&profile)); }