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