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

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

Issue 2549103003: tracing: split trace event filter classes out of TraceLog (Closed)
Patch Set: Add BASE_EXPORT Created 4 years 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
« no previous file with comments | « base/trace_event/trace_event_filter_test_utils.cc ('k') | base/trace_event/trace_log.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "base/trace_event/trace_event.h" 5 #include "base/trace_event/trace_event.h"
6 6
7 #include <math.h> 7 #include <math.h>
8 #include <stddef.h> 8 #include <stddef.h>
9 #include <stdint.h> 9 #include <stdint.h>
10 10
(...skipping 12 matching lines...) Expand all
23 #include "base/memory/singleton.h" 23 #include "base/memory/singleton.h"
24 #include "base/process/process_handle.h" 24 #include "base/process/process_handle.h"
25 #include "base/single_thread_task_runner.h" 25 #include "base/single_thread_task_runner.h"
26 #include "base/stl_util.h" 26 #include "base/stl_util.h"
27 #include "base/strings/pattern.h" 27 #include "base/strings/pattern.h"
28 #include "base/strings/stringprintf.h" 28 #include "base/strings/stringprintf.h"
29 #include "base/synchronization/waitable_event.h" 29 #include "base/synchronization/waitable_event.h"
30 #include "base/threading/platform_thread.h" 30 #include "base/threading/platform_thread.h"
31 #include "base/threading/thread.h" 31 #include "base/threading/thread.h"
32 #include "base/time/time.h" 32 #include "base/time/time.h"
33 #include "base/trace_event/event_name_filter.h"
34 #include "base/trace_event/heap_profiler_event_filter.h"
33 #include "base/trace_event/trace_buffer.h" 35 #include "base/trace_event/trace_buffer.h"
34 #include "base/trace_event/trace_event.h" 36 #include "base/trace_event/trace_event.h"
37 #include "base/trace_event/trace_event_filter.h"
38 #include "base/trace_event/trace_event_filter_test_utils.h"
35 #include "base/trace_event/trace_event_synthetic_delay.h" 39 #include "base/trace_event/trace_event_synthetic_delay.h"
36 #include "base/values.h" 40 #include "base/values.h"
37 #include "testing/gmock/include/gmock/gmock.h" 41 #include "testing/gmock/include/gmock/gmock.h"
38 #include "testing/gtest/include/gtest/gtest.h" 42 #include "testing/gtest/include/gtest/gtest.h"
39 43
40 namespace base { 44 namespace base {
41 namespace trace_event { 45 namespace trace_event {
42 46
43 namespace { 47 namespace {
44 48
(...skipping 2904 matching lines...) Expand 10 before | Expand all | Expand 10 after
2949 config1.Merge(config2); 2953 config1.Merge(config2);
2950 EXPECT_EQ(2u, config1.GetSyntheticDelayValues().size()); 2954 EXPECT_EQ(2u, config1.GetSyntheticDelayValues().size());
2951 } 2955 }
2952 2956
2953 TEST_F(TraceEventTestFixture, SyntheticDelayConfigurationToString) { 2957 TEST_F(TraceEventTestFixture, SyntheticDelayConfigurationToString) {
2954 const char filter[] = "DELAY(test.Delay;16;oneshot)"; 2958 const char filter[] = "DELAY(test.Delay;16;oneshot)";
2955 TraceConfig config(filter, ""); 2959 TraceConfig config(filter, "");
2956 EXPECT_EQ(filter, config.ToCategoryFilterString()); 2960 EXPECT_EQ(filter, config.ToCategoryFilterString());
2957 } 2961 }
2958 2962
2959 class TestEventFilter : public TraceLog::TraceEventFilter {
2960 public:
2961 bool FilterTraceEvent(const TraceEvent& trace_event) const override {
2962 filter_trace_event_hit_count_++;
2963 return filter_return_value_;
2964 }
2965
2966 void EndEvent(const char* category_group, const char* name) override {
2967 end_event_hit_count_++;
2968 }
2969
2970 static void set_filter_return_value(bool value) {
2971 filter_return_value_ = value;
2972 }
2973
2974 static size_t filter_trace_event_hit_count() {
2975 return filter_trace_event_hit_count_;
2976 }
2977 static size_t end_event_hit_count() { return end_event_hit_count_; }
2978
2979 static void clear_counts() {
2980 filter_trace_event_hit_count_ = 0;
2981 end_event_hit_count_ = 0;
2982 }
2983
2984 private:
2985 static size_t filter_trace_event_hit_count_;
2986 static size_t end_event_hit_count_;
2987 static bool filter_return_value_;
2988 };
2989
2990 size_t TestEventFilter::filter_trace_event_hit_count_ = 0;
2991 size_t TestEventFilter::end_event_hit_count_ = 0;
2992 bool TestEventFilter::filter_return_value_ = false;
2993
2994 std::unique_ptr<TraceLog::TraceEventFilter> ConstructTestEventFilter() {
2995 return WrapUnique(new TestEventFilter);
2996 }
2997
2998 TEST_F(TraceEventTestFixture, TraceFilteringMode) { 2963 TEST_F(TraceEventTestFixture, TraceFilteringMode) {
2999 const char config_json[] = 2964 const char config_json[] =
3000 "{" 2965 "{"
3001 " \"event_filters\": [" 2966 " \"event_filters\": ["
3002 " {" 2967 " {"
3003 " \"filter_predicate\": \"testing_predicate\", " 2968 " \"filter_predicate\": \"testing_predicate\", "
3004 " \"included_categories\": [\"*\"]" 2969 " \"included_categories\": [\"*\"]"
3005 " }" 2970 " }"
3006 " ]" 2971 " ]"
3007 "}"; 2972 "}";
3008 2973
3009 // Run RECORDING_MODE within FILTERING_MODE: 2974 // Run RECORDING_MODE within FILTERING_MODE:
2975 TestEventFilter::HitsCounter filter_hits_counter;
3010 TestEventFilter::set_filter_return_value(true); 2976 TestEventFilter::set_filter_return_value(true);
3011 TraceLog::SetTraceEventFilterConstructorForTesting(ConstructTestEventFilter); 2977 TraceLog::GetInstance()->SetFilterFactoryForTesting(TestEventFilter::Factory);
3012 2978
3013 // Only filtering mode is enabled with test filters. 2979 // Only filtering mode is enabled with test filters.
3014 TraceLog::GetInstance()->SetEnabled(TraceConfig(config_json), 2980 TraceLog::GetInstance()->SetEnabled(TraceConfig(config_json),
3015 TraceLog::FILTERING_MODE); 2981 TraceLog::FILTERING_MODE);
3016 EXPECT_EQ(TraceLog::FILTERING_MODE, TraceLog::GetInstance()->enabled_modes()); 2982 EXPECT_EQ(TraceLog::FILTERING_MODE, TraceLog::GetInstance()->enabled_modes());
3017 { 2983 {
3018 void* ptr = this; 2984 void* ptr = this;
3019 TRACE_EVENT0("c0", "name0"); 2985 TRACE_EVENT0("c0", "name0");
3020 TRACE_EVENT_ASYNC_BEGIN0("c1", "name1", ptr); 2986 TRACE_EVENT_ASYNC_BEGIN0("c1", "name1", ptr);
3021 TRACE_EVENT_INSTANT0("c0", "name0", TRACE_EVENT_SCOPE_THREAD); 2987 TRACE_EVENT_INSTANT0("c0", "name0", TRACE_EVENT_SCOPE_THREAD);
(...skipping 19 matching lines...) Expand all
3041 TraceLog::GetInstance()->SetDisabled(TraceLog::FILTERING_MODE); 3007 TraceLog::GetInstance()->SetDisabled(TraceLog::FILTERING_MODE);
3042 EXPECT_EQ(0, TraceLog::GetInstance()->enabled_modes()); 3008 EXPECT_EQ(0, TraceLog::GetInstance()->enabled_modes());
3043 3009
3044 EndTraceAndFlush(); 3010 EndTraceAndFlush();
3045 EXPECT_FALSE(FindMatchingValue("cat", "c0")); 3011 EXPECT_FALSE(FindMatchingValue("cat", "c0"));
3046 EXPECT_FALSE(FindMatchingValue("cat", "c1")); 3012 EXPECT_FALSE(FindMatchingValue("cat", "c1"));
3047 EXPECT_FALSE(FindMatchingValue("name", "name0")); 3013 EXPECT_FALSE(FindMatchingValue("name", "name0"));
3048 EXPECT_FALSE(FindMatchingValue("name", "name1")); 3014 EXPECT_FALSE(FindMatchingValue("name", "name1"));
3049 EXPECT_TRUE(FindMatchingValue("cat", "c2")); 3015 EXPECT_TRUE(FindMatchingValue("cat", "c2"));
3050 EXPECT_TRUE(FindMatchingValue("name", "name2")); 3016 EXPECT_TRUE(FindMatchingValue("name", "name2"));
3051 EXPECT_EQ(6u, TestEventFilter::filter_trace_event_hit_count()); 3017 EXPECT_EQ(6u, filter_hits_counter.filter_trace_event_hit_count);
3052 EXPECT_EQ(3u, TestEventFilter::end_event_hit_count()); 3018 EXPECT_EQ(3u, filter_hits_counter.end_event_hit_count);
3053 Clear(); 3019 Clear();
3054 TestEventFilter::clear_counts(); 3020 filter_hits_counter.Reset();
3055 3021
3056 // Run FILTERING_MODE within RECORDING_MODE: 3022 // Run FILTERING_MODE within RECORDING_MODE:
3057 // Only recording mode is enabled and all events must be recorded. 3023 // Only recording mode is enabled and all events must be recorded.
3058 TraceLog::GetInstance()->SetEnabled(TraceConfig("", ""), 3024 TraceLog::GetInstance()->SetEnabled(TraceConfig("", ""),
3059 TraceLog::RECORDING_MODE); 3025 TraceLog::RECORDING_MODE);
3060 EXPECT_EQ(TraceLog::RECORDING_MODE, TraceLog::GetInstance()->enabled_modes()); 3026 EXPECT_EQ(TraceLog::RECORDING_MODE, TraceLog::GetInstance()->enabled_modes());
3061 { 3027 {
3062 TRACE_EVENT0("c0", "name0"); 3028 TRACE_EVENT0("c0", "name0");
3063 } 3029 }
3064 3030
(...skipping 18 matching lines...) Expand all
3083 TraceLog::GetInstance()->SetDisabled(TraceLog::RECORDING_MODE); 3049 TraceLog::GetInstance()->SetDisabled(TraceLog::RECORDING_MODE);
3084 EXPECT_EQ(0, TraceLog::GetInstance()->enabled_modes()); 3050 EXPECT_EQ(0, TraceLog::GetInstance()->enabled_modes());
3085 3051
3086 EndTraceAndFlush(); 3052 EndTraceAndFlush();
3087 EXPECT_TRUE(FindMatchingValue("cat", "c0")); 3053 EXPECT_TRUE(FindMatchingValue("cat", "c0"));
3088 EXPECT_TRUE(FindMatchingValue("cat", "c2")); 3054 EXPECT_TRUE(FindMatchingValue("cat", "c2"));
3089 EXPECT_TRUE(FindMatchingValue("name", "name0")); 3055 EXPECT_TRUE(FindMatchingValue("name", "name0"));
3090 EXPECT_TRUE(FindMatchingValue("name", "name2")); 3056 EXPECT_TRUE(FindMatchingValue("name", "name2"));
3091 EXPECT_FALSE(FindMatchingValue("cat", "c1")); 3057 EXPECT_FALSE(FindMatchingValue("cat", "c1"));
3092 EXPECT_FALSE(FindMatchingValue("name", "name1")); 3058 EXPECT_FALSE(FindMatchingValue("name", "name1"));
3093 EXPECT_EQ(1u, TestEventFilter::filter_trace_event_hit_count()); 3059 EXPECT_EQ(1u, filter_hits_counter.filter_trace_event_hit_count);
3094 EXPECT_EQ(1u, TestEventFilter::end_event_hit_count()); 3060 EXPECT_EQ(1u, filter_hits_counter.end_event_hit_count);
3095 Clear(); 3061 Clear();
3096 TestEventFilter::clear_counts();
3097 } 3062 }
3098 3063
3099 TEST_F(TraceEventTestFixture, EventFiltering) { 3064 TEST_F(TraceEventTestFixture, EventFiltering) {
3100 const char config_json[] = 3065 const char config_json[] =
3101 "{" 3066 "{"
3102 " \"included_categories\": [" 3067 " \"included_categories\": ["
3103 " \"filtered_cat\"," 3068 " \"filtered_cat\","
3104 " \"unfiltered_cat\"]," 3069 " \"unfiltered_cat\"],"
3105 " \"event_filters\": [" 3070 " \"event_filters\": ["
3106 " {" 3071 " {"
3107 " \"filter_predicate\": \"testing_predicate\", " 3072 " \"filter_predicate\": \"testing_predicate\", "
3108 " \"included_categories\": [\"filtered_cat\"]" 3073 " \"included_categories\": [\"filtered_cat\"]"
3109 " }" 3074 " }"
3110 " " 3075 " "
3111 " ]" 3076 " ]"
3112 "}"; 3077 "}";
3113 3078
3079 TestEventFilter::HitsCounter filter_hits_counter;
3114 TestEventFilter::set_filter_return_value(true); 3080 TestEventFilter::set_filter_return_value(true);
3115 TraceLog::SetTraceEventFilterConstructorForTesting(ConstructTestEventFilter); 3081 TraceLog::GetInstance()->SetFilterFactoryForTesting(TestEventFilter::Factory);
3082
3116 TraceConfig trace_config(config_json); 3083 TraceConfig trace_config(config_json);
3117 TraceLog::GetInstance()->SetEnabled( 3084 TraceLog::GetInstance()->SetEnabled(
3118 trace_config, TraceLog::RECORDING_MODE | TraceLog::FILTERING_MODE); 3085 trace_config, TraceLog::RECORDING_MODE | TraceLog::FILTERING_MODE);
3119 ASSERT_TRUE(TraceLog::GetInstance()->IsEnabled()); 3086 ASSERT_TRUE(TraceLog::GetInstance()->IsEnabled());
3120 3087
3121 TRACE_EVENT0("filtered_cat", "a snake"); 3088 TRACE_EVENT0("filtered_cat", "a snake");
3122 TRACE_EVENT0("filtered_cat", "a mushroom"); 3089 TRACE_EVENT0("filtered_cat", "a mushroom");
3123 TRACE_EVENT0("unfiltered_cat", "a horse"); 3090 TRACE_EVENT0("unfiltered_cat", "a horse");
3124 3091
3125 // This is scoped so we can test the end event being filtered. 3092 // This is scoped so we can test the end event being filtered.
3126 { TRACE_EVENT0("filtered_cat", "another cat whoa"); } 3093 { TRACE_EVENT0("filtered_cat", "another cat whoa"); }
3127 3094
3128 EndTraceAndFlush(); 3095 EndTraceAndFlush();
3129 3096
3130 EXPECT_EQ(3u, TestEventFilter::filter_trace_event_hit_count()); 3097 EXPECT_EQ(3u, filter_hits_counter.filter_trace_event_hit_count);
3131 EXPECT_EQ(1u, TestEventFilter::end_event_hit_count()); 3098 EXPECT_EQ(1u, filter_hits_counter.end_event_hit_count);
3132 TestEventFilter::clear_counts();
3133 } 3099 }
3134 3100
3135 TEST_F(TraceEventTestFixture, EventWhitelistFiltering) { 3101 TEST_F(TraceEventTestFixture, EventWhitelistFiltering) {
3136 std::string config_json = StringPrintf( 3102 std::string config_json = StringPrintf(
3137 "{" 3103 "{"
3138 " \"included_categories\": [" 3104 " \"included_categories\": ["
3139 " \"filtered_cat\"," 3105 " \"filtered_cat\","
3140 " \"unfiltered_cat\"]," 3106 " \"unfiltered_cat\"],"
3141 " \"event_filters\": [" 3107 " \"event_filters\": ["
3142 " {" 3108 " {"
3143 " \"filter_predicate\": \"%s\", " 3109 " \"filter_predicate\": \"%s\", "
3144 " \"included_categories\": [\"*\"], " 3110 " \"included_categories\": [\"*\"], "
3145 " \"excluded_categories\": [\"unfiltered_cat\"], " 3111 " \"excluded_categories\": [\"unfiltered_cat\"], "
3146 " \"filter_args\": {" 3112 " \"filter_args\": {"
3147 " \"event_name_whitelist\": [\"a snake\", \"a dog\"]" 3113 " \"event_name_whitelist\": [\"a snake\", \"a dog\"]"
3148 " }" 3114 " }"
3149 " }" 3115 " }"
3150 " " 3116 " "
3151 " ]" 3117 " ]"
3152 "}", 3118 "}",
3153 TraceLog::TraceEventFilter::kEventWhitelistPredicate); 3119 EventNameFilter::kName);
3154 3120
3155 TraceConfig trace_config(config_json); 3121 TraceConfig trace_config(config_json);
3156 TraceLog::GetInstance()->SetEnabled( 3122 TraceLog::GetInstance()->SetEnabled(
3157 trace_config, TraceLog::RECORDING_MODE | TraceLog::FILTERING_MODE); 3123 trace_config, TraceLog::RECORDING_MODE | TraceLog::FILTERING_MODE);
3158 EXPECT_TRUE(TraceLog::GetInstance()->IsEnabled()); 3124 EXPECT_TRUE(TraceLog::GetInstance()->IsEnabled());
3159 3125
3160 TRACE_EVENT0("filtered_cat", "a snake"); 3126 TRACE_EVENT0("filtered_cat", "a snake");
3161 TRACE_EVENT0("filtered_cat", "a mushroom"); 3127 TRACE_EVENT0("filtered_cat", "a mushroom");
3162 TRACE_EVENT0("unfiltered_cat", "a cat"); 3128 TRACE_EVENT0("unfiltered_cat", "a cat");
3163 3129
(...skipping 11 matching lines...) Expand all
3175 " \"filtered_cat\"," 3141 " \"filtered_cat\","
3176 " \"unfiltered_cat\"]," 3142 " \"unfiltered_cat\"],"
3177 " \"excluded_categories\": [\"excluded_cat\"]," 3143 " \"excluded_categories\": [\"excluded_cat\"],"
3178 " \"event_filters\": [" 3144 " \"event_filters\": ["
3179 " {" 3145 " {"
3180 " \"filter_predicate\": \"%s\", " 3146 " \"filter_predicate\": \"%s\", "
3181 " \"included_categories\": [\"*\"]" 3147 " \"included_categories\": [\"*\"]"
3182 " }" 3148 " }"
3183 " ]" 3149 " ]"
3184 "}", 3150 "}",
3185 TraceLog::TraceEventFilter::kHeapProfilerPredicate); 3151 HeapProfilerEventFilter::kName);
3186 3152
3187 TraceConfig trace_config(config_json); 3153 TraceConfig trace_config(config_json);
3188 TraceLog::GetInstance()->SetEnabled( 3154 TraceLog::GetInstance()->SetEnabled(
3189 trace_config, TraceLog::RECORDING_MODE | TraceLog::FILTERING_MODE); 3155 trace_config, TraceLog::RECORDING_MODE | TraceLog::FILTERING_MODE);
3190 EXPECT_TRUE(TraceLog::GetInstance()->IsEnabled()); 3156 EXPECT_TRUE(TraceLog::GetInstance()->IsEnabled());
3191 3157
3192 TRACE_EVENT0("filtered_cat", "a snake"); 3158 TRACE_EVENT0("filtered_cat", "a snake");
3193 TRACE_EVENT0("excluded_cat", "a mushroom"); 3159 TRACE_EVENT0("excluded_cat", "a mushroom");
3194 TRACE_EVENT0("unfiltered_cat", "a cat"); 3160 TRACE_EVENT0("unfiltered_cat", "a cat");
3195 3161
3196 EndTraceAndFlush(); 3162 EndTraceAndFlush();
3197 3163
3198 // The predicate should not change behavior of the trace events. 3164 // The predicate should not change behavior of the trace events.
3199 EXPECT_TRUE(FindMatchingValue("name", "a snake")); 3165 EXPECT_TRUE(FindMatchingValue("name", "a snake"));
3200 EXPECT_FALSE(FindMatchingValue("name", "a mushroom")); 3166 EXPECT_FALSE(FindMatchingValue("name", "a mushroom"));
3201 EXPECT_TRUE(FindMatchingValue("name", "a cat")); 3167 EXPECT_TRUE(FindMatchingValue("name", "a cat"));
3202 } 3168 }
3203 3169
3204 TEST_F(TraceEventTestFixture, ClockSyncEventsAreAlwaysAddedToTrace) { 3170 TEST_F(TraceEventTestFixture, ClockSyncEventsAreAlwaysAddedToTrace) {
3205 BeginSpecificTrace("-*"); 3171 BeginSpecificTrace("-*");
3206 TRACE_EVENT_CLOCK_SYNC_RECEIVER(1); 3172 TRACE_EVENT_CLOCK_SYNC_RECEIVER(1);
3207 EndTraceAndFlush(); 3173 EndTraceAndFlush();
3208 EXPECT_TRUE(FindNamePhase("clock_sync", "c")); 3174 EXPECT_TRUE(FindNamePhase("clock_sync", "c"));
3209 } 3175 }
3210 3176
3211 } // namespace trace_event 3177 } // namespace trace_event
3212 } // namespace base 3178 } // namespace base
OLDNEW
« no previous file with comments | « base/trace_event/trace_event_filter_test_utils.cc ('k') | base/trace_event/trace_log.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698