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 <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" |
(...skipping 29 matching lines...) Expand all Loading... | |
40 const char* key; | 40 const char* key; |
41 const char* value; | 41 const char* value; |
42 CompareOp op; | 42 CompareOp op; |
43 }; | 43 }; |
44 | 44 |
45 const int kThreadId = 42; | 45 const int kThreadId = 42; |
46 const int kAsyncId = 5; | 46 const int kAsyncId = 5; |
47 const char kAsyncIdStr[] = "0x5"; | 47 const char kAsyncIdStr[] = "0x5"; |
48 const int kAsyncId2 = 6; | 48 const int kAsyncId2 = 6; |
49 const char kAsyncId2Str[] = "0x6"; | 49 const char kAsyncId2Str[] = "0x6"; |
50 const char kDefaultTraceConfigString[] = | |
51 "{" | |
52 "\"enable_sampling\":false," | |
53 "\"enable_systrace\":false," | |
54 "\"excluded_categories\":[\"*Debug\",\"*Test\"]," | |
55 "\"record_mode\":\"record-until-full\"" | |
56 "}"; | |
50 | 57 |
51 class TraceEventTestFixture : public testing::Test { | 58 class TraceEventTestFixture : public testing::Test { |
52 public: | 59 public: |
53 void OnTraceDataCollected( | 60 void OnTraceDataCollected( |
54 WaitableEvent* flush_complete_event, | 61 WaitableEvent* flush_complete_event, |
55 const scoped_refptr<base::RefCountedString>& events_str, | 62 const scoped_refptr<base::RefCountedString>& events_str, |
56 bool has_more_events); | 63 bool has_more_events); |
57 void OnWatchEventMatched() { | 64 void OnWatchEventMatched() { |
58 ++event_watch_notification_; | 65 ++event_watch_notification_; |
59 } | 66 } |
(...skipping 3013 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3073 TraceOptions new_options; | 3080 TraceOptions new_options; |
3074 EXPECT_TRUE(new_options.SetFromString(original_option.ToString())); | 3081 EXPECT_TRUE(new_options.SetFromString(original_option.ToString())); |
3075 EXPECT_EQ(original_option.record_mode, new_options.record_mode); | 3082 EXPECT_EQ(original_option.record_mode, new_options.record_mode); |
3076 EXPECT_EQ(original_option.enable_sampling, new_options.enable_sampling); | 3083 EXPECT_EQ(original_option.enable_sampling, new_options.enable_sampling); |
3077 EXPECT_EQ(original_option.enable_systrace, new_options.enable_systrace); | 3084 EXPECT_EQ(original_option.enable_systrace, new_options.enable_systrace); |
3078 } | 3085 } |
3079 } | 3086 } |
3080 } | 3087 } |
3081 } | 3088 } |
3082 | 3089 |
3090 TEST(TraceConfigTest, TraceConfigFromValidLegacyString) { | |
nednguyen
2015/05/13 18:16:32
"...LegacyStrings"?
Zhen Wang
2015/05/13 20:59:17
Done.
| |
3091 // From trace options strings | |
3092 TraceConfig config("", "record-until-full"); | |
3093 EXPECT_EQ(RECORD_UNTIL_FULL, config.record_mode_); | |
3094 EXPECT_FALSE(config.enable_sampling_); | |
3095 EXPECT_FALSE(config.enable_systrace_); | |
3096 EXPECT_STREQ("record-until-full", config.ToTraceOptionsString().c_str()); | |
3097 | |
3098 config = TraceConfig("", "record-continuously"); | |
3099 EXPECT_EQ(RECORD_CONTINUOUSLY, config.record_mode_); | |
3100 EXPECT_FALSE(config.enable_sampling_); | |
3101 EXPECT_FALSE(config.enable_systrace_); | |
3102 EXPECT_STREQ("record-continuously", config.ToTraceOptionsString().c_str()); | |
3103 | |
3104 config = TraceConfig("", "trace-to-console"); | |
3105 EXPECT_EQ(ECHO_TO_CONSOLE, config.record_mode_); | |
3106 EXPECT_FALSE(config.enable_sampling_); | |
3107 EXPECT_FALSE(config.enable_systrace_); | |
3108 EXPECT_STREQ("trace-to-console", config.ToTraceOptionsString().c_str()); | |
3109 | |
3110 config = TraceConfig("", "record-as-much-as-possible"); | |
3111 EXPECT_EQ(RECORD_AS_MUCH_AS_POSSIBLE, config.record_mode_); | |
3112 EXPECT_FALSE(config.enable_sampling_); | |
3113 EXPECT_FALSE(config.enable_systrace_); | |
3114 EXPECT_STREQ("record-as-much-as-possible", | |
3115 config.ToTraceOptionsString().c_str()); | |
3116 | |
3117 config = TraceConfig("", "record-until-full, enable-sampling"); | |
3118 EXPECT_EQ(RECORD_UNTIL_FULL, config.record_mode_); | |
3119 EXPECT_TRUE(config.enable_sampling_); | |
3120 EXPECT_FALSE(config.enable_systrace_); | |
3121 EXPECT_STREQ("record-until-full,enable-sampling", | |
3122 config.ToTraceOptionsString().c_str()); | |
3123 | |
3124 config = TraceConfig("", "enable-systrace, record-continuously"); | |
3125 EXPECT_EQ(RECORD_CONTINUOUSLY, config.record_mode_); | |
3126 EXPECT_FALSE(config.enable_sampling_); | |
3127 EXPECT_TRUE(config.enable_systrace_); | |
3128 EXPECT_STREQ("record-continuously,enable-systrace", | |
3129 config.ToTraceOptionsString().c_str()); | |
3130 | |
3131 config = TraceConfig("", | |
3132 "enable-systrace, trace-to-console, enable-sampling"); | |
3133 EXPECT_EQ(ECHO_TO_CONSOLE, config.record_mode_); | |
3134 EXPECT_TRUE(config.enable_sampling_); | |
3135 EXPECT_TRUE(config.enable_systrace_); | |
3136 EXPECT_STREQ("trace-to-console,enable-sampling,enable-systrace", | |
3137 config.ToTraceOptionsString().c_str()); | |
3138 | |
3139 config = TraceConfig( | |
3140 "", "record-continuously, record-until-full, trace-to-console"); | |
3141 EXPECT_EQ(ECHO_TO_CONSOLE, config.record_mode_); | |
3142 EXPECT_FALSE(config.enable_systrace_); | |
3143 EXPECT_FALSE(config.enable_sampling_); | |
3144 EXPECT_STREQ("trace-to-console", config.ToTraceOptionsString().c_str()); | |
3145 | |
3146 // From category filter strings | |
3147 config = TraceConfig("-*Debug,-*Test", ""); | |
3148 EXPECT_STREQ("-*Debug,-*Test", config.ToCategoryFilterString().c_str()); | |
3149 | |
3150 config = TraceConfig("included,-excluded,inc_pattern*,-exc_pattern*", ""); | |
3151 EXPECT_STREQ("included,inc_pattern*,-excluded,-exc_pattern*", | |
3152 config.ToCategoryFilterString().c_str()); | |
3153 | |
3154 config = TraceConfig("only_inc_cat", ""); | |
3155 EXPECT_STREQ("only_inc_cat", config.ToCategoryFilterString().c_str()); | |
3156 | |
3157 config = TraceConfig("-only_exc_cat", ""); | |
3158 EXPECT_STREQ("-only_exc_cat", config.ToCategoryFilterString().c_str()); | |
3159 | |
3160 config = TraceConfig("disabled-by-default-cc,-excluded", ""); | |
3161 EXPECT_STREQ("disabled-by-default-cc,-excluded", | |
3162 config.ToCategoryFilterString().c_str()); | |
3163 | |
3164 config = TraceConfig("disabled-by-default-cc,included", ""); | |
3165 EXPECT_STREQ("included,disabled-by-default-cc", | |
3166 config.ToCategoryFilterString().c_str()); | |
3167 | |
3168 config = TraceConfig("DELAY(test.Delay1;16),included", ""); | |
3169 EXPECT_STREQ("included,DELAY(test.Delay1;16)", | |
3170 config.ToCategoryFilterString().c_str()); | |
3171 | |
3172 // From both trace options and category filter strings | |
3173 config = TraceConfig("", ""); | |
3174 EXPECT_EQ(RECORD_UNTIL_FULL, config.record_mode_); | |
3175 EXPECT_FALSE(config.enable_systrace_); | |
3176 EXPECT_FALSE(config.enable_sampling_); | |
3177 EXPECT_STREQ("", config.ToCategoryFilterString().c_str()); | |
3178 EXPECT_STREQ("record-until-full", config.ToTraceOptionsString().c_str()); | |
3179 | |
3180 config = TraceConfig("included,-excluded,inc_pattern*,-exc_pattern*", | |
3181 "enable-systrace, trace-to-console, enable-sampling"); | |
3182 EXPECT_STREQ("included,inc_pattern*,-excluded,-exc_pattern*", | |
3183 config.ToCategoryFilterString().c_str()); | |
3184 EXPECT_STREQ("trace-to-console,enable-sampling,enable-systrace", | |
3185 config.ToTraceOptionsString().c_str()); | |
3186 | |
3187 // From both trace options and category filter strings with spaces. | |
3188 config = TraceConfig(" included , -excluded, inc_pattern*, ,-exc_pattern* ", | |
3189 "enable-systrace, ,trace-to-console, enable-sampling "); | |
3190 EXPECT_STREQ("included,inc_pattern*,-excluded,-exc_pattern*", | |
3191 config.ToCategoryFilterString().c_str()); | |
3192 EXPECT_STREQ("trace-to-console,enable-sampling,enable-systrace", | |
3193 config.ToTraceOptionsString().c_str()); | |
3194 } | |
3195 | |
3196 TEST(TraceConfigTest, TraceConfigFromInvalidLegacyString) { | |
nednguyen
2015/05/13 18:16:32
"...LegacyStrings"?
Zhen Wang
2015/05/13 20:59:17
Done.
| |
3197 TraceConfig config("", "foo-bar-baz"); | |
3198 EXPECT_EQ(RECORD_UNTIL_FULL, config.record_mode_); | |
3199 EXPECT_FALSE(config.enable_systrace_); | |
3200 EXPECT_FALSE(config.enable_sampling_); | |
3201 EXPECT_STREQ("", config.ToCategoryFilterString().c_str()); | |
3202 EXPECT_STREQ("record-until-full", config.ToTraceOptionsString().c_str()); | |
3203 | |
3204 config = TraceConfig("arbitrary-category", "foo-bar-baz, enable-systrace"); | |
3205 EXPECT_EQ(RECORD_UNTIL_FULL, config.record_mode_); | |
3206 EXPECT_TRUE(config.enable_systrace_); | |
3207 EXPECT_FALSE(config.enable_sampling_); | |
3208 EXPECT_STREQ("arbitrary-category", config.ToCategoryFilterString().c_str()); | |
3209 EXPECT_STREQ("record-until-full,enable-systrace", | |
3210 config.ToTraceOptionsString().c_str()); | |
3211 } | |
3212 | |
3213 TEST(TraceConfigTest, ConstructDefaultTraceConfig) { | |
3214 // Make sure that upon an empty string, we fall back to the default config. | |
3215 TraceConfig tc; | |
3216 EXPECT_STREQ(kDefaultTraceConfigString, tc.ToString().c_str()); | |
3217 EXPECT_TRUE(tc.record_mode_ == RECORD_UNTIL_FULL); | |
3218 EXPECT_FALSE(tc.enable_sampling_); | |
3219 EXPECT_FALSE(tc.enable_systrace_); | |
3220 EXPECT_STREQ("-*Debug,-*Test", tc.ToCategoryFilterString().c_str()); | |
3221 EXPECT_TRUE(tc.IsCategoryGroupEnabled("not-excluded-category")); | |
3222 EXPECT_TRUE(tc.IsCategoryGroupEnabled("Category1,CategoryDebug")); | |
3223 EXPECT_TRUE(tc.IsCategoryGroupEnabled("CategoryDebug,Category1")); | |
3224 EXPECT_TRUE(tc.IsCategoryGroupEnabled("CategoryTest,Category2")); | |
3225 } | |
3226 | |
3227 TEST(TraceConfigTest, TraceConfigFromValidString) { | |
3228 // Using an arbitrary non-empty config string. | |
3229 const char config_string[] = | |
3230 "{" | |
3231 "\"enable_sampling\":true," | |
3232 "\"enable_systrace\":true," | |
3233 "\"excluded_categories\":[\"excluded\",\"exc_pattern*\"]," | |
3234 "\"included_categories\":[\"included\",\"inc_pattern*\"]," | |
3235 "\"record_mode\":\"record-continuously\"," | |
3236 "\"synthetic_delays\":[\"test.Delay1;16\"]" | |
3237 "}"; | |
3238 TraceConfig tc(config_string); | |
3239 EXPECT_STREQ(config_string, tc.ToString().c_str()); | |
3240 EXPECT_TRUE(tc.record_mode_ == RECORD_CONTINUOUSLY); | |
3241 EXPECT_TRUE(tc.enable_sampling_); | |
3242 EXPECT_TRUE(tc.enable_systrace_); | |
3243 EXPECT_STREQ( | |
3244 "included,inc_pattern*,-excluded,-exc_pattern*,DELAY(test.Delay1;16)", | |
3245 tc.ToCategoryFilterString().c_str()); | |
3246 EXPECT_TRUE(tc.IsCategoryGroupEnabled("included")); | |
3247 EXPECT_TRUE(tc.IsCategoryGroupEnabled("included,excluded")); | |
3248 EXPECT_TRUE(tc.IsCategoryGroupEnabled("inc_pattern_category")); | |
3249 EXPECT_FALSE(tc.IsCategoryGroupEnabled("exc_pattern_category")); | |
3250 EXPECT_FALSE(tc.IsCategoryGroupEnabled("excluded")); | |
3251 EXPECT_FALSE(tc.IsCategoryGroupEnabled("not-excluded-nor-included")); | |
3252 EXPECT_FALSE(tc.IsCategoryGroupEnabled("Category1,CategoryDebug")); | |
3253 EXPECT_FALSE(tc.IsCategoryGroupEnabled("CategoryDebug,Category1")); | |
3254 EXPECT_FALSE(tc.IsCategoryGroupEnabled("CategoryTest,Category2")); | |
3255 | |
3256 // Clear | |
3257 tc.Clear(); | |
3258 EXPECT_STREQ(tc.ToString().c_str(), | |
3259 "{" | |
3260 "\"enable_sampling\":false," | |
3261 "\"enable_systrace\":false," | |
3262 "\"record_mode\":\"record-until-full\"" | |
3263 "}"); | |
3264 } | |
3265 | |
3266 TEST(TraceConfigTest, TraceConfigFromInvalidString) { | |
3267 // The config string needs to be a dictionary correctly formatted as a JSON | |
3268 // string. Otherwise, it will fall back to the default initialization. | |
3269 TraceConfig tc(""); | |
3270 EXPECT_STREQ(kDefaultTraceConfigString, tc.ToString().c_str()); | |
3271 EXPECT_TRUE(tc.record_mode_ == RECORD_UNTIL_FULL); | |
3272 EXPECT_FALSE(tc.enable_sampling_); | |
3273 EXPECT_FALSE(tc.enable_systrace_); | |
3274 EXPECT_STREQ("-*Debug,-*Test", tc.ToCategoryFilterString().c_str()); | |
3275 | |
3276 tc = TraceConfig("This is an invalid config string."); | |
3277 EXPECT_STREQ(kDefaultTraceConfigString, tc.ToString().c_str()); | |
3278 EXPECT_TRUE(tc.record_mode_ == RECORD_UNTIL_FULL); | |
3279 EXPECT_FALSE(tc.enable_sampling_); | |
3280 EXPECT_FALSE(tc.enable_systrace_); | |
3281 EXPECT_STREQ("-*Debug,-*Test", tc.ToCategoryFilterString().c_str()); | |
3282 | |
3283 tc = TraceConfig("[\"This\", \"is\", \"not\", \"a\", \"dictionary\"]"); | |
3284 EXPECT_STREQ(kDefaultTraceConfigString, tc.ToString().c_str()); | |
3285 EXPECT_TRUE(tc.record_mode_ == RECORD_UNTIL_FULL); | |
3286 EXPECT_FALSE(tc.enable_sampling_); | |
3287 EXPECT_FALSE(tc.enable_systrace_); | |
3288 EXPECT_STREQ("-*Debug,-*Test", tc.ToCategoryFilterString().c_str()); | |
3289 | |
3290 tc = TraceConfig("{\"record_mode\": invalid-value-needs-double-quote}"); | |
3291 EXPECT_STREQ(kDefaultTraceConfigString, tc.ToString().c_str()); | |
3292 EXPECT_TRUE(tc.record_mode_ == RECORD_UNTIL_FULL); | |
3293 EXPECT_FALSE(tc.enable_sampling_); | |
3294 EXPECT_FALSE(tc.enable_systrace_); | |
3295 EXPECT_STREQ("-*Debug,-*Test", tc.ToCategoryFilterString().c_str()); | |
3296 | |
3297 // If the config string a dictionary formatted as a JSON string, it will | |
3298 // initialize TraceConfig with best effort. | |
3299 tc = TraceConfig("{}"); | |
3300 EXPECT_TRUE(tc.record_mode_ == RECORD_UNTIL_FULL); | |
3301 EXPECT_FALSE(tc.enable_sampling_); | |
3302 EXPECT_FALSE(tc.enable_systrace_); | |
3303 EXPECT_STREQ("", tc.ToCategoryFilterString().c_str()); | |
3304 | |
3305 tc = TraceConfig("{\"arbitrary-key\":\"arbitrary-value\"}"); | |
3306 EXPECT_TRUE(tc.record_mode_ == RECORD_UNTIL_FULL); | |
3307 EXPECT_FALSE(tc.enable_sampling_); | |
3308 EXPECT_FALSE(tc.enable_systrace_); | |
3309 EXPECT_STREQ("", tc.ToCategoryFilterString().c_str()); | |
3310 | |
3311 const char invalid_config_string[] = | |
3312 "{" | |
3313 "\"enable_sampling\":\"true\"," | |
3314 "\"enable_systrace\":1," | |
3315 "\"excluded_categories\":[\"excluded\"]," | |
3316 "\"included_categories\":\"not a list\"," | |
3317 "\"record_mode\":\"arbitrary-mode\"," | |
3318 "\"synthetic_delays\":[\"test.Delay1;16\"]" | |
3319 "}"; | |
3320 tc = TraceConfig(invalid_config_string); | |
3321 EXPECT_TRUE(tc.record_mode_ == RECORD_UNTIL_FULL); | |
3322 EXPECT_FALSE(tc.enable_sampling_); | |
3323 EXPECT_FALSE(tc.enable_systrace_); | |
3324 EXPECT_STREQ("-excluded,DELAY(test.Delay1;16)", | |
3325 tc.ToCategoryFilterString().c_str()); | |
3326 } | |
3327 | |
3328 TEST(TraceConfigTest, MergingTraceConfigs) { | |
3329 // Merge | |
3330 TraceConfig tc; | |
3331 TraceConfig tc2("included,-excluded,inc_pattern*,-exc_pattern*", ""); | |
3332 tc.Merge(tc2); | |
3333 EXPECT_STREQ("{" | |
3334 "\"enable_sampling\":false," | |
3335 "\"enable_systrace\":false," | |
3336 "\"excluded_categories\":[" | |
3337 "\"*Debug\",\"*Test\",\"excluded\",\"exc_pattern*\"" | |
3338 "]," | |
3339 "\"record_mode\":\"record-until-full\"" | |
3340 "}", | |
3341 tc.ToString().c_str()); | |
3342 } | |
3343 | |
3344 TEST(TraceConfigTest, IsCategoryGroupEnabled) { | |
3345 // Enabling a disabled- category does not require all categories to be traced | |
3346 // to be included. | |
3347 TraceConfig tc("disabled-by-default-cc,-excluded", ""); | |
3348 EXPECT_STREQ("disabled-by-default-cc,-excluded", | |
3349 tc.ToCategoryFilterString().c_str()); | |
3350 EXPECT_TRUE(tc.IsCategoryGroupEnabled("disabled-by-default-cc")); | |
3351 EXPECT_TRUE(tc.IsCategoryGroupEnabled("some_other_group")); | |
3352 EXPECT_FALSE(tc.IsCategoryGroupEnabled("excluded")); | |
3353 | |
3354 // Enabled a disabled- category and also including makes all categories to | |
3355 // be traced require including. | |
3356 tc = TraceConfig("disabled-by-default-cc,included", ""); | |
3357 EXPECT_STREQ("included,disabled-by-default-cc", | |
3358 tc.ToCategoryFilterString().c_str()); | |
3359 EXPECT_TRUE(tc.IsCategoryGroupEnabled("disabled-by-default-cc")); | |
3360 EXPECT_TRUE(tc.IsCategoryGroupEnabled("included")); | |
3361 EXPECT_FALSE(tc.IsCategoryGroupEnabled("other_included")); | |
3362 } | |
3363 | |
3364 TEST(TraceConfigTest, IsEmptyOrContainsLeadingOrTrailingWhitespace) { | |
3365 // Test that IsEmptyOrContainsLeadingOrTrailingWhitespace actually catches | |
3366 // categories that are explicitly forbidden. | |
3367 // This method is called in a DCHECK to assert that we don't have these types | |
3368 // of strings as categories. | |
3369 EXPECT_TRUE(TraceConfig::IsEmptyOrContainsLeadingOrTrailingWhitespace( | |
3370 " bad_category ")); | |
3371 EXPECT_TRUE(TraceConfig::IsEmptyOrContainsLeadingOrTrailingWhitespace( | |
3372 " bad_category")); | |
3373 EXPECT_TRUE(TraceConfig::IsEmptyOrContainsLeadingOrTrailingWhitespace( | |
3374 "bad_category ")); | |
3375 EXPECT_TRUE(TraceConfig::IsEmptyOrContainsLeadingOrTrailingWhitespace( | |
3376 " bad_category")); | |
3377 EXPECT_TRUE(TraceConfig::IsEmptyOrContainsLeadingOrTrailingWhitespace( | |
3378 "bad_category ")); | |
3379 EXPECT_TRUE(TraceConfig::IsEmptyOrContainsLeadingOrTrailingWhitespace( | |
3380 " bad_category ")); | |
3381 EXPECT_TRUE(TraceConfig::IsEmptyOrContainsLeadingOrTrailingWhitespace( | |
3382 "")); | |
3383 EXPECT_FALSE(TraceConfig::IsEmptyOrContainsLeadingOrTrailingWhitespace( | |
3384 "good_category")); | |
3385 } | |
3386 | |
3083 } // namespace trace_event | 3387 } // namespace trace_event |
3084 } // namespace base | 3388 } // namespace base |
OLD | NEW |