Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(107)

Side by Side Diff: net/base/net_log_unittest.cc

Issue 16137008: Refactor net::NetLog to provide implementation of observer pattern, not just the interface. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: revert more Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/base/net_log_unittest.h" 5 #include "net/base/net_log_unittest.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/synchronization/waitable_event.h"
9 #include "base/threading/simple_thread.h"
8 #include "base/values.h" 10 #include "base/values.h"
9 #include "net/base/net_errors.h" 11 #include "net/base/net_errors.h"
10 12
11 namespace net { 13 namespace net {
12 14
13 namespace { 15 namespace {
14 16
15 base::Value* NetLogLevelCallback(NetLog::LogLevel log_level) { 17 base::Value* NetLogLevelCallback(NetLog::LogLevel log_level) {
16 base::DictionaryValue* dict = new base::DictionaryValue(); 18 base::DictionaryValue* dict = new base::DictionaryValue();
17 dict->SetInteger("log_level", log_level); 19 dict->SetInteger("log_level", log_level);
18 return dict; 20 return dict;
19 } 21 }
20 22
21 TEST(NetLogTest, Basic) { 23 TEST(NetLogTest, Basic) {
22 CapturingNetLog net_log; 24 NetLog net_log;
23 net::CapturingNetLog::CapturedEntryList entries; 25
24 net_log.GetEntries(&entries); 26 CapturingNetLogObserver capturing_net_log_observer;
27 net_log.AddThreadSafeObserver(&capturing_net_log_observer, NetLog::LOG_BASIC);
28
29 net::CapturingNetLogObserver::CapturedEntryList entries;
30 capturing_net_log_observer.GetEntries(&entries);
25 EXPECT_EQ(0u, entries.size()); 31 EXPECT_EQ(0u, entries.size());
26 32
27 net_log.AddGlobalEntry(NetLog::TYPE_CANCELLED); 33 net_log.AddGlobalEntry(NetLog::TYPE_CANCELLED);
28 34
29 net_log.GetEntries(&entries); 35 capturing_net_log_observer.GetEntries(&entries);
30 ASSERT_EQ(1u, entries.size()); 36 ASSERT_EQ(1u, entries.size());
31 EXPECT_EQ(NetLog::TYPE_CANCELLED, entries[0].type); 37 EXPECT_EQ(NetLog::TYPE_CANCELLED, entries[0].type);
32 EXPECT_EQ(NetLog::SOURCE_NONE, entries[0].source.type); 38 EXPECT_EQ(NetLog::SOURCE_NONE, entries[0].source.type);
33 EXPECT_NE(NetLog::Source::kInvalidId, entries[0].source.id); 39 EXPECT_NE(NetLog::Source::kInvalidId, entries[0].source.id);
34 EXPECT_EQ(NetLog::PHASE_NONE, entries[0].phase); 40 EXPECT_EQ(NetLog::PHASE_NONE, entries[0].phase);
35 EXPECT_GE(base::TimeTicks::Now(), entries[0].time); 41 EXPECT_GE(base::TimeTicks::Now(), entries[0].time);
36 EXPECT_FALSE(entries[0].params); 42 EXPECT_FALSE(entries[0].params);
43
44 net_log.RemoveThreadSafeObserver(&capturing_net_log_observer);
37 } 45 }
38 46
39 // Check that the correct LogLevel is sent to NetLog Value callbacks, and that 47 // Check that the correct LogLevel is sent to NetLog Value callbacks, and that
40 // LOG_NONE logs no events. 48 // LOG_NONE logs no events.
41 TEST(NetLogTest, LogLevels) { 49 TEST(NetLogTest, LogLevels) {
42 CapturingNetLog net_log; 50 NetLog net_log;
51
52 CapturingNetLogObserver capturing_net_log_observer;
53 net_log.AddThreadSafeObserver(&capturing_net_log_observer, NetLog::LOG_BASIC);
54
43 for (int log_level = NetLog::LOG_ALL; log_level <= NetLog::LOG_NONE; 55 for (int log_level = NetLog::LOG_ALL; log_level <= NetLog::LOG_NONE;
44 ++log_level) { 56 ++log_level) {
45 net_log.SetLogLevel(static_cast<NetLog::LogLevel>(log_level)); 57 net_log.SetObserverLogLevel(&capturing_net_log_observer,
46 EXPECT_EQ(log_level, net_log.GetLogLevel()); 58 static_cast<NetLog::LogLevel>(log_level));
59 EXPECT_EQ(log_level, capturing_net_log_observer.log_level());
47 60
48 net_log.AddGlobalEntry(NetLog::TYPE_SOCKET_ALIVE, 61 net_log.AddGlobalEntry(NetLog::TYPE_SOCKET_ALIVE,
49 base::Bind(NetLogLevelCallback)); 62 base::Bind(NetLogLevelCallback));
50 63
51 net::CapturingNetLog::CapturedEntryList entries; 64 net::CapturingNetLogObserver::CapturedEntryList entries;
52 net_log.GetEntries(&entries); 65 capturing_net_log_observer.GetEntries(&entries);
53 66
54 if (log_level == NetLog::LOG_NONE) { 67 if (log_level == NetLog::LOG_NONE) {
55 EXPECT_EQ(0u, entries.size()); 68 EXPECT_EQ(0u, entries.size());
56 } else { 69 } else {
57 ASSERT_EQ(1u, entries.size()); 70 ASSERT_EQ(1u, entries.size());
58 EXPECT_EQ(NetLog::TYPE_SOCKET_ALIVE, entries[0].type); 71 EXPECT_EQ(NetLog::TYPE_SOCKET_ALIVE, entries[0].type);
59 EXPECT_EQ(NetLog::SOURCE_NONE, entries[0].source.type); 72 EXPECT_EQ(NetLog::SOURCE_NONE, entries[0].source.type);
60 EXPECT_NE(NetLog::Source::kInvalidId, entries[0].source.id); 73 EXPECT_NE(NetLog::Source::kInvalidId, entries[0].source.id);
61 EXPECT_EQ(NetLog::PHASE_NONE, entries[0].phase); 74 EXPECT_EQ(NetLog::PHASE_NONE, entries[0].phase);
62 EXPECT_GE(base::TimeTicks::Now(), entries[0].time); 75 EXPECT_GE(base::TimeTicks::Now(), entries[0].time);
63 76
64 int logged_log_level; 77 int logged_log_level;
65 ASSERT_TRUE(entries[0].GetIntegerValue("log_level", &logged_log_level)); 78 ASSERT_TRUE(entries[0].GetIntegerValue("log_level", &logged_log_level));
66 EXPECT_EQ(log_level, logged_log_level); 79 EXPECT_EQ(log_level, logged_log_level);
67 } 80 }
68 81
69 net_log.Clear(); 82 capturing_net_log_observer.Clear();
70 } 83 }
84
85 net_log.RemoveThreadSafeObserver(&capturing_net_log_observer);
86 }
87
88 const int kThreads = 10;
89 const int kEvents = 100;
mmenke 2013/05/30 18:18:59 nit: Suggest putting these (And all the test thre
kouhei (in TOK) 2013/05/31 06:30:03 Done.
90
91 class CountingObserver : public net::NetLog::ThreadSafeObserver {
mmenke 2013/05/30 18:18:59 Hmm...We could switch to CapturingNetLog instead.
kouhei (in TOK) 2013/05/31 06:30:03 Done.
92 public:
93 CountingObserver() : count_(0) {}
94
95 virtual ~CountingObserver() {
96 if (net_log())
97 net_log()->RemoveThreadSafeObserver(this);
98 }
99
100 virtual void OnAddEntry(const net::NetLog::Entry& entry) OVERRIDE {
101 ++count_;
102 }
103
104 int count() const { return count_; }
105
106 private:
107 int count_;
108 };
109
110 void AddEvent(NetLog* net_log) {
111 net_log->AddGlobalEntry(net::NetLog::TYPE_CANCELLED);
112 }
113
114 // A thread that waits until an event has been signalled before calling
115 // RunTestThread.
116 class NetLogTestThread : public base::SimpleThread {
117 public:
118 NetLogTestThread() : base::SimpleThread("NetLogTest"),
119 net_log_(NULL),
120 start_event_(NULL) {
121 }
122
123 // We'll wait for |start_event| to be triggered before calling a subclass's
124 // subclass's RunTestThread() function.
125 void Init(NetLog* net_log, base::WaitableEvent* start_event) {
126 start_event_ = start_event;
127 net_log_ = net_log;
128 }
129
130 virtual void Run() OVERRIDE {
131 start_event_->Wait();
132 RunTestThread();
133 }
134
135 // Subclasses must override this with the code they want to run on their
136 // thread.
137 virtual void RunTestThread() = 0;
138
139 protected:
140 NetLog* net_log_;
141
142 private:
143 // Only triggered once all threads have been created, to make it less likely
144 // each thread completes before the next one starts.
145 base::WaitableEvent* start_event_;
146
147 DISALLOW_COPY_AND_ASSIGN(NetLogTestThread);
148 };
149
150 // A thread that adds a bunch of events to the NetLog.
151 class AddEventsTestThread : public NetLogTestThread {
152 public:
153 AddEventsTestThread() {}
154 virtual ~AddEventsTestThread() {}
155
156 private:
157 virtual void RunTestThread() OVERRIDE {
158 for (int i = 0; i < kEvents; ++i)
159 AddEvent(net_log_);
160 }
161
162 DISALLOW_COPY_AND_ASSIGN(AddEventsTestThread);
163 };
164
165 // A thread that adds and removes an observer from the NetLog repeatedly.
166 class AddRemoveObserverTestThread : public NetLogTestThread {
167 public:
168 AddRemoveObserverTestThread() {}
169
170 virtual ~AddRemoveObserverTestThread() {
171 EXPECT_TRUE(!observer_.net_log());
172 }
173
174 private:
175 virtual void RunTestThread() OVERRIDE {
176 for (int i = 0; i < kEvents; ++i) {
177 ASSERT_FALSE(observer_.net_log());
178
179 net_log_->AddThreadSafeObserver(&observer_, net::NetLog::LOG_BASIC);
180 ASSERT_EQ(net_log_, observer_.net_log());
181 ASSERT_EQ(net::NetLog::LOG_BASIC, observer_.log_level());
182
183 net_log_->SetObserverLogLevel(&observer_, net::NetLog::LOG_ALL_BUT_BYTES);
184 ASSERT_EQ(net_log_, observer_.net_log());
185 ASSERT_EQ(net::NetLog::LOG_ALL_BUT_BYTES, observer_.log_level());
186 ASSERT_LE(net_log_->GetLogLevel(), net::NetLog::LOG_ALL_BUT_BYTES);
187
188 net_log_->SetObserverLogLevel(&observer_, net::NetLog::LOG_ALL);
189 ASSERT_EQ(net_log_, observer_.net_log());
190 ASSERT_EQ(net::NetLog::LOG_ALL, observer_.log_level());
191 ASSERT_LE(net_log_->GetLogLevel(), net::NetLog::LOG_ALL);
192
193 net_log_->RemoveThreadSafeObserver(&observer_);
194 ASSERT_TRUE(!observer_.net_log());
195 }
196 }
197
198 CountingObserver observer_;
199
200 DISALLOW_COPY_AND_ASSIGN(AddRemoveObserverTestThread);
201 };
202
203 // Creates |kThreads| threads of type |ThreadType| and then runs them all
204 // to completion.
205 template<class ThreadType>
206 void RunTestThreads(NetLog* net_log) {
207 ThreadType threads[kThreads];
208 base::WaitableEvent start_event(true, false);
209
210 for (size_t i = 0; i < arraysize(threads); ++i) {
211 threads[i].Init(net_log, &start_event);
212 threads[i].Start();
213 }
214
215 start_event.Signal();
216
217 for (size_t i = 0; i < arraysize(threads); ++i)
218 threads[i].Join();
219 }
220
221 // Makes sure that events on multiple threads are dispatched to all observers.
222 TEST(NetLogTest, NetLogEventThreads) {
223 NetLog net_log;
224
225 // Attach some observers. Since they're created after |net_log|, they'll
226 // safely detach themselves on destruction.
227 CountingObserver observers[3];
228 for (size_t i = 0; i < arraysize(observers); ++i)
229 net_log.AddThreadSafeObserver(&observers[i], net::NetLog::LOG_BASIC);
230
231 // Run a bunch of threads to completion, each of which will emit events to
232 // |net_log|.
233 RunTestThreads<AddEventsTestThread>(&net_log);
234
235 // Check that each observer saw the emitted events.
236 const int kTotalEvents = kThreads * kEvents;
237 for (size_t i = 0; i < arraysize(observers); ++i)
238 EXPECT_EQ(kTotalEvents, observers[i].count());
239 }
240
241 // Test adding and removing a single observer.
242 TEST(NetLogTest, NetLogAddRemoveObserver) {
243 NetLog net_log;
244 CountingObserver observer;
245
246 AddEvent(&net_log);
247 EXPECT_EQ(0, observer.count());
248 EXPECT_EQ(NULL, observer.net_log());
249 EXPECT_EQ(net::NetLog::LOG_NONE, net_log.GetLogLevel());
250
251 // Add the observer and add an event.
252 net_log.AddThreadSafeObserver(&observer, net::NetLog::LOG_BASIC);
253 EXPECT_EQ(&net_log, observer.net_log());
254 EXPECT_EQ(net::NetLog::LOG_BASIC, observer.log_level());
255 EXPECT_EQ(net::NetLog::LOG_BASIC, net_log.GetLogLevel());
256
257 AddEvent(&net_log);
258 EXPECT_EQ(1, observer.count());
259
260 // Change the observer's logging level and add an event.
261 net_log.SetObserverLogLevel(&observer, net::NetLog::LOG_ALL);
262 EXPECT_EQ(&net_log, observer.net_log());
263 EXPECT_EQ(net::NetLog::LOG_ALL, observer.log_level());
264 EXPECT_EQ(net::NetLog::LOG_ALL, net_log.GetLogLevel());
265
266 AddEvent(&net_log);
267 EXPECT_EQ(2, observer.count());
268
269 // Remove observer and add an event.
270 net_log.RemoveThreadSafeObserver(&observer);
271 EXPECT_EQ(NULL, observer.net_log());
272 EXPECT_EQ(net::NetLog::LOG_NONE, net_log.GetLogLevel());
273
274 AddEvent(&net_log);
275 EXPECT_EQ(2, observer.count());
276
277 // Add the observer a final time, and add an event.
278 net_log.AddThreadSafeObserver(&observer, net::NetLog::LOG_ALL);
279 EXPECT_EQ(&net_log, observer.net_log());
280 EXPECT_EQ(net::NetLog::LOG_ALL, observer.log_level());
281 EXPECT_EQ(net::NetLog::LOG_ALL, net_log.GetLogLevel());
282
283 AddEvent(&net_log);
284 EXPECT_EQ(3, observer.count());
285 }
286
287 // Test adding and removing two observers.
288 TEST(NetLogTest, NetLogTwoObservers) {
289 NetLog net_log;
290 CountingObserver observer[2];
291
292 // Add first observer.
293 net_log.AddThreadSafeObserver(&observer[0], net::NetLog::LOG_ALL_BUT_BYTES);
294 EXPECT_EQ(&net_log, observer[0].net_log());
295 EXPECT_EQ(NULL, observer[1].net_log());
296 EXPECT_EQ(net::NetLog::LOG_ALL_BUT_BYTES, observer[0].log_level());
297 EXPECT_EQ(net::NetLog::LOG_ALL_BUT_BYTES, net_log.GetLogLevel());
298
299 // Add second observer observer.
300 net_log.AddThreadSafeObserver(&observer[1], net::NetLog::LOG_ALL);
301 EXPECT_EQ(&net_log, observer[0].net_log());
302 EXPECT_EQ(&net_log, observer[1].net_log());
303 EXPECT_EQ(net::NetLog::LOG_ALL_BUT_BYTES, observer[0].log_level());
304 EXPECT_EQ(net::NetLog::LOG_ALL, observer[1].log_level());
305 EXPECT_EQ(net::NetLog::LOG_ALL, net_log.GetLogLevel());
306
307 // Add event and make sure both observers receive it.
308 AddEvent(&net_log);
309 EXPECT_EQ(1, observer[0].count());
310 EXPECT_EQ(1, observer[1].count());
311
312 // Remove second observer.
313 net_log.RemoveThreadSafeObserver(&observer[1]);
314 EXPECT_EQ(&net_log, observer[0].net_log());
315 EXPECT_EQ(NULL, observer[1].net_log());
316 EXPECT_EQ(net::NetLog::LOG_ALL_BUT_BYTES, observer[0].log_level());
317 EXPECT_EQ(net::NetLog::LOG_ALL_BUT_BYTES, net_log.GetLogLevel());
318
319 // Add event and make sure only second observer gets it.
320 AddEvent(&net_log);
321 EXPECT_EQ(2, observer[0].count());
322 EXPECT_EQ(1, observer[1].count());
323
324 // Remove first observer.
325 net_log.RemoveThreadSafeObserver(&observer[0]);
326 EXPECT_EQ(NULL, observer[0].net_log());
327 EXPECT_EQ(NULL, observer[1].net_log());
328 EXPECT_EQ(net::NetLog::LOG_NONE, net_log.GetLogLevel());
329
330 // Add event and make sure neither observer gets it.
331 AddEvent(&net_log);
332 EXPECT_EQ(2, observer[0].count());
333 EXPECT_EQ(1, observer[1].count());
334 }
335
336 // Makes sure that adding and removing observers simultaneously on different
337 // threads works.
338 TEST(NetLogTest, NetLogAddRemoveObserverThreads) {
339 NetLog net_log;
340
341 // Run a bunch of threads to completion, each of which will repeatedly add
342 // and remove an observer, and set its logging level.
343 RunTestThreads<AddRemoveObserverTestThread>(&net_log);
71 } 344 }
72 345
73 } // namespace 346 } // namespace
74 347
75 } // namespace net 348 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698