blob: 36ef00dd4d55a149d05ecfcbd6232ef939db0c25 [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "net/log/test_net_log.h"
#include "base/macros.h"
#include "base/synchronization/lock.h"
#include "base/values.h"
#include "net/log/net_log_capture_mode.h"
#include "net/log/net_log_entry.h"
#include "net/log/net_log_source.h"
#include "net/log/net_log_source_type.h"
namespace net {
// TestNetLog::Observer is an implementation of NetLog::ThreadSafeObserver
// that saves messages to a buffer.
class TestNetLog::Observer : public NetLog::ThreadSafeObserver {
public:
Observer() = default;
~Observer() override = default;
// Returns the list of all entries in the log.
void GetEntries(TestNetLogEntry::List* entry_list) const {
base::AutoLock lock(lock_);
*entry_list = entry_list_;
}
// Fills |entry_list| with all entries in the log from the specified Source.
void GetEntriesForSource(NetLogSource source,
TestNetLogEntry::List* entry_list) const {
base::AutoLock lock(lock_);
entry_list->clear();
for (const auto& entry : entry_list_) {
if (entry.source.id == source.id)
entry_list->push_back(entry);
}
}
// Returns the number of entries in the log.
size_t GetSize() const {
base::AutoLock lock(lock_);
return entry_list_.size();
}
void Clear() {
base::AutoLock lock(lock_);
entry_list_.clear();
}
private:
// ThreadSafeObserver implementation:
void OnAddEntry(const NetLogEntry& entry) override {
// Using Dictionaries instead of Values makes checking values a little
// simpler.
std::unique_ptr<base::DictionaryValue> param_dict =
base::DictionaryValue::From(entry.ParametersToValue());
// Only need to acquire the lock when accessing class variables.
base::AutoLock lock(lock_);
entry_list_.push_back(TestNetLogEntry(entry.type(), base::TimeTicks::Now(),
entry.source(), entry.phase(),
std::move(param_dict)));
}
// Needs to be "mutable" to use it in GetEntries().
mutable base::Lock lock_;
TestNetLogEntry::List entry_list_;
DISALLOW_COPY_AND_ASSIGN(Observer);
};
TestNetLog::TestNetLog() : observer_(new Observer()) {
AddObserver(observer_.get(),
NetLogCaptureMode::IncludeCookiesAndCredentials());
}
TestNetLog::~TestNetLog() {
RemoveObserver(observer_.get());
}
void TestNetLog::SetCaptureMode(NetLogCaptureMode capture_mode) {
SetObserverCaptureMode(observer_.get(), capture_mode);
}
void TestNetLog::GetEntries(TestNetLogEntry::List* entry_list) const {
observer_->GetEntries(entry_list);
}
void TestNetLog::GetEntriesForSource(NetLogSource source,
TestNetLogEntry::List* entry_list) const {
observer_->GetEntriesForSource(source, entry_list);
}
size_t TestNetLog::GetSize() const {
return observer_->GetSize();
}
void TestNetLog::Clear() {
observer_->Clear();
}
NetLog::ThreadSafeObserver* TestNetLog::GetObserver() const {
return observer_.get();
}
BoundTestNetLog::BoundTestNetLog()
: net_log_(NetLogWithSource::Make(&test_net_log_, NetLogSourceType::NONE)) {
}
BoundTestNetLog::~BoundTestNetLog() = default;
void BoundTestNetLog::GetEntries(TestNetLogEntry::List* entry_list) const {
test_net_log_.GetEntries(entry_list);
}
void BoundTestNetLog::GetEntriesForSource(
NetLogSource source,
TestNetLogEntry::List* entry_list) const {
test_net_log_.GetEntriesForSource(source, entry_list);
}
size_t BoundTestNetLog::GetSize() const {
return test_net_log_.GetSize();
}
void BoundTestNetLog::Clear() {
test_net_log_.Clear();
}
void BoundTestNetLog::SetCaptureMode(NetLogCaptureMode capture_mode) {
test_net_log_.SetCaptureMode(capture_mode);
}
} // namespace net