error_console_unittest.cc revision 424c4d7b64af9d0d8fd9624f381f469654d5e3d2
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/json/json_writer.h"
8ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/logging.h"
9558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/memory/scoped_ptr.h"
10424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/prefs/pref_service.h"
11558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/strings/string16.h"
12ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/strings/string_number_conversions.h"
13424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/strings/string_util.h"
14558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/strings/utf_string_conversions.h"
15424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "chrome/common/extensions/feature_switch.h"
16424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "chrome/common/pref_names.h"
17558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chrome/test/base/testing_profile.h"
18ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/public/common/url_constants.h"
19ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "extensions/browser/extension_error.h"
20ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "extensions/common/constants.h"
21424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "extensions/common/id_util.h"
22558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "testing/gtest/include/gtest/gtest.h"
23558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
24558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochusing base::string16;
25558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochusing base::UTF8ToUTF16;
26558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
27558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochnamespace extensions {
28558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
29558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochnamespace {
30558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
31ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kExecutionContextURLKey[] = "executionContextURL";
32ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kStackTraceKey[] = "stackTrace";
33ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
34ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochstring16 CreateErrorDetails(const std::string& extension_id) {
35ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::DictionaryValue value;
36ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  value.SetString(
37ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      kExecutionContextURLKey,
38ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      std::string(kExtensionScheme) +
39ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          content::kStandardSchemeSeparator +
40ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          extension_id);
41ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  value.Set(kStackTraceKey, new ListValue);
42ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::string json_utf8;
43ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::JSONWriter::Write(&value, &json_utf8);
44ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return UTF8ToUTF16(json_utf8);
45ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
46ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
47424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)scoped_ptr<ExtensionError> CreateNewRuntimeError(
48ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    bool from_incognito,
49ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const std::string& extension_id,
50ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const string16& message) {
51424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return scoped_ptr<ExtensionError>(new RuntimeError(
52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      from_incognito,
53ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      UTF8ToUTF16("source"),
54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      message,
55ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      logging::LOG_INFO,
56ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      CreateErrorDetails(extension_id)));
57558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
58558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
59558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}  // namespace
60558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
61558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochclass ErrorConsoleUnitTest : public testing::Test {
62558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch public:
63424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ErrorConsoleUnitTest() : error_console_(NULL) { }
64558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  virtual ~ErrorConsoleUnitTest() { }
65558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
66424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
67424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    testing::Test::SetUp();
68424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
69424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // Errors are only kept if we have the FeatureSwitch and have Developer Mode
70424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // enabled.
71424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    FeatureSwitch::error_console()->SetOverrideValue(
72424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        FeatureSwitch::OVERRIDE_ENABLED);
73424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    profile_.reset(new TestingProfile);
74424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    profile_->GetPrefs()->SetBoolean(prefs::kExtensionsUIDeveloperMode, true);
75424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    error_console_ = ErrorConsole::Get(profile_.get());
76424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
77424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
78558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch protected:
79558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  scoped_ptr<TestingProfile> profile_;
80558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ErrorConsole* error_console_;
81558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch};
82558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
83558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Test adding errors, and removing them by reference, by incognito status,
84558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// and in bulk.
85558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochTEST_F(ErrorConsoleUnitTest, AddAndRemoveErrors) {
86558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_EQ(0u, error_console_->errors().size());
87558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
88558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  const size_t kNumTotalErrors = 6;
89558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  const size_t kNumNonIncognitoErrors = 3;
90424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const std::string kId = id_util::GenerateId("id");
91558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Populate with both incognito and non-incognito errors (evenly distributed).
92ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  for (size_t i = 0; i < kNumTotalErrors; ++i) {
93ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    error_console_->ReportError(
94424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        CreateNewRuntimeError(i % 2 == 0, kId, base::UintToString16(i)));
95ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
96ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
97ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // There should only be one entry in the map, since errors are stored in lists
98ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // keyed by extension id.
99ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_EQ(1u, error_console_->errors().size());
100558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
101ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_EQ(kNumTotalErrors, error_console_->GetErrorsForExtension(kId).size());
102558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
103558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Remove the incognito errors; three errors should remain, and all should
104558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // be from non-incognito contexts.
105558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  error_console_->RemoveIncognitoErrors();
106ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const ErrorConsole::ErrorList& errors =
107ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      error_console_->GetErrorsForExtension(kId);
108ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_EQ(kNumNonIncognitoErrors, errors.size());
109ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  for (size_t i = 0; i < errors.size(); ++i)
110ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ASSERT_FALSE(errors[i]->from_incognito());
111ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
112ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Add another error for a different extension id.
113424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const std::string kSecondId = id_util::GenerateId("id2");
114ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  error_console_->ReportError(
115ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      CreateNewRuntimeError(false, kSecondId, string16()));
116ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
117ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // There should be two entries now, one for each id, and there should be one
118ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // error for the second extension.
119ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_EQ(2u, error_console_->errors().size());
120ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_EQ(1u, error_console_->GetErrorsForExtension(kSecondId).size());
121ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
122ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Remove all errors for the second id.
123ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  error_console_->RemoveErrorsForExtension(kSecondId);
124ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_EQ(1u, error_console_->errors().size());
125ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_EQ(0u, error_console_->GetErrorsForExtension(kSecondId).size());
126ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // First extension should be unaffected.
127ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_EQ(kNumNonIncognitoErrors,
128ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            error_console_->GetErrorsForExtension(kId).size());
129ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
130ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Remove remaining errors.
131558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  error_console_->RemoveAllErrors();
132558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_EQ(0u, error_console_->errors().size());
133ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_EQ(0u, error_console_->GetErrorsForExtension(kId).size());
134ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
135ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
136ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test that if we add enough errors, only the most recent
137ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// kMaxErrorsPerExtension are kept.
138ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(ErrorConsoleUnitTest, ExcessiveErrorsGetCropped) {
139ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_EQ(0u, error_console_->errors().size());
140ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
141ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // This constant matches one of the same name in error_console.cc.
142ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const size_t kMaxErrorsPerExtension = 100;
143ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const size_t kNumExtraErrors = 5;
144424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const std::string kId = id_util::GenerateId("id");
145ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
146ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Add new errors, with each error's message set to its number.
147ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  for (size_t i = 0; i < kMaxErrorsPerExtension + kNumExtraErrors; ++i) {
148ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    error_console_->ReportError(
149ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        CreateNewRuntimeError(false, kId, base::UintToString16(i)));
150ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
151ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
152ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_EQ(1u, error_console_->errors().size());
153ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
154ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const ErrorConsole::ErrorList& errors =
155ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      error_console_->GetErrorsForExtension(kId);
156ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_EQ(kMaxErrorsPerExtension, errors.size());
157ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
158ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // We should have popped off errors in the order they arrived, so the
159ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // first stored error should be the 6th reported (zero-based)...
160424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_EQ(base::UintToString16(kNumExtraErrors),
161424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            errors.front()->message());
162ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // ..and the last stored should be the 105th reported.
163424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_EQ(base::UintToString16(kMaxErrorsPerExtension + kNumExtraErrors - 1),
164424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            errors.back()->message());
165424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
166424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
167424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Test to ensure that the error console will not add duplicate errors, but will
168424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// keep the latest version of an error.
169424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TEST_F(ErrorConsoleUnitTest, DuplicateErrorsAreReplaced) {
170424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_EQ(0u, error_console_->errors().size());
171424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
172424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const std::string kId = id_util::GenerateId("id");
173424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const size_t kNumErrors = 3u;
174424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
175424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Report three errors.
176424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  for (size_t i = 0; i < kNumErrors; ++i) {
177424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    error_console_->ReportError(
178424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        CreateNewRuntimeError(false, kId, base::UintToString16(i)));
179424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
180424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
181424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Create an error identical to the second error reported, and save its
182424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // location.
183424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  scoped_ptr<ExtensionError> runtime_error2 =
184424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      CreateNewRuntimeError(false, kId, base::UintToString16(1u));
185424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const ExtensionError* weak_error = runtime_error2.get();
186424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
187424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Add it to the error console.
188424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  error_console_->ReportError(runtime_error2.Pass());
189424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
190424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // We should only have three errors stored, since two of the four reported
191424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // were identical, and the older should have been replaced.
192424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_EQ(1u, error_console_->errors().size());
193424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const ErrorConsole::ErrorList& errors =
194424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      error_console_->GetErrorsForExtension(kId);
195424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_EQ(kNumErrors, errors.size());
196424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
197424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // The duplicate error should be the last reported (pointer comparison)...
198424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_EQ(weak_error, errors.back());
199424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // ... and should have two reported occurrences.
200424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_EQ(2u, errors.back()->occurrences());
201558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
202558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
203558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}  // namespace extensions
204