diff options
author | kouhei@chromium.org <kouhei@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-07 19:18:26 +0000 |
---|---|---|
committer | kouhei@chromium.org <kouhei@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-07 19:18:26 +0000 |
commit | 1cf7fd079ca5d2638c816e91bd4b50bed915eba0 (patch) | |
tree | a55a4f4e6fd0a72669ddae31da738e62301ddb1d /net/base | |
parent | 89a94a7913b6bbc6eb2ad9510b82a519bce2bd61 (diff) | |
download | chromium_src-1cf7fd079ca5d2638c816e91bd4b50bed915eba0.zip chromium_src-1cf7fd079ca5d2638c816e91bd4b50bed915eba0.tar.gz chromium_src-1cf7fd079ca5d2638c816e91bd4b50bed915eba0.tar.bz2 |
Revert 204861 "Refactor net::NetLog to provide implementation of..."
> Refactor net::NetLog to provide implementation of observer pattern, not just the interface.
> This would make use of net::NetLog::ThreadSafeObserver available from base/net, so custom NetLog implementations can focus on implementing OnAddEntry() without re-implementing all NetLog methods.
>
> The implementation of observer pattern was previously provided in ChromeNetLog.
> The contents of chrome_net_log_unittest are merged to net_log_unittest.
>
> TESTS=net_log_unittest
> BUG=None
>
> Review URL: https://chromiumcodereview.appspot.com/16137008
TBR=kouhei@chromium.org
Review URL: https://codereview.chromium.org/15927035
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@204892 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/base')
-rw-r--r-- | net/base/capturing_net_log.cc | 62 | ||||
-rw-r--r-- | net/base/capturing_net_log.h | 63 | ||||
-rw-r--r-- | net/base/net_log.cc | 98 | ||||
-rw-r--r-- | net/base/net_log.h | 51 | ||||
-rw-r--r-- | net/base/net_log_unittest.cc | 265 |
5 files changed, 97 insertions, 442 deletions
diff --git a/net/base/capturing_net_log.cc b/net/base/capturing_net_log.cc index f938931..b90dcae 100644 --- a/net/base/capturing_net_log.cc +++ b/net/base/capturing_net_log.cc @@ -67,19 +67,20 @@ std::string CapturingNetLog::CapturedEntry::GetParamsJson() const { return json; } -CapturingNetLog::Observer::Observer() {} +CapturingNetLog::CapturingNetLog() + : last_id_(0), + log_level_(LOG_ALL_BUT_BYTES) { +} -CapturingNetLog::Observer::~Observer() {} +CapturingNetLog::~CapturingNetLog() {} -void CapturingNetLog::Observer::GetEntries( - CapturedEntryList* entry_list) const { +void CapturingNetLog::GetEntries(CapturedEntryList* entry_list) const { base::AutoLock lock(lock_); *entry_list = captured_entries_; } -void CapturingNetLog::Observer::GetEntriesForSource( - NetLog::Source source, - CapturedEntryList* entry_list) const { +void CapturingNetLog::GetEntriesForSource(NetLog::Source source, + CapturedEntryList* entry_list) const { base::AutoLock lock(lock_); entry_list->clear(); for (CapturedEntryList::const_iterator entry = captured_entries_.begin(); @@ -89,17 +90,22 @@ void CapturingNetLog::Observer::GetEntriesForSource( } } -size_t CapturingNetLog::Observer::GetSize() const { +size_t CapturingNetLog::GetSize() const { base::AutoLock lock(lock_); return captured_entries_.size(); } -void CapturingNetLog::Observer::Clear() { +void CapturingNetLog::Clear() { base::AutoLock lock(lock_); captured_entries_.clear(); } -void CapturingNetLog::Observer::OnAddEntry(const net::NetLog::Entry& entry) { +void CapturingNetLog::SetLogLevel(NetLog::LogLevel log_level) { + base::AutoLock lock(lock_); + log_level_ = log_level; +} + +void CapturingNetLog::OnAddEntry(const net::NetLog::Entry& entry) { // Only BoundNetLogs without a NetLog should have an invalid source. CHECK(entry.source().IsValid()); @@ -120,35 +126,29 @@ void CapturingNetLog::Observer::OnAddEntry(const net::NetLog::Entry& entry) { scoped_ptr<DictionaryValue>(param_dict))); } -CapturingNetLog::CapturingNetLog() { - AddThreadSafeObserver(&capturing_net_log_observer_, LOG_ALL_BUT_BYTES); -} - -CapturingNetLog::~CapturingNetLog() { - RemoveThreadSafeObserver(&capturing_net_log_observer_); +uint32 CapturingNetLog::NextID() { + return base::subtle::NoBarrier_AtomicIncrement(&last_id_, 1); } -void CapturingNetLog::SetLogLevel(NetLog::LogLevel log_level) { - SetObserverLogLevel(&capturing_net_log_observer_, log_level); -} - -void CapturingNetLog::GetEntries( - CapturingNetLog::CapturedEntryList* entry_list) const { - capturing_net_log_observer_.GetEntries(entry_list); +NetLog::LogLevel CapturingNetLog::GetLogLevel() const { + base::AutoLock lock(lock_); + return log_level_; } -void CapturingNetLog::GetEntriesForSource( - NetLog::Source source, - CapturedEntryList* entry_list) const { - capturing_net_log_observer_.GetEntriesForSource(source, entry_list); +void CapturingNetLog::AddThreadSafeObserver( + NetLog::ThreadSafeObserver* observer, + NetLog::LogLevel log_level) { + NOTIMPLEMENTED() << "Not currently used by net unit tests."; } -size_t CapturingNetLog::GetSize() const { - return capturing_net_log_observer_.GetSize(); +void CapturingNetLog::SetObserverLogLevel(ThreadSafeObserver* observer, + LogLevel log_level) { + NOTIMPLEMENTED() << "Not currently used by net unit tests."; } -void CapturingNetLog::Clear() { - capturing_net_log_observer_.Clear(); +void CapturingNetLog::RemoveThreadSafeObserver( + NetLog::ThreadSafeObserver* observer) { + NOTIMPLEMENTED() << "Not currently used by net unit tests."; } CapturingBoundNetLog::CapturingBoundNetLog() diff --git a/net/base/capturing_net_log.h b/net/base/capturing_net_log.h index d23beb9..d3586d1 100644 --- a/net/base/capturing_net_log.h +++ b/net/base/capturing_net_log.h @@ -23,10 +23,9 @@ class DictionaryValue; namespace net { -// CapturingNetLog is a NetLog which instantiates Observer that saves messages -// to a bounded buffer. It is intended for testing only, and is part of the -// net_test_support project. This is provided for convinience and compatilbility -// with the old unittests. +// CapturingNetLog is an implementation of NetLog that saves messages to a +// bounded buffer. It is intended for testing only, and is part of the +// net_test_support project. class CapturingNetLog : public NetLog { public: struct CapturedEntry { @@ -72,48 +71,40 @@ class CapturingNetLog : public NetLog { CapturingNetLog(); virtual ~CapturingNetLog(); - void SetLogLevel(LogLevel log_level); - - // Below methods are forwarded to capturing_net_log_observer_. + // Returns the list of all entries in the log. void GetEntries(CapturedEntryList* entry_list) const; - void GetEntriesForSource(Source source, CapturedEntryList* entry_list) const; - size_t GetSize() const; - void Clear(); - private: - // Observer is an implementation of NetLog::ThreadSafeObserver - // that saves messages to a bounded buffer. It is intended for testing only, - // and is part of the net_test_support project. - class Observer : public NetLog::ThreadSafeObserver { - public: - Observer(); - virtual ~Observer(); - - // Returns the list of all entries in the log. - void GetEntries(CapturedEntryList* entry_list) const; + // Fills |entry_list| with all entries in the log from the specified Source. + void GetEntriesForSource(NetLog::Source source, + CapturedEntryList* entry_list) const; - // Fills |entry_list| with all entries in the log from the specified Source. - void GetEntriesForSource(Source source, - CapturedEntryList* entry_list) const; + // Returns number of entries in the log. + size_t GetSize() const; - // Returns number of entries in the log. - size_t GetSize() const; + void Clear(); - void Clear(); + void SetLogLevel(NetLog::LogLevel log_level); - private: - // ThreadSafeObserver implementation: - virtual void OnAddEntry(const Entry& entry) OVERRIDE; + // NetLog implementation: + virtual void OnAddEntry(const net::NetLog::Entry& entry) OVERRIDE; + virtual uint32 NextID() OVERRIDE; + virtual LogLevel GetLogLevel() const OVERRIDE; + virtual void AddThreadSafeObserver(ThreadSafeObserver* observer, + LogLevel log_level) OVERRIDE; + virtual void SetObserverLogLevel(ThreadSafeObserver* observer, + LogLevel log_level) OVERRIDE; + virtual void RemoveThreadSafeObserver(ThreadSafeObserver* observer) OVERRIDE; - // Needs to be "mutable" so can use it in GetEntries(). - mutable base::Lock lock_; + private: + // Needs to be "mutable" so can use it in GetEntries(). + mutable base::Lock lock_; - CapturedEntryList captured_entries_; + // Last assigned source ID. Incremented to get the next one. + base::subtle::Atomic32 last_id_; - DISALLOW_COPY_AND_ASSIGN(Observer); - }; + CapturedEntryList captured_entries_; - Observer capturing_net_log_observer_; + NetLog::LogLevel log_level_; DISALLOW_COPY_AND_ASSIGN(CapturingNetLog); }; diff --git a/net/base/net_log.cc b/net/base/net_log.cc index 1b61698..0ca551e 100644 --- a/net/base/net_log.cc +++ b/net/base/net_log.cc @@ -187,15 +187,6 @@ NetLog* NetLog::ThreadSafeObserver::net_log() const { return net_log_; } -NetLog::NetLog() - : last_id_(0), - base_log_level_(LOG_NONE), - effective_log_level_(LOG_NONE) { -} - -NetLog::~NetLog() { -} - void NetLog::AddGlobalEntry(EventType type) { AddEntry(type, Source(net::NetLog::SOURCE_NONE, NextID()), @@ -212,73 +203,6 @@ void NetLog::AddGlobalEntry( ¶meters_callback); } -uint32 NetLog::NextID() { - return base::subtle::NoBarrier_AtomicIncrement(&last_id_, 1); -} - -void NetLog::SetBaseLogLevel(LogLevel log_level) { - base::AutoLock lock(lock_); - base_log_level_ = log_level; - - UpdateLogLevel(); -} - -NetLog::LogLevel NetLog::GetLogLevel() const { - base::subtle::Atomic32 log_level = - base::subtle::NoBarrier_Load(&effective_log_level_); - return static_cast<net::NetLog::LogLevel>(log_level); -} - -void NetLog::AddThreadSafeObserver( - net::NetLog::ThreadSafeObserver* observer, - LogLevel log_level) { - base::AutoLock lock(lock_); - - DCHECK(!observer->net_log_); - observers_.AddObserver(observer); - observer->net_log_ = this; - observer->log_level_ = log_level; - UpdateLogLevel(); -} - -void NetLog::SetObserverLogLevel( - net::NetLog::ThreadSafeObserver* observer, - LogLevel log_level) { - base::AutoLock lock(lock_); - - DCHECK(observers_.HasObserver(observer)); - DCHECK_EQ(this, observer->net_log_); - observer->log_level_ = log_level; - UpdateLogLevel(); -} - -void NetLog::RemoveThreadSafeObserver( - net::NetLog::ThreadSafeObserver* observer) { - base::AutoLock lock(lock_); - - DCHECK(observers_.HasObserver(observer)); - DCHECK_EQ(this, observer->net_log_); - observers_.RemoveObserver(observer); - observer->net_log_ = NULL; - UpdateLogLevel(); -} - -void NetLog::UpdateLogLevel() { - lock_.AssertAcquired(); - - // Look through all the observers and find the finest granularity - // log level (higher values of the enum imply *lower* log levels). - LogLevel new_effective_log_level = base_log_level_; - ObserverListBase<ThreadSafeObserver>::Iterator it(observers_); - ThreadSafeObserver* observer; - while ((observer = it.GetNext()) != NULL) { - new_effective_log_level = - std::min(new_effective_log_level, observer->log_level()); - } - base::subtle::NoBarrier_Store(&effective_log_level_, - new_effective_log_level); -} - // static std::string NetLog::TickCountToString(const base::TimeTicks& time) { int64 delta_time = (time - base::TimeTicks()).InMilliseconds(); @@ -377,6 +301,23 @@ NetLog::ParametersCallback NetLog::StringCallback(const char* name, return base::Bind(&NetLogString16Callback, name, value); } +void NetLog::OnAddObserver(ThreadSafeObserver* observer, LogLevel log_level) { + DCHECK(!observer->net_log_); + observer->net_log_ = this; + observer->log_level_ = log_level; +} + +void NetLog::OnSetObserverLogLevel(ThreadSafeObserver* observer, + LogLevel log_level) { + DCHECK_EQ(this, observer->net_log_); + observer->log_level_ = log_level; +} + +void NetLog::OnRemoveObserver(ThreadSafeObserver* observer) { + DCHECK_EQ(this, observer->net_log_); + observer->net_log_ = NULL; +} + void NetLog::AddEntry(EventType type, const Source& source, EventPhase phase, @@ -386,10 +327,7 @@ void NetLog::AddEntry(EventType type, return; Entry entry(type, source, phase, base::TimeTicks::Now(), parameters_callback, log_level); - - // Notify all of the log observers. - base::AutoLock lock(lock_); - FOR_EACH_OBSERVER(ThreadSafeObserver, observers_, OnAddEntry(entry)); + OnAddEntry(entry); } void BoundNetLog::AddEntry(NetLog::EventType type, diff --git a/net/base/net_log.h b/net/base/net_log.h index fb5637d..8ae33e9 100644 --- a/net/base/net_log.h +++ b/net/base/net_log.h @@ -7,13 +7,10 @@ #include <string> -#include "base/atomicops.h" #include "base/basictypes.h" #include "base/callback_forward.h" #include "base/compiler_specific.h" -#include "base/observer_list.h" #include "base/string16.h" -#include "base/synchronization/lock.h" #include "base/time.h" #include "net/base/net_export.h" @@ -201,8 +198,8 @@ class NET_EXPORT NetLog { DISALLOW_COPY_AND_ASSIGN(ThreadSafeObserver); }; - NetLog(); - virtual ~NetLog(); + NetLog() {} + virtual ~NetLog() {} // Emits a global event to the log stream, with its own unique source ID. void AddGlobalEntry(EventType type); @@ -211,11 +208,11 @@ class NET_EXPORT NetLog { // Returns a unique ID which can be used as a source ID. All returned IDs // will be unique and greater than 0. - uint32 NextID(); + virtual uint32 NextID() = 0; // Returns the logging level for this NetLog. This is used to avoid computing // and saving expensive log entries. - LogLevel GetLogLevel() const; + virtual LogLevel GetLogLevel() const = 0; // Adds an observer and sets its log level. The observer must not be // watching any NetLog, including this one, when this is called. @@ -227,19 +224,21 @@ class NET_EXPORT NetLog { // // NetLog implementations must call NetLog::OnAddObserver to update the // observer's internal state. - void AddThreadSafeObserver(ThreadSafeObserver* observer, LogLevel log_level); + virtual void AddThreadSafeObserver(ThreadSafeObserver* observer, + LogLevel log_level) = 0; // Sets the log level of |observer| to |log_level|. |observer| must be // watching |this|. NetLog implementations must call // NetLog::OnSetObserverLogLevel to update the observer's internal state. - void SetObserverLogLevel(ThreadSafeObserver* observer, LogLevel log_level); + virtual void SetObserverLogLevel(ThreadSafeObserver* observer, + LogLevel log_level) = 0; // Removes an observer. NetLog implementations must call // NetLog::OnAddObserver to update the observer's internal state. // // For thread safety reasons, it is recommended that this not be called in // an object's destructor. - void RemoveThreadSafeObserver(ThreadSafeObserver* observer); + virtual void RemoveThreadSafeObserver(ThreadSafeObserver* observer) = 0; // Converts a time to the string format that the NetLog uses to represent // times. Strings are used since integers may overflow. @@ -294,8 +293,16 @@ class NET_EXPORT NetLog { const base::string16* value); protected: - // Set the lowest allowed log level, regardless of any Observers. - void SetBaseLogLevel(LogLevel log_level); + // Child classes should respond to the new entry here. This includes + // creating the Entry object and alerting their observers. + virtual void OnAddEntry(const Entry& entry) = 0; + + // Subclasses must call these in the corresponding functions to set an + // observer's |net_log_| and |log_level_| values. + void OnAddObserver(ThreadSafeObserver* observer, LogLevel log_level); + void OnSetObserverLogLevel(ThreadSafeObserver* observer, + LogLevel log_level); + void OnRemoveObserver(ThreadSafeObserver* observer); private: friend class BoundNetLog; @@ -305,26 +312,6 @@ class NET_EXPORT NetLog { EventPhase phase, const NetLog::ParametersCallback* parameters_callback); - // Called whenever an observer is added or removed, or has its log level - // changed. Must have acquired |lock_| prior to calling. - void UpdateLogLevel(); - - // |lock_| protects access to |observers_|. - base::Lock lock_; - - // Last assigned source ID. Incremented to get the next one. - base::subtle::Atomic32 last_id_; - - // The lowest allowed log level, regardless of any Observers. - // Normally defaults to LOG_NONE, but can be changed with SetBaseLogLevel - LogLevel base_log_level_; - - // The current log level. - base::subtle::Atomic32 effective_log_level_; - - // |lock_| must be acquired whenever reading or writing to this. - ObserverList<ThreadSafeObserver, true> observers_; - DISALLOW_COPY_AND_ASSIGN(NetLog); }; diff --git a/net/base/net_log_unittest.cc b/net/base/net_log_unittest.cc index 7a98f79..d52f3b7 100644 --- a/net/base/net_log_unittest.cc +++ b/net/base/net_log_unittest.cc @@ -5,8 +5,6 @@ #include "net/base/net_log_unittest.h" #include "base/bind.h" -#include "base/synchronization/waitable_event.h" -#include "base/threading/simple_thread.h" #include "base/values.h" #include "net/base/net_errors.h" @@ -14,9 +12,6 @@ namespace net { namespace { -const int kThreads = 10; -const int kEvents = 100; - base::Value* NetLogLevelCallback(NetLog::LogLevel log_level) { base::DictionaryValue* dict = new base::DictionaryValue(); dict->SetInteger("log_level", log_level); @@ -25,7 +20,7 @@ base::Value* NetLogLevelCallback(NetLog::LogLevel log_level) { TEST(NetLogTest, Basic) { CapturingNetLog net_log; - CapturingNetLog::CapturedEntryList entries; + net::CapturingNetLog::CapturedEntryList entries; net_log.GetEntries(&entries); EXPECT_EQ(0u, entries.size()); @@ -53,7 +48,7 @@ TEST(NetLogTest, LogLevels) { net_log.AddGlobalEntry(NetLog::TYPE_SOCKET_ALIVE, base::Bind(NetLogLevelCallback)); - CapturingNetLog::CapturedEntryList entries; + net::CapturingNetLog::CapturedEntryList entries; net_log.GetEntries(&entries); if (log_level == NetLog::LOG_NONE) { @@ -75,262 +70,6 @@ TEST(NetLogTest, LogLevels) { } } -class CountingObserver : public NetLog::ThreadSafeObserver { - public: - CountingObserver() : count_(0) {} - - virtual ~CountingObserver() { - if (net_log()) - net_log()->RemoveThreadSafeObserver(this); - } - - virtual void OnAddEntry(const NetLog::Entry& entry) OVERRIDE { - ++count_; - } - - int count() const { return count_; } - - private: - int count_; -}; - -void AddEvent(NetLog* net_log) { - net_log->AddGlobalEntry(NetLog::TYPE_CANCELLED); -} - -// A thread that waits until an event has been signalled before calling -// RunTestThread. -class NetLogTestThread : public base::SimpleThread { - public: - NetLogTestThread() - : base::SimpleThread("NetLogTest"), - net_log_(NULL), - start_event_(NULL) { - } - - // We'll wait for |start_event| to be triggered before calling a subclass's - // subclass's RunTestThread() function. - void Init(NetLog* net_log, base::WaitableEvent* start_event) { - start_event_ = start_event; - net_log_ = net_log; - } - - virtual void Run() OVERRIDE { - start_event_->Wait(); - RunTestThread(); - } - - // Subclasses must override this with the code they want to run on their - // thread. - virtual void RunTestThread() = 0; - - protected: - NetLog* net_log_; - - private: - // Only triggered once all threads have been created, to make it less likely - // each thread completes before the next one starts. - base::WaitableEvent* start_event_; - - DISALLOW_COPY_AND_ASSIGN(NetLogTestThread); -}; - -// A thread that adds a bunch of events to the NetLog. -class AddEventsTestThread : public NetLogTestThread { - public: - AddEventsTestThread() {} - virtual ~AddEventsTestThread() {} - - private: - virtual void RunTestThread() OVERRIDE { - for (int i = 0; i < kEvents; ++i) - AddEvent(net_log_); - } - - DISALLOW_COPY_AND_ASSIGN(AddEventsTestThread); -}; - -// A thread that adds and removes an observer from the NetLog repeatedly. -class AddRemoveObserverTestThread : public NetLogTestThread { - public: - AddRemoveObserverTestThread() {} - - virtual ~AddRemoveObserverTestThread() { - EXPECT_TRUE(!observer_.net_log()); - } - - private: - virtual void RunTestThread() OVERRIDE { - for (int i = 0; i < kEvents; ++i) { - ASSERT_FALSE(observer_.net_log()); - - net_log_->AddThreadSafeObserver(&observer_, NetLog::LOG_BASIC); - ASSERT_EQ(net_log_, observer_.net_log()); - ASSERT_EQ(NetLog::LOG_BASIC, observer_.log_level()); - - net_log_->SetObserverLogLevel(&observer_, NetLog::LOG_ALL_BUT_BYTES); - ASSERT_EQ(net_log_, observer_.net_log()); - ASSERT_EQ(NetLog::LOG_ALL_BUT_BYTES, observer_.log_level()); - ASSERT_LE(net_log_->GetLogLevel(), NetLog::LOG_ALL_BUT_BYTES); - - net_log_->SetObserverLogLevel(&observer_, NetLog::LOG_ALL); - ASSERT_EQ(net_log_, observer_.net_log()); - ASSERT_EQ(NetLog::LOG_ALL, observer_.log_level()); - ASSERT_LE(net_log_->GetLogLevel(), NetLog::LOG_ALL); - - net_log_->RemoveThreadSafeObserver(&observer_); - ASSERT_TRUE(!observer_.net_log()); - } - } - - CountingObserver observer_; - - DISALLOW_COPY_AND_ASSIGN(AddRemoveObserverTestThread); -}; - -// Creates |kThreads| threads of type |ThreadType| and then runs them all -// to completion. -template<class ThreadType> -void RunTestThreads(NetLog* net_log) { - ThreadType threads[kThreads]; - base::WaitableEvent start_event(true, false); - - for (size_t i = 0; i < arraysize(threads); ++i) { - threads[i].Init(net_log, &start_event); - threads[i].Start(); - } - - start_event.Signal(); - - for (size_t i = 0; i < arraysize(threads); ++i) - threads[i].Join(); -} - -// Makes sure that events on multiple threads are dispatched to all observers. -TEST(NetLogTest, NetLogEventThreads) { - NetLog net_log; - - // Attach some observers. Since they're created after |net_log|, they'll - // safely detach themselves on destruction. - CountingObserver observers[3]; - for (size_t i = 0; i < arraysize(observers); ++i) - net_log.AddThreadSafeObserver(&observers[i], NetLog::LOG_BASIC); - - // Run a bunch of threads to completion, each of which will emit events to - // |net_log|. - RunTestThreads<AddEventsTestThread>(&net_log); - - // Check that each observer saw the emitted events. - const int kTotalEvents = kThreads * kEvents; - for (size_t i = 0; i < arraysize(observers); ++i) - EXPECT_EQ(kTotalEvents, observers[i].count()); -} - -// Test adding and removing a single observer. -TEST(NetLogTest, NetLogAddRemoveObserver) { - NetLog net_log; - CountingObserver observer; - - AddEvent(&net_log); - EXPECT_EQ(0, observer.count()); - EXPECT_EQ(NULL, observer.net_log()); - EXPECT_EQ(NetLog::LOG_NONE, net_log.GetLogLevel()); - - // Add the observer and add an event. - net_log.AddThreadSafeObserver(&observer, NetLog::LOG_BASIC); - EXPECT_EQ(&net_log, observer.net_log()); - EXPECT_EQ(NetLog::LOG_BASIC, observer.log_level()); - EXPECT_EQ(NetLog::LOG_BASIC, net_log.GetLogLevel()); - - AddEvent(&net_log); - EXPECT_EQ(1, observer.count()); - - // Change the observer's logging level and add an event. - net_log.SetObserverLogLevel(&observer, NetLog::LOG_ALL); - EXPECT_EQ(&net_log, observer.net_log()); - EXPECT_EQ(NetLog::LOG_ALL, observer.log_level()); - EXPECT_EQ(NetLog::LOG_ALL, net_log.GetLogLevel()); - - AddEvent(&net_log); - EXPECT_EQ(2, observer.count()); - - // Remove observer and add an event. - net_log.RemoveThreadSafeObserver(&observer); - EXPECT_EQ(NULL, observer.net_log()); - EXPECT_EQ(NetLog::LOG_NONE, net_log.GetLogLevel()); - - AddEvent(&net_log); - EXPECT_EQ(2, observer.count()); - - // Add the observer a final time, and add an event. - net_log.AddThreadSafeObserver(&observer, NetLog::LOG_ALL); - EXPECT_EQ(&net_log, observer.net_log()); - EXPECT_EQ(NetLog::LOG_ALL, observer.log_level()); - EXPECT_EQ(NetLog::LOG_ALL, net_log.GetLogLevel()); - - AddEvent(&net_log); - EXPECT_EQ(3, observer.count()); -} - -// Test adding and removing two observers. -TEST(NetLogTest, NetLogTwoObservers) { - NetLog net_log; - CountingObserver observer[2]; - - // Add first observer. - net_log.AddThreadSafeObserver(&observer[0], NetLog::LOG_ALL_BUT_BYTES); - EXPECT_EQ(&net_log, observer[0].net_log()); - EXPECT_EQ(NULL, observer[1].net_log()); - EXPECT_EQ(NetLog::LOG_ALL_BUT_BYTES, observer[0].log_level()); - EXPECT_EQ(NetLog::LOG_ALL_BUT_BYTES, net_log.GetLogLevel()); - - // Add second observer observer. - net_log.AddThreadSafeObserver(&observer[1], NetLog::LOG_ALL); - EXPECT_EQ(&net_log, observer[0].net_log()); - EXPECT_EQ(&net_log, observer[1].net_log()); - EXPECT_EQ(NetLog::LOG_ALL_BUT_BYTES, observer[0].log_level()); - EXPECT_EQ(NetLog::LOG_ALL, observer[1].log_level()); - EXPECT_EQ(NetLog::LOG_ALL, net_log.GetLogLevel()); - - // Add event and make sure both observers receive it. - AddEvent(&net_log); - EXPECT_EQ(1, observer[0].count()); - EXPECT_EQ(1, observer[1].count()); - - // Remove second observer. - net_log.RemoveThreadSafeObserver(&observer[1]); - EXPECT_EQ(&net_log, observer[0].net_log()); - EXPECT_EQ(NULL, observer[1].net_log()); - EXPECT_EQ(NetLog::LOG_ALL_BUT_BYTES, observer[0].log_level()); - EXPECT_EQ(NetLog::LOG_ALL_BUT_BYTES, net_log.GetLogLevel()); - - // Add event and make sure only second observer gets it. - AddEvent(&net_log); - EXPECT_EQ(2, observer[0].count()); - EXPECT_EQ(1, observer[1].count()); - - // Remove first observer. - net_log.RemoveThreadSafeObserver(&observer[0]); - EXPECT_EQ(NULL, observer[0].net_log()); - EXPECT_EQ(NULL, observer[1].net_log()); - EXPECT_EQ(NetLog::LOG_NONE, net_log.GetLogLevel()); - - // Add event and make sure neither observer gets it. - AddEvent(&net_log); - EXPECT_EQ(2, observer[0].count()); - EXPECT_EQ(1, observer[1].count()); -} - -// Makes sure that adding and removing observers simultaneously on different -// threads works. -TEST(NetLogTest, NetLogAddRemoveObserverThreads) { - NetLog net_log; - - // Run a bunch of threads to completion, each of which will repeatedly add - // and remove an observer, and set its logging level. - RunTestThreads<AddRemoveObserverTestThread>(&net_log); -} - } // namespace } // namespace net |