Index: base/trace_event/trace_event_unittest.cc |
diff --git a/base/trace_event/trace_event_unittest.cc b/base/trace_event/trace_event_unittest.cc |
index 2449d54cf63b1f2cc5cba2d732c3afd242bc7b4b..8248f281e780daae97de8c5abecd3ac527031fc3 100644 |
--- a/base/trace_event/trace_event_unittest.cc |
+++ b/base/trace_event/trace_event_unittest.cc |
@@ -15,6 +15,7 @@ |
#include "base/memory/singleton.h" |
#include "base/process/process_handle.h" |
#include "base/single_thread_task_runner.h" |
+#include "base/strings/pattern.h" |
#include "base/strings/stringprintf.h" |
#include "base/synchronization/waitable_event.h" |
#include "base/threading/platform_thread.h" |
@@ -47,6 +48,8 @@ const int kAsyncId = 5; |
const char kAsyncIdStr[] = "0x5"; |
const int kAsyncId2 = 6; |
const char kAsyncId2Str[] = "0x6"; |
+const int kFlowId = 7; |
+const char kFlowIdStr[] = "0x7"; |
const char kRecordAllCategoryFilter[] = "*"; |
@@ -85,7 +88,14 @@ class TraceEventTestFixture : public testing::Test { |
TraceLog::RECORDING_MODE); |
} |
+ void CancelTrace() { |
+ WaitableEvent flush_complete_event(false, false); |
+ CancelTraceAsync(&flush_complete_event); |
+ flush_complete_event.Wait(); |
+ } |
+ |
void EndTraceAndFlush() { |
+ num_flush_callbacks_ = 0; |
WaitableEvent flush_complete_event(false, false); |
EndTraceAndFlushAsync(&flush_complete_event); |
flush_complete_event.Wait(); |
@@ -103,6 +113,13 @@ class TraceEventTestFixture : public testing::Test { |
flush_complete_event.Wait(); |
} |
+ void CancelTraceAsync(WaitableEvent* flush_complete_event) { |
+ TraceLog::GetInstance()->CancelTracing( |
+ base::Bind(&TraceEventTestFixture::OnTraceDataCollected, |
+ base::Unretained(static_cast<TraceEventTestFixture*>(this)), |
+ base::Unretained(flush_complete_event))); |
+ } |
+ |
void EndTraceAndFlushAsync(WaitableEvent* flush_complete_event) { |
TraceLog::GetInstance()->SetDisabled(); |
TraceLog::GetInstance()->Flush( |
@@ -134,6 +151,7 @@ class TraceEventTestFixture : public testing::Test { |
ASSERT_FALSE(tracelog->IsEnabled()); |
trace_buffer_.SetOutputCallback(json_output_.GetCallback()); |
event_watch_notification_ = 0; |
+ num_flush_callbacks_ = 0; |
} |
void TearDown() override { |
if (TraceLog::GetInstance()) |
@@ -150,6 +168,7 @@ class TraceEventTestFixture : public testing::Test { |
TraceResultBuffer trace_buffer_; |
TraceResultBuffer::SimpleOutput json_output_; |
int event_watch_notification_; |
+ size_t num_flush_callbacks_; |
private: |
// We want our singleton torn down after each test. |
@@ -161,6 +180,10 @@ void TraceEventTestFixture::OnTraceDataCollected( |
WaitableEvent* flush_complete_event, |
const scoped_refptr<base::RefCountedString>& events_str, |
bool has_more_events) { |
+ num_flush_callbacks_++; |
+ if (num_flush_callbacks_ > 1) { |
+ EXPECT_FALSE(events_str->data().empty()); |
+ } |
AutoLock lock(lock_); |
json_output_.json_output.clear(); |
trace_buffer_.Start(); |
@@ -430,6 +453,12 @@ void TraceWithAllMacroVariants(WaitableEvent* task_complete_event) { |
"name1", "value1", |
"name2", "value2"); |
+ TRACE_EVENT_FLOW_BEGIN0("all", "TRACE_EVENT_FLOW_BEGIN0 call", kFlowId); |
+ TRACE_EVENT_FLOW_STEP0("all", "TRACE_EVENT_FLOW_STEP0 call", kFlowId, |
+ "step1"); |
+ TRACE_EVENT_FLOW_END_BIND_TO_ENCLOSING0( |
+ "all", "TRACE_EVENT_FLOW_END_BIND_TO_ENCLOSING0 call", kFlowId); |
+ |
TRACE_EVENT_BEGIN_ETW("TRACE_EVENT_BEGIN_ETW0 call", kAsyncId, NULL); |
TRACE_EVENT_BEGIN_ETW("TRACE_EVENT_BEGIN_ETW1 call", kAsyncId, "value"); |
TRACE_EVENT_END_ETW("TRACE_EVENT_END_ETW0 call", kAsyncId, NULL); |
@@ -613,6 +642,17 @@ void ValidateAllTraceMacrosCreatedData(const ListValue& trace_parsed) { |
EXPECT_SUB_FIND_("name2"); |
EXPECT_SUB_FIND_("value2"); |
+ EXPECT_FIND_("TRACE_EVENT_FLOW_BEGIN0 call"); |
+ EXPECT_SUB_FIND_("id"); |
+ EXPECT_SUB_FIND_(kFlowIdStr); |
+ EXPECT_FIND_("TRACE_EVENT_FLOW_STEP0 call"); |
+ EXPECT_SUB_FIND_("id"); |
+ EXPECT_SUB_FIND_(kFlowIdStr); |
+ EXPECT_SUB_FIND_("step1"); |
+ EXPECT_FIND_("TRACE_EVENT_FLOW_END_BIND_TO_ENCLOSING0 call"); |
+ EXPECT_SUB_FIND_("id"); |
+ EXPECT_SUB_FIND_(kFlowIdStr); |
+ |
EXPECT_FIND_("TRACE_EVENT_BEGIN_ETW0 call"); |
EXPECT_SUB_FIND_("id"); |
EXPECT_SUB_FIND_(kAsyncIdStr); |
@@ -882,6 +922,19 @@ TEST_F(TraceEventTestFixture, DataCaptured) { |
ValidateAllTraceMacrosCreatedData(trace_parsed_); |
} |
+// Emit some events and validate that only empty strings are received |
+// if we tell Flush() to discard events. |
+TEST_F(TraceEventTestFixture, DataDiscarded) { |
+ TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""), |
+ TraceLog::RECORDING_MODE); |
+ |
+ TraceWithAllMacroVariants(NULL); |
+ |
+ CancelTrace(); |
+ |
+ EXPECT_TRUE(trace_parsed_.empty()); |
+} |
+ |
class MockEnabledStateChangedObserver : |
public TraceLog::EnabledStateObserver { |
public: |
@@ -968,7 +1021,7 @@ class AfterStateChangeEnabledStateObserver |
: public TraceLog::EnabledStateObserver { |
public: |
AfterStateChangeEnabledStateObserver() {} |
- virtual ~AfterStateChangeEnabledStateObserver() {} |
+ ~AfterStateChangeEnabledStateObserver() override {} |
// TraceLog::EnabledStateObserver overrides: |
void OnTraceLogEnabled() override { |
@@ -999,7 +1052,7 @@ class SelfRemovingEnabledStateObserver |
: public TraceLog::EnabledStateObserver { |
public: |
SelfRemovingEnabledStateObserver() {} |
- virtual ~SelfRemovingEnabledStateObserver() {} |
+ ~SelfRemovingEnabledStateObserver() override {} |
// TraceLog::EnabledStateObserver overrides: |
void OnTraceLogEnabled() override {} |
@@ -1052,6 +1105,43 @@ TEST_F(TraceEventTestFixture, NewTraceRecording) { |
EndTraceAndFlush(); |
} |
+TEST_F(TraceEventTestFixture, TestTraceFlush) { |
+ size_t min_traces = 1; |
+ size_t max_traces = 1; |
+ do { |
+ max_traces *= 2; |
+ TraceLog::GetInstance()->SetEnabled(TraceConfig(), |
+ TraceLog::RECORDING_MODE); |
+ for (size_t i = 0; i < max_traces; i++) { |
+ TRACE_EVENT_INSTANT0("x", "y", TRACE_EVENT_SCOPE_THREAD); |
+ } |
+ EndTraceAndFlush(); |
+ } while (num_flush_callbacks_ < 2); |
+ |
+ while (min_traces + 50 < max_traces) { |
+ size_t traces = (min_traces + max_traces) / 2; |
+ TraceLog::GetInstance()->SetEnabled(TraceConfig(), |
+ TraceLog::RECORDING_MODE); |
+ for (size_t i = 0; i < traces; i++) { |
+ TRACE_EVENT_INSTANT0("x", "y", TRACE_EVENT_SCOPE_THREAD); |
+ } |
+ EndTraceAndFlush(); |
+ if (num_flush_callbacks_ < 2) { |
+ min_traces = traces - 10; |
+ } else { |
+ max_traces = traces + 10; |
+ } |
+ } |
+ |
+ for (size_t traces = min_traces; traces < max_traces; traces++) { |
+ TraceLog::GetInstance()->SetEnabled(TraceConfig(), |
+ TraceLog::RECORDING_MODE); |
+ for (size_t i = 0; i < traces; i++) { |
+ TRACE_EVENT_INSTANT0("x", "y", TRACE_EVENT_SCOPE_THREAD); |
+ } |
+ EndTraceAndFlush(); |
+ } |
+} |
// Test that categories work. |
TEST_F(TraceEventTestFixture, Categories) { |
@@ -2149,8 +2239,8 @@ namespace { |
bool IsTraceEventArgsWhitelisted(const char* category_group_name, |
const char* event_name) { |
- if (MatchPattern(category_group_name, "toplevel") && |
- MatchPattern(event_name, "*")) { |
+ if (base::MatchPattern(category_group_name, "toplevel") && |
+ base::MatchPattern(event_name, "*")) { |
return true; |
} |
@@ -2187,7 +2277,10 @@ TEST_F(TraceEventTestFixture, ArgsWhitelisting) { |
dict->GetDictionary("args", &args_dict); |
ASSERT_TRUE(args_dict); |
EXPECT_FALSE(args_dict->GetInteger("int_two", &int_value)); |
- EXPECT_TRUE(args_dict->GetInteger("stripped", &int_value)); |
+ |
+ std::string args_string; |
+ EXPECT_TRUE(dict->GetString("args", &args_string)); |
+ EXPECT_EQ(args_string, "__stripped__"); |
} |
class TraceEventCallbackTest : public TraceEventTestFixture { |
@@ -2247,7 +2340,7 @@ class TraceEventCallbackTest : public TraceEventTestFixture { |
const char* const arg_names[], |
const unsigned char arg_types[], |
const unsigned long long arg_values[], |
- unsigned char flags) { |
+ unsigned int flags) { |
s_instance->collected_events_phases_.push_back(phase); |
s_instance->collected_events_categories_.push_back( |
TraceLog::GetCategoryGroupName(category_group_enabled)); |