blob: dead9012076ff1d2896be2dcda101f2903d9e5fb [file] [log] [blame]
[email protected]b2fcd0e2010-12-01 15:19:401// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/net/chrome_net_log.h"
6
[email protected]44f9c952011-01-02 06:05:397#include "base/synchronization/waitable_event.h"
[email protected]ad382912010-12-30 18:45:018#include "base/threading/simple_thread.h"
[email protected]b2fcd0e2010-12-01 15:19:409#include "testing/gtest/include/gtest/gtest.h"
10
11namespace {
12
13const int kThreads = 10;
14const int kEvents = 100;
15
16class ChromeNetLogTestThread : public base::SimpleThread {
17 public:
18 ChromeNetLogTestThread() : base::SimpleThread("ChromeNetLogTest"),
19 can_start_loop_(false, false),
20 log_(NULL) {
21 }
22
23 void Init(ChromeNetLog* log) {
24 log_ = log;
25 }
26
27 virtual void Run() {
28 can_start_loop_.Wait();
29 for (int i = 0; i < kEvents; ++i) {
30 net::NetLog::Source source(net::NetLog::SOURCE_SOCKET, log_->NextID());
31 log_->AddEntry(net::NetLog::TYPE_SOCKET_ALIVE, base::TimeTicks(),
32 source, net::NetLog::PHASE_BEGIN, NULL);
33 }
34 log_->ClearAllPassivelyCapturedEvents();
35 }
36
37 void ReallyStart() {
38 can_start_loop_.Signal();
39 }
40
41 private:
42 // Only triggered once all threads have been created, to make it much less
43 // likely each thread completes before the next one starts.
44 base::WaitableEvent can_start_loop_;
45
46 ChromeNetLog* log_;
47
48 DISALLOW_COPY_AND_ASSIGN(ChromeNetLogTestThread);
49};
50
51} // namespace
52
53// Attempts to check thread safety, exercising checks in ChromeNetLog and
54// PassiveLogCollector.
55TEST(ChromeNetLogTest, NetLogThreads) {
56 ChromeNetLog log;
57 ChromeNetLogTestThread threads[kThreads];
58
59 for (int i = 0; i < kThreads; ++i) {
60 threads[i].Init(&log);
61 threads[i].Start();
62 }
63
64 for (int i = 0; i < kThreads; ++i)
65 threads[i].ReallyStart();
66
67 for (int i = 0; i < kThreads; ++i)
68 threads[i].Join();
69
70 ChromeNetLog::EntryList entries;
71 log.GetAllPassivelyCapturedEvents(&entries);
72 EXPECT_EQ(0u, entries.size());
73}