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

Side by Side Diff: base/trace_event/trace_event_unittest.cc

Issue 1100773004: base: Remove most uses of MessageLoopProxy (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added some missing includes. Created 5 years, 7 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) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 <math.h> 5 #include <math.h>
6 #include <cstdlib> 6 #include <cstdlib>
7 7
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/json/json_reader.h" 10 #include "base/json/json_reader.h"
11 #include "base/json/json_writer.h" 11 #include "base/json/json_writer.h"
12 #include "base/location.h"
12 #include "base/memory/ref_counted_memory.h" 13 #include "base/memory/ref_counted_memory.h"
13 #include "base/memory/scoped_ptr.h" 14 #include "base/memory/scoped_ptr.h"
14 #include "base/memory/singleton.h" 15 #include "base/memory/singleton.h"
15 #include "base/process/process_handle.h" 16 #include "base/process/process_handle.h"
17 #include "base/single_thread_task_runner.h"
16 #include "base/strings/stringprintf.h" 18 #include "base/strings/stringprintf.h"
17 #include "base/synchronization/waitable_event.h" 19 #include "base/synchronization/waitable_event.h"
18 #include "base/threading/platform_thread.h" 20 #include "base/threading/platform_thread.h"
19 #include "base/threading/thread.h" 21 #include "base/threading/thread.h"
20 #include "base/time/time.h" 22 #include "base/time/time.h"
21 #include "base/trace_event/trace_event.h" 23 #include "base/trace_event/trace_event.h"
22 #include "base/trace_event/trace_event_synthetic_delay.h" 24 #include "base/trace_event/trace_event_synthetic_delay.h"
23 #include "base/values.h" 25 #include "base/values.h"
24 #include "testing/gmock/include/gmock/gmock.h" 26 #include "testing/gmock/include/gmock/gmock.h"
25 #include "testing/gtest/include/gtest/gtest.h" 27 #include "testing/gtest/include/gtest/gtest.h"
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
88 EndTraceAndFlushAsync(&flush_complete_event); 90 EndTraceAndFlushAsync(&flush_complete_event);
89 flush_complete_event.Wait(); 91 flush_complete_event.Wait();
90 } 92 }
91 93
92 // Used when testing thread-local buffers which requires the thread initiating 94 // Used when testing thread-local buffers which requires the thread initiating
93 // flush to have a message loop. 95 // flush to have a message loop.
94 void EndTraceAndFlushInThreadWithMessageLoop() { 96 void EndTraceAndFlushInThreadWithMessageLoop() {
95 WaitableEvent flush_complete_event(false, false); 97 WaitableEvent flush_complete_event(false, false);
96 Thread flush_thread("flush"); 98 Thread flush_thread("flush");
97 flush_thread.Start(); 99 flush_thread.Start();
98 flush_thread.message_loop()->PostTask(FROM_HERE, 100 flush_thread.task_runner()->PostTask(
99 base::Bind(&TraceEventTestFixture::EndTraceAndFlushAsync, 101 FROM_HERE, base::Bind(&TraceEventTestFixture::EndTraceAndFlushAsync,
100 base::Unretained(this), 102 base::Unretained(this), &flush_complete_event));
101 &flush_complete_event));
102 flush_complete_event.Wait(); 103 flush_complete_event.Wait();
103 } 104 }
104 105
105 void EndTraceAndFlushAsync(WaitableEvent* flush_complete_event) { 106 void EndTraceAndFlushAsync(WaitableEvent* flush_complete_event) {
106 TraceLog::GetInstance()->SetDisabled(); 107 TraceLog::GetInstance()->SetDisabled();
107 TraceLog::GetInstance()->Flush( 108 TraceLog::GetInstance()->Flush(
108 base::Bind(&TraceEventTestFixture::OnTraceDataCollected, 109 base::Bind(&TraceEventTestFixture::OnTraceDataCollected,
109 base::Unretained(static_cast<TraceEventTestFixture*>(this)), 110 base::Unretained(static_cast<TraceEventTestFixture*>(this)),
110 base::Unretained(flush_complete_event))); 111 base::Unretained(flush_complete_event)));
111 } 112 }
(...skipping 1305 matching lines...) Expand 10 before | Expand all | Expand 10 after
1417 } 1418 }
1418 1419
1419 // Test that data sent from other threads is gathered 1420 // Test that data sent from other threads is gathered
1420 TEST_F(TraceEventTestFixture, DataCapturedOnThread) { 1421 TEST_F(TraceEventTestFixture, DataCapturedOnThread) {
1421 BeginTrace(); 1422 BeginTrace();
1422 1423
1423 Thread thread("1"); 1424 Thread thread("1");
1424 WaitableEvent task_complete_event(false, false); 1425 WaitableEvent task_complete_event(false, false);
1425 thread.Start(); 1426 thread.Start();
1426 1427
1427 thread.message_loop()->PostTask( 1428 thread.task_runner()->PostTask(
1428 FROM_HERE, base::Bind(&TraceWithAllMacroVariants, &task_complete_event)); 1429 FROM_HERE, base::Bind(&TraceWithAllMacroVariants, &task_complete_event));
1429 task_complete_event.Wait(); 1430 task_complete_event.Wait();
1430 thread.Stop(); 1431 thread.Stop();
1431 1432
1432 EndTraceAndFlush(); 1433 EndTraceAndFlush();
1433 ValidateAllTraceMacrosCreatedData(trace_parsed_); 1434 ValidateAllTraceMacrosCreatedData(trace_parsed_);
1434 } 1435 }
1435 1436
1436 // Test that data sent from multiple threads is gathered 1437 // Test that data sent from multiple threads is gathered
1437 TEST_F(TraceEventTestFixture, DataCapturedManyThreads) { 1438 TEST_F(TraceEventTestFixture, DataCapturedManyThreads) {
1438 BeginTrace(); 1439 BeginTrace();
1439 1440
1440 const int num_threads = 4; 1441 const int num_threads = 4;
1441 const int num_events = 4000; 1442 const int num_events = 4000;
1442 Thread* threads[num_threads]; 1443 Thread* threads[num_threads];
1443 WaitableEvent* task_complete_events[num_threads]; 1444 WaitableEvent* task_complete_events[num_threads];
1444 for (int i = 0; i < num_threads; i++) { 1445 for (int i = 0; i < num_threads; i++) {
1445 threads[i] = new Thread(StringPrintf("Thread %d", i)); 1446 threads[i] = new Thread(StringPrintf("Thread %d", i));
1446 task_complete_events[i] = new WaitableEvent(false, false); 1447 task_complete_events[i] = new WaitableEvent(false, false);
1447 threads[i]->Start(); 1448 threads[i]->Start();
1448 threads[i]->message_loop()->PostTask( 1449 threads[i]->task_runner()->PostTask(
1449 FROM_HERE, base::Bind(&TraceManyInstantEvents, 1450 FROM_HERE, base::Bind(&TraceManyInstantEvents, i, num_events,
1450 i, num_events, task_complete_events[i])); 1451 task_complete_events[i]));
1451 } 1452 }
1452 1453
1453 for (int i = 0; i < num_threads; i++) { 1454 for (int i = 0; i < num_threads; i++) {
1454 task_complete_events[i]->Wait(); 1455 task_complete_events[i]->Wait();
1455 } 1456 }
1456 1457
1457 // Let half of the threads end before flush. 1458 // Let half of the threads end before flush.
1458 for (int i = 0; i < num_threads / 2; i++) { 1459 for (int i = 0; i < num_threads / 2; i++) {
1459 threads[i]->Stop(); 1460 threads[i]->Stop();
1460 delete threads[i]; 1461 delete threads[i];
(...skipping 25 matching lines...) Expand all
1486 1487
1487 // Enable tracing. 1488 // Enable tracing.
1488 BeginTrace(); 1489 BeginTrace();
1489 1490
1490 // Now run some trace code on these threads. 1491 // Now run some trace code on these threads.
1491 WaitableEvent* task_complete_events[kNumThreads]; 1492 WaitableEvent* task_complete_events[kNumThreads];
1492 for (int i = 0; i < kNumThreads; i++) { 1493 for (int i = 0; i < kNumThreads; i++) {
1493 task_complete_events[i] = new WaitableEvent(false, false); 1494 task_complete_events[i] = new WaitableEvent(false, false);
1494 threads[i]->Start(); 1495 threads[i]->Start();
1495 thread_ids[i] = threads[i]->thread_id(); 1496 thread_ids[i] = threads[i]->thread_id();
1496 threads[i]->message_loop()->PostTask( 1497 threads[i]->task_runner()->PostTask(
1497 FROM_HERE, base::Bind(&TraceManyInstantEvents, 1498 FROM_HERE, base::Bind(&TraceManyInstantEvents, i, kNumEvents,
1498 i, kNumEvents, task_complete_events[i])); 1499 task_complete_events[i]));
1499 } 1500 }
1500 for (int i = 0; i < kNumThreads; i++) { 1501 for (int i = 0; i < kNumThreads; i++) {
1501 task_complete_events[i]->Wait(); 1502 task_complete_events[i]->Wait();
1502 } 1503 }
1503 1504
1504 // Shut things down. 1505 // Shut things down.
1505 for (int i = 0; i < kNumThreads; i++) { 1506 for (int i = 0; i < kNumThreads; i++) {
1506 threads[i]->Stop(); 1507 threads[i]->Stop();
1507 delete threads[i]; 1508 delete threads[i];
1508 delete task_complete_events[i]; 1509 delete task_complete_events[i];
(...skipping 1209 matching lines...) Expand 10 before | Expand all | Expand 10 after
2718 task_start_event->Signal(); 2719 task_start_event->Signal();
2719 task_stop_event->Wait(); 2720 task_stop_event->Wait();
2720 } 2721 }
2721 2722
2722 TEST_F(TraceEventTestFixture, SetCurrentThreadBlocksMessageLoopBeforeTracing) { 2723 TEST_F(TraceEventTestFixture, SetCurrentThreadBlocksMessageLoopBeforeTracing) {
2723 BeginTrace(); 2724 BeginTrace();
2724 2725
2725 Thread thread("1"); 2726 Thread thread("1");
2726 WaitableEvent task_complete_event(false, false); 2727 WaitableEvent task_complete_event(false, false);
2727 thread.Start(); 2728 thread.Start();
2728 thread.message_loop()->PostTask( 2729 thread.task_runner()->PostTask(
2729 FROM_HERE, Bind(&TraceLog::SetCurrentThreadBlocksMessageLoop, 2730 FROM_HERE, Bind(&TraceLog::SetCurrentThreadBlocksMessageLoop,
2730 Unretained(TraceLog::GetInstance()))); 2731 Unretained(TraceLog::GetInstance())));
2731 2732
2732 thread.message_loop()->PostTask( 2733 thread.task_runner()->PostTask(
2733 FROM_HERE, Bind(&TraceWithAllMacroVariants, &task_complete_event)); 2734 FROM_HERE, Bind(&TraceWithAllMacroVariants, &task_complete_event));
2734 task_complete_event.Wait(); 2735 task_complete_event.Wait();
2735 2736
2736 WaitableEvent task_start_event(false, false); 2737 WaitableEvent task_start_event(false, false);
2737 WaitableEvent task_stop_event(false, false); 2738 WaitableEvent task_stop_event(false, false);
2738 thread.message_loop()->PostTask( 2739 thread.task_runner()->PostTask(
2739 FROM_HERE, Bind(&BlockUntilStopped, &task_start_event, &task_stop_event)); 2740 FROM_HERE, Bind(&BlockUntilStopped, &task_start_event, &task_stop_event));
2740 task_start_event.Wait(); 2741 task_start_event.Wait();
2741 2742
2742 EndTraceAndFlush(); 2743 EndTraceAndFlush();
2743 ValidateAllTraceMacrosCreatedData(trace_parsed_); 2744 ValidateAllTraceMacrosCreatedData(trace_parsed_);
2744 2745
2745 task_stop_event.Signal(); 2746 task_stop_event.Signal();
2746 thread.Stop(); 2747 thread.Stop();
2747 } 2748 }
2748 2749
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
2789 BlockUntilStopped(task_start_event, task_stop_event); 2790 BlockUntilStopped(task_start_event, task_stop_event);
2790 } 2791 }
2791 2792
2792 TEST_F(TraceEventTestFixture, SetCurrentThreadBlocksMessageLoopAfterTracing) { 2793 TEST_F(TraceEventTestFixture, SetCurrentThreadBlocksMessageLoopAfterTracing) {
2793 BeginTrace(); 2794 BeginTrace();
2794 2795
2795 Thread thread("1"); 2796 Thread thread("1");
2796 WaitableEvent task_complete_event(false, false); 2797 WaitableEvent task_complete_event(false, false);
2797 thread.Start(); 2798 thread.Start();
2798 2799
2799 thread.message_loop()->PostTask( 2800 thread.task_runner()->PostTask(
2800 FROM_HERE, Bind(&TraceWithAllMacroVariants, &task_complete_event)); 2801 FROM_HERE, Bind(&TraceWithAllMacroVariants, &task_complete_event));
2801 task_complete_event.Wait(); 2802 task_complete_event.Wait();
2802 2803
2803 WaitableEvent task_start_event(false, false); 2804 WaitableEvent task_start_event(false, false);
2804 WaitableEvent task_stop_event(false, false); 2805 WaitableEvent task_stop_event(false, false);
2805 thread.message_loop()->PostTask( 2806 thread.task_runner()->PostTask(
2806 FROM_HERE, Bind(&SetBlockingFlagAndBlockUntilStopped, 2807 FROM_HERE, Bind(&SetBlockingFlagAndBlockUntilStopped, &task_start_event,
2807 &task_start_event, &task_stop_event)); 2808 &task_stop_event));
2808 task_start_event.Wait(); 2809 task_start_event.Wait();
2809 2810
2810 EndTraceAndFlush(); 2811 EndTraceAndFlush();
2811 ValidateAllTraceMacrosCreatedData(trace_parsed_); 2812 ValidateAllTraceMacrosCreatedData(trace_parsed_);
2812 2813
2813 task_stop_event.Signal(); 2814 task_stop_event.Signal();
2814 thread.Stop(); 2815 thread.Stop();
2815 } 2816 }
2816 2817
2817 TEST_F(TraceEventTestFixture, ThreadOnceBlocking) { 2818 TEST_F(TraceEventTestFixture, ThreadOnceBlocking) {
2818 BeginTrace(); 2819 BeginTrace();
2819 2820
2820 Thread thread("1"); 2821 Thread thread("1");
2821 WaitableEvent task_complete_event(false, false); 2822 WaitableEvent task_complete_event(false, false);
2822 thread.Start(); 2823 thread.Start();
2823 2824
2824 thread.message_loop()->PostTask( 2825 thread.task_runner()->PostTask(
2825 FROM_HERE, Bind(&TraceWithAllMacroVariants, &task_complete_event)); 2826 FROM_HERE, Bind(&TraceWithAllMacroVariants, &task_complete_event));
2826 task_complete_event.Wait(); 2827 task_complete_event.Wait();
2827 task_complete_event.Reset(); 2828 task_complete_event.Reset();
2828 2829
2829 WaitableEvent task_start_event(false, false); 2830 WaitableEvent task_start_event(false, false);
2830 WaitableEvent task_stop_event(false, false); 2831 WaitableEvent task_stop_event(false, false);
2831 thread.message_loop()->PostTask( 2832 thread.task_runner()->PostTask(
2832 FROM_HERE, Bind(&BlockUntilStopped, &task_start_event, &task_stop_event)); 2833 FROM_HERE, Bind(&BlockUntilStopped, &task_start_event, &task_stop_event));
2833 task_start_event.Wait(); 2834 task_start_event.Wait();
2834 2835
2835 // The thread will timeout in this flush. 2836 // The thread will timeout in this flush.
2836 EndTraceAndFlushInThreadWithMessageLoop(); 2837 EndTraceAndFlushInThreadWithMessageLoop();
2837 Clear(); 2838 Clear();
2838 2839
2839 // Let the thread's message loop continue to spin. 2840 // Let the thread's message loop continue to spin.
2840 task_stop_event.Signal(); 2841 task_stop_event.Signal();
2841 2842
2842 // The following sequence ensures that the FlushCurrentThread task has been 2843 // The following sequence ensures that the FlushCurrentThread task has been
2843 // executed in the thread before continuing. 2844 // executed in the thread before continuing.
2844 task_start_event.Reset(); 2845 task_start_event.Reset();
2845 task_stop_event.Reset(); 2846 task_stop_event.Reset();
2846 thread.message_loop()->PostTask( 2847 thread.task_runner()->PostTask(
2847 FROM_HERE, Bind(&BlockUntilStopped, &task_start_event, &task_stop_event)); 2848 FROM_HERE, Bind(&BlockUntilStopped, &task_start_event, &task_stop_event));
2848 task_start_event.Wait(); 2849 task_start_event.Wait();
2849 task_stop_event.Signal(); 2850 task_stop_event.Signal();
2850 Clear(); 2851 Clear();
2851 2852
2852 // TraceLog should discover the generation mismatch and recover the thread 2853 // TraceLog should discover the generation mismatch and recover the thread
2853 // local buffer for the thread without any error. 2854 // local buffer for the thread without any error.
2854 BeginTrace(); 2855 BeginTrace();
2855 thread.message_loop()->PostTask( 2856 thread.task_runner()->PostTask(
2856 FROM_HERE, Bind(&TraceWithAllMacroVariants, &task_complete_event)); 2857 FROM_HERE, Bind(&TraceWithAllMacroVariants, &task_complete_event));
2857 task_complete_event.Wait(); 2858 task_complete_event.Wait();
2858 task_complete_event.Reset(); 2859 task_complete_event.Reset();
2859 EndTraceAndFlushInThreadWithMessageLoop(); 2860 EndTraceAndFlushInThreadWithMessageLoop();
2860 ValidateAllTraceMacrosCreatedData(trace_parsed_); 2861 ValidateAllTraceMacrosCreatedData(trace_parsed_);
2861 } 2862 }
2862 2863
2863 std::string* g_log_buffer = NULL; 2864 std::string* g_log_buffer = NULL;
2864 bool MockLogMessageHandler(int, const char*, int, size_t, 2865 bool MockLogMessageHandler(int, const char*, int, size_t,
2865 const std::string& str) { 2866 const std::string& str) {
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
3074 EXPECT_EQ(original_option.record_mode, new_options.record_mode); 3075 EXPECT_EQ(original_option.record_mode, new_options.record_mode);
3075 EXPECT_EQ(original_option.enable_sampling, new_options.enable_sampling); 3076 EXPECT_EQ(original_option.enable_sampling, new_options.enable_sampling);
3076 EXPECT_EQ(original_option.enable_systrace, new_options.enable_systrace); 3077 EXPECT_EQ(original_option.enable_systrace, new_options.enable_systrace);
3077 } 3078 }
3078 } 3079 }
3079 } 3080 }
3080 } 3081 }
3081 3082
3082 } // namespace trace_event 3083 } // namespace trace_event
3083 } // namespace base 3084 } // namespace base
OLDNEW
« no previous file with comments | « base/trace_event/trace_event_system_stats_monitor_unittest.cc ('k') | base/win/object_watcher.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698