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_badge_service.h"
6
7#include "chrome/app/chrome_command_ids.h"
8#include "chrome/browser/profiles/profile.h"
9#include "chrome/browser/ui/global_error/global_error_service.h"
10#include "chrome/browser/ui/global_error/global_error_service_factory.h"
11#include "chrome/test/base/testing_profile.h"
12#include "extensions/browser/warning_service.h"
13#include "extensions/browser/warning_set.h"
14#include "testing/gtest/include/gtest/gtest.h"
15
16namespace extensions {
17
18namespace {
19
20class TestExtensionWarningSet : public WarningService {
21 public:
22  explicit TestExtensionWarningSet(Profile* profile) : WarningService(profile) {
23  }
24  virtual ~TestExtensionWarningSet() {}
25
26  void AddWarning(const Warning& warning) {
27    WarningSet warnings;
28    warnings.insert(warning);
29    AddWarnings(warnings);
30  }
31};
32
33class TestExtensionWarningBadgeService : public ExtensionWarningBadgeService {
34 public:
35  TestExtensionWarningBadgeService(Profile* profile,
36                                   WarningService* warning_service)
37      : ExtensionWarningBadgeService(profile),
38        warning_service_(warning_service) {}
39  virtual ~TestExtensionWarningBadgeService() {}
40
41  virtual const std::set<Warning>&
42  GetCurrentWarnings() const OVERRIDE {
43    return warning_service_->warnings();
44  }
45
46 private:
47  WarningService* warning_service_;
48};
49
50bool HasBadge(Profile* profile) {
51  GlobalErrorService* service =
52      GlobalErrorServiceFactory::GetForProfile(profile);
53  return service->GetGlobalErrorByMenuItemCommandID(IDC_EXTENSION_ERRORS) !=
54      NULL;
55}
56
57const char* ext1_id = "extension1";
58const char* ext2_id = "extension2";
59
60}  // namespace
61
62// Check that no badge appears if it has been suppressed for a specific
63// warning.
64TEST(ExtensionWarningBadgeServiceTest, SuppressBadgeForCurrentWarnings) {
65  TestingProfile profile;
66  TestExtensionWarningSet warnings(&profile);
67  TestExtensionWarningBadgeService badge_service(&profile, &warnings);
68  warnings.AddObserver(&badge_service);
69
70  // Insert first warning.
71  warnings.AddWarning(Warning::CreateNetworkDelayWarning(ext1_id));
72  EXPECT_TRUE(HasBadge(&profile));
73
74  // Suppress first warning.
75  badge_service.SuppressCurrentWarnings();
76  EXPECT_FALSE(HasBadge(&profile));
77
78  // Simulate deinstallation of extension.
79  std::set<Warning::WarningType> to_clear =
80      warnings.GetWarningTypesAffectingExtension(ext1_id);
81  warnings.ClearWarnings(to_clear);
82  EXPECT_FALSE(HasBadge(&profile));
83
84  // Set first warning again and verify that not badge is shown this time.
85  warnings.AddWarning(Warning::CreateNetworkDelayWarning(ext1_id));
86  EXPECT_FALSE(HasBadge(&profile));
87
88  // Set second warning and verify that it shows a badge.
89  warnings.AddWarning(Warning::CreateNetworkConflictWarning(ext2_id));
90  EXPECT_TRUE(HasBadge(&profile));
91
92  warnings.RemoveObserver(&badge_service);
93}
94
95}   // namespace extensions
96