| OLD | NEW |
| 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 "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 25 matching lines...) Expand all Loading... |
| 36 CompareOp op; | 36 CompareOp op; |
| 37 }; | 37 }; |
| 38 | 38 |
| 39 class TraceEventTestFixture : public testing::Test { | 39 class TraceEventTestFixture : public testing::Test { |
| 40 public: | 40 public: |
| 41 // This fixture does not use SetUp() because the fixture must be manually set | 41 // This fixture does not use SetUp() because the fixture must be manually set |
| 42 // up multiple times when testing AtExit. Use ManualTestSetUp for this. | 42 // up multiple times when testing AtExit. Use ManualTestSetUp for this. |
| 43 void ManualTestSetUp(); | 43 void ManualTestSetUp(); |
| 44 void OnTraceDataCollected( | 44 void OnTraceDataCollected( |
| 45 const scoped_refptr<base::RefCountedString>& events_str); | 45 const scoped_refptr<base::RefCountedString>& events_str); |
| 46 void OnTraceNotification(int notification) { |
| 47 event_watch_notification_ = |
| 48 !!(notification & TraceLog::EVENT_WATCH_NOTIFICATION); |
| 49 } |
| 46 DictionaryValue* FindMatchingTraceEntry(const JsonKeyValue* key_values); | 50 DictionaryValue* FindMatchingTraceEntry(const JsonKeyValue* key_values); |
| 47 DictionaryValue* FindNamePhase(const char* name, const char* phase); | 51 DictionaryValue* FindNamePhase(const char* name, const char* phase); |
| 48 DictionaryValue* FindNamePhaseKeyValue(const char* name, | 52 DictionaryValue* FindNamePhaseKeyValue(const char* name, |
| 49 const char* phase, | 53 const char* phase, |
| 50 const char* key, | 54 const char* key, |
| 51 const char* value); | 55 const char* value); |
| 52 bool FindMatchingValue(const char* key, | 56 bool FindMatchingValue(const char* key, |
| 53 const char* value); | 57 const char* value); |
| 54 bool FindNonMatchingValue(const char* key, | 58 bool FindNonMatchingValue(const char* key, |
| 55 const char* value); | 59 const char* value); |
| 56 void Clear() { | 60 void Clear() { |
| 57 trace_parsed_.Clear(); | 61 trace_parsed_.Clear(); |
| 58 json_output_.json_output.clear(); | 62 json_output_.json_output.clear(); |
| 59 } | 63 } |
| 60 | 64 |
| 65 void BeginTrace() { |
| 66 event_watch_notification_ = false; |
| 67 TraceLog::GetInstance()->SetEnabled("*"); |
| 68 } |
| 69 |
| 70 void EndTraceAndFlush() { |
| 71 TraceLog::GetInstance()->SetDisabled(); |
| 72 TraceLog::GetInstance()->Flush( |
| 73 base::Bind(&TraceEventTestFixture::OnTraceDataCollected, |
| 74 base::Unretained(this))); |
| 75 } |
| 76 |
| 61 virtual void SetUp() OVERRIDE { | 77 virtual void SetUp() OVERRIDE { |
| 62 old_thread_name_ = PlatformThread::GetName(); | 78 old_thread_name_ = PlatformThread::GetName(); |
| 63 } | 79 } |
| 64 virtual void TearDown() OVERRIDE { | 80 virtual void TearDown() OVERRIDE { |
| 65 if (TraceLog::GetInstance()) | 81 if (TraceLog::GetInstance()) |
| 66 EXPECT_FALSE(TraceLog::GetInstance()->IsEnabled()); | 82 EXPECT_FALSE(TraceLog::GetInstance()->IsEnabled()); |
| 67 PlatformThread::SetName(old_thread_name_ ? old_thread_name_ : ""); | 83 PlatformThread::SetName(old_thread_name_ ? old_thread_name_ : ""); |
| 68 } | 84 } |
| 69 | 85 |
| 70 const char* old_thread_name_; | 86 const char* old_thread_name_; |
| 71 ListValue trace_parsed_; | 87 ListValue trace_parsed_; |
| 72 base::debug::TraceResultBuffer trace_buffer_; | 88 base::debug::TraceResultBuffer trace_buffer_; |
| 73 base::debug::TraceResultBuffer::SimpleOutput json_output_; | 89 base::debug::TraceResultBuffer::SimpleOutput json_output_; |
| 90 bool event_watch_notification_; |
| 74 | 91 |
| 75 private: | 92 private: |
| 76 // We want our singleton torn down after each test. | 93 // We want our singleton torn down after each test. |
| 77 ShadowingAtExitManager at_exit_manager_; | 94 ShadowingAtExitManager at_exit_manager_; |
| 78 Lock lock_; | 95 Lock lock_; |
| 79 }; | 96 }; |
| 80 | 97 |
| 81 void TraceEventTestFixture::ManualTestSetUp() { | 98 void TraceEventTestFixture::ManualTestSetUp() { |
| 82 TraceLog::DeleteForTesting(); | 99 TraceLog::DeleteForTesting(); |
| 83 TraceLog::Resurrect(); | 100 TraceLog::Resurrect(); |
| 84 TraceLog* tracelog = TraceLog::GetInstance(); | 101 TraceLog* tracelog = TraceLog::GetInstance(); |
| 85 ASSERT_TRUE(tracelog); | 102 ASSERT_TRUE(tracelog); |
| 86 ASSERT_FALSE(tracelog->IsEnabled()); | 103 ASSERT_FALSE(tracelog->IsEnabled()); |
| 87 tracelog->SetOutputCallback( | 104 tracelog->SetNotificationCallback( |
| 88 base::Bind(&TraceEventTestFixture::OnTraceDataCollected, | 105 base::Bind(&TraceEventTestFixture::OnTraceNotification, |
| 89 base::Unretained(this))); | 106 base::Unretained(this))); |
| 90 trace_buffer_.SetOutputCallback(json_output_.GetCallback()); | 107 trace_buffer_.SetOutputCallback(json_output_.GetCallback()); |
| 91 } | 108 } |
| 92 | 109 |
| 93 void TraceEventTestFixture::OnTraceDataCollected( | 110 void TraceEventTestFixture::OnTraceDataCollected( |
| 94 const scoped_refptr<base::RefCountedString>& events_str) { | 111 const scoped_refptr<base::RefCountedString>& events_str) { |
| 95 AutoLock lock(lock_); | 112 AutoLock lock(lock_); |
| 96 json_output_.json_output.clear(); | 113 json_output_.json_output.clear(); |
| 97 trace_buffer_.Start(); | 114 trace_buffer_.Start(); |
| 98 trace_buffer_.AddFragment(events_str->data()); | 115 trace_buffer_.AddFragment(events_str->data()); |
| (...skipping 534 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 633 | 650 |
| 634 } // namespace | 651 } // namespace |
| 635 | 652 |
| 636 // Simple Test for emitting data and validating it was received. | 653 // Simple Test for emitting data and validating it was received. |
| 637 TEST_F(TraceEventTestFixture, DataCaptured) { | 654 TEST_F(TraceEventTestFixture, DataCaptured) { |
| 638 ManualTestSetUp(); | 655 ManualTestSetUp(); |
| 639 TraceLog::GetInstance()->SetEnabled(true); | 656 TraceLog::GetInstance()->SetEnabled(true); |
| 640 | 657 |
| 641 TraceWithAllMacroVariants(NULL); | 658 TraceWithAllMacroVariants(NULL); |
| 642 | 659 |
| 643 TraceLog::GetInstance()->SetEnabled(false); | 660 EndTraceAndFlush(); |
| 644 | 661 |
| 645 ValidateAllTraceMacrosCreatedData(trace_parsed_); | 662 ValidateAllTraceMacrosCreatedData(trace_parsed_); |
| 646 } | 663 } |
| 647 | 664 |
| 648 class MockEnabledStateChangedObserver : | 665 class MockEnabledStateChangedObserver : |
| 649 public base::debug::TraceLog::EnabledStateChangedObserver { | 666 public base::debug::TraceLog::EnabledStateChangedObserver { |
| 650 public: | 667 public: |
| 651 MOCK_METHOD0(OnTraceLogWillEnable, void()); | 668 MOCK_METHOD0(OnTraceLogWillEnable, void()); |
| 652 MOCK_METHOD0(OnTraceLogWillDisable, void()); | 669 MOCK_METHOD0(OnTraceLogWillDisable, void()); |
| 653 }; | 670 }; |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 724 } | 741 } |
| 725 | 742 |
| 726 // Test that categories work. | 743 // Test that categories work. |
| 727 TEST_F(TraceEventTestFixture, Categories) { | 744 TEST_F(TraceEventTestFixture, Categories) { |
| 728 ManualTestSetUp(); | 745 ManualTestSetUp(); |
| 729 | 746 |
| 730 // Test that categories that are used can be retrieved whether trace was | 747 // Test that categories that are used can be retrieved whether trace was |
| 731 // enabled or disabled when the trace event was encountered. | 748 // enabled or disabled when the trace event was encountered. |
| 732 TRACE_EVENT_INSTANT0("c1", "name"); | 749 TRACE_EVENT_INSTANT0("c1", "name"); |
| 733 TRACE_EVENT_INSTANT0("c2", "name"); | 750 TRACE_EVENT_INSTANT0("c2", "name"); |
| 734 TraceLog::GetInstance()->SetEnabled(true); | 751 BeginTrace(); |
| 735 TRACE_EVENT_INSTANT0("c3", "name"); | 752 TRACE_EVENT_INSTANT0("c3", "name"); |
| 736 TRACE_EVENT_INSTANT0("c4", "name"); | 753 TRACE_EVENT_INSTANT0("c4", "name"); |
| 737 TraceLog::GetInstance()->SetEnabled(false); | 754 EndTraceAndFlush(); |
| 738 std::vector<std::string> cats; | 755 std::vector<std::string> cats; |
| 739 TraceLog::GetInstance()->GetKnownCategories(&cats); | 756 TraceLog::GetInstance()->GetKnownCategories(&cats); |
| 740 EXPECT_TRUE(std::find(cats.begin(), cats.end(), "c1") != cats.end()); | 757 EXPECT_TRUE(std::find(cats.begin(), cats.end(), "c1") != cats.end()); |
| 741 EXPECT_TRUE(std::find(cats.begin(), cats.end(), "c2") != cats.end()); | 758 EXPECT_TRUE(std::find(cats.begin(), cats.end(), "c2") != cats.end()); |
| 742 EXPECT_TRUE(std::find(cats.begin(), cats.end(), "c3") != cats.end()); | 759 EXPECT_TRUE(std::find(cats.begin(), cats.end(), "c3") != cats.end()); |
| 743 EXPECT_TRUE(std::find(cats.begin(), cats.end(), "c4") != cats.end()); | 760 EXPECT_TRUE(std::find(cats.begin(), cats.end(), "c4") != cats.end()); |
| 744 | 761 |
| 745 const std::vector<std::string> empty_categories; | 762 const std::vector<std::string> empty_categories; |
| 746 std::vector<std::string> included_categories; | 763 std::vector<std::string> included_categories; |
| 747 std::vector<std::string> excluded_categories; | 764 std::vector<std::string> excluded_categories; |
| 748 | 765 |
| 749 // Test that category filtering works. | 766 // Test that category filtering works. |
| 750 | 767 |
| 751 // Include nonexistent category -> no events | 768 // Include nonexistent category -> no events |
| 752 Clear(); | 769 Clear(); |
| 753 included_categories.clear(); | 770 included_categories.clear(); |
| 754 included_categories.push_back("not_found823564786"); | 771 included_categories.push_back("not_found823564786"); |
| 755 TraceLog::GetInstance()->SetEnabled(included_categories, empty_categories); | 772 TraceLog::GetInstance()->SetEnabled(included_categories, empty_categories); |
| 756 TRACE_EVENT_INSTANT0("cat1", "name"); | 773 TRACE_EVENT_INSTANT0("cat1", "name"); |
| 757 TRACE_EVENT_INSTANT0("cat2", "name"); | 774 TRACE_EVENT_INSTANT0("cat2", "name"); |
| 758 TraceLog::GetInstance()->SetDisabled(); | 775 EndTraceAndFlush(); |
| 759 EXPECT_TRUE(trace_parsed_.empty()); | 776 EXPECT_TRUE(trace_parsed_.empty()); |
| 760 | 777 |
| 761 // Include existent category -> only events of that category | 778 // Include existent category -> only events of that category |
| 762 Clear(); | 779 Clear(); |
| 763 included_categories.clear(); | 780 included_categories.clear(); |
| 764 included_categories.push_back("inc"); | 781 included_categories.push_back("inc"); |
| 765 TraceLog::GetInstance()->SetEnabled(included_categories, empty_categories); | 782 TraceLog::GetInstance()->SetEnabled(included_categories, empty_categories); |
| 766 TRACE_EVENT_INSTANT0("inc", "name"); | 783 TRACE_EVENT_INSTANT0("inc", "name"); |
| 767 TRACE_EVENT_INSTANT0("inc2", "name"); | 784 TRACE_EVENT_INSTANT0("inc2", "name"); |
| 768 TraceLog::GetInstance()->SetDisabled(); | 785 EndTraceAndFlush(); |
| 769 EXPECT_TRUE(FindMatchingValue("cat", "inc")); | 786 EXPECT_TRUE(FindMatchingValue("cat", "inc")); |
| 770 EXPECT_FALSE(FindNonMatchingValue("cat", "inc")); | 787 EXPECT_FALSE(FindNonMatchingValue("cat", "inc")); |
| 771 | 788 |
| 772 // Include existent wildcard -> all categories matching wildcard | 789 // Include existent wildcard -> all categories matching wildcard |
| 773 Clear(); | 790 Clear(); |
| 774 included_categories.clear(); | 791 included_categories.clear(); |
| 775 included_categories.push_back("inc_wildcard_*"); | 792 included_categories.push_back("inc_wildcard_*"); |
| 776 included_categories.push_back("inc_wildchar_?_end"); | 793 included_categories.push_back("inc_wildchar_?_end"); |
| 777 TraceLog::GetInstance()->SetEnabled(included_categories, empty_categories); | 794 TraceLog::GetInstance()->SetEnabled(included_categories, empty_categories); |
| 778 TRACE_EVENT_INSTANT0("inc_wildcard_abc", "included"); | 795 TRACE_EVENT_INSTANT0("inc_wildcard_abc", "included"); |
| 779 TRACE_EVENT_INSTANT0("inc_wildcard_", "included"); | 796 TRACE_EVENT_INSTANT0("inc_wildcard_", "included"); |
| 780 TRACE_EVENT_INSTANT0("inc_wildchar_x_end", "included"); | 797 TRACE_EVENT_INSTANT0("inc_wildchar_x_end", "included"); |
| 781 TRACE_EVENT_INSTANT0("inc_wildchar_bla_end", "not_inc"); | 798 TRACE_EVENT_INSTANT0("inc_wildchar_bla_end", "not_inc"); |
| 782 TRACE_EVENT_INSTANT0("cat1", "not_inc"); | 799 TRACE_EVENT_INSTANT0("cat1", "not_inc"); |
| 783 TRACE_EVENT_INSTANT0("cat2", "not_inc"); | 800 TRACE_EVENT_INSTANT0("cat2", "not_inc"); |
| 784 TraceLog::GetInstance()->SetDisabled(); | 801 EndTraceAndFlush(); |
| 785 EXPECT_TRUE(FindMatchingValue("cat", "inc_wildcard_abc")); | 802 EXPECT_TRUE(FindMatchingValue("cat", "inc_wildcard_abc")); |
| 786 EXPECT_TRUE(FindMatchingValue("cat", "inc_wildcard_")); | 803 EXPECT_TRUE(FindMatchingValue("cat", "inc_wildcard_")); |
| 787 EXPECT_TRUE(FindMatchingValue("cat", "inc_wildchar_x_end")); | 804 EXPECT_TRUE(FindMatchingValue("cat", "inc_wildchar_x_end")); |
| 788 EXPECT_FALSE(FindMatchingValue("name", "not_inc")); | 805 EXPECT_FALSE(FindMatchingValue("name", "not_inc")); |
| 789 | 806 |
| 790 included_categories.clear(); | 807 included_categories.clear(); |
| 791 | 808 |
| 792 // Exclude nonexistent category -> all events | 809 // Exclude nonexistent category -> all events |
| 793 Clear(); | 810 Clear(); |
| 794 excluded_categories.clear(); | 811 excluded_categories.clear(); |
| 795 excluded_categories.push_back("not_found823564786"); | 812 excluded_categories.push_back("not_found823564786"); |
| 796 TraceLog::GetInstance()->SetEnabled(empty_categories, excluded_categories); | 813 TraceLog::GetInstance()->SetEnabled(empty_categories, excluded_categories); |
| 797 TRACE_EVENT_INSTANT0("cat1", "name"); | 814 TRACE_EVENT_INSTANT0("cat1", "name"); |
| 798 TRACE_EVENT_INSTANT0("cat2", "name"); | 815 TRACE_EVENT_INSTANT0("cat2", "name"); |
| 799 TraceLog::GetInstance()->SetDisabled(); | 816 EndTraceAndFlush(); |
| 800 EXPECT_TRUE(FindMatchingValue("cat", "cat1")); | 817 EXPECT_TRUE(FindMatchingValue("cat", "cat1")); |
| 801 EXPECT_TRUE(FindMatchingValue("cat", "cat2")); | 818 EXPECT_TRUE(FindMatchingValue("cat", "cat2")); |
| 802 | 819 |
| 803 // Exclude existent category -> only events of other categories | 820 // Exclude existent category -> only events of other categories |
| 804 Clear(); | 821 Clear(); |
| 805 excluded_categories.clear(); | 822 excluded_categories.clear(); |
| 806 excluded_categories.push_back("inc"); | 823 excluded_categories.push_back("inc"); |
| 807 TraceLog::GetInstance()->SetEnabled(empty_categories, excluded_categories); | 824 TraceLog::GetInstance()->SetEnabled(empty_categories, excluded_categories); |
| 808 TRACE_EVENT_INSTANT0("inc", "name"); | 825 TRACE_EVENT_INSTANT0("inc", "name"); |
| 809 TRACE_EVENT_INSTANT0("inc2", "name"); | 826 TRACE_EVENT_INSTANT0("inc2", "name"); |
| 810 TraceLog::GetInstance()->SetDisabled(); | 827 EndTraceAndFlush(); |
| 811 EXPECT_TRUE(FindMatchingValue("cat", "inc2")); | 828 EXPECT_TRUE(FindMatchingValue("cat", "inc2")); |
| 812 EXPECT_FALSE(FindMatchingValue("cat", "inc")); | 829 EXPECT_FALSE(FindMatchingValue("cat", "inc")); |
| 813 | 830 |
| 814 // Exclude existent wildcard -> all categories not matching wildcard | 831 // Exclude existent wildcard -> all categories not matching wildcard |
| 815 Clear(); | 832 Clear(); |
| 816 excluded_categories.clear(); | 833 excluded_categories.clear(); |
| 817 excluded_categories.push_back("inc_wildcard_*"); | 834 excluded_categories.push_back("inc_wildcard_*"); |
| 818 excluded_categories.push_back("inc_wildchar_?_end"); | 835 excluded_categories.push_back("inc_wildchar_?_end"); |
| 819 TraceLog::GetInstance()->SetEnabled(empty_categories, excluded_categories); | 836 TraceLog::GetInstance()->SetEnabled(empty_categories, excluded_categories); |
| 820 TRACE_EVENT_INSTANT0("inc_wildcard_abc", "not_inc"); | 837 TRACE_EVENT_INSTANT0("inc_wildcard_abc", "not_inc"); |
| 821 TRACE_EVENT_INSTANT0("inc_wildcard_", "not_inc"); | 838 TRACE_EVENT_INSTANT0("inc_wildcard_", "not_inc"); |
| 822 TRACE_EVENT_INSTANT0("inc_wildchar_x_end", "not_inc"); | 839 TRACE_EVENT_INSTANT0("inc_wildchar_x_end", "not_inc"); |
| 823 TRACE_EVENT_INSTANT0("inc_wildchar_bla_end", "included"); | 840 TRACE_EVENT_INSTANT0("inc_wildchar_bla_end", "included"); |
| 824 TRACE_EVENT_INSTANT0("cat1", "included"); | 841 TRACE_EVENT_INSTANT0("cat1", "included"); |
| 825 TRACE_EVENT_INSTANT0("cat2", "included"); | 842 TRACE_EVENT_INSTANT0("cat2", "included"); |
| 826 TraceLog::GetInstance()->SetDisabled(); | 843 EndTraceAndFlush(); |
| 827 EXPECT_TRUE(FindMatchingValue("cat", "inc_wildchar_bla_end")); | 844 EXPECT_TRUE(FindMatchingValue("cat", "inc_wildchar_bla_end")); |
| 828 EXPECT_TRUE(FindMatchingValue("cat", "cat1")); | 845 EXPECT_TRUE(FindMatchingValue("cat", "cat1")); |
| 829 EXPECT_TRUE(FindMatchingValue("cat", "cat2")); | 846 EXPECT_TRUE(FindMatchingValue("cat", "cat2")); |
| 830 EXPECT_FALSE(FindMatchingValue("name", "not_inc")); | 847 EXPECT_FALSE(FindMatchingValue("name", "not_inc")); |
| 831 } | 848 } |
| 832 | 849 |
| 833 // Simple Test for time threshold events. | 850 // Simple Test for time threshold events. |
| 834 TEST_F(TraceEventTestFixture, DataCapturedThreshold) { | 851 TEST_F(TraceEventTestFixture, DataCapturedThreshold) { |
| 835 ManualTestSetUp(); | 852 ManualTestSetUp(); |
| 836 TraceLog::GetInstance()->SetEnabled(true); | 853 BeginTrace(); |
| 837 | 854 |
| 838 // Test that events at the same level are properly filtered by threshold. | 855 // Test that events at the same level are properly filtered by threshold. |
| 839 { | 856 { |
| 840 TRACE_EVENT_IF_LONGER_THAN0(100, "time", "threshold 100"); | 857 TRACE_EVENT_IF_LONGER_THAN0(100, "time", "threshold 100"); |
| 841 TRACE_EVENT_IF_LONGER_THAN0(1000, "time", "threshold 1000"); | 858 TRACE_EVENT_IF_LONGER_THAN0(1000, "time", "threshold 1000"); |
| 842 TRACE_EVENT_IF_LONGER_THAN0(10000, "time", "threshold 10000"); | 859 TRACE_EVENT_IF_LONGER_THAN0(10000, "time", "threshold 10000"); |
| 843 // 100+ seconds to avoid flakiness. | 860 // 100+ seconds to avoid flakiness. |
| 844 TRACE_EVENT_IF_LONGER_THAN0(100000000, "time", "threshold long1"); | 861 TRACE_EVENT_IF_LONGER_THAN0(100000000, "time", "threshold long1"); |
| 845 TRACE_EVENT_IF_LONGER_THAN0(200000000, "time", "threshold long2"); | 862 TRACE_EVENT_IF_LONGER_THAN0(200000000, "time", "threshold long2"); |
| 846 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(20)); | 863 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(20)); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 895 "4thresholdlong2"); | 912 "4thresholdlong2"); |
| 896 base::PlatformThread::Sleep( | 913 base::PlatformThread::Sleep( |
| 897 base::TimeDelta::FromMilliseconds(20)); | 914 base::TimeDelta::FromMilliseconds(20)); |
| 898 } | 915 } |
| 899 } | 916 } |
| 900 } | 917 } |
| 901 } | 918 } |
| 902 } | 919 } |
| 903 } | 920 } |
| 904 | 921 |
| 905 TraceLog::GetInstance()->SetEnabled(false); | 922 EndTraceAndFlush(); |
| 906 | 923 |
| 907 #define EXPECT_FIND_BE_(str) \ | 924 #define EXPECT_FIND_BE_(str) \ |
| 908 EXPECT_TRUE(FindNamePhase(str, "B")); \ | 925 EXPECT_TRUE(FindNamePhase(str, "B")); \ |
| 909 EXPECT_TRUE(FindNamePhase(str, "E")) | 926 EXPECT_TRUE(FindNamePhase(str, "E")) |
| 910 #define EXPECT_NOT_FIND_BE_(str) \ | 927 #define EXPECT_NOT_FIND_BE_(str) \ |
| 911 EXPECT_FALSE(FindNamePhase(str, "B")); \ | 928 EXPECT_FALSE(FindNamePhase(str, "B")); \ |
| 912 EXPECT_FALSE(FindNamePhase(str, "E")) | 929 EXPECT_FALSE(FindNamePhase(str, "E")) |
| 913 | 930 |
| 914 EXPECT_FIND_BE_("threshold 100"); | 931 EXPECT_FIND_BE_("threshold 100"); |
| 915 EXPECT_FIND_BE_("threshold 1000"); | 932 EXPECT_FIND_BE_("threshold 1000"); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 928 EXPECT_NOT_FIND_BE_("3thresholdlong2"); | 945 EXPECT_NOT_FIND_BE_("3thresholdlong2"); |
| 929 | 946 |
| 930 EXPECT_FIND_BE_("nonthreshold4"); | 947 EXPECT_FIND_BE_("nonthreshold4"); |
| 931 EXPECT_FIND_BE_("4threshold100"); | 948 EXPECT_FIND_BE_("4threshold100"); |
| 932 EXPECT_FIND_BE_("4threshold1000"); | 949 EXPECT_FIND_BE_("4threshold1000"); |
| 933 EXPECT_FIND_BE_("4threshold10000"); | 950 EXPECT_FIND_BE_("4threshold10000"); |
| 934 EXPECT_NOT_FIND_BE_("4thresholdlong1"); | 951 EXPECT_NOT_FIND_BE_("4thresholdlong1"); |
| 935 EXPECT_NOT_FIND_BE_("4thresholdlong2"); | 952 EXPECT_NOT_FIND_BE_("4thresholdlong2"); |
| 936 } | 953 } |
| 937 | 954 |
| 955 // Test EVENT_WATCH_NOTIFICATION |
| 956 TEST_F(TraceEventTestFixture, EventWatchNotification) { |
| 957 ManualTestSetUp(); |
| 958 |
| 959 // Basic one occurrence. |
| 960 BeginTrace(); |
| 961 TraceLog::GetInstance()->SetWatchEvent("cat", "event", 1); |
| 962 TRACE_EVENT_INSTANT0("cat", "event"); |
| 963 EndTraceAndFlush(); |
| 964 EXPECT_TRUE(event_watch_notification_); |
| 965 |
| 966 // Auto-reset after end trace. |
| 967 BeginTrace(); |
| 968 TraceLog::GetInstance()->SetWatchEvent("cat", "event", 1); |
| 969 EndTraceAndFlush(); |
| 970 BeginTrace(); |
| 971 TRACE_EVENT_INSTANT0("cat", "event"); |
| 972 EndTraceAndFlush(); |
| 973 EXPECT_FALSE(event_watch_notification_); |
| 974 |
| 975 // Multiple occurrence. |
| 976 BeginTrace(); |
| 977 int num_occurrences = 5; |
| 978 TraceLog::GetInstance()->SetWatchEvent("cat", "event", num_occurrences); |
| 979 for (int i = 0; i < num_occurrences; ++i) |
| 980 TRACE_EVENT_INSTANT0("cat", "event"); |
| 981 EndTraceAndFlush(); |
| 982 EXPECT_TRUE(event_watch_notification_); |
| 983 |
| 984 // Wrong category. |
| 985 BeginTrace(); |
| 986 TraceLog::GetInstance()->SetWatchEvent("cat", "event", 1); |
| 987 TRACE_EVENT_INSTANT0("wrong_cat", "event"); |
| 988 EndTraceAndFlush(); |
| 989 EXPECT_FALSE(event_watch_notification_); |
| 990 |
| 991 // Wrong name. |
| 992 BeginTrace(); |
| 993 TraceLog::GetInstance()->SetWatchEvent("cat", "event", 1); |
| 994 TRACE_EVENT_INSTANT0("cat", "wrong_event"); |
| 995 EndTraceAndFlush(); |
| 996 EXPECT_FALSE(event_watch_notification_); |
| 997 |
| 998 // Not enough occurrences. |
| 999 BeginTrace(); |
| 1000 TraceLog::GetInstance()->SetWatchEvent("cat", "event", 2); |
| 1001 TRACE_EVENT_INSTANT0("cat", "event"); |
| 1002 EndTraceAndFlush(); |
| 1003 EXPECT_FALSE(event_watch_notification_); |
| 1004 |
| 1005 // Canceled. |
| 1006 BeginTrace(); |
| 1007 TraceLog::GetInstance()->SetWatchEvent("cat", "event", 1); |
| 1008 TraceLog::GetInstance()->CancelWatchEvent(); |
| 1009 TRACE_EVENT_INSTANT0("cat", "event"); |
| 1010 EndTraceAndFlush(); |
| 1011 EXPECT_FALSE(event_watch_notification_); |
| 1012 } |
| 1013 |
| 938 // Test ASYNC_BEGIN/END events | 1014 // Test ASYNC_BEGIN/END events |
| 939 TEST_F(TraceEventTestFixture, AsyncBeginEndEvents) { | 1015 TEST_F(TraceEventTestFixture, AsyncBeginEndEvents) { |
| 940 ManualTestSetUp(); | 1016 ManualTestSetUp(); |
| 941 TraceLog::GetInstance()->SetEnabled(true); | 1017 BeginTrace(); |
| 942 | 1018 |
| 943 unsigned long long id = 0xfeedbeeffeedbeefull; | 1019 unsigned long long id = 0xfeedbeeffeedbeefull; |
| 944 TRACE_EVENT_ASYNC_BEGIN0( "cat", "name1", id); | 1020 TRACE_EVENT_ASYNC_BEGIN0( "cat", "name1", id); |
| 945 TRACE_EVENT_ASYNC_BEGIN_STEP0( "cat", "name1", id, "step1"); | 1021 TRACE_EVENT_ASYNC_BEGIN_STEP0( "cat", "name1", id, "step1"); |
| 946 TRACE_EVENT_ASYNC_END0("cat", "name1", id); | 1022 TRACE_EVENT_ASYNC_END0("cat", "name1", id); |
| 947 TRACE_EVENT_BEGIN0( "cat", "name2"); | 1023 TRACE_EVENT_BEGIN0( "cat", "name2"); |
| 948 TRACE_EVENT_ASYNC_BEGIN0( "cat", "name3", 0); | 1024 TRACE_EVENT_ASYNC_BEGIN0( "cat", "name3", 0); |
| 949 | 1025 |
| 950 TraceLog::GetInstance()->SetEnabled(false); | 1026 EndTraceAndFlush(); |
| 951 | 1027 |
| 952 EXPECT_TRUE(FindNamePhase("name1", "S")); | 1028 EXPECT_TRUE(FindNamePhase("name1", "S")); |
| 953 EXPECT_TRUE(FindNamePhase("name1", "T")); | 1029 EXPECT_TRUE(FindNamePhase("name1", "T")); |
| 954 EXPECT_TRUE(FindNamePhase("name1", "F")); | 1030 EXPECT_TRUE(FindNamePhase("name1", "F")); |
| 955 | 1031 |
| 956 std::string id_str; | 1032 std::string id_str; |
| 957 StringAppendF(&id_str, "%llx", id); | 1033 StringAppendF(&id_str, "%llx", id); |
| 958 | 1034 |
| 959 EXPECT_TRUE(FindNamePhaseKeyValue("name1", "S", "id", id_str.c_str())); | 1035 EXPECT_TRUE(FindNamePhaseKeyValue("name1", "S", "id", id_str.c_str())); |
| 960 EXPECT_TRUE(FindNamePhaseKeyValue("name1", "T", "id", id_str.c_str())); | 1036 EXPECT_TRUE(FindNamePhaseKeyValue("name1", "T", "id", id_str.c_str())); |
| 961 EXPECT_TRUE(FindNamePhaseKeyValue("name1", "F", "id", id_str.c_str())); | 1037 EXPECT_TRUE(FindNamePhaseKeyValue("name1", "F", "id", id_str.c_str())); |
| 962 EXPECT_TRUE(FindNamePhaseKeyValue("name3", "S", "id", "0")); | 1038 EXPECT_TRUE(FindNamePhaseKeyValue("name3", "S", "id", "0")); |
| 963 | 1039 |
| 964 // BEGIN events should not have id | 1040 // BEGIN events should not have id |
| 965 EXPECT_FALSE(FindNamePhaseKeyValue("name2", "B", "id", "0")); | 1041 EXPECT_FALSE(FindNamePhaseKeyValue("name2", "B", "id", "0")); |
| 966 } | 1042 } |
| 967 | 1043 |
| 968 // Test ASYNC_BEGIN/END events | 1044 // Test ASYNC_BEGIN/END events |
| 969 TEST_F(TraceEventTestFixture, AsyncBeginEndPointerMangling) { | 1045 TEST_F(TraceEventTestFixture, AsyncBeginEndPointerMangling) { |
| 970 ManualTestSetUp(); | 1046 ManualTestSetUp(); |
| 971 | 1047 |
| 972 void* ptr = this; | 1048 void* ptr = this; |
| 973 | 1049 |
| 974 TraceLog::GetInstance()->SetProcessID(100); | 1050 TraceLog::GetInstance()->SetProcessID(100); |
| 975 TraceLog::GetInstance()->SetEnabled(true); | 1051 BeginTrace(); |
| 976 TRACE_EVENT_ASYNC_BEGIN0( "cat", "name1", ptr); | 1052 TRACE_EVENT_ASYNC_BEGIN0( "cat", "name1", ptr); |
| 977 TRACE_EVENT_ASYNC_BEGIN0( "cat", "name2", ptr); | 1053 TRACE_EVENT_ASYNC_BEGIN0( "cat", "name2", ptr); |
| 978 TraceLog::GetInstance()->SetEnabled(false); | 1054 EndTraceAndFlush(); |
| 979 | 1055 |
| 980 TraceLog::GetInstance()->SetProcessID(200); | 1056 TraceLog::GetInstance()->SetProcessID(200); |
| 981 TraceLog::GetInstance()->SetEnabled(true); | 1057 BeginTrace(); |
| 982 TRACE_EVENT_ASYNC_END0( "cat", "name1", ptr); | 1058 TRACE_EVENT_ASYNC_END0( "cat", "name1", ptr); |
| 983 TraceLog::GetInstance()->SetEnabled(false); | 1059 EndTraceAndFlush(); |
| 984 | 1060 |
| 985 DictionaryValue* async_begin = FindNamePhase("name1", "S"); | 1061 DictionaryValue* async_begin = FindNamePhase("name1", "S"); |
| 986 DictionaryValue* async_begin2 = FindNamePhase("name2", "S"); | 1062 DictionaryValue* async_begin2 = FindNamePhase("name2", "S"); |
| 987 DictionaryValue* async_end = FindNamePhase("name1", "F"); | 1063 DictionaryValue* async_end = FindNamePhase("name1", "F"); |
| 988 EXPECT_TRUE(async_begin); | 1064 EXPECT_TRUE(async_begin); |
| 989 EXPECT_TRUE(async_begin2); | 1065 EXPECT_TRUE(async_begin2); |
| 990 EXPECT_TRUE(async_end); | 1066 EXPECT_TRUE(async_end); |
| 991 | 1067 |
| 992 Value* value = NULL; | 1068 Value* value = NULL; |
| 993 std::string async_begin_id_str; | 1069 std::string async_begin_id_str; |
| 994 std::string async_begin2_id_str; | 1070 std::string async_begin2_id_str; |
| 995 std::string async_end_id_str; | 1071 std::string async_end_id_str; |
| 996 ASSERT_TRUE(async_begin->Get("id", &value)); | 1072 ASSERT_TRUE(async_begin->Get("id", &value)); |
| 997 ASSERT_TRUE(value->GetAsString(&async_begin_id_str)); | 1073 ASSERT_TRUE(value->GetAsString(&async_begin_id_str)); |
| 998 ASSERT_TRUE(async_begin2->Get("id", &value)); | 1074 ASSERT_TRUE(async_begin2->Get("id", &value)); |
| 999 ASSERT_TRUE(value->GetAsString(&async_begin2_id_str)); | 1075 ASSERT_TRUE(value->GetAsString(&async_begin2_id_str)); |
| 1000 ASSERT_TRUE(async_end->Get("id", &value)); | 1076 ASSERT_TRUE(async_end->Get("id", &value)); |
| 1001 ASSERT_TRUE(value->GetAsString(&async_end_id_str)); | 1077 ASSERT_TRUE(value->GetAsString(&async_end_id_str)); |
| 1002 | 1078 |
| 1003 EXPECT_STREQ(async_begin_id_str.c_str(), async_begin2_id_str.c_str()); | 1079 EXPECT_STREQ(async_begin_id_str.c_str(), async_begin2_id_str.c_str()); |
| 1004 EXPECT_STRNE(async_begin_id_str.c_str(), async_end_id_str.c_str()); | 1080 EXPECT_STRNE(async_begin_id_str.c_str(), async_end_id_str.c_str()); |
| 1005 } | 1081 } |
| 1006 | 1082 |
| 1007 // Test that static strings are not copied. | 1083 // Test that static strings are not copied. |
| 1008 TEST_F(TraceEventTestFixture, StaticStringVsString) { | 1084 TEST_F(TraceEventTestFixture, StaticStringVsString) { |
| 1009 ManualTestSetUp(); | 1085 ManualTestSetUp(); |
| 1010 TraceLog* tracer = TraceLog::GetInstance(); | 1086 TraceLog* tracer = TraceLog::GetInstance(); |
| 1011 // Make sure old events are flushed: | 1087 // Make sure old events are flushed: |
| 1012 tracer->SetEnabled(false); | 1088 EndTraceAndFlush(); |
| 1013 EXPECT_EQ(0u, tracer->GetEventsSize()); | 1089 EXPECT_EQ(0u, tracer->GetEventsSize()); |
| 1014 | 1090 |
| 1015 { | 1091 { |
| 1016 tracer->SetEnabled(true); | 1092 BeginTrace(); |
| 1017 // Test that string arguments are copied. | 1093 // Test that string arguments are copied. |
| 1018 TRACE_EVENT2("cat", "name1", | 1094 TRACE_EVENT2("cat", "name1", |
| 1019 "arg1", std::string("argval"), "arg2", std::string("argval")); | 1095 "arg1", std::string("argval"), "arg2", std::string("argval")); |
| 1020 // Test that static TRACE_STR_COPY string arguments are copied. | 1096 // Test that static TRACE_STR_COPY string arguments are copied. |
| 1021 TRACE_EVENT2("cat", "name2", | 1097 TRACE_EVENT2("cat", "name2", |
| 1022 "arg1", TRACE_STR_COPY("argval"), | 1098 "arg1", TRACE_STR_COPY("argval"), |
| 1023 "arg2", TRACE_STR_COPY("argval")); | 1099 "arg2", TRACE_STR_COPY("argval")); |
| 1024 size_t num_events = tracer->GetEventsSize(); | 1100 size_t num_events = tracer->GetEventsSize(); |
| 1025 EXPECT_GT(num_events, 1u); | 1101 EXPECT_GT(num_events, 1u); |
| 1026 const TraceEvent& event1 = tracer->GetEventAt(num_events - 2); | 1102 const TraceEvent& event1 = tracer->GetEventAt(num_events - 2); |
| 1027 const TraceEvent& event2 = tracer->GetEventAt(num_events - 1); | 1103 const TraceEvent& event2 = tracer->GetEventAt(num_events - 1); |
| 1028 EXPECT_STREQ("name1", event1.name()); | 1104 EXPECT_STREQ("name1", event1.name()); |
| 1029 EXPECT_STREQ("name2", event2.name()); | 1105 EXPECT_STREQ("name2", event2.name()); |
| 1030 EXPECT_TRUE(event1.parameter_copy_storage() != NULL); | 1106 EXPECT_TRUE(event1.parameter_copy_storage() != NULL); |
| 1031 EXPECT_TRUE(event2.parameter_copy_storage() != NULL); | 1107 EXPECT_TRUE(event2.parameter_copy_storage() != NULL); |
| 1032 EXPECT_GT(event1.parameter_copy_storage()->size(), 0u); | 1108 EXPECT_GT(event1.parameter_copy_storage()->size(), 0u); |
| 1033 EXPECT_GT(event2.parameter_copy_storage()->size(), 0u); | 1109 EXPECT_GT(event2.parameter_copy_storage()->size(), 0u); |
| 1034 tracer->SetEnabled(false); | 1110 EndTraceAndFlush(); |
| 1035 } | 1111 } |
| 1036 | 1112 |
| 1037 { | 1113 { |
| 1038 tracer->SetEnabled(true); | 1114 BeginTrace(); |
| 1039 // Test that static literal string arguments are not copied. | 1115 // Test that static literal string arguments are not copied. |
| 1040 TRACE_EVENT2("cat", "name1", | 1116 TRACE_EVENT2("cat", "name1", |
| 1041 "arg1", "argval", "arg2", "argval"); | 1117 "arg1", "argval", "arg2", "argval"); |
| 1042 // Test that static TRACE_STR_COPY NULL string arguments are not copied. | 1118 // Test that static TRACE_STR_COPY NULL string arguments are not copied. |
| 1043 const char* str1 = NULL; | 1119 const char* str1 = NULL; |
| 1044 const char* str2 = NULL; | 1120 const char* str2 = NULL; |
| 1045 TRACE_EVENT2("cat", "name2", | 1121 TRACE_EVENT2("cat", "name2", |
| 1046 "arg1", TRACE_STR_COPY(str1), | 1122 "arg1", TRACE_STR_COPY(str1), |
| 1047 "arg2", TRACE_STR_COPY(str2)); | 1123 "arg2", TRACE_STR_COPY(str2)); |
| 1048 size_t num_events = tracer->GetEventsSize(); | 1124 size_t num_events = tracer->GetEventsSize(); |
| 1049 EXPECT_GT(num_events, 1u); | 1125 EXPECT_GT(num_events, 1u); |
| 1050 const TraceEvent& event1 = tracer->GetEventAt(num_events - 2); | 1126 const TraceEvent& event1 = tracer->GetEventAt(num_events - 2); |
| 1051 const TraceEvent& event2 = tracer->GetEventAt(num_events - 1); | 1127 const TraceEvent& event2 = tracer->GetEventAt(num_events - 1); |
| 1052 EXPECT_STREQ("name1", event1.name()); | 1128 EXPECT_STREQ("name1", event1.name()); |
| 1053 EXPECT_STREQ("name2", event2.name()); | 1129 EXPECT_STREQ("name2", event2.name()); |
| 1054 EXPECT_TRUE(event1.parameter_copy_storage() == NULL); | 1130 EXPECT_TRUE(event1.parameter_copy_storage() == NULL); |
| 1055 EXPECT_TRUE(event2.parameter_copy_storage() == NULL); | 1131 EXPECT_TRUE(event2.parameter_copy_storage() == NULL); |
| 1056 tracer->SetEnabled(false); | 1132 EndTraceAndFlush(); |
| 1057 } | 1133 } |
| 1058 } | 1134 } |
| 1059 | 1135 |
| 1060 // Test that data sent from other threads is gathered | 1136 // Test that data sent from other threads is gathered |
| 1061 TEST_F(TraceEventTestFixture, DataCapturedOnThread) { | 1137 TEST_F(TraceEventTestFixture, DataCapturedOnThread) { |
| 1062 ManualTestSetUp(); | 1138 ManualTestSetUp(); |
| 1063 TraceLog::GetInstance()->SetEnabled(true); | 1139 BeginTrace(); |
| 1064 | 1140 |
| 1065 Thread thread("1"); | 1141 Thread thread("1"); |
| 1066 WaitableEvent task_complete_event(false, false); | 1142 WaitableEvent task_complete_event(false, false); |
| 1067 thread.Start(); | 1143 thread.Start(); |
| 1068 | 1144 |
| 1069 thread.message_loop()->PostTask( | 1145 thread.message_loop()->PostTask( |
| 1070 FROM_HERE, base::Bind(&TraceWithAllMacroVariants, &task_complete_event)); | 1146 FROM_HERE, base::Bind(&TraceWithAllMacroVariants, &task_complete_event)); |
| 1071 task_complete_event.Wait(); | 1147 task_complete_event.Wait(); |
| 1072 thread.Stop(); | 1148 thread.Stop(); |
| 1073 | 1149 |
| 1074 TraceLog::GetInstance()->SetEnabled(false); | 1150 EndTraceAndFlush(); |
| 1075 ValidateAllTraceMacrosCreatedData(trace_parsed_); | 1151 ValidateAllTraceMacrosCreatedData(trace_parsed_); |
| 1076 } | 1152 } |
| 1077 | 1153 |
| 1078 // Test that data sent from multiple threads is gathered | 1154 // Test that data sent from multiple threads is gathered |
| 1079 TEST_F(TraceEventTestFixture, DataCapturedManyThreads) { | 1155 TEST_F(TraceEventTestFixture, DataCapturedManyThreads) { |
| 1080 ManualTestSetUp(); | 1156 ManualTestSetUp(); |
| 1081 TraceLog::GetInstance()->SetEnabled(true); | 1157 BeginTrace(); |
| 1082 | 1158 |
| 1083 const int num_threads = 4; | 1159 const int num_threads = 4; |
| 1084 const int num_events = 4000; | 1160 const int num_events = 4000; |
| 1085 Thread* threads[num_threads]; | 1161 Thread* threads[num_threads]; |
| 1086 WaitableEvent* task_complete_events[num_threads]; | 1162 WaitableEvent* task_complete_events[num_threads]; |
| 1087 for (int i = 0; i < num_threads; i++) { | 1163 for (int i = 0; i < num_threads; i++) { |
| 1088 threads[i] = new Thread(StringPrintf("Thread %d", i).c_str()); | 1164 threads[i] = new Thread(StringPrintf("Thread %d", i).c_str()); |
| 1089 task_complete_events[i] = new WaitableEvent(false, false); | 1165 task_complete_events[i] = new WaitableEvent(false, false); |
| 1090 threads[i]->Start(); | 1166 threads[i]->Start(); |
| 1091 threads[i]->message_loop()->PostTask( | 1167 threads[i]->message_loop()->PostTask( |
| 1092 FROM_HERE, base::Bind(&TraceManyInstantEvents, | 1168 FROM_HERE, base::Bind(&TraceManyInstantEvents, |
| 1093 i, num_events, task_complete_events[i])); | 1169 i, num_events, task_complete_events[i])); |
| 1094 } | 1170 } |
| 1095 | 1171 |
| 1096 for (int i = 0; i < num_threads; i++) { | 1172 for (int i = 0; i < num_threads; i++) { |
| 1097 task_complete_events[i]->Wait(); | 1173 task_complete_events[i]->Wait(); |
| 1098 } | 1174 } |
| 1099 | 1175 |
| 1100 for (int i = 0; i < num_threads; i++) { | 1176 for (int i = 0; i < num_threads; i++) { |
| 1101 threads[i]->Stop(); | 1177 threads[i]->Stop(); |
| 1102 delete threads[i]; | 1178 delete threads[i]; |
| 1103 delete task_complete_events[i]; | 1179 delete task_complete_events[i]; |
| 1104 } | 1180 } |
| 1105 | 1181 |
| 1106 TraceLog::GetInstance()->SetEnabled(false); | 1182 EndTraceAndFlush(); |
| 1107 | 1183 |
| 1108 ValidateInstantEventPresentOnEveryThread(trace_parsed_, | 1184 ValidateInstantEventPresentOnEveryThread(trace_parsed_, |
| 1109 num_threads, num_events); | 1185 num_threads, num_events); |
| 1110 } | 1186 } |
| 1111 | 1187 |
| 1112 // Test that thread and process names show up in the trace | 1188 // Test that thread and process names show up in the trace |
| 1113 TEST_F(TraceEventTestFixture, ThreadNames) { | 1189 TEST_F(TraceEventTestFixture, ThreadNames) { |
| 1114 ManualTestSetUp(); | 1190 ManualTestSetUp(); |
| 1115 | 1191 |
| 1116 // Create threads before we enable tracing to make sure | 1192 // Create threads before we enable tracing to make sure |
| 1117 // that tracelog still captures them. | 1193 // that tracelog still captures them. |
| 1118 const int num_threads = 4; | 1194 const int num_threads = 4; |
| 1119 const int num_events = 10; | 1195 const int num_events = 10; |
| 1120 Thread* threads[num_threads]; | 1196 Thread* threads[num_threads]; |
| 1121 PlatformThreadId thread_ids[num_threads]; | 1197 PlatformThreadId thread_ids[num_threads]; |
| 1122 for (int i = 0; i < num_threads; i++) | 1198 for (int i = 0; i < num_threads; i++) |
| 1123 threads[i] = new Thread(StringPrintf("Thread %d", i).c_str()); | 1199 threads[i] = new Thread(StringPrintf("Thread %d", i).c_str()); |
| 1124 | 1200 |
| 1125 // Enable tracing. | 1201 // Enable tracing. |
| 1126 TraceLog::GetInstance()->SetEnabled(true); | 1202 BeginTrace(); |
| 1127 | 1203 |
| 1128 // Now run some trace code on these threads. | 1204 // Now run some trace code on these threads. |
| 1129 WaitableEvent* task_complete_events[num_threads]; | 1205 WaitableEvent* task_complete_events[num_threads]; |
| 1130 for (int i = 0; i < num_threads; i++) { | 1206 for (int i = 0; i < num_threads; i++) { |
| 1131 task_complete_events[i] = new WaitableEvent(false, false); | 1207 task_complete_events[i] = new WaitableEvent(false, false); |
| 1132 threads[i]->Start(); | 1208 threads[i]->Start(); |
| 1133 thread_ids[i] = threads[i]->thread_id(); | 1209 thread_ids[i] = threads[i]->thread_id(); |
| 1134 threads[i]->message_loop()->PostTask( | 1210 threads[i]->message_loop()->PostTask( |
| 1135 FROM_HERE, base::Bind(&TraceManyInstantEvents, | 1211 FROM_HERE, base::Bind(&TraceManyInstantEvents, |
| 1136 i, num_events, task_complete_events[i])); | 1212 i, num_events, task_complete_events[i])); |
| 1137 } | 1213 } |
| 1138 for (int i = 0; i < num_threads; i++) { | 1214 for (int i = 0; i < num_threads; i++) { |
| 1139 task_complete_events[i]->Wait(); | 1215 task_complete_events[i]->Wait(); |
| 1140 } | 1216 } |
| 1141 | 1217 |
| 1142 // Shut things down. | 1218 // Shut things down. |
| 1143 for (int i = 0; i < num_threads; i++) { | 1219 for (int i = 0; i < num_threads; i++) { |
| 1144 threads[i]->Stop(); | 1220 threads[i]->Stop(); |
| 1145 delete threads[i]; | 1221 delete threads[i]; |
| 1146 delete task_complete_events[i]; | 1222 delete task_complete_events[i]; |
| 1147 } | 1223 } |
| 1148 | 1224 |
| 1149 TraceLog::GetInstance()->SetEnabled(false); | 1225 EndTraceAndFlush(); |
| 1150 | 1226 |
| 1151 std::string tmp; | 1227 std::string tmp; |
| 1152 int tmp_int; | 1228 int tmp_int; |
| 1153 const DictionaryValue* item; | 1229 const DictionaryValue* item; |
| 1154 | 1230 |
| 1155 // Make sure we get thread name metadata. | 1231 // Make sure we get thread name metadata. |
| 1156 // Note, the test suite may have created a ton of threads. | 1232 // Note, the test suite may have created a ton of threads. |
| 1157 // So, we'll have thread names for threads we didn't create. | 1233 // So, we'll have thread names for threads we didn't create. |
| 1158 std::vector<const DictionaryValue*> items = | 1234 std::vector<const DictionaryValue*> items = |
| 1159 FindTraceEntries(trace_parsed_, "thread_name"); | 1235 FindTraceEntries(trace_parsed_, "thread_name"); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1175 // a comma-separated list of thread names, so look for a substring. | 1251 // a comma-separated list of thread names, so look for a substring. |
| 1176 EXPECT_TRUE(item->GetString("args.name", &tmp) && | 1252 EXPECT_TRUE(item->GetString("args.name", &tmp) && |
| 1177 tmp.find(expected_name) != std::string::npos); | 1253 tmp.find(expected_name) != std::string::npos); |
| 1178 } | 1254 } |
| 1179 } | 1255 } |
| 1180 } | 1256 } |
| 1181 | 1257 |
| 1182 TEST_F(TraceEventTestFixture, ThreadNameChanges) { | 1258 TEST_F(TraceEventTestFixture, ThreadNameChanges) { |
| 1183 ManualTestSetUp(); | 1259 ManualTestSetUp(); |
| 1184 | 1260 |
| 1185 TraceLog::GetInstance()->SetEnabled(true); | 1261 BeginTrace(); |
| 1186 | 1262 |
| 1187 PlatformThread::SetName(""); | 1263 PlatformThread::SetName(""); |
| 1188 TRACE_EVENT_INSTANT0("drink", "water"); | 1264 TRACE_EVENT_INSTANT0("drink", "water"); |
| 1189 | 1265 |
| 1190 PlatformThread::SetName("cafe"); | 1266 PlatformThread::SetName("cafe"); |
| 1191 TRACE_EVENT_INSTANT0("drink", "coffee"); | 1267 TRACE_EVENT_INSTANT0("drink", "coffee"); |
| 1192 | 1268 |
| 1193 PlatformThread::SetName("shop"); | 1269 PlatformThread::SetName("shop"); |
| 1194 // No event here, so won't appear in combined name. | 1270 // No event here, so won't appear in combined name. |
| 1195 | 1271 |
| 1196 PlatformThread::SetName("pub"); | 1272 PlatformThread::SetName("pub"); |
| 1197 TRACE_EVENT_INSTANT0("drink", "beer"); | 1273 TRACE_EVENT_INSTANT0("drink", "beer"); |
| 1198 TRACE_EVENT_INSTANT0("drink", "wine"); | 1274 TRACE_EVENT_INSTANT0("drink", "wine"); |
| 1199 | 1275 |
| 1200 PlatformThread::SetName(" bar"); | 1276 PlatformThread::SetName(" bar"); |
| 1201 TRACE_EVENT_INSTANT0("drink", "whisky"); | 1277 TRACE_EVENT_INSTANT0("drink", "whisky"); |
| 1202 | 1278 |
| 1203 TraceLog::GetInstance()->SetEnabled(false); | 1279 EndTraceAndFlush(); |
| 1204 | 1280 |
| 1205 std::vector<const DictionaryValue*> items = | 1281 std::vector<const DictionaryValue*> items = |
| 1206 FindTraceEntries(trace_parsed_, "thread_name"); | 1282 FindTraceEntries(trace_parsed_, "thread_name"); |
| 1207 EXPECT_EQ(1u, items.size()); | 1283 EXPECT_EQ(1u, items.size()); |
| 1208 ASSERT_GT(items.size(), 0u); | 1284 ASSERT_GT(items.size(), 0u); |
| 1209 const DictionaryValue* item = items[0]; | 1285 const DictionaryValue* item = items[0]; |
| 1210 ASSERT_TRUE(item); | 1286 ASSERT_TRUE(item); |
| 1211 int tid; | 1287 int tid; |
| 1212 EXPECT_TRUE(item->GetInteger("tid", &tid)); | 1288 EXPECT_TRUE(item->GetInteger("tid", &tid)); |
| 1213 EXPECT_EQ(PlatformThread::CurrentId(), static_cast<PlatformThreadId>(tid)); | 1289 EXPECT_EQ(PlatformThread::CurrentId(), static_cast<PlatformThreadId>(tid)); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1232 // Scope to contain the then destroy the TraceLog singleton. | 1308 // Scope to contain the then destroy the TraceLog singleton. |
| 1233 { | 1309 { |
| 1234 base::ShadowingAtExitManager exit_manager_will_destroy_singletons; | 1310 base::ShadowingAtExitManager exit_manager_will_destroy_singletons; |
| 1235 | 1311 |
| 1236 // Setup TraceLog singleton inside this test's exit manager scope | 1312 // Setup TraceLog singleton inside this test's exit manager scope |
| 1237 // so that it will be destroyed when this scope closes. | 1313 // so that it will be destroyed when this scope closes. |
| 1238 ManualTestSetUp(); | 1314 ManualTestSetUp(); |
| 1239 | 1315 |
| 1240 TRACE_EVENT_INSTANT0("all", "not recorded; system not enabled"); | 1316 TRACE_EVENT_INSTANT0("all", "not recorded; system not enabled"); |
| 1241 | 1317 |
| 1242 TraceLog::GetInstance()->SetEnabled(true); | 1318 BeginTrace(); |
| 1243 | 1319 |
| 1244 TRACE_EVENT_INSTANT0("all", "is recorded 1; system has been enabled"); | 1320 TRACE_EVENT_INSTANT0("all", "is recorded 1; system has been enabled"); |
| 1245 // Trace calls that will cache pointers to categories; they're valid here | 1321 // Trace calls that will cache pointers to categories; they're valid here |
| 1246 TraceCallsWithCachedCategoryPointersPointers( | 1322 TraceCallsWithCachedCategoryPointersPointers( |
| 1247 "is recorded 2; system has been enabled"); | 1323 "is recorded 2; system has been enabled"); |
| 1248 | 1324 |
| 1249 TraceLog::GetInstance()->SetEnabled(false); | 1325 EndTraceAndFlush(); |
| 1250 } // scope to destroy singleton | 1326 } // scope to destroy singleton |
| 1251 ASSERT_FALSE(TraceLog::GetInstance()); | 1327 ASSERT_FALSE(TraceLog::GetInstance()); |
| 1252 | 1328 |
| 1253 // Now that singleton is destroyed, check what trace events were recorded | 1329 // Now that singleton is destroyed, check what trace events were recorded |
| 1254 const DictionaryValue* item = NULL; | 1330 const DictionaryValue* item = NULL; |
| 1255 ListValue& trace_parsed = trace_parsed_; | 1331 ListValue& trace_parsed = trace_parsed_; |
| 1256 EXPECT_FIND_("is recorded 1"); | 1332 EXPECT_FIND_("is recorded 1"); |
| 1257 EXPECT_FIND_("is recorded 2"); | 1333 EXPECT_FIND_("is recorded 2"); |
| 1258 EXPECT_NOT_FIND_("not recorded"); | 1334 EXPECT_NOT_FIND_("not recorded"); |
| 1259 | 1335 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1280 } | 1356 } |
| 1281 | 1357 |
| 1282 TEST_F(TraceEventTestFixture, NormallyNoDeepCopy) { | 1358 TEST_F(TraceEventTestFixture, NormallyNoDeepCopy) { |
| 1283 // Test that the TRACE_EVENT macros do not deep-copy their string. If they | 1359 // Test that the TRACE_EVENT macros do not deep-copy their string. If they |
| 1284 // do so it may indicate a performance regression, but more-over it would | 1360 // do so it may indicate a performance regression, but more-over it would |
| 1285 // make the DEEP_COPY overloads redundant. | 1361 // make the DEEP_COPY overloads redundant. |
| 1286 ManualTestSetUp(); | 1362 ManualTestSetUp(); |
| 1287 | 1363 |
| 1288 std::string name_string("event name"); | 1364 std::string name_string("event name"); |
| 1289 | 1365 |
| 1290 TraceLog::GetInstance()->SetEnabled(true); | 1366 BeginTrace(); |
| 1291 TRACE_EVENT_INSTANT0("category", name_string.c_str()); | 1367 TRACE_EVENT_INSTANT0("category", name_string.c_str()); |
| 1292 | 1368 |
| 1293 // Modify the string in place (a wholesale reassignment may leave the old | 1369 // Modify the string in place (a wholesale reassignment may leave the old |
| 1294 // string intact on the heap). | 1370 // string intact on the heap). |
| 1295 name_string[0] = '@'; | 1371 name_string[0] = '@'; |
| 1296 | 1372 |
| 1297 TraceLog::GetInstance()->SetEnabled(false); | 1373 EndTraceAndFlush(); |
| 1298 | 1374 |
| 1299 EXPECT_FALSE(FindTraceEntry(trace_parsed_, "event name")); | 1375 EXPECT_FALSE(FindTraceEntry(trace_parsed_, "event name")); |
| 1300 EXPECT_TRUE(FindTraceEntry(trace_parsed_, name_string.c_str())); | 1376 EXPECT_TRUE(FindTraceEntry(trace_parsed_, name_string.c_str())); |
| 1301 } | 1377 } |
| 1302 | 1378 |
| 1303 TEST_F(TraceEventTestFixture, DeepCopy) { | 1379 TEST_F(TraceEventTestFixture, DeepCopy) { |
| 1304 ManualTestSetUp(); | 1380 ManualTestSetUp(); |
| 1305 | 1381 |
| 1306 static const char kOriginalName1[] = "name1"; | 1382 static const char kOriginalName1[] = "name1"; |
| 1307 static const char kOriginalName2[] = "name2"; | 1383 static const char kOriginalName2[] = "name2"; |
| 1308 static const char kOriginalName3[] = "name3"; | 1384 static const char kOriginalName3[] = "name3"; |
| 1309 std::string name1(kOriginalName1); | 1385 std::string name1(kOriginalName1); |
| 1310 std::string name2(kOriginalName2); | 1386 std::string name2(kOriginalName2); |
| 1311 std::string name3(kOriginalName3); | 1387 std::string name3(kOriginalName3); |
| 1312 std::string arg1("arg1"); | 1388 std::string arg1("arg1"); |
| 1313 std::string arg2("arg2"); | 1389 std::string arg2("arg2"); |
| 1314 std::string val1("val1"); | 1390 std::string val1("val1"); |
| 1315 std::string val2("val2"); | 1391 std::string val2("val2"); |
| 1316 | 1392 |
| 1317 TraceLog::GetInstance()->SetEnabled(true); | 1393 BeginTrace(); |
| 1318 TRACE_EVENT_COPY_INSTANT0("category", name1.c_str()); | 1394 TRACE_EVENT_COPY_INSTANT0("category", name1.c_str()); |
| 1319 TRACE_EVENT_COPY_BEGIN1("category", name2.c_str(), | 1395 TRACE_EVENT_COPY_BEGIN1("category", name2.c_str(), |
| 1320 arg1.c_str(), 5); | 1396 arg1.c_str(), 5); |
| 1321 TRACE_EVENT_COPY_END2("category", name3.c_str(), | 1397 TRACE_EVENT_COPY_END2("category", name3.c_str(), |
| 1322 arg1.c_str(), val1, | 1398 arg1.c_str(), val1, |
| 1323 arg2.c_str(), val2); | 1399 arg2.c_str(), val2); |
| 1324 | 1400 |
| 1325 // As per NormallyNoDeepCopy, modify the strings in place. | 1401 // As per NormallyNoDeepCopy, modify the strings in place. |
| 1326 name1[0] = name2[0] = name3[0] = arg1[0] = arg2[0] = val1[0] = val2[0] = '@'; | 1402 name1[0] = name2[0] = name3[0] = arg1[0] = arg2[0] = val1[0] = val2[0] = '@'; |
| 1327 | 1403 |
| 1328 TraceLog::GetInstance()->SetEnabled(false); | 1404 EndTraceAndFlush(); |
| 1329 | 1405 |
| 1330 EXPECT_FALSE(FindTraceEntry(trace_parsed_, name1.c_str())); | 1406 EXPECT_FALSE(FindTraceEntry(trace_parsed_, name1.c_str())); |
| 1331 EXPECT_FALSE(FindTraceEntry(trace_parsed_, name2.c_str())); | 1407 EXPECT_FALSE(FindTraceEntry(trace_parsed_, name2.c_str())); |
| 1332 EXPECT_FALSE(FindTraceEntry(trace_parsed_, name3.c_str())); | 1408 EXPECT_FALSE(FindTraceEntry(trace_parsed_, name3.c_str())); |
| 1333 | 1409 |
| 1334 const DictionaryValue* entry1 = FindTraceEntry(trace_parsed_, kOriginalName1); | 1410 const DictionaryValue* entry1 = FindTraceEntry(trace_parsed_, kOriginalName1); |
| 1335 const DictionaryValue* entry2 = FindTraceEntry(trace_parsed_, kOriginalName2); | 1411 const DictionaryValue* entry2 = FindTraceEntry(trace_parsed_, kOriginalName2); |
| 1336 const DictionaryValue* entry3 = FindTraceEntry(trace_parsed_, kOriginalName3); | 1412 const DictionaryValue* entry3 = FindTraceEntry(trace_parsed_, kOriginalName3); |
| 1337 ASSERT_TRUE(entry1); | 1413 ASSERT_TRUE(entry1); |
| 1338 ASSERT_TRUE(entry2); | 1414 ASSERT_TRUE(entry2); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 1367 Clear(); | 1443 Clear(); |
| 1368 | 1444 |
| 1369 trace_buffer_.Start(); | 1445 trace_buffer_.Start(); |
| 1370 trace_buffer_.AddFragment("bla1,bla2,bla3,bla4"); | 1446 trace_buffer_.AddFragment("bla1,bla2,bla3,bla4"); |
| 1371 trace_buffer_.Finish(); | 1447 trace_buffer_.Finish(); |
| 1372 EXPECT_STREQ(json_output_.json_output.c_str(), "[bla1,bla2,bla3,bla4]"); | 1448 EXPECT_STREQ(json_output_.json_output.c_str(), "[bla1,bla2,bla3,bla4]"); |
| 1373 } | 1449 } |
| 1374 | 1450 |
| 1375 } // namespace debug | 1451 } // namespace debug |
| 1376 } // namespace base | 1452 } // namespace base |
| OLD | NEW |