chrome_net_log_unittest.cc revision 3f50c38dc070f4bb515c1b64450dae14f316474e
1// 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
7#include "base/synchronization/waitable_event.h"
8#include "base/threading/simple_thread.h"
9#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}
74