12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/warning_service.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/test/test_browser_context.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/extensions_test.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extensions {
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass TestWarningService : public WarningService {
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  explicit TestWarningService(content::BrowserContext* browser_context)
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      : WarningService(browser_context) {
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~TestWarningService() {}
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void AddWarning(const Warning& warning) {
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    WarningSet warnings;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    warnings.insert(warning);
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddWarnings(warnings);
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass MockObserver : public WarningService::Observer {
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~MockObserver() {}
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD0(ExtensionWarningsChanged, void());
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef ExtensionsTest WarningServiceTest;
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char* ext1_id = "extension1";
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char* ext2_id = "extension2";
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst Warning::WarningType warning_1 =
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    Warning::kNetworkDelay;
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst Warning::WarningType warning_2 =
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    Warning::kNetworkConflict;
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Check that inserting a warning triggers notifications, whereas inserting
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the same warning again is silent.
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(WarningServiceTest, SetWarning) {
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  content::TestBrowserContext browser_context;
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TestWarningService warning_service(&browser_context);
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockObserver observer;
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  warning_service.AddObserver(&observer);
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Insert warning for the first time.
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(observer, ExtensionWarningsChanged());
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  warning_service.AddWarning(
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      Warning::CreateNetworkDelayWarning(ext1_id));
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  testing::Mock::VerifyAndClearExpectations(&warning_service);
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Second insertion of same warning does not trigger anything.
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  warning_service.AddWarning(
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      Warning::CreateNetworkDelayWarning(ext1_id));
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  testing::Mock::VerifyAndClearExpectations(&warning_service);
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  warning_service.RemoveObserver(&observer);
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Check that ClearWarnings deletes exactly the specified warnings and
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// triggers notifications where appropriate.
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(WarningServiceTest, ClearWarnings) {
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  content::TestBrowserContext browser_context;
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TestWarningService warning_service(&browser_context);
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockObserver observer;
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  warning_service.AddObserver(&observer);
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Insert two unique warnings in one batch.
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(observer, ExtensionWarningsChanged());
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  WarningSet warning_set;
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  warning_set.insert(Warning::CreateNetworkDelayWarning(ext1_id));
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  warning_set.insert(Warning::CreateNetworkConflictWarning(ext2_id));
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  warning_service.AddWarnings(warning_set);
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  testing::Mock::VerifyAndClearExpectations(&warning_service);
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Remove one warning and check that the badge remains.
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(observer, ExtensionWarningsChanged());
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::set<Warning::WarningType> to_clear;
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  to_clear.insert(warning_2);
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  warning_service.ClearWarnings(to_clear);
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  testing::Mock::VerifyAndClearExpectations(&warning_service);
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check that the correct warnings appear in |warnings|.
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::set<Warning::WarningType> existing_warnings =
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      warning_service.GetWarningTypesAffectingExtension(ext1_id);
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, existing_warnings.size());
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  existing_warnings =
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      warning_service.GetWarningTypesAffectingExtension(ext2_id);
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, existing_warnings.size());
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Remove the other one warning.
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(observer, ExtensionWarningsChanged());
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  to_clear.insert(warning_1);
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  warning_service.ClearWarnings(to_clear);
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  testing::Mock::VerifyAndClearExpectations(&warning_service);
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check that not warnings remain.
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  existing_warnings =
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      warning_service.GetWarningTypesAffectingExtension(ext1_id);
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, existing_warnings.size());
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  existing_warnings =
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      warning_service.GetWarningTypesAffectingExtension(ext2_id);
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, existing_warnings.size());
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  warning_service.RemoveObserver(&observer);
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace extensions
118