Index: net/log/file_net_log_observer_unittest.cc |
diff --git a/net/log/file_net_log_observer_unittest.cc b/net/log/file_net_log_observer_unittest.cc |
index 7ee076fcb4257d06dd32e13767d645943a3f1a94..0cbf7d1c1471a01d3c979ffe8386938f8dc74066 100644 |
--- a/net/log/file_net_log_observer_unittest.cc |
+++ b/net/log/file_net_log_observer_unittest.cc |
@@ -792,6 +792,75 @@ TEST_F(FileNetLogObserverBoundedTest, PartiallyOverwriteFiles) { |
} |
} |
+void AddEntriesViaNetLog(NetLog* net_log, int num_entries) { |
+ for (int i = 0; i < num_entries; i++) { |
+ net_log->AddGlobalEntry(NetLogEventType::PAC_JAVASCRIPT_ERROR); |
+ } |
+} |
+ |
+TEST_P(FileNetLogObserverTest, AddEventsFromMultipleThreadsWithStopObserving) { |
+ const size_t kNumThreads = 10; |
+ std::vector<std::unique_ptr<base::Thread>> threads(kNumThreads); |
+ // Start all the threads. Waiting for them to start is to hopefuly improve |
+ // the odds of hitting interesting races once events start being added. |
+ for (size_t i = 0; i < threads.size(); ++i) { |
+ threads[i] = base::MakeUnique<base::Thread>( |
+ base::StringPrintf("WorkerThread%i", static_cast<int>(i))); |
+ threads[i]->Start(); |
+ threads[i]->WaitUntilThreadStarted(); |
+ } |
+ |
+ CreateAndStartObserving(nullptr); |
+ |
+ const size_t kNumEventsAddedPerThread = 200; |
+ |
+ // Add events in parallel from all the threads. |
+ for (size_t i = 0; i < kNumThreads; ++i) { |
+ threads[i]->task_runner()->PostTask( |
+ FROM_HERE, base::Bind(&AddEntriesViaNetLog, base::Unretained(&net_log_), |
+ kNumEventsAddedPerThread)); |
+ } |
+ |
+ // Stop observing. |
+ TestClosure closure; |
+ logger_->StopObserving(nullptr, closure.closure()); |
+ closure.WaitForResult(); |
+ |
+ // Join all the threads. |
+ threads.clear(); |
+} |
+ |
+TEST_P(FileNetLogObserverTest, |
+ AddEventsFromMultipleThreadsWithoutStopObserving) { |
+ const size_t kNumThreads = 10; |
+ std::vector<std::unique_ptr<base::Thread>> threads(kNumThreads); |
+ // Start all the threads. Waiting for them to start is to hopefuly improve |
+ // the odds of hitting interesting races once events start being added. |
+ for (size_t i = 0; i < threads.size(); ++i) { |
+ threads[i] = base::MakeUnique<base::Thread>( |
+ base::StringPrintf("WorkerThread%i", static_cast<int>(i))); |
+ threads[i]->Start(); |
+ threads[i]->WaitUntilThreadStarted(); |
+ } |
+ |
+ CreateAndStartObserving(nullptr); |
+ |
+ const size_t kNumEventsAddedPerThread = 200; |
+ |
+ // Add events in parallel from all the threads. |
+ for (size_t i = 0; i < kNumThreads; ++i) { |
+ threads[i]->task_runner()->PostTask( |
+ FROM_HERE, base::Bind(&AddEntriesViaNetLog, base::Unretained(&net_log_), |
+ kNumEventsAddedPerThread)); |
+ } |
+ |
+ // Destroy logger. |
+ logger_.reset(); |
+ |
+ // Join all the threads. |
+ threads.clear(); |
+} |
+ |
} // namespace |
} // namespace net |