error_console_unittest.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// found in the LICENSE file.
4558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
5558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chrome/browser/extensions/error_console/error_console.h"
6558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
7ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/logging.h"
8558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/memory/scoped_ptr.h"
9424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/prefs/pref_service.h"
10ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/strings/string_number_conversions.h"
11424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "chrome/common/pref_names.h"
12558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chrome/test/base/testing_profile.h"
13ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "extensions/browser/extension_error.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_error_test_util.h"
15ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "extensions/common/constants.h"
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/feature_switch.h"
17424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "extensions/common/id_util.h"
18558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "testing/gtest/include/gtest/gtest.h"
19558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
20558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochnamespace extensions {
21558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using error_test_util::CreateNewManifestError;
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using error_test_util::CreateNewRuntimeError;
24558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
25558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochclass ErrorConsoleUnitTest : public testing::Test {
26558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch public:
27424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ErrorConsoleUnitTest() : error_console_(NULL) { }
28558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  virtual ~ErrorConsoleUnitTest() { }
29558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
30424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
31424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    testing::Test::SetUp();
32424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
33424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // Errors are only kept if we have the FeatureSwitch and have Developer Mode
34424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // enabled.
35424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    FeatureSwitch::error_console()->SetOverrideValue(
36424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        FeatureSwitch::OVERRIDE_ENABLED);
37424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    profile_.reset(new TestingProfile);
38424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    profile_->GetPrefs()->SetBoolean(prefs::kExtensionsUIDeveloperMode, true);
39424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    error_console_ = ErrorConsole::Get(profile_.get());
40424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
41424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
42558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch protected:
43558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  scoped_ptr<TestingProfile> profile_;
44558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ErrorConsole* error_console_;
45558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch};
46558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Test that errors are successfully reported. This is a simple test, since it
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// is tested more thoroughly in extensions/browser/error_map_unittest.cc
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ErrorConsoleUnitTest, ReportErrors) {
50558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  const size_t kNumTotalErrors = 6;
51424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const std::string kId = id_util::GenerateId("id");
52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_EQ(0u, error_console_->GetErrorsForExtension(kId).size());
53ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (size_t i = 0; i < kNumTotalErrors; ++i) {
55ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    error_console_->ReportError(
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        CreateNewManifestError(kId, base::UintToString(i)));
57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
58ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(kNumTotalErrors, error_console_->GetErrorsForExtension(kId).size());
60424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
61424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ErrorConsoleUnitTest, DontStoreErrorsWithoutEnablingType) {
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Disable default runtime error reporting.
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error_console_->set_default_reporting_for_test(ExtensionError::RUNTIME_ERROR,
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                false);
66424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
67424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const std::string kId = id_util::GenerateId("id");
68424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Try to report a runtime error - it should be ignored.
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error_console_->ReportError(CreateNewRuntimeError(kId, "a"));
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(0u, error_console_->GetErrorsForExtension(kId).size());
72424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Check that manifest errors are reported successfully.
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error_console_->ReportError(CreateNewManifestError(kId, "b"));
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(1u, error_console_->GetErrorsForExtension(kId).size());
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // We should still ignore runtime errors.
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error_console_->ReportError(CreateNewRuntimeError(kId, "c"));
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(1u, error_console_->GetErrorsForExtension(kId).size());
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Enable runtime errors specifically for this extension, and disable the use
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // of the default mask.
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error_console_->SetReportingForExtension(
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      kId, ExtensionError::RUNTIME_ERROR, true);
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // We should now accept runtime and manifest errors.
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error_console_->ReportError(CreateNewManifestError(kId, "d"));
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(2u, error_console_->GetErrorsForExtension(kId).size());
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error_console_->ReportError(CreateNewRuntimeError(kId, "e"));
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(3u, error_console_->GetErrorsForExtension(kId).size());
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // All other extensions should still use the default mask, and ignore runtime
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // errors but report manifest errors.
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const std::string kId2 = id_util::GenerateId("id2");
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error_console_->ReportError(CreateNewRuntimeError(kId2, "f"));
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(0u, error_console_->GetErrorsForExtension(kId2).size());
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error_console_->ReportError(CreateNewManifestError(kId2, "g"));
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(1u, error_console_->GetErrorsForExtension(kId2).size());
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // By reverting to default reporting, we should again allow manifest errors,
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // but not runtime errors.
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error_console_->UseDefaultReportingForExtension(kId);
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error_console_->ReportError(CreateNewManifestError(kId, "h"));
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(4u, error_console_->GetErrorsForExtension(kId).size());
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error_console_->ReportError(CreateNewRuntimeError(kId, "i"));
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(4u, error_console_->GetErrorsForExtension(kId).size());
107558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
108558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
109558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}  // namespace extensions
110