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

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

Issue 7778033: Add trace code to track all posted tasks in message_loop. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: win trace tests Created 9 years, 3 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "base/debug/trace_event.h" 5 #include "base/debug/trace_event.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/json/json_reader.h" 9 #include "base/json/json_reader.h"
10 #include "base/json/json_writer.h" 10 #include "base/json/json_writer.h"
(...skipping 26 matching lines...) Expand all
37 scoped_refptr<TraceLog::RefCountedString> json_events_str); 37 scoped_refptr<TraceLog::RefCountedString> json_events_str);
38 bool FindMatchingTraceEntry(const JsonKeyValue* key_values); 38 bool FindMatchingTraceEntry(const JsonKeyValue* key_values);
39 bool FindNamePhase(const char* name, const char* phase); 39 bool FindNamePhase(const char* name, const char* phase);
40 40
41 std::string trace_string_; 41 std::string trace_string_;
42 ListValue trace_parsed_; 42 ListValue trace_parsed_;
43 43
44 private: 44 private:
45 // We want our singleton torn down after each test. 45 // We want our singleton torn down after each test.
46 ShadowingAtExitManager at_exit_manager_; 46 ShadowingAtExitManager at_exit_manager_;
47 Lock lock_;
47 }; 48 };
48 49
49 void TraceEventTestFixture::ManualTestSetUp() { 50 void TraceEventTestFixture::ManualTestSetUp() {
51 TraceLog::DeleteForTesting();
50 TraceLog::Resurrect(); 52 TraceLog::Resurrect();
51 TraceLog* tracelog = TraceLog::GetInstance(); 53 TraceLog* tracelog = TraceLog::GetInstance();
52 ASSERT_TRUE(tracelog); 54 ASSERT_TRUE(tracelog);
53 ASSERT_FALSE(tracelog->IsEnabled()); 55 ASSERT_FALSE(tracelog->IsEnabled());
54 tracelog->SetOutputCallback( 56 tracelog->SetOutputCallback(
55 base::Bind(&TraceEventTestFixture::OnTraceDataCollected, 57 base::Bind(&TraceEventTestFixture::OnTraceDataCollected,
56 base::Unretained(this))); 58 base::Unretained(this)));
57 } 59 }
58 60
59 void TraceEventTestFixture::OnTraceDataCollected( 61 void TraceEventTestFixture::OnTraceDataCollected(
60 scoped_refptr<TraceLog::RefCountedString> json_events_str) { 62 scoped_refptr<TraceLog::RefCountedString> json_events_str) {
63 AutoLock lock(lock_);
61 trace_string_ += json_events_str->data; 64 trace_string_ += json_events_str->data;
62 65
63 scoped_ptr<Value> root; 66 scoped_ptr<Value> root;
64 root.reset(base::JSONReader::Read(json_events_str->data, false)); 67 root.reset(base::JSONReader::Read(json_events_str->data, false));
65 68
66 ListValue* root_list = NULL; 69 ListValue* root_list = NULL;
67 ASSERT_TRUE(root.get()); 70 ASSERT_TRUE(root.get());
68 ASSERT_TRUE(root->GetAsList(&root_list)); 71 ASSERT_TRUE(root->GetAsList(&root_list));
69 72
70 // Move items into our aggregate collection 73 // Move items into our aggregate collection
(...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after
522 TraceLog::GetInstance()->SetEnabled(true); 525 TraceLog::GetInstance()->SetEnabled(true);
523 526
524 Thread thread("1"); 527 Thread thread("1");
525 WaitableEvent task_complete_event(false, false); 528 WaitableEvent task_complete_event(false, false);
526 thread.Start(); 529 thread.Start();
527 530
528 thread.message_loop()->PostTask( 531 thread.message_loop()->PostTask(
529 FROM_HERE, NewRunnableFunction(&TraceWithAllMacroVariants, 532 FROM_HERE, NewRunnableFunction(&TraceWithAllMacroVariants,
530 &task_complete_event)); 533 &task_complete_event));
531 task_complete_event.Wait(); 534 task_complete_event.Wait();
535 thread.Stop();
532 536
533 TraceLog::GetInstance()->SetEnabled(false); 537 TraceLog::GetInstance()->SetEnabled(false);
534 thread.Stop();
535 ValidateAllTraceMacrosCreatedData(trace_parsed_, trace_string_); 538 ValidateAllTraceMacrosCreatedData(trace_parsed_, trace_string_);
536 } 539 }
537 540
538 // Test that data sent from multiple threads is gathered 541 // Test that data sent from multiple threads is gathered
539 TEST_F(TraceEventTestFixture, DataCapturedManyThreads) { 542 TEST_F(TraceEventTestFixture, DataCapturedManyThreads) {
540 ManualTestSetUp(); 543 ManualTestSetUp();
541 TraceLog::GetInstance()->SetEnabled(true); 544 TraceLog::GetInstance()->SetEnabled(true);
542 545
543 const int num_threads = 4; 546 const int num_threads = 4;
544 const int num_events = 4000; 547 const int num_events = 4000;
545 Thread* threads[num_threads]; 548 Thread* threads[num_threads];
546 WaitableEvent* task_complete_events[num_threads]; 549 WaitableEvent* task_complete_events[num_threads];
547 for (int i = 0; i < num_threads; i++) { 550 for (int i = 0; i < num_threads; i++) {
548 threads[i] = new Thread(StringPrintf("Thread %d", i).c_str()); 551 threads[i] = new Thread(StringPrintf("Thread %d", i).c_str());
549 task_complete_events[i] = new WaitableEvent(false, false); 552 task_complete_events[i] = new WaitableEvent(false, false);
550 threads[i]->Start(); 553 threads[i]->Start();
551 threads[i]->message_loop()->PostTask( 554 threads[i]->message_loop()->PostTask(
552 FROM_HERE, NewRunnableFunction(&TraceManyInstantEvents, 555 FROM_HERE, NewRunnableFunction(&TraceManyInstantEvents,
553 i, num_events, task_complete_events[i])); 556 i, num_events, task_complete_events[i]));
554 } 557 }
555 558
556 for (int i = 0; i < num_threads; i++) { 559 for (int i = 0; i < num_threads; i++) {
557 task_complete_events[i]->Wait(); 560 task_complete_events[i]->Wait();
558 } 561 }
559 562
560 TraceLog::GetInstance()->SetEnabled(false);
561
562 for (int i = 0; i < num_threads; i++) { 563 for (int i = 0; i < num_threads; i++) {
563 threads[i]->Stop(); 564 threads[i]->Stop();
564 delete threads[i]; 565 delete threads[i];
565 delete task_complete_events[i]; 566 delete task_complete_events[i];
566 } 567 }
567 568
569 TraceLog::GetInstance()->SetEnabled(false);
570
568 ValidateInstantEventPresentOnEveryThread(trace_parsed_, trace_string_, 571 ValidateInstantEventPresentOnEveryThread(trace_parsed_, trace_string_,
569 num_threads, num_events); 572 num_threads, num_events);
570 } 573 }
571 574
572 // Test that thread and process names show up in the trace 575 // Test that thread and process names show up in the trace
573 TEST_F(TraceEventTestFixture, ThreadNames) { 576 TEST_F(TraceEventTestFixture, ThreadNames) {
574 ManualTestSetUp(); 577 ManualTestSetUp();
575 578
576 // Create threads before we enable tracing to make sure 579 // Create threads before we enable tracing to make sure
577 // that tracelog still captures them. 580 // that tracelog still captures them.
(...skipping 15 matching lines...) Expand all
593 thread_ids[i] = threads[i]->thread_id(); 596 thread_ids[i] = threads[i]->thread_id();
594 threads[i]->message_loop()->PostTask( 597 threads[i]->message_loop()->PostTask(
595 FROM_HERE, NewRunnableFunction(&TraceManyInstantEvents, 598 FROM_HERE, NewRunnableFunction(&TraceManyInstantEvents,
596 i, num_events, task_complete_events[i])); 599 i, num_events, task_complete_events[i]));
597 } 600 }
598 for (int i = 0; i < num_threads; i++) { 601 for (int i = 0; i < num_threads; i++) {
599 task_complete_events[i]->Wait(); 602 task_complete_events[i]->Wait();
600 } 603 }
601 604
602 // Shut things down. 605 // Shut things down.
603 TraceLog::GetInstance()->SetEnabled(false);
604 for (int i = 0; i < num_threads; i++) { 606 for (int i = 0; i < num_threads; i++) {
605 threads[i]->Stop(); 607 threads[i]->Stop();
606 delete threads[i]; 608 delete threads[i];
607 delete task_complete_events[i]; 609 delete task_complete_events[i];
608 } 610 }
609 611
612 TraceLog::GetInstance()->SetEnabled(false);
613
610 std::string tmp; 614 std::string tmp;
611 int tmp_int; 615 int tmp_int;
612 DictionaryValue* item; 616 DictionaryValue* item;
613 617
614 // Make sure we get thread name metadata. 618 // Make sure we get thread name metadata.
615 // Note, the test suite may have created a ton of threads. 619 // Note, the test suite may have created a ton of threads.
616 // So, we'll have thread names for threads we didn't create. 620 // So, we'll have thread names for threads we didn't create.
617 std::vector<DictionaryValue*> items = 621 std::vector<DictionaryValue*> items =
618 FindTraceEntries(trace_parsed_, "thread_name"); 622 FindTraceEntries(trace_parsed_, "thread_name");
619 for (int i = 0; i < static_cast<int>(items.size()); i++) { 623 for (int i = 0; i < static_cast<int>(items.size()); i++) {
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
764 768
765 std::string s; 769 std::string s;
766 EXPECT_TRUE(entry3->GetString("args.arg1", &s)); 770 EXPECT_TRUE(entry3->GetString("args.arg1", &s));
767 EXPECT_EQ("val1", s); 771 EXPECT_EQ("val1", s);
768 EXPECT_TRUE(entry3->GetString("args.arg2", &s)); 772 EXPECT_TRUE(entry3->GetString("args.arg2", &s));
769 EXPECT_EQ("val2", s); 773 EXPECT_EQ("val2", s);
770 } 774 }
771 775
772 } // namespace debug 776 } // namespace debug
773 } // namespace base 777 } // namespace base
OLDNEW
« no previous file with comments | « base/debug/trace_event.cc ('k') | base/memory/singleton.h » ('j') | base/message_loop.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698