// Copyright (c) 2010 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 "chrome/browser/net/chrome_net_log.h" #include "base/synchronization/waitable_event.h" #include "base/threading/simple_thread.h" #include "testing/gtest/include/gtest/gtest.h" namespace { const int kThreads = 10; const int kEvents = 100; class ChromeNetLogTestThread : public base::SimpleThread { public: ChromeNetLogTestThread() : base::SimpleThread("ChromeNetLogTest"), can_start_loop_(false, false), log_(NULL) { } void Init(ChromeNetLog* log) { log_ = log; } virtual void Run() { can_start_loop_.Wait(); for (int i = 0; i < kEvents; ++i) { net::NetLog::Source source(net::NetLog::SOURCE_SOCKET, log_->NextID()); log_->AddEntry(net::NetLog::TYPE_SOCKET_ALIVE, base::TimeTicks(), source, net::NetLog::PHASE_BEGIN, NULL); } log_->ClearAllPassivelyCapturedEvents(); } void ReallyStart() { can_start_loop_.Signal(); } private: // Only triggered once all threads have been created, to make it much less // likely each thread completes before the next one starts. base::WaitableEvent can_start_loop_; ChromeNetLog* log_; DISALLOW_COPY_AND_ASSIGN(ChromeNetLogTestThread); }; } // namespace // Attempts to check thread safety, exercising checks in ChromeNetLog and // PassiveLogCollector. TEST(ChromeNetLogTest, NetLogThreads) { ChromeNetLog log; ChromeNetLogTestThread threads[kThreads]; for (int i = 0; i < kThreads; ++i) { threads[i].Init(&log); threads[i].Start(); } for (int i = 0; i < kThreads; ++i) threads[i].ReallyStart(); for (int i = 0; i < kThreads; ++i) threads[i].Join(); ChromeNetLog::EntryList entries; log.GetAllPassivelyCapturedEvents(&entries); EXPECT_EQ(0u, entries.size()); }