trace_event_unittest.cc revision b8cf94937c52feb53b55c39e3f82094d27de464c
1b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Use of this source code is governed by a BSD-style license that can be 3b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// found in the LICENSE file. 4b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 5b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include <math.h> 6b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include <cstdlib> 7b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 8b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/bind.h" 9b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/command_line.h" 10b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/json/json_reader.h" 11b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/json/json_writer.h" 12b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/location.h" 13b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/memory/ref_counted_memory.h" 14b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/memory/scoped_ptr.h" 15b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/memory/singleton.h" 16b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/process/process_handle.h" 17b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/single_thread_task_runner.h" 18b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/strings/stringprintf.h" 19b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/synchronization/waitable_event.h" 20b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/threading/platform_thread.h" 21b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/threading/thread.h" 22b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/time/time.h" 23b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/trace_event/trace_event.h" 24b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/trace_event/trace_event_synthetic_delay.h" 25b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/values.h" 26b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "testing/gmock/include/gmock/gmock.h" 27b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "testing/gtest/include/gtest/gtest.h" 28b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 29b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace base { 30b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace trace_event { 31b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 32b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace { 33b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 34b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratenum CompareOp { 35b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat IS_EQUAL, 36b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat IS_NOT_EQUAL, 37b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 38b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 39b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstruct JsonKeyValue { 40b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* key; 41b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* value; 42b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CompareOp op; 43b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 44b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 45b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst int kThreadId = 42; 46b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst int kAsyncId = 5; 47b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kAsyncIdStr[] = "0x5"; 48b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst int kAsyncId2 = 6; 49b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kAsyncId2Str[] = "0x6"; 50b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst int kFlowId = 7; 51b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kFlowIdStr[] = "0x7"; 52b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 53b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kRecordAllCategoryFilter[] = "*"; 54b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 55b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass TraceEventTestFixture : public testing::Test { 56b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public: 57b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void OnTraceDataCollected( 58b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat WaitableEvent* flush_complete_event, 59b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const scoped_refptr<base::RefCountedString>& events_str, 60b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool has_more_events); 61b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void OnWatchEventMatched() { 62b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ++event_watch_notification_; 63b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 64b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat DictionaryValue* FindMatchingTraceEntry(const JsonKeyValue* key_values); 65b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat DictionaryValue* FindNamePhase(const char* name, const char* phase); 66b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat DictionaryValue* FindNamePhaseKeyValue(const char* name, 67b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* phase, 68b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* key, 69b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* value); 70b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void DropTracedMetadataRecords(); 71b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool FindMatchingValue(const char* key, 72b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* value); 73b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool FindNonMatchingValue(const char* key, 74b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* value); 75b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void Clear() { 76b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_parsed_.Clear(); 77b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat json_output_.json_output.clear(); 78b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 79b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 80b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void BeginTrace() { 81b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat BeginSpecificTrace("*"); 82b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 83b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 84b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void BeginSpecificTrace(const std::string& filter) { 85b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat event_watch_notification_ = 0; 86b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEnabled(TraceConfig(filter, ""), 87b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::RECORDING_MODE); 88b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 89b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 90b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void EndTraceAndFlush() { 91b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat WaitableEvent flush_complete_event(false, false); 92b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlushAsync(&flush_complete_event); 93b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat flush_complete_event.Wait(); 94b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 95b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 96b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Used when testing thread-local buffers which requires the thread initiating 97b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // flush to have a message loop. 98b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void EndTraceAndFlushInThreadWithMessageLoop() { 99b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat WaitableEvent flush_complete_event(false, false); 100b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Thread flush_thread("flush"); 101b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat flush_thread.Start(); 102b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat flush_thread.task_runner()->PostTask( 103b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FROM_HERE, base::Bind(&TraceEventTestFixture::EndTraceAndFlushAsync, 104b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::Unretained(this), &flush_complete_event)); 105b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat flush_complete_event.Wait(); 106b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 107b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 108b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void EndTraceAndFlushAsync(WaitableEvent* flush_complete_event) { 109b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetDisabled(); 110b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->Flush( 111b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::Bind(&TraceEventTestFixture::OnTraceDataCollected, 112b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::Unretained(static_cast<TraceEventTestFixture*>(this)), 113b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::Unretained(flush_complete_event))); 114b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 115b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 116b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void FlushMonitoring() { 117b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat WaitableEvent flush_complete_event(false, false); 118b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FlushMonitoring(&flush_complete_event); 119b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat flush_complete_event.Wait(); 120b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 121b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 122b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void FlushMonitoring(WaitableEvent* flush_complete_event) { 123b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->FlushButLeaveBufferIntact( 124b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::Bind(&TraceEventTestFixture::OnTraceDataCollected, 125b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::Unretained(static_cast<TraceEventTestFixture*>(this)), 126b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::Unretained(flush_complete_event))); 127b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 128b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 129b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void SetUp() override { 130b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* name = PlatformThread::GetName(); 131b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat old_thread_name_ = name ? strdup(name) : NULL; 132b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 133b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::DeleteForTesting(); 134b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog* tracelog = TraceLog::GetInstance(); 135b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(tracelog); 136b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_FALSE(tracelog->IsEnabled()); 137b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_buffer_.SetOutputCallback(json_output_.GetCallback()); 138b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat event_watch_notification_ = 0; 139b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 140b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void TearDown() override { 141b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (TraceLog::GetInstance()) 142b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(TraceLog::GetInstance()->IsEnabled()); 143b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat PlatformThread::SetName(old_thread_name_ ? old_thread_name_ : ""); 144b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat free(old_thread_name_); 145b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat old_thread_name_ = NULL; 146b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // We want our singleton torn down after each test. 147b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::DeleteForTesting(); 148b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 149b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 150b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat char* old_thread_name_; 151b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ListValue trace_parsed_; 152b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceResultBuffer trace_buffer_; 153b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceResultBuffer::SimpleOutput json_output_; 154b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int event_watch_notification_; 155b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 156b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat private: 157b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // We want our singleton torn down after each test. 158b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ShadowingAtExitManager at_exit_manager_; 159b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Lock lock_; 160b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 161b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 162b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid TraceEventTestFixture::OnTraceDataCollected( 163b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat WaitableEvent* flush_complete_event, 164b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const scoped_refptr<base::RefCountedString>& events_str, 165b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool has_more_events) { 166b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat AutoLock lock(lock_); 167b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat json_output_.json_output.clear(); 168b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_buffer_.Start(); 169b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_buffer_.AddFragment(events_str->data()); 170b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_buffer_.Finish(); 171b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 172b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat scoped_ptr<Value> root; 173b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat root.reset(base::JSONReader::DeprecatedRead( 174b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat json_output_.json_output, JSON_PARSE_RFC | JSON_DETACHABLE_CHILDREN)); 175b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 176b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (!root.get()) { 177b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat LOG(ERROR) << json_output_.json_output; 178b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 179b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 180b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ListValue* root_list = NULL; 181b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(root.get()); 182b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(root->GetAsList(&root_list)); 183b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 184b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Move items into our aggregate collection 185b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat while (root_list->GetSize()) { 186b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat scoped_ptr<Value> item; 187b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat root_list->Remove(0, &item); 188b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_parsed_.Append(item.release()); 189b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 190b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 191b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (!has_more_events) 192b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat flush_complete_event->Signal(); 193b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 194b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 195b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstatic bool CompareJsonValues(const std::string& lhs, 196b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const std::string& rhs, 197b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CompareOp op) { 198b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat switch (op) { 199b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat case IS_EQUAL: 200b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return lhs == rhs; 201b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat case IS_NOT_EQUAL: 202b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return lhs != rhs; 203b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat default: 204b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CHECK(0); 205b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 206b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return false; 207b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 208b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 209b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstatic bool IsKeyValueInDict(const JsonKeyValue* key_value, 210b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat DictionaryValue* dict) { 211b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Value* value = NULL; 212b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string value_str; 213b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (dict->Get(key_value->key, &value) && 214b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat value->GetAsString(&value_str) && 215b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CompareJsonValues(value_str, key_value->value, key_value->op)) 216b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return true; 217b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 218b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Recurse to test arguments 219b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat DictionaryValue* args_dict = NULL; 220b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict->GetDictionary("args", &args_dict); 221b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (args_dict) 222b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return IsKeyValueInDict(key_value, args_dict); 223b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 224b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return false; 225b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 226b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 227b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstatic bool IsAllKeyValueInDict(const JsonKeyValue* key_values, 228b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat DictionaryValue* dict) { 229b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Scan all key_values, they must all be present and equal. 230b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat while (key_values && key_values->key) { 231b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (!IsKeyValueInDict(key_values, dict)) 232b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return false; 233b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ++key_values; 234b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 235b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return true; 236b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 237b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 238b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratDictionaryValue* TraceEventTestFixture::FindMatchingTraceEntry( 239b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const JsonKeyValue* key_values) { 240b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Scan all items 241b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat size_t trace_parsed_count = trace_parsed_.GetSize(); 242b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (size_t i = 0; i < trace_parsed_count; i++) { 243b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Value* value = NULL; 244b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_parsed_.Get(i, &value); 245b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (!value || value->GetType() != Value::TYPE_DICTIONARY) 246b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat continue; 247b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat DictionaryValue* dict = static_cast<DictionaryValue*>(value); 248b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 249b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (IsAllKeyValueInDict(key_values, dict)) 250b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return dict; 251b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 252b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return NULL; 253b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 254b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 255b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid TraceEventTestFixture::DropTracedMetadataRecords() { 256b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat scoped_ptr<ListValue> old_trace_parsed(trace_parsed_.DeepCopy()); 257b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat size_t old_trace_parsed_size = old_trace_parsed->GetSize(); 258b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_parsed_.Clear(); 259b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 260b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (size_t i = 0; i < old_trace_parsed_size; i++) { 261b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Value* value = NULL; 262b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat old_trace_parsed->Get(i, &value); 263b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (!value || value->GetType() != Value::TYPE_DICTIONARY) { 264b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_parsed_.Append(value->DeepCopy()); 265b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat continue; 266b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 267b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat DictionaryValue* dict = static_cast<DictionaryValue*>(value); 268b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string tmp; 269b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (dict->GetString("ph", &tmp) && tmp == "M") 270b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat continue; 271b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 272b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_parsed_.Append(value->DeepCopy()); 273b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 274b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 275b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 276b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratDictionaryValue* TraceEventTestFixture::FindNamePhase(const char* name, 277b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* phase) { 278b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat JsonKeyValue key_values[] = { 279b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat {"name", name, IS_EQUAL}, 280b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat {"ph", phase, IS_EQUAL}, 281b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat {0, 0, IS_EQUAL} 282b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat }; 283b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return FindMatchingTraceEntry(key_values); 284b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 285b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 286b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratDictionaryValue* TraceEventTestFixture::FindNamePhaseKeyValue( 287b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* name, 288b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* phase, 289b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* key, 290b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* value) { 291b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat JsonKeyValue key_values[] = { 292b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat {"name", name, IS_EQUAL}, 293b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat {"ph", phase, IS_EQUAL}, 294b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat {key, value, IS_EQUAL}, 295b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat {0, 0, IS_EQUAL} 296b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat }; 297b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return FindMatchingTraceEntry(key_values); 298b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 299b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 300b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratbool TraceEventTestFixture::FindMatchingValue(const char* key, 301b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* value) { 302b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat JsonKeyValue key_values[] = { 303b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat {key, value, IS_EQUAL}, 304b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat {0, 0, IS_EQUAL} 305b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat }; 306b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return FindMatchingTraceEntry(key_values); 307b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 308b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 309b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratbool TraceEventTestFixture::FindNonMatchingValue(const char* key, 310b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* value) { 311b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat JsonKeyValue key_values[] = { 312b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat {key, value, IS_NOT_EQUAL}, 313b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat {0, 0, IS_EQUAL} 314b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat }; 315b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return FindMatchingTraceEntry(key_values); 316b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 317b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 318b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratbool IsStringInDict(const char* string_to_match, const DictionaryValue* dict) { 319b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (DictionaryValue::Iterator it(*dict); !it.IsAtEnd(); it.Advance()) { 320b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (it.key().find(string_to_match) != std::string::npos) 321b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return true; 322b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 323b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string value_str; 324b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat it.value().GetAsString(&value_str); 325b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (value_str.find(string_to_match) != std::string::npos) 326b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return true; 327b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 328b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 329b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Recurse to test arguments 330b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const DictionaryValue* args_dict = NULL; 331b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict->GetDictionary("args", &args_dict); 332b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (args_dict) 333b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return IsStringInDict(string_to_match, args_dict); 334b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 335b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return false; 336b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 337b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 338b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst DictionaryValue* FindTraceEntry( 339b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const ListValue& trace_parsed, 340b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* string_to_match, 341b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const DictionaryValue* match_after_this_item = NULL) { 342b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Scan all items 343b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat size_t trace_parsed_count = trace_parsed.GetSize(); 344b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (size_t i = 0; i < trace_parsed_count; i++) { 345b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const Value* value = NULL; 346b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_parsed.Get(i, &value); 347b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (match_after_this_item) { 348b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (value == match_after_this_item) 349b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat match_after_this_item = NULL; 350b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat continue; 351b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 352b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (!value || value->GetType() != Value::TYPE_DICTIONARY) 353b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat continue; 354b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const DictionaryValue* dict = static_cast<const DictionaryValue*>(value); 355b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 356b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (IsStringInDict(string_to_match, dict)) 357b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return dict; 358b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 359b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return NULL; 360b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 361b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 362b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstd::vector<const DictionaryValue*> FindTraceEntries( 363b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const ListValue& trace_parsed, 364b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* string_to_match) { 365b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::vector<const DictionaryValue*> hits; 366b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat size_t trace_parsed_count = trace_parsed.GetSize(); 367b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (size_t i = 0; i < trace_parsed_count; i++) { 368b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const Value* value = NULL; 369b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_parsed.Get(i, &value); 370b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (!value || value->GetType() != Value::TYPE_DICTIONARY) 371b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat continue; 372b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const DictionaryValue* dict = static_cast<const DictionaryValue*>(value); 373b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 374b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (IsStringInDict(string_to_match, dict)) 375b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat hits.push_back(dict); 376b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 377b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return hits; 378b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 379b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 380b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kControlCharacters[] = "\001\002\003\n\r"; 381b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 382b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid TraceWithAllMacroVariants(WaitableEvent* task_complete_event) { 383b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 384b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_BEGIN_ETW("TRACE_EVENT_BEGIN_ETW call", 0x1122, "extrastring1"); 385b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_END_ETW("TRACE_EVENT_END_ETW call", 0x3344, "extrastring2"); 386b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT_ETW("TRACE_EVENT_INSTANT_ETW call", 387b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 0x5566, "extrastring3"); 388b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 389b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT0("all", "TRACE_EVENT0 call"); 390b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT1("all", "TRACE_EVENT1 call", "name1", "value1"); 391b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT2("all", "TRACE_EVENT2 call", 392b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "name1", "\"value1\"", 393b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "name2", "value\\2"); 394b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 395b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("all", "TRACE_EVENT_INSTANT0 call", 396b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_SCOPE_GLOBAL); 397b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT1("all", "TRACE_EVENT_INSTANT1 call", 398b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_SCOPE_PROCESS, "name1", "value1"); 399b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT2("all", "TRACE_EVENT_INSTANT2 call", 400b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_SCOPE_THREAD, 401b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "name1", "value1", 402b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "name2", "value2"); 403b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 404b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_BEGIN0("all", "TRACE_EVENT_BEGIN0 call"); 405b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_BEGIN1("all", "TRACE_EVENT_BEGIN1 call", "name1", "value1"); 406b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_BEGIN2("all", "TRACE_EVENT_BEGIN2 call", 407b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "name1", "value1", 408b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "name2", "value2"); 409b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 410b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_END0("all", "TRACE_EVENT_END0 call"); 411b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_END1("all", "TRACE_EVENT_END1 call", "name1", "value1"); 412b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_END2("all", "TRACE_EVENT_END2 call", 413b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "name1", "value1", 414b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "name2", "value2"); 415b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 416b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_ASYNC_BEGIN0("all", "TRACE_EVENT_ASYNC_BEGIN0 call", kAsyncId); 417b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_ASYNC_BEGIN1("all", "TRACE_EVENT_ASYNC_BEGIN1 call", kAsyncId, 418b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "name1", "value1"); 419b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_ASYNC_BEGIN2("all", "TRACE_EVENT_ASYNC_BEGIN2 call", kAsyncId, 420b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "name1", "value1", 421b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "name2", "value2"); 422b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 423b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_ASYNC_STEP_INTO0("all", "TRACE_EVENT_ASYNC_STEP_INTO0 call", 424b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat kAsyncId, "step_begin1"); 425b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_ASYNC_STEP_INTO1("all", "TRACE_EVENT_ASYNC_STEP_INTO1 call", 426b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat kAsyncId, "step_begin2", "name1", "value1"); 427b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 428b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_ASYNC_END0("all", "TRACE_EVENT_ASYNC_END0 call", kAsyncId); 429b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_ASYNC_END1("all", "TRACE_EVENT_ASYNC_END1 call", kAsyncId, 430b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "name1", "value1"); 431b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_ASYNC_END2("all", "TRACE_EVENT_ASYNC_END2 call", kAsyncId, 432b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "name1", "value1", 433b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "name2", "value2"); 434b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 435b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_FLOW_BEGIN0("all", "TRACE_EVENT_FLOW_BEGIN0 call", kFlowId); 436b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_FLOW_STEP0("all", "TRACE_EVENT_FLOW_STEP0 call", 437b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat kFlowId, "step1"); 438b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_FLOW_END_BIND_TO_ENCLOSING0("all", 439b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "TRACE_EVENT_FLOW_END_BIND_TO_ENCLOSING0 call", kFlowId); 440b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 441b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_BEGIN_ETW("TRACE_EVENT_BEGIN_ETW0 call", kAsyncId, NULL); 442b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_BEGIN_ETW("TRACE_EVENT_BEGIN_ETW1 call", kAsyncId, "value"); 443b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_END_ETW("TRACE_EVENT_END_ETW0 call", kAsyncId, NULL); 444b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_END_ETW("TRACE_EVENT_END_ETW1 call", kAsyncId, "value"); 445b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT_ETW("TRACE_EVENT_INSTANT_ETW0 call", kAsyncId, NULL); 446b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT_ETW("TRACE_EVENT_INSTANT_ETW1 call", kAsyncId, "value"); 447b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 448b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_COUNTER1("all", "TRACE_COUNTER1 call", 31415); 449b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_COUNTER2("all", "TRACE_COUNTER2 call", 450b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "a", 30000, 451b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "b", 1415); 452b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 453b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_COUNTER_ID1("all", "TRACE_COUNTER_ID1 call", 0x319009, 31415); 454b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_COUNTER_ID2("all", "TRACE_COUNTER_ID2 call", 0x319009, 455b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "a", 30000, "b", 1415); 456b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 457b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_COPY_BEGIN_WITH_ID_TID_AND_TIMESTAMP0("all", 458b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "TRACE_EVENT_COPY_BEGIN_WITH_ID_TID_AND_TIMESTAMP0 call", 459b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat kAsyncId, kThreadId, 12345); 460b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_COPY_END_WITH_ID_TID_AND_TIMESTAMP0("all", 461b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "TRACE_EVENT_COPY_END_WITH_ID_TID_AND_TIMESTAMP0 call", 462b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat kAsyncId, kThreadId, 23456); 463b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 464b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_BEGIN_WITH_ID_TID_AND_TIMESTAMP0("all", 465b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "TRACE_EVENT_BEGIN_WITH_ID_TID_AND_TIMESTAMP0 call", 466b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat kAsyncId2, kThreadId, 34567); 467b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_ASYNC_STEP_PAST0("all", "TRACE_EVENT_ASYNC_STEP_PAST0 call", 468b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat kAsyncId2, "step_end1"); 469b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_ASYNC_STEP_PAST1("all", "TRACE_EVENT_ASYNC_STEP_PAST1 call", 470b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat kAsyncId2, "step_end2", "name1", "value1"); 471b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 472b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_END_WITH_ID_TID_AND_TIMESTAMP0("all", 473b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "TRACE_EVENT_END_WITH_ID_TID_AND_TIMESTAMP0 call", 474b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat kAsyncId2, kThreadId, 45678); 475b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 476b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_OBJECT_CREATED_WITH_ID("all", "tracked object 1", 0x42); 477b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID( 478b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "all", "tracked object 1", 0x42, "hello"); 479b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_OBJECT_DELETED_WITH_ID("all", "tracked object 1", 0x42); 480b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 481b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceScopedTrackableObject<int> trackable("all", "tracked object 2", 482b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 0x2128506); 483b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trackable.snapshot("world"); 484b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 485b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT1(kControlCharacters, kControlCharacters, 486b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat kControlCharacters, kControlCharacters); 487b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } // Scope close causes TRACE_EVENT0 etc to send their END events. 488b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 489b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (task_complete_event) 490b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat task_complete_event->Signal(); 491b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 492b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 493b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid ValidateAllTraceMacrosCreatedData(const ListValue& trace_parsed) { 494b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const DictionaryValue* item = NULL; 495b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 496b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define EXPECT_FIND_(string) \ 497b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat item = FindTraceEntry(trace_parsed, string); \ 498b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(item); 499b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define EXPECT_NOT_FIND_(string) \ 500b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat item = FindTraceEntry(trace_parsed, string); \ 501b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(item); 502b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define EXPECT_SUB_FIND_(string) \ 503b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (item) \ 504b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(IsStringInDict(string, item)); 505b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 506b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("ETW Trace Event"); 507b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("all"); 508b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_EVENT_BEGIN_ETW call"); 509b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 510b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string str_val; 511b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(item && item->GetString("args.id", &str_val)); 512b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_STREQ("0x1122", str_val.c_str()); 513b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 514b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("extrastring1"); 515b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_EVENT_END_ETW call"); 516b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_EVENT_INSTANT_ETW call"); 517b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_EVENT0 call"); 518b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 519b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string ph; 520b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string ph_end; 521b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE((item = FindTraceEntry(trace_parsed, "TRACE_EVENT0 call"))); 522b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE((item && item->GetString("ph", &ph))); 523b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("X", ph); 524b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat item = FindTraceEntry(trace_parsed, "TRACE_EVENT0 call", item); 525b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(item); 526b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 527b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_EVENT1 call"); 528b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("name1"); 529b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("value1"); 530b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_EVENT2 call"); 531b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("name1"); 532b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("\"value1\""); 533b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("name2"); 534b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("value\\2"); 535b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 536b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_EVENT_INSTANT0 call"); 537b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 538b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string scope; 539b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE((item && item->GetString("s", &scope))); 540b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("g", scope); 541b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 542b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_EVENT_INSTANT1 call"); 543b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 544b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string scope; 545b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE((item && item->GetString("s", &scope))); 546b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("p", scope); 547b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 548b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("name1"); 549b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("value1"); 550b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_EVENT_INSTANT2 call"); 551b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 552b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string scope; 553b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE((item && item->GetString("s", &scope))); 554b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("t", scope); 555b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 556b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("name1"); 557b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("value1"); 558b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("name2"); 559b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("value2"); 560b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 561b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_EVENT_BEGIN0 call"); 562b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_EVENT_BEGIN1 call"); 563b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("name1"); 564b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("value1"); 565b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_EVENT_BEGIN2 call"); 566b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("name1"); 567b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("value1"); 568b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("name2"); 569b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("value2"); 570b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 571b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_EVENT_END0 call"); 572b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_EVENT_END1 call"); 573b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("name1"); 574b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("value1"); 575b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_EVENT_END2 call"); 576b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("name1"); 577b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("value1"); 578b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("name2"); 579b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("value2"); 580b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 581b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_EVENT_ASYNC_BEGIN0 call"); 582b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("id"); 583b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_(kAsyncIdStr); 584b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_EVENT_ASYNC_BEGIN1 call"); 585b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("id"); 586b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_(kAsyncIdStr); 587b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("name1"); 588b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("value1"); 589b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_EVENT_ASYNC_BEGIN2 call"); 590b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("id"); 591b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_(kAsyncIdStr); 592b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("name1"); 593b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("value1"); 594b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("name2"); 595b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("value2"); 596b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 597b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_EVENT_ASYNC_STEP_INTO0 call"); 598b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("id"); 599b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_(kAsyncIdStr); 600b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("step_begin1"); 601b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_EVENT_ASYNC_STEP_INTO1 call"); 602b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("id"); 603b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_(kAsyncIdStr); 604b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("step_begin2"); 605b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("name1"); 606b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("value1"); 607b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 608b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_EVENT_ASYNC_END0 call"); 609b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("id"); 610b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_(kAsyncIdStr); 611b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_EVENT_ASYNC_END1 call"); 612b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("id"); 613b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_(kAsyncIdStr); 614b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("name1"); 615b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("value1"); 616b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_EVENT_ASYNC_END2 call"); 617b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("id"); 618b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_(kAsyncIdStr); 619b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("name1"); 620b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("value1"); 621b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("name2"); 622b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("value2"); 623b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 624b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_EVENT_FLOW_BEGIN0 call"); 625b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("id"); 626b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_(kFlowIdStr); 627b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_EVENT_FLOW_STEP0 call"); 628b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("id"); 629b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_(kFlowIdStr); 630b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("step1"); 631b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_EVENT_FLOW_END_BIND_TO_ENCLOSING0 call"); 632b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("id"); 633b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_(kFlowIdStr); 634b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 635b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_EVENT_BEGIN_ETW0 call"); 636b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("id"); 637b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_(kAsyncIdStr); 638b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("extra"); 639b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("NULL"); 640b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_EVENT_BEGIN_ETW1 call"); 641b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("id"); 642b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_(kAsyncIdStr); 643b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("extra"); 644b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("value"); 645b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_EVENT_END_ETW0 call"); 646b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("id"); 647b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_(kAsyncIdStr); 648b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("extra"); 649b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("NULL"); 650b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_EVENT_END_ETW1 call"); 651b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("id"); 652b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_(kAsyncIdStr); 653b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("extra"); 654b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("value"); 655b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_EVENT_INSTANT_ETW0 call"); 656b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("id"); 657b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_(kAsyncIdStr); 658b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("extra"); 659b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("NULL"); 660b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_EVENT_INSTANT_ETW1 call"); 661b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("id"); 662b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_(kAsyncIdStr); 663b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("extra"); 664b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("value"); 665b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 666b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_COUNTER1 call"); 667b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 668b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string ph; 669b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE((item && item->GetString("ph", &ph))); 670b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("C", ph); 671b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 672b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int value; 673b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE((item && item->GetInteger("args.value", &value))); 674b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(31415, value); 675b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 676b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 677b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_COUNTER2 call"); 678b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 679b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string ph; 680b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE((item && item->GetString("ph", &ph))); 681b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("C", ph); 682b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 683b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int value; 684b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE((item && item->GetInteger("args.a", &value))); 685b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(30000, value); 686b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 687b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE((item && item->GetInteger("args.b", &value))); 688b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1415, value); 689b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 690b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 691b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_COUNTER_ID1 call"); 692b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 693b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string id; 694b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE((item && item->GetString("id", &id))); 695b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("0x319009", id); 696b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 697b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string ph; 698b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE((item && item->GetString("ph", &ph))); 699b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("C", ph); 700b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 701b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int value; 702b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE((item && item->GetInteger("args.value", &value))); 703b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(31415, value); 704b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 705b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 706b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_COUNTER_ID2 call"); 707b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 708b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string id; 709b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE((item && item->GetString("id", &id))); 710b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("0x319009", id); 711b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 712b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string ph; 713b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE((item && item->GetString("ph", &ph))); 714b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("C", ph); 715b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 716b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int value; 717b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE((item && item->GetInteger("args.a", &value))); 718b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(30000, value); 719b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 720b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE((item && item->GetInteger("args.b", &value))); 721b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1415, value); 722b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 723b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 724b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_EVENT_COPY_BEGIN_WITH_ID_TID_AND_TIMESTAMP0 call"); 725b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 726b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int val; 727b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE((item && item->GetInteger("ts", &val))); 728b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(12345, val); 729b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE((item && item->GetInteger("tid", &val))); 730b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kThreadId, val); 731b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string id; 732b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE((item && item->GetString("id", &id))); 733b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kAsyncIdStr, id); 734b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 735b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 736b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_EVENT_COPY_END_WITH_ID_TID_AND_TIMESTAMP0 call"); 737b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 738b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int val; 739b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE((item && item->GetInteger("ts", &val))); 740b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(23456, val); 741b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE((item && item->GetInteger("tid", &val))); 742b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kThreadId, val); 743b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string id; 744b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE((item && item->GetString("id", &id))); 745b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kAsyncIdStr, id); 746b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 747b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 748b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_EVENT_BEGIN_WITH_ID_TID_AND_TIMESTAMP0 call"); 749b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 750b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int val; 751b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE((item && item->GetInteger("ts", &val))); 752b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(34567, val); 753b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE((item && item->GetInteger("tid", &val))); 754b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kThreadId, val); 755b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string id; 756b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE((item && item->GetString("id", &id))); 757b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kAsyncId2Str, id); 758b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 759b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 760b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_EVENT_ASYNC_STEP_PAST0 call"); 761b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 762b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("id"); 763b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_(kAsyncId2Str); 764b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("step_end1"); 765b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_EVENT_ASYNC_STEP_PAST1 call"); 766b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("id"); 767b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_(kAsyncId2Str); 768b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("step_end2"); 769b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("name1"); 770b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_("value1"); 771b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 772b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 773b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("TRACE_EVENT_END_WITH_ID_TID_AND_TIMESTAMP0 call"); 774b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 775b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int val; 776b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE((item && item->GetInteger("ts", &val))); 777b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(45678, val); 778b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE((item && item->GetInteger("tid", &val))); 779b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kThreadId, val); 780b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string id; 781b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE((item && item->GetString("id", &id))); 782b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kAsyncId2Str, id); 783b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 784b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 785b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("tracked object 1"); 786b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 787b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string phase; 788b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string id; 789b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string snapshot; 790b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 791b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE((item && item->GetString("ph", &phase))); 792b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("N", phase); 793b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE((item && item->GetString("id", &id))); 794b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("0x42", id); 795b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 796b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat item = FindTraceEntry(trace_parsed, "tracked object 1", item); 797b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(item); 798b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(item && item->GetString("ph", &phase)); 799b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("O", phase); 800b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(item && item->GetString("id", &id)); 801b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("0x42", id); 802b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(item && item->GetString("args.snapshot", &snapshot)); 803b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("hello", snapshot); 804b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 805b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat item = FindTraceEntry(trace_parsed, "tracked object 1", item); 806b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(item); 807b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(item && item->GetString("ph", &phase)); 808b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("D", phase); 809b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(item && item->GetString("id", &id)); 810b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("0x42", id); 811b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 812b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 813b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("tracked object 2"); 814b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 815b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string phase; 816b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string id; 817b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string snapshot; 818b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 819b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(item && item->GetString("ph", &phase)); 820b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("N", phase); 821b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(item && item->GetString("id", &id)); 822b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("0x2128506", id); 823b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 824b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat item = FindTraceEntry(trace_parsed, "tracked object 2", item); 825b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(item); 826b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(item && item->GetString("ph", &phase)); 827b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("O", phase); 828b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(item && item->GetString("id", &id)); 829b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("0x2128506", id); 830b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(item && item->GetString("args.snapshot", &snapshot)); 831b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("world", snapshot); 832b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 833b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat item = FindTraceEntry(trace_parsed, "tracked object 2", item); 834b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(item); 835b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(item && item->GetString("ph", &phase)); 836b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("D", phase); 837b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(item && item->GetString("id", &id)); 838b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("0x2128506", id); 839b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 840b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 841b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_(kControlCharacters); 842b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_SUB_FIND_(kControlCharacters); 843b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 844b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 845b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid TraceManyInstantEvents(int thread_id, int num_events, 846b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat WaitableEvent* task_complete_event) { 847b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (int i = 0; i < num_events; i++) { 848b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT2("all", "multi thread event", 849b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_SCOPE_THREAD, 850b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "thread", thread_id, 851b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "event", i); 852b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 853b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 854b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (task_complete_event) 855b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat task_complete_event->Signal(); 856b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 857b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 858b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid ValidateInstantEventPresentOnEveryThread(const ListValue& trace_parsed, 859b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int num_threads, 860b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int num_events) { 861b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::map<int, std::map<int, bool> > results; 862b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 863b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat size_t trace_parsed_count = trace_parsed.GetSize(); 864b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (size_t i = 0; i < trace_parsed_count; i++) { 865b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const Value* value = NULL; 866b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_parsed.Get(i, &value); 867b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (!value || value->GetType() != Value::TYPE_DICTIONARY) 868b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat continue; 869b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const DictionaryValue* dict = static_cast<const DictionaryValue*>(value); 870b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string name; 871b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict->GetString("name", &name); 872b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (name != "multi thread event") 873b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat continue; 874b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 875b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int thread = 0; 876b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int event = 0; 877b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(dict->GetInteger("args.thread", &thread)); 878b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(dict->GetInteger("args.event", &event)); 879b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat results[thread][event] = true; 880b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 881b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 882b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(results[-1][-1]); 883b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (int thread = 0; thread < num_threads; thread++) { 884b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (int event = 0; event < num_events; event++) { 885b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(results[thread][event]); 886b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 887b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 888b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 889b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 890b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} // namespace 891b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 892b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Simple Test for emitting data and validating it was received. 893b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, DataCaptured) { 894b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""), 895b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::RECORDING_MODE); 896b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 897b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceWithAllMacroVariants(NULL); 898b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 899b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 900b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 901b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ValidateAllTraceMacrosCreatedData(trace_parsed_); 902b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 903b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 904b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass MockEnabledStateChangedObserver : 905b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public TraceLog::EnabledStateObserver { 906b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public: 907b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat MOCK_METHOD0(OnTraceLogEnabled, void()); 908b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat MOCK_METHOD0(OnTraceLogDisabled, void()); 909b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 910b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 911b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, EnabledObserverFiresOnEnable) { 912b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat MockEnabledStateChangedObserver observer; 913b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->AddEnabledStateObserver(&observer); 914b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 915b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_CALL(observer, OnTraceLogEnabled()) 916b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat .Times(1); 917b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""), 918b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::RECORDING_MODE); 919b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat testing::Mock::VerifyAndClear(&observer); 920b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(TraceLog::GetInstance()->IsEnabled()); 921b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 922b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Cleanup. 923b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->RemoveEnabledStateObserver(&observer); 924b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetDisabled(); 925b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 926b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 927b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, EnabledObserverDoesntFireOnSecondEnable) { 928b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""), 929b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::RECORDING_MODE); 930b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 931b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat testing::StrictMock<MockEnabledStateChangedObserver> observer; 932b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->AddEnabledStateObserver(&observer); 933b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 934b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_CALL(observer, OnTraceLogEnabled()) 935b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat .Times(0); 936b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_CALL(observer, OnTraceLogDisabled()) 937b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat .Times(0); 938b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""), 939b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::RECORDING_MODE); 940b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat testing::Mock::VerifyAndClear(&observer); 941b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(TraceLog::GetInstance()->IsEnabled()); 942b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 943b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Cleanup. 944b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->RemoveEnabledStateObserver(&observer); 945b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetDisabled(); 946b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetDisabled(); 947b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 948b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 949b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, EnabledObserverFiresOnFirstDisable) { 950b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceConfig tc_inc_all("*", ""); 951b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEnabled(tc_inc_all, TraceLog::RECORDING_MODE); 952b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEnabled(tc_inc_all, TraceLog::RECORDING_MODE); 953b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 954b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat testing::StrictMock<MockEnabledStateChangedObserver> observer; 955b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->AddEnabledStateObserver(&observer); 956b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 957b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_CALL(observer, OnTraceLogEnabled()) 958b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat .Times(0); 959b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_CALL(observer, OnTraceLogDisabled()) 960b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat .Times(1); 961b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetDisabled(); 962b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat testing::Mock::VerifyAndClear(&observer); 963b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 964b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Cleanup. 965b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->RemoveEnabledStateObserver(&observer); 966b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetDisabled(); 967b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 968b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 969b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, EnabledObserverFiresOnDisable) { 970b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""), 971b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::RECORDING_MODE); 972b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 973b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat MockEnabledStateChangedObserver observer; 974b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->AddEnabledStateObserver(&observer); 975b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 976b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_CALL(observer, OnTraceLogDisabled()) 977b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat .Times(1); 978b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetDisabled(); 979b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat testing::Mock::VerifyAndClear(&observer); 980b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 981b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Cleanup. 982b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->RemoveEnabledStateObserver(&observer); 983b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 984b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 985b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Tests the IsEnabled() state of TraceLog changes before callbacks. 986b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass AfterStateChangeEnabledStateObserver 987b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat : public TraceLog::EnabledStateObserver { 988b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public: 989b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat AfterStateChangeEnabledStateObserver() {} 990b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat virtual ~AfterStateChangeEnabledStateObserver() {} 991b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 992b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // TraceLog::EnabledStateObserver overrides: 993b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void OnTraceLogEnabled() override { 994b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(TraceLog::GetInstance()->IsEnabled()); 995b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 996b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 997b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void OnTraceLogDisabled() override { 998b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(TraceLog::GetInstance()->IsEnabled()); 999b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 1000b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 1001b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1002b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, ObserversFireAfterStateChange) { 1003b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat AfterStateChangeEnabledStateObserver observer; 1004b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->AddEnabledStateObserver(&observer); 1005b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1006b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""), 1007b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::RECORDING_MODE); 1008b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(TraceLog::GetInstance()->IsEnabled()); 1009b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1010b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetDisabled(); 1011b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(TraceLog::GetInstance()->IsEnabled()); 1012b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1013b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->RemoveEnabledStateObserver(&observer); 1014b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 1015b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1016b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Tests that a state observer can remove itself during a callback. 1017b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass SelfRemovingEnabledStateObserver 1018b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat : public TraceLog::EnabledStateObserver { 1019b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public: 1020b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SelfRemovingEnabledStateObserver() {} 1021b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat virtual ~SelfRemovingEnabledStateObserver() {} 1022b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1023b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // TraceLog::EnabledStateObserver overrides: 1024b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void OnTraceLogEnabled() override {} 1025b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1026b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void OnTraceLogDisabled() override { 1027b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->RemoveEnabledStateObserver(this); 1028b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 1029b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 1030b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1031b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, SelfRemovingObserver) { 1032b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_EQ(0u, TraceLog::GetInstance()->GetObserverCountForTest()); 1033b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1034b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SelfRemovingEnabledStateObserver observer; 1035b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->AddEnabledStateObserver(&observer); 1036b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1u, TraceLog::GetInstance()->GetObserverCountForTest()); 1037b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1038b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""), 1039b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::RECORDING_MODE); 1040b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetDisabled(); 1041b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // The observer removed itself on disable. 1042b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(0u, TraceLog::GetInstance()->GetObserverCountForTest()); 1043b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 1044b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1045b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratbool IsNewTrace() { 1046b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool is_new_trace; 1047b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_IS_NEW_TRACE(&is_new_trace); 1048b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return is_new_trace; 1049b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 1050b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1051b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, NewTraceRecording) { 1052b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_FALSE(IsNewTrace()); 1053b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""), 1054b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::RECORDING_MODE); 1055b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // First call to IsNewTrace() should succeed. But, the second shouldn't. 1056b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(IsNewTrace()); 1057b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_FALSE(IsNewTrace()); 1058b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 1059b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1060b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // IsNewTrace() should definitely be false now. 1061b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_FALSE(IsNewTrace()); 1062b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1063b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Start another trace. IsNewTrace() should become true again, briefly, as 1064b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // before. 1065b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""), 1066b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::RECORDING_MODE); 1067b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(IsNewTrace()); 1068b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_FALSE(IsNewTrace()); 1069b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1070b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Cleanup. 1071b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 1072b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 1073b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1074b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1075b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Test that categories work. 1076b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, Categories) { 1077b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Test that categories that are used can be retrieved whether trace was 1078b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // enabled or disabled when the trace event was encountered. 1079b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("c1", "name", TRACE_EVENT_SCOPE_THREAD); 1080b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("c2", "name", TRACE_EVENT_SCOPE_THREAD); 1081b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat BeginTrace(); 1082b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("c3", "name", TRACE_EVENT_SCOPE_THREAD); 1083b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("c4", "name", TRACE_EVENT_SCOPE_THREAD); 1084b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Category groups containing more than one category. 1085b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("c5,c6", "name", TRACE_EVENT_SCOPE_THREAD); 1086b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("c7,c8", "name", TRACE_EVENT_SCOPE_THREAD); 1087b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0(TRACE_DISABLED_BY_DEFAULT("c9"), "name", 1088b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_SCOPE_THREAD); 1089b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1090b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 1091b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::vector<std::string> cat_groups; 1092b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->GetKnownCategoryGroups(&cat_groups); 1093b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(std::find(cat_groups.begin(), 1094b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat cat_groups.end(), "c1") != cat_groups.end()); 1095b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(std::find(cat_groups.begin(), 1096b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat cat_groups.end(), "c2") != cat_groups.end()); 1097b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(std::find(cat_groups.begin(), 1098b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat cat_groups.end(), "c3") != cat_groups.end()); 1099b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(std::find(cat_groups.begin(), 1100b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat cat_groups.end(), "c4") != cat_groups.end()); 1101b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(std::find(cat_groups.begin(), 1102b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat cat_groups.end(), "c5,c6") != cat_groups.end()); 1103b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(std::find(cat_groups.begin(), 1104b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat cat_groups.end(), "c7,c8") != cat_groups.end()); 1105b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(std::find(cat_groups.begin(), 1106b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat cat_groups.end(), 1107b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "disabled-by-default-c9") != cat_groups.end()); 1108b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Make sure metadata isn't returned. 1109b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(std::find(cat_groups.begin(), 1110b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat cat_groups.end(), "__metadata") == cat_groups.end()); 1111b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1112b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const std::vector<std::string> empty_categories; 1113b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::vector<std::string> included_categories; 1114b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::vector<std::string> excluded_categories; 1115b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1116b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Test that category filtering works. 1117b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1118b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Include nonexistent category -> no events 1119b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Clear(); 1120b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat included_categories.clear(); 1121b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEnabled(TraceConfig("not_found823564786", ""), 1122b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::RECORDING_MODE); 1123b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("cat1", "name", TRACE_EVENT_SCOPE_THREAD); 1124b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("cat2", "name", TRACE_EVENT_SCOPE_THREAD); 1125b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 1126b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat DropTracedMetadataRecords(); 1127b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(trace_parsed_.empty()); 1128b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1129b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Include existent category -> only events of that category 1130b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Clear(); 1131b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat included_categories.clear(); 1132b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEnabled(TraceConfig("inc", ""), 1133b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::RECORDING_MODE); 1134b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("inc", "name", TRACE_EVENT_SCOPE_THREAD); 1135b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("inc2", "name", TRACE_EVENT_SCOPE_THREAD); 1136b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 1137b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat DropTracedMetadataRecords(); 1138b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(FindMatchingValue("cat", "inc")); 1139b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(FindNonMatchingValue("cat", "inc")); 1140b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1141b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Include existent wildcard -> all categories matching wildcard 1142b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Clear(); 1143b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat included_categories.clear(); 1144b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEnabled( 1145b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceConfig("inc_wildcard_*,inc_wildchar_?_end", ""), 1146b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::RECORDING_MODE); 1147b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("inc_wildcard_abc", "included", 1148b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_SCOPE_THREAD); 1149b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("inc_wildcard_", "included", TRACE_EVENT_SCOPE_THREAD); 1150b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("inc_wildchar_x_end", "included", 1151b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_SCOPE_THREAD); 1152b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("inc_wildchar_bla_end", "not_inc", 1153b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_SCOPE_THREAD); 1154b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("cat1", "not_inc", TRACE_EVENT_SCOPE_THREAD); 1155b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("cat2", "not_inc", TRACE_EVENT_SCOPE_THREAD); 1156b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("inc_wildcard_category,other_category", "included", 1157b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_SCOPE_THREAD); 1158b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0( 1159b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "non_included_category,inc_wildcard_category", "included", 1160b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_SCOPE_THREAD); 1161b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 1162b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(FindMatchingValue("cat", "inc_wildcard_abc")); 1163b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(FindMatchingValue("cat", "inc_wildcard_")); 1164b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(FindMatchingValue("cat", "inc_wildchar_x_end")); 1165b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(FindMatchingValue("name", "not_inc")); 1166b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(FindMatchingValue("cat", "inc_wildcard_category,other_category")); 1167b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(FindMatchingValue("cat", 1168b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "non_included_category,inc_wildcard_category")); 1169b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1170b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat included_categories.clear(); 1171b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1172b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Exclude nonexistent category -> all events 1173b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Clear(); 1174b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEnabled(TraceConfig("-not_found823564786", ""), 1175b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::RECORDING_MODE); 1176b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("cat1", "name", TRACE_EVENT_SCOPE_THREAD); 1177b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("cat2", "name", TRACE_EVENT_SCOPE_THREAD); 1178b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("category1,category2", "name", TRACE_EVENT_SCOPE_THREAD); 1179b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 1180b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(FindMatchingValue("cat", "cat1")); 1181b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(FindMatchingValue("cat", "cat2")); 1182b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(FindMatchingValue("cat", "category1,category2")); 1183b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1184b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Exclude existent category -> only events of other categories 1185b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Clear(); 1186b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEnabled(TraceConfig("-inc", ""), 1187b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::RECORDING_MODE); 1188b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("inc", "name", TRACE_EVENT_SCOPE_THREAD); 1189b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("inc2", "name", TRACE_EVENT_SCOPE_THREAD); 1190b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("inc2,inc", "name", TRACE_EVENT_SCOPE_THREAD); 1191b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("inc,inc2", "name", TRACE_EVENT_SCOPE_THREAD); 1192b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 1193b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(FindMatchingValue("cat", "inc2")); 1194b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(FindMatchingValue("cat", "inc")); 1195b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(FindMatchingValue("cat", "inc2,inc")); 1196b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(FindMatchingValue("cat", "inc,inc2")); 1197b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1198b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Exclude existent wildcard -> all categories not matching wildcard 1199b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Clear(); 1200b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEnabled( 1201b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceConfig("-inc_wildcard_*,-inc_wildchar_?_end", ""), 1202b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::RECORDING_MODE); 1203b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("inc_wildcard_abc", "not_inc", 1204b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_SCOPE_THREAD); 1205b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("inc_wildcard_", "not_inc", 1206b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_SCOPE_THREAD); 1207b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("inc_wildchar_x_end", "not_inc", 1208b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_SCOPE_THREAD); 1209b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("inc_wildchar_bla_end", "included", 1210b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_SCOPE_THREAD); 1211b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("cat1", "included", TRACE_EVENT_SCOPE_THREAD); 1212b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("cat2", "included", TRACE_EVENT_SCOPE_THREAD); 1213b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 1214b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(FindMatchingValue("cat", "inc_wildchar_bla_end")); 1215b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(FindMatchingValue("cat", "cat1")); 1216b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(FindMatchingValue("cat", "cat2")); 1217b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(FindMatchingValue("name", "not_inc")); 1218b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 1219b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1220b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1221b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Test EVENT_WATCH_NOTIFICATION 1222b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, EventWatchNotification) { 1223b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Basic one occurrence. 1224b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat BeginTrace(); 1225b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::WatchEventCallback callback = 1226b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::Bind(&TraceEventTestFixture::OnWatchEventMatched, 1227b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::Unretained(this)); 1228b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetWatchEvent("cat", "event", callback); 1229b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("cat", "event", TRACE_EVENT_SCOPE_THREAD); 1230b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 1231b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(event_watch_notification_, 1); 1232b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1233b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Auto-reset after end trace. 1234b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat BeginTrace(); 1235b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetWatchEvent("cat", "event", callback); 1236b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 1237b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat BeginTrace(); 1238b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("cat", "event", TRACE_EVENT_SCOPE_THREAD); 1239b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 1240b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(event_watch_notification_, 0); 1241b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1242b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Multiple occurrence. 1243b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat BeginTrace(); 1244b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int num_occurrences = 5; 1245b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetWatchEvent("cat", "event", callback); 1246b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (int i = 0; i < num_occurrences; ++i) 1247b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("cat", "event", TRACE_EVENT_SCOPE_THREAD); 1248b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 1249b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(event_watch_notification_, num_occurrences); 1250b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1251b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Wrong category. 1252b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat BeginTrace(); 1253b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetWatchEvent("cat", "event", callback); 1254b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("wrong_cat", "event", TRACE_EVENT_SCOPE_THREAD); 1255b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 1256b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(event_watch_notification_, 0); 1257b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1258b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Wrong name. 1259b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat BeginTrace(); 1260b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetWatchEvent("cat", "event", callback); 1261b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("cat", "wrong_event", TRACE_EVENT_SCOPE_THREAD); 1262b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 1263b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(event_watch_notification_, 0); 1264b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1265b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Canceled. 1266b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat BeginTrace(); 1267b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetWatchEvent("cat", "event", callback); 1268b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->CancelWatchEvent(); 1269b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("cat", "event", TRACE_EVENT_SCOPE_THREAD); 1270b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 1271b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(event_watch_notification_, 0); 1272b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 1273b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1274b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Test ASYNC_BEGIN/END events 1275b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, AsyncBeginEndEvents) { 1276b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat BeginTrace(); 1277b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1278b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned long long id = 0xfeedbeeffeedbeefull; 1279b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_ASYNC_BEGIN0("cat", "name1", id); 1280b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_ASYNC_STEP_INTO0("cat", "name1", id, "step1"); 1281b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_ASYNC_END0("cat", "name1", id); 1282b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_BEGIN0("cat", "name2"); 1283b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_ASYNC_BEGIN0("cat", "name3", 0); 1284b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_ASYNC_STEP_PAST0("cat", "name3", 0, "step2"); 1285b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1286b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 1287b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1288b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(FindNamePhase("name1", "S")); 1289b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(FindNamePhase("name1", "T")); 1290b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(FindNamePhase("name1", "F")); 1291b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1292b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string id_str; 1293b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat StringAppendF(&id_str, "0x%llx", id); 1294b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1295b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(FindNamePhaseKeyValue("name1", "S", "id", id_str.c_str())); 1296b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(FindNamePhaseKeyValue("name1", "T", "id", id_str.c_str())); 1297b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(FindNamePhaseKeyValue("name1", "F", "id", id_str.c_str())); 1298b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(FindNamePhaseKeyValue("name3", "S", "id", "0x0")); 1299b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(FindNamePhaseKeyValue("name3", "p", "id", "0x0")); 1300b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1301b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // BEGIN events should not have id 1302b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(FindNamePhaseKeyValue("name2", "B", "id", "0")); 1303b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 1304b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1305b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Test ASYNC_BEGIN/END events 1306b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, AsyncBeginEndPointerMangling) { 1307b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void* ptr = this; 1308b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1309b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetProcessID(100); 1310b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat BeginTrace(); 1311b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_ASYNC_BEGIN0("cat", "name1", ptr); 1312b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_ASYNC_BEGIN0("cat", "name2", ptr); 1313b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 1314b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1315b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetProcessID(200); 1316b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat BeginTrace(); 1317b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_ASYNC_END0("cat", "name1", ptr); 1318b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 1319b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1320b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat DictionaryValue* async_begin = FindNamePhase("name1", "S"); 1321b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat DictionaryValue* async_begin2 = FindNamePhase("name2", "S"); 1322b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat DictionaryValue* async_end = FindNamePhase("name1", "F"); 1323b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(async_begin); 1324b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(async_begin2); 1325b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(async_end); 1326b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1327b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Value* value = NULL; 1328b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string async_begin_id_str; 1329b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string async_begin2_id_str; 1330b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string async_end_id_str; 1331b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(async_begin->Get("id", &value)); 1332b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(value->GetAsString(&async_begin_id_str)); 1333b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(async_begin2->Get("id", &value)); 1334b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(value->GetAsString(&async_begin2_id_str)); 1335b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(async_end->Get("id", &value)); 1336b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(value->GetAsString(&async_end_id_str)); 1337b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1338b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_STREQ(async_begin_id_str.c_str(), async_begin2_id_str.c_str()); 1339b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_STRNE(async_begin_id_str.c_str(), async_end_id_str.c_str()); 1340b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 1341b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1342b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Test that static strings are not copied. 1343b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, StaticStringVsString) { 1344b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog* tracer = TraceLog::GetInstance(); 1345b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Make sure old events are flushed: 1346b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(0u, tracer->GetStatus().event_count); 1347b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const unsigned char* category_group_enabled = 1348b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED("cat"); 1349b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1350b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 1351b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat BeginTrace(); 1352b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Test that string arguments are copied. 1353b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceEventHandle handle1 = 1354b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_event_internal::AddTraceEvent( 1355b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_PHASE_INSTANT, category_group_enabled, "name1", 0, 0, 1356b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "arg1", std::string("argval"), "arg2", std::string("argval")); 1357b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Test that static TRACE_STR_COPY string arguments are copied. 1358b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceEventHandle handle2 = 1359b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_event_internal::AddTraceEvent( 1360b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_PHASE_INSTANT, category_group_enabled, "name2", 0, 0, 1361b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "arg1", TRACE_STR_COPY("argval"), 1362b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "arg2", TRACE_STR_COPY("argval")); 1363b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_GT(tracer->GetStatus().event_count, 1u); 1364b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const TraceEvent* event1 = tracer->GetEventByHandle(handle1); 1365b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const TraceEvent* event2 = tracer->GetEventByHandle(handle2); 1366b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(event1); 1367b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(event2); 1368b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_STREQ("name1", event1->name()); 1369b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_STREQ("name2", event2->name()); 1370b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(event1->parameter_copy_storage() != NULL); 1371b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(event2->parameter_copy_storage() != NULL); 1372b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_GT(event1->parameter_copy_storage()->size(), 0u); 1373b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_GT(event2->parameter_copy_storage()->size(), 0u); 1374b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 1375b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 1376b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1377b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 1378b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat BeginTrace(); 1379b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Test that static literal string arguments are not copied. 1380b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceEventHandle handle1 = 1381b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_event_internal::AddTraceEvent( 1382b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_PHASE_INSTANT, category_group_enabled, "name1", 0, 0, 1383b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "arg1", "argval", "arg2", "argval"); 1384b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Test that static TRACE_STR_COPY NULL string arguments are not copied. 1385b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* str1 = NULL; 1386b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* str2 = NULL; 1387b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceEventHandle handle2 = 1388b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_event_internal::AddTraceEvent( 1389b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_PHASE_INSTANT, category_group_enabled, "name2", 0, 0, 1390b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "arg1", TRACE_STR_COPY(str1), 1391b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "arg2", TRACE_STR_COPY(str2)); 1392b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_GT(tracer->GetStatus().event_count, 1u); 1393b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const TraceEvent* event1 = tracer->GetEventByHandle(handle1); 1394b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const TraceEvent* event2 = tracer->GetEventByHandle(handle2); 1395b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(event1); 1396b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(event2); 1397b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_STREQ("name1", event1->name()); 1398b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_STREQ("name2", event2->name()); 1399b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(event1->parameter_copy_storage() == NULL); 1400b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(event2->parameter_copy_storage() == NULL); 1401b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 1402b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 1403b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 1404b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1405b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Test that data sent from other threads is gathered 1406b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, DataCapturedOnThread) { 1407b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat BeginTrace(); 1408b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1409b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Thread thread("1"); 1410b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat WaitableEvent task_complete_event(false, false); 1411b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat thread.Start(); 1412b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1413b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat thread.task_runner()->PostTask( 1414b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FROM_HERE, base::Bind(&TraceWithAllMacroVariants, &task_complete_event)); 1415b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat task_complete_event.Wait(); 1416b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat thread.Stop(); 1417b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1418b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 1419b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ValidateAllTraceMacrosCreatedData(trace_parsed_); 1420b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 1421b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1422b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Test that data sent from multiple threads is gathered 1423b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, DataCapturedManyThreads) { 1424b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat BeginTrace(); 1425b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1426b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const int num_threads = 4; 1427b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const int num_events = 4000; 1428b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Thread* threads[num_threads]; 1429b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat WaitableEvent* task_complete_events[num_threads]; 1430b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (int i = 0; i < num_threads; i++) { 1431b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat threads[i] = new Thread(StringPrintf("Thread %d", i)); 1432b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat task_complete_events[i] = new WaitableEvent(false, false); 1433b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat threads[i]->Start(); 1434b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat threads[i]->task_runner()->PostTask( 1435b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FROM_HERE, base::Bind(&TraceManyInstantEvents, i, num_events, 1436b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat task_complete_events[i])); 1437b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 1438b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1439b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (int i = 0; i < num_threads; i++) { 1440b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat task_complete_events[i]->Wait(); 1441b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 1442b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1443b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Let half of the threads end before flush. 1444b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (int i = 0; i < num_threads / 2; i++) { 1445b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat threads[i]->Stop(); 1446b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat delete threads[i]; 1447b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat delete task_complete_events[i]; 1448b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 1449b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1450b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlushInThreadWithMessageLoop(); 1451b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ValidateInstantEventPresentOnEveryThread(trace_parsed_, 1452b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat num_threads, num_events); 1453b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1454b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Let the other half of the threads end after flush. 1455b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (int i = num_threads / 2; i < num_threads; i++) { 1456b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat threads[i]->Stop(); 1457b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat delete threads[i]; 1458b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat delete task_complete_events[i]; 1459b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 1460b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 1461b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1462b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Test that thread and process names show up in the trace 1463b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, ThreadNames) { 1464b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Create threads before we enable tracing to make sure 1465b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // that tracelog still captures them. 1466b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const int kNumThreads = 4; 1467b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const int kNumEvents = 10; 1468b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Thread* threads[kNumThreads]; 1469b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat PlatformThreadId thread_ids[kNumThreads]; 1470b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (int i = 0; i < kNumThreads; i++) 1471b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat threads[i] = new Thread(StringPrintf("Thread %d", i)); 1472b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1473b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Enable tracing. 1474b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat BeginTrace(); 1475b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1476b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Now run some trace code on these threads. 1477b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat WaitableEvent* task_complete_events[kNumThreads]; 1478b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (int i = 0; i < kNumThreads; i++) { 1479b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat task_complete_events[i] = new WaitableEvent(false, false); 1480b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat threads[i]->Start(); 1481b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat thread_ids[i] = threads[i]->thread_id(); 1482b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat threads[i]->task_runner()->PostTask( 1483b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FROM_HERE, base::Bind(&TraceManyInstantEvents, i, kNumEvents, 1484b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat task_complete_events[i])); 1485b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 1486b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (int i = 0; i < kNumThreads; i++) { 1487b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat task_complete_events[i]->Wait(); 1488b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 1489b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1490b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Shut things down. 1491b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (int i = 0; i < kNumThreads; i++) { 1492b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat threads[i]->Stop(); 1493b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat delete threads[i]; 1494b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat delete task_complete_events[i]; 1495b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 1496b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1497b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 1498b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1499b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string tmp; 1500b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int tmp_int; 1501b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const DictionaryValue* item; 1502b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1503b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Make sure we get thread name metadata. 1504b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Note, the test suite may have created a ton of threads. 1505b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // So, we'll have thread names for threads we didn't create. 1506b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::vector<const DictionaryValue*> items = 1507b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FindTraceEntries(trace_parsed_, "thread_name"); 1508b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (int i = 0; i < static_cast<int>(items.size()); i++) { 1509b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat item = items[i]; 1510b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(item); 1511b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(item->GetInteger("tid", &tmp_int)); 1512b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1513b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // See if this thread name is one of the threads we just created 1514b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (int j = 0; j < kNumThreads; j++) { 1515b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (static_cast<int>(thread_ids[j]) != tmp_int) 1516b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat continue; 1517b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1518b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string expected_name = StringPrintf("Thread %d", j); 1519b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(item->GetString("ph", &tmp) && tmp == "M"); 1520b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(item->GetInteger("pid", &tmp_int) && 1521b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat tmp_int == static_cast<int>(base::GetCurrentProcId())); 1522b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // If the thread name changes or the tid gets reused, the name will be 1523b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // a comma-separated list of thread names, so look for a substring. 1524b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(item->GetString("args.name", &tmp) && 1525b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat tmp.find(expected_name) != std::string::npos); 1526b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 1527b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 1528b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 1529b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1530b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, ThreadNameChanges) { 1531b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat BeginTrace(); 1532b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1533b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat PlatformThread::SetName(""); 1534b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("drink", "water", TRACE_EVENT_SCOPE_THREAD); 1535b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1536b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat PlatformThread::SetName("cafe"); 1537b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("drink", "coffee", TRACE_EVENT_SCOPE_THREAD); 1538b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1539b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat PlatformThread::SetName("shop"); 1540b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // No event here, so won't appear in combined name. 1541b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1542b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat PlatformThread::SetName("pub"); 1543b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("drink", "beer", TRACE_EVENT_SCOPE_THREAD); 1544b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("drink", "wine", TRACE_EVENT_SCOPE_THREAD); 1545b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1546b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat PlatformThread::SetName(" bar"); 1547b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("drink", "whisky", TRACE_EVENT_SCOPE_THREAD); 1548b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1549b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 1550b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1551b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::vector<const DictionaryValue*> items = 1552b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FindTraceEntries(trace_parsed_, "thread_name"); 1553b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1u, items.size()); 1554b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_GT(items.size(), 0u); 1555b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const DictionaryValue* item = items[0]; 1556b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(item); 1557b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int tid; 1558b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(item->GetInteger("tid", &tid)); 1559b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(PlatformThread::CurrentId(), static_cast<PlatformThreadId>(tid)); 1560b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1561b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string expected_name = "cafe,pub, bar"; 1562b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string tmp; 1563b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(item->GetString("args.name", &tmp)); 1564b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(expected_name, tmp); 1565b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 1566b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1567b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Test that the disabled trace categories are included/excluded from the 1568b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// trace output correctly. 1569b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, DisabledCategories) { 1570b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat BeginTrace(); 1571b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0(TRACE_DISABLED_BY_DEFAULT("cc"), "first", 1572b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_SCOPE_THREAD); 1573b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("included", "first", TRACE_EVENT_SCOPE_THREAD); 1574b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 1575b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 1576b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const DictionaryValue* item = NULL; 1577b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ListValue& trace_parsed = trace_parsed_; 1578b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_NOT_FIND_("disabled-by-default-cc"); 1579b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("included"); 1580b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 1581b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Clear(); 1582b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1583b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat BeginSpecificTrace("disabled-by-default-cc"); 1584b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0(TRACE_DISABLED_BY_DEFAULT("cc"), "second", 1585b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_SCOPE_THREAD); 1586b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("other_included", "second", TRACE_EVENT_SCOPE_THREAD); 1587b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 1588b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1589b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 1590b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const DictionaryValue* item = NULL; 1591b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ListValue& trace_parsed = trace_parsed_; 1592b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("disabled-by-default-cc"); 1593b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("other_included"); 1594b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 1595b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1596b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Clear(); 1597b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1598b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat BeginSpecificTrace("other_included"); 1599b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0(TRACE_DISABLED_BY_DEFAULT("cc") ",other_included", 1600b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "first", TRACE_EVENT_SCOPE_THREAD); 1601b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("other_included," TRACE_DISABLED_BY_DEFAULT("cc"), 1602b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "second", TRACE_EVENT_SCOPE_THREAD); 1603b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 1604b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1605b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 1606b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const DictionaryValue* item = NULL; 1607b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ListValue& trace_parsed = trace_parsed_; 1608b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("disabled-by-default-cc,other_included"); 1609b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FIND_("other_included,disabled-by-default-cc"); 1610b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 1611b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 1612b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1613b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, NormallyNoDeepCopy) { 1614b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Test that the TRACE_EVENT macros do not deep-copy their string. If they 1615b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // do so it may indicate a performance regression, but more-over it would 1616b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // make the DEEP_COPY overloads redundant. 1617b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string name_string("event name"); 1618b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1619b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat BeginTrace(); 1620b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("category", name_string.c_str(), 1621b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_SCOPE_THREAD); 1622b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1623b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Modify the string in place (a wholesale reassignment may leave the old 1624b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // string intact on the heap). 1625b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat name_string[0] = '@'; 1626b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1627b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 1628b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1629b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(FindTraceEntry(trace_parsed_, "event name")); 1630b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(FindTraceEntry(trace_parsed_, name_string.c_str())); 1631b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 1632b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1633b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, DeepCopy) { 1634b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static const char kOriginalName1[] = "name1"; 1635b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static const char kOriginalName2[] = "name2"; 1636b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static const char kOriginalName3[] = "name3"; 1637b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string name1(kOriginalName1); 1638b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string name2(kOriginalName2); 1639b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string name3(kOriginalName3); 1640b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string arg1("arg1"); 1641b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string arg2("arg2"); 1642b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string val1("val1"); 1643b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string val2("val2"); 1644b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1645b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat BeginTrace(); 1646b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_COPY_INSTANT0("category", name1.c_str(), 1647b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_SCOPE_THREAD); 1648b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_COPY_BEGIN1("category", name2.c_str(), 1649b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat arg1.c_str(), 5); 1650b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_COPY_END2("category", name3.c_str(), 1651b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat arg1.c_str(), val1, 1652b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat arg2.c_str(), val2); 1653b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1654b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // As per NormallyNoDeepCopy, modify the strings in place. 1655b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat name1[0] = name2[0] = name3[0] = arg1[0] = arg2[0] = val1[0] = val2[0] = '@'; 1656b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1657b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 1658b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1659b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(FindTraceEntry(trace_parsed_, name1.c_str())); 1660b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(FindTraceEntry(trace_parsed_, name2.c_str())); 1661b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(FindTraceEntry(trace_parsed_, name3.c_str())); 1662b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1663b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const DictionaryValue* entry1 = FindTraceEntry(trace_parsed_, kOriginalName1); 1664b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const DictionaryValue* entry2 = FindTraceEntry(trace_parsed_, kOriginalName2); 1665b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const DictionaryValue* entry3 = FindTraceEntry(trace_parsed_, kOriginalName3); 1666b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(entry1); 1667b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(entry2); 1668b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(entry3); 1669b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1670b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int i; 1671b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(entry2->GetInteger("args.@rg1", &i)); 1672b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(entry2->GetInteger("args.arg1", &i)); 1673b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(5, i); 1674b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1675b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string s; 1676b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(entry3->GetString("args.arg1", &s)); 1677b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("val1", s); 1678b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(entry3->GetString("args.arg2", &s)); 1679b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("val2", s); 1680b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 1681b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1682b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Test that TraceResultBuffer outputs the correct result whether it is added 1683b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// in chunks or added all at once. 1684b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, TraceResultBuffer) { 1685b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Clear(); 1686b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1687b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_buffer_.Start(); 1688b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_buffer_.AddFragment("bla1"); 1689b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_buffer_.AddFragment("bla2"); 1690b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_buffer_.AddFragment("bla3,bla4"); 1691b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_buffer_.Finish(); 1692b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_STREQ(json_output_.json_output.c_str(), "[bla1,bla2,bla3,bla4]"); 1693b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1694b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Clear(); 1695b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1696b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_buffer_.Start(); 1697b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_buffer_.AddFragment("bla1,bla2,bla3,bla4"); 1698b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_buffer_.Finish(); 1699b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_STREQ(json_output_.json_output.c_str(), "[bla1,bla2,bla3,bla4]"); 1700b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 1701b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1702b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Test that trace_event parameters are not evaluated if the tracing 1703b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// system is disabled. 1704b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, TracingIsLazy) { 1705b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat BeginTrace(); 1706b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1707b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int a = 0; 1708b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT1("category", "test", TRACE_EVENT_SCOPE_THREAD, "a", a++); 1709b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1, a); 1710b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1711b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetDisabled(); 1712b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1713b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT1("category", "test", TRACE_EVENT_SCOPE_THREAD, "a", a++); 1714b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1, a); 1715b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1716b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 1717b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 1718b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1719b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, TraceEnableDisable) { 1720b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog* trace_log = TraceLog::GetInstance(); 1721b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceConfig tc_inc_all("*", ""); 1722b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_log->SetEnabled(tc_inc_all, TraceLog::RECORDING_MODE); 1723b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(trace_log->IsEnabled()); 1724b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_log->SetDisabled(); 1725b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(trace_log->IsEnabled()); 1726b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1727b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_log->SetEnabled(tc_inc_all, TraceLog::RECORDING_MODE); 1728b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(trace_log->IsEnabled()); 1729b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const std::vector<std::string> empty; 1730b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_log->SetEnabled(TraceConfig(), TraceLog::RECORDING_MODE); 1731b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(trace_log->IsEnabled()); 1732b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_log->SetDisabled(); 1733b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(trace_log->IsEnabled()); 1734b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_log->SetDisabled(); 1735b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(trace_log->IsEnabled()); 1736b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 1737b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1738b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, TraceCategoriesAfterNestedEnable) { 1739b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog* trace_log = TraceLog::GetInstance(); 1740b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_log->SetEnabled(TraceConfig("foo,bar", ""), TraceLog::RECORDING_MODE); 1741b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(*trace_log->GetCategoryGroupEnabled("foo")); 1742b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(*trace_log->GetCategoryGroupEnabled("bar")); 1743b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(*trace_log->GetCategoryGroupEnabled("baz")); 1744b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_log->SetEnabled(TraceConfig("foo2", ""), TraceLog::RECORDING_MODE); 1745b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(*trace_log->GetCategoryGroupEnabled("foo2")); 1746b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(*trace_log->GetCategoryGroupEnabled("baz")); 1747b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // The "" becomes the default catergory set when applied. 1748b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_log->SetEnabled(TraceConfig(), TraceLog::RECORDING_MODE); 1749b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(*trace_log->GetCategoryGroupEnabled("foo")); 1750b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(*trace_log->GetCategoryGroupEnabled("baz")); 1751b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_STREQ( 1752b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "-*Debug,-*Test", 1753b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_log->GetCurrentTraceConfig().ToCategoryFilterString().c_str()); 1754b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_log->SetDisabled(); 1755b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_log->SetDisabled(); 1756b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_log->SetDisabled(); 1757b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(*trace_log->GetCategoryGroupEnabled("foo")); 1758b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(*trace_log->GetCategoryGroupEnabled("baz")); 1759b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1760b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_log->SetEnabled(TraceConfig("-foo,-bar", ""), TraceLog::RECORDING_MODE); 1761b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(*trace_log->GetCategoryGroupEnabled("foo")); 1762b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(*trace_log->GetCategoryGroupEnabled("baz")); 1763b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_log->SetEnabled(TraceConfig("moo", ""), TraceLog::RECORDING_MODE); 1764b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(*trace_log->GetCategoryGroupEnabled("baz")); 1765b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(*trace_log->GetCategoryGroupEnabled("moo")); 1766b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(*trace_log->GetCategoryGroupEnabled("foo")); 1767b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_STREQ( 1768b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "-foo,-bar", 1769b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_log->GetCurrentTraceConfig().ToCategoryFilterString().c_str()); 1770b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_log->SetDisabled(); 1771b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_log->SetDisabled(); 1772b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1773b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Make sure disabled categories aren't cleared if we set in the second. 1774b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_log->SetEnabled(TraceConfig("disabled-by-default-cc,foo", ""), 1775b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::RECORDING_MODE); 1776b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(*trace_log->GetCategoryGroupEnabled("bar")); 1777b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_log->SetEnabled(TraceConfig("disabled-by-default-gpu", ""), 1778b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::RECORDING_MODE); 1779b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(*trace_log->GetCategoryGroupEnabled("disabled-by-default-cc")); 1780b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(*trace_log->GetCategoryGroupEnabled("disabled-by-default-gpu")); 1781b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(*trace_log->GetCategoryGroupEnabled("bar")); 1782b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_STREQ( 1783b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "disabled-by-default-cc,disabled-by-default-gpu", 1784b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_log->GetCurrentTraceConfig().ToCategoryFilterString().c_str()); 1785b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_log->SetDisabled(); 1786b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_log->SetDisabled(); 1787b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 1788b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1789b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, TraceSampling) { 1790b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEnabled( 1791b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceConfig(kRecordAllCategoryFilter, "record-until-full,enable-sampling"), 1792b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::RECORDING_MODE); 1793b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1794b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_SET_SAMPLING_STATE_FOR_BUCKET(1, "cc", "Stuff"); 1795b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->WaitSamplingEventForTesting(); 1796b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_SET_SAMPLING_STATE_FOR_BUCKET(1, "cc", "Things"); 1797b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->WaitSamplingEventForTesting(); 1798b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1799b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 1800b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1801b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Make sure we hit at least once. 1802b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(FindNamePhase("Stuff", "P")); 1803b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(FindNamePhase("Things", "P")); 1804b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 1805b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1806b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, TraceSamplingScope) { 1807b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEnabled( 1808b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceConfig(kRecordAllCategoryFilter, "record-until-full,enable-sampling"), 1809b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::RECORDING_MODE); 1810b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1811b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_SCOPED_SAMPLING_STATE("AAA", "name"); 1812b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->WaitSamplingEventForTesting(); 1813b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 1814b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_STREQ(TRACE_EVENT_GET_SAMPLING_STATE(), "AAA"); 1815b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_SCOPED_SAMPLING_STATE("BBB", "name"); 1816b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->WaitSamplingEventForTesting(); 1817b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_STREQ(TRACE_EVENT_GET_SAMPLING_STATE(), "BBB"); 1818b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 1819b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->WaitSamplingEventForTesting(); 1820b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 1821b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_STREQ(TRACE_EVENT_GET_SAMPLING_STATE(), "AAA"); 1822b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_SCOPED_SAMPLING_STATE("CCC", "name"); 1823b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->WaitSamplingEventForTesting(); 1824b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_STREQ(TRACE_EVENT_GET_SAMPLING_STATE(), "CCC"); 1825b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 1826b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->WaitSamplingEventForTesting(); 1827b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 1828b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_STREQ(TRACE_EVENT_GET_SAMPLING_STATE(), "AAA"); 1829b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_SET_SAMPLING_STATE("DDD", "name"); 1830b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->WaitSamplingEventForTesting(); 1831b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_STREQ(TRACE_EVENT_GET_SAMPLING_STATE(), "DDD"); 1832b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 1833b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->WaitSamplingEventForTesting(); 1834b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_STREQ(TRACE_EVENT_GET_SAMPLING_STATE(), "DDD"); 1835b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1836b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 1837b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 1838b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1839b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, TraceContinuousSampling) { 1840b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEnabled( 1841b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceConfig(kRecordAllCategoryFilter, "record-until-full,enable-sampling"), 1842b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::MONITORING_MODE); 1843b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1844b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_SET_SAMPLING_STATE_FOR_BUCKET(1, "category", "AAA"); 1845b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->WaitSamplingEventForTesting(); 1846b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_SET_SAMPLING_STATE_FOR_BUCKET(1, "category", "BBB"); 1847b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->WaitSamplingEventForTesting(); 1848b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1849b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FlushMonitoring(); 1850b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1851b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Make sure we can get the profiled data. 1852b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(FindNamePhase("AAA", "P")); 1853b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(FindNamePhase("BBB", "P")); 1854b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1855b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Clear(); 1856b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->WaitSamplingEventForTesting(); 1857b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1858b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_SET_SAMPLING_STATE_FOR_BUCKET(1, "category", "CCC"); 1859b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->WaitSamplingEventForTesting(); 1860b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_SET_SAMPLING_STATE_FOR_BUCKET(1, "category", "DDD"); 1861b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->WaitSamplingEventForTesting(); 1862b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1863b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FlushMonitoring(); 1864b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1865b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Make sure the profiled data is accumulated. 1866b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(FindNamePhase("AAA", "P")); 1867b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(FindNamePhase("BBB", "P")); 1868b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(FindNamePhase("CCC", "P")); 1869b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(FindNamePhase("DDD", "P")); 1870b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1871b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Clear(); 1872b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1873b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetDisabled(); 1874b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1875b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Make sure disabling the continuous sampling thread clears 1876b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // the profiled data. 1877b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(FindNamePhase("AAA", "P")); 1878b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(FindNamePhase("BBB", "P")); 1879b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(FindNamePhase("CCC", "P")); 1880b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(FindNamePhase("DDD", "P")); 1881b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1882b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Clear(); 1883b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 1884b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1885b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass MyData : public ConvertableToTraceFormat { 1886b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public: 1887b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat MyData() {} 1888b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1889b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void AppendAsTraceFormat(std::string* out) const override { 1890b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat out->append("{\"foo\":1}"); 1891b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 1892b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1893b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat private: 1894b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ~MyData() override {} 1895b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat DISALLOW_COPY_AND_ASSIGN(MyData); 1896b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 1897b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1898b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, ConvertableTypes) { 1899b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""), 1900b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::RECORDING_MODE); 1901b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1902b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat scoped_refptr<ConvertableToTraceFormat> data(new MyData()); 1903b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat scoped_refptr<ConvertableToTraceFormat> data1(new MyData()); 1904b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat scoped_refptr<ConvertableToTraceFormat> data2(new MyData()); 1905b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT1("foo", "bar", "data", data); 1906b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT2("foo", "baz", 1907b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "data1", data1, 1908b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "data2", data2); 1909b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1910b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1911b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat scoped_refptr<ConvertableToTraceFormat> convertData1(new MyData()); 1912b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat scoped_refptr<ConvertableToTraceFormat> convertData2(new MyData()); 1913b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT2( 1914b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "foo", 1915b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "string_first", 1916b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "str", 1917b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "string value 1", 1918b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "convert", 1919b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat convertData1); 1920b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT2( 1921b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "foo", 1922b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "string_second", 1923b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "convert", 1924b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat convertData2, 1925b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "str", 1926b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "string value 2"); 1927b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 1928b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1929b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // One arg version. 1930b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat DictionaryValue* dict = FindNamePhase("bar", "X"); 1931b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(dict); 1932b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1933b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const DictionaryValue* args_dict = NULL; 1934b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict->GetDictionary("args", &args_dict); 1935b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(args_dict); 1936b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1937b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const Value* value = NULL; 1938b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const DictionaryValue* convertable_dict = NULL; 1939b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(args_dict->Get("data", &value)); 1940b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(value->GetAsDictionary(&convertable_dict)); 1941b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1942b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int foo_val; 1943b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(convertable_dict->GetInteger("foo", &foo_val)); 1944b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1, foo_val); 1945b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1946b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Two arg version. 1947b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict = FindNamePhase("baz", "X"); 1948b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(dict); 1949b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1950b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat args_dict = NULL; 1951b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict->GetDictionary("args", &args_dict); 1952b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(args_dict); 1953b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1954b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat value = NULL; 1955b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat convertable_dict = NULL; 1956b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(args_dict->Get("data1", &value)); 1957b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(value->GetAsDictionary(&convertable_dict)); 1958b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1959b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat value = NULL; 1960b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat convertable_dict = NULL; 1961b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(args_dict->Get("data2", &value)); 1962b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(value->GetAsDictionary(&convertable_dict)); 1963b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1964b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Convertable with other types. 1965b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict = FindNamePhase("string_first", "X"); 1966b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(dict); 1967b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1968b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat args_dict = NULL; 1969b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict->GetDictionary("args", &args_dict); 1970b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(args_dict); 1971b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1972b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string str_value; 1973b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(args_dict->GetString("str", &str_value)); 1974b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_STREQ("string value 1", str_value.c_str()); 1975b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1976b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat value = NULL; 1977b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat convertable_dict = NULL; 1978b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat foo_val = 0; 1979b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(args_dict->Get("convert", &value)); 1980b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(value->GetAsDictionary(&convertable_dict)); 1981b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(convertable_dict->GetInteger("foo", &foo_val)); 1982b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1, foo_val); 1983b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1984b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict = FindNamePhase("string_second", "X"); 1985b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(dict); 1986b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1987b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat args_dict = NULL; 1988b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict->GetDictionary("args", &args_dict); 1989b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(args_dict); 1990b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1991b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(args_dict->GetString("str", &str_value)); 1992b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_STREQ("string value 2", str_value.c_str()); 1993b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1994b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat value = NULL; 1995b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat convertable_dict = NULL; 1996b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat foo_val = 0; 1997b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(args_dict->Get("convert", &value)); 1998b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(value->GetAsDictionary(&convertable_dict)); 1999b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(convertable_dict->GetInteger("foo", &foo_val)); 2000b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1, foo_val); 2001b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 2002b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2003b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, PrimitiveArgs) { 2004b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""), 2005b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::RECORDING_MODE); 2006b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2007b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT1("foo", "event1", "int_one", 1); 2008b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT1("foo", "event2", "int_neg_ten", -10); 2009b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT1("foo", "event3", "float_one", 1.0f); 2010b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT1("foo", "event4", "float_half", .5f); 2011b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT1("foo", "event5", "float_neghalf", -.5f); 2012b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT1("foo", "event6", "float_infinity", 2013b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::numeric_limits<float>::infinity()); 2014b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT1("foo", "event6b", "float_neg_infinity", 2015b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat -std::numeric_limits<float>::infinity()); 2016b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT1("foo", "event7", "double_nan", 2017b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::numeric_limits<double>::quiet_NaN()); 2018b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void* p = 0; 2019b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT1("foo", "event8", "pointer_null", p); 2020b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat p = reinterpret_cast<void*>(0xbadf00d); 2021b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT1("foo", "event9", "pointer_badf00d", p); 2022b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT1("foo", "event10", "bool_true", true); 2023b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT1("foo", "event11", "bool_false", false); 2024b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT1("foo", "event12", "time_null", 2025b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::Time()); 2026b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT1("foo", "event13", "time_one", 2027b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::Time::FromInternalValue(1)); 2028b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT1("foo", "event14", "timeticks_null", 2029b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::TimeTicks()); 2030b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT1("foo", "event15", "timeticks_one", 2031b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::TimeTicks::FromInternalValue(1)); 2032b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 2033b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2034b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const DictionaryValue* args_dict = NULL; 2035b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat DictionaryValue* dict = NULL; 2036b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const Value* value = NULL; 2037b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string str_value; 2038b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int int_value; 2039b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat double double_value; 2040b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool bool_value; 2041b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2042b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict = FindNamePhase("event1", "X"); 2043b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(dict); 2044b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict->GetDictionary("args", &args_dict); 2045b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(args_dict); 2046b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(args_dict->GetInteger("int_one", &int_value)); 2047b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1, int_value); 2048b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2049b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict = FindNamePhase("event2", "X"); 2050b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(dict); 2051b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict->GetDictionary("args", &args_dict); 2052b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(args_dict); 2053b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(args_dict->GetInteger("int_neg_ten", &int_value)); 2054b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(-10, int_value); 2055b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2056b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // 1f must be serlized to JSON as "1.0" in order to be a double, not an int. 2057b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict = FindNamePhase("event3", "X"); 2058b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(dict); 2059b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict->GetDictionary("args", &args_dict); 2060b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(args_dict); 2061b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(args_dict->Get("float_one", &value)); 2062b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(value->IsType(Value::TYPE_DOUBLE)); 2063b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(value->GetAsDouble(&double_value)); 2064b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1, double_value); 2065b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2066b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // .5f must be serlized to JSON as "0.5". 2067b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict = FindNamePhase("event4", "X"); 2068b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(dict); 2069b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict->GetDictionary("args", &args_dict); 2070b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(args_dict); 2071b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(args_dict->Get("float_half", &value)); 2072b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(value->IsType(Value::TYPE_DOUBLE)); 2073b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(value->GetAsDouble(&double_value)); 2074b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(0.5, double_value); 2075b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2076b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // -.5f must be serlized to JSON as "-0.5". 2077b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict = FindNamePhase("event5", "X"); 2078b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(dict); 2079b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict->GetDictionary("args", &args_dict); 2080b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(args_dict); 2081b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(args_dict->Get("float_neghalf", &value)); 2082b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(value->IsType(Value::TYPE_DOUBLE)); 2083b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(value->GetAsDouble(&double_value)); 2084b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(-0.5, double_value); 2085b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2086b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Infinity is serialized to JSON as a string. 2087b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict = FindNamePhase("event6", "X"); 2088b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(dict); 2089b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict->GetDictionary("args", &args_dict); 2090b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(args_dict); 2091b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(args_dict->GetString("float_infinity", &str_value)); 2092b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_STREQ("Infinity", str_value.c_str()); 2093b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict = FindNamePhase("event6b", "X"); 2094b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(dict); 2095b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict->GetDictionary("args", &args_dict); 2096b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(args_dict); 2097b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(args_dict->GetString("float_neg_infinity", &str_value)); 2098b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_STREQ("-Infinity", str_value.c_str()); 2099b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2100b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // NaN is serialized to JSON as a string. 2101b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict = FindNamePhase("event7", "X"); 2102b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(dict); 2103b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict->GetDictionary("args", &args_dict); 2104b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(args_dict); 2105b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(args_dict->GetString("double_nan", &str_value)); 2106b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_STREQ("NaN", str_value.c_str()); 2107b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2108b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // NULL pointers should be serialized as "0x0". 2109b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict = FindNamePhase("event8", "X"); 2110b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(dict); 2111b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict->GetDictionary("args", &args_dict); 2112b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(args_dict); 2113b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(args_dict->GetString("pointer_null", &str_value)); 2114b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_STREQ("0x0", str_value.c_str()); 2115b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2116b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Other pointers should be serlized as a hex string. 2117b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict = FindNamePhase("event9", "X"); 2118b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(dict); 2119b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict->GetDictionary("args", &args_dict); 2120b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(args_dict); 2121b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(args_dict->GetString("pointer_badf00d", &str_value)); 2122b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_STREQ("0xbadf00d", str_value.c_str()); 2123b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2124b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict = FindNamePhase("event10", "X"); 2125b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(dict); 2126b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict->GetDictionary("args", &args_dict); 2127b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(args_dict); 2128b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(args_dict->GetBoolean("bool_true", &bool_value)); 2129b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(bool_value); 2130b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2131b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict = FindNamePhase("event11", "X"); 2132b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(dict); 2133b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict->GetDictionary("args", &args_dict); 2134b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(args_dict); 2135b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(args_dict->GetBoolean("bool_false", &bool_value)); 2136b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(bool_value); 2137b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2138b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict = FindNamePhase("event12", "X"); 2139b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(dict); 2140b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict->GetDictionary("args", &args_dict); 2141b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(args_dict); 2142b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(args_dict->GetInteger("time_null", &int_value)); 2143b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(0, int_value); 2144b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2145b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict = FindNamePhase("event13", "X"); 2146b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(dict); 2147b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict->GetDictionary("args", &args_dict); 2148b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(args_dict); 2149b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(args_dict->GetInteger("time_one", &int_value)); 2150b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1, int_value); 2151b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2152b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict = FindNamePhase("event14", "X"); 2153b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(dict); 2154b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict->GetDictionary("args", &args_dict); 2155b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(args_dict); 2156b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(args_dict->GetInteger("timeticks_null", &int_value)); 2157b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(0, int_value); 2158b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2159b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict = FindNamePhase("event15", "X"); 2160b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(dict); 2161b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict->GetDictionary("args", &args_dict); 2162b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(args_dict); 2163b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(args_dict->GetInteger("timeticks_one", &int_value)); 2164b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1, int_value); 2165b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 2166b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2167b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace { 2168b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2169b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratbool IsTraceEventArgsWhitelisted(const char* category_group_name, 2170b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* event_name) { 2171b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (MatchPattern(category_group_name, "toplevel") && 2172b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat MatchPattern(event_name, "*")) { 2173b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return true; 2174b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 2175b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2176b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return false; 2177b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 2178b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2179b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} // namespace 2180b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2181b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, ArgsWhitelisting) { 2182b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetArgumentFilterPredicate( 2183b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::Bind(&IsTraceEventArgsWhitelisted)); 2184b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2185b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEnabled( 2186b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceConfig(kRecordAllCategoryFilter, "enable-argument-filter"), 2187b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::RECORDING_MODE); 2188b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2189b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT1("toplevel", "event1", "int_one", 1); 2190b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT1("whitewashed", "event2", "int_two", 1); 2191b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 2192b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2193b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const DictionaryValue* args_dict = NULL; 2194b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat DictionaryValue* dict = NULL; 2195b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int int_value; 2196b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2197b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict = FindNamePhase("event1", "X"); 2198b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(dict); 2199b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict->GetDictionary("args", &args_dict); 2200b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(args_dict); 2201b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(args_dict->GetInteger("int_one", &int_value)); 2202b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1, int_value); 2203b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2204b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict = FindNamePhase("event2", "X"); 2205b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(dict); 2206b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat dict->GetDictionary("args", &args_dict); 2207b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(args_dict); 2208b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(args_dict->GetInteger("int_two", &int_value)); 2209b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2210b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string args_string; 2211b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(dict->GetString("args", &args_string)); 2212b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(args_string, "__stripped__"); 2213b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 2214b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2215b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass TraceEventCallbackTest : public TraceEventTestFixture { 2216b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public: 2217b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void SetUp() override { 2218b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceEventTestFixture::SetUp(); 2219b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_EQ(NULL, s_instance); 2220b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat s_instance = this; 2221b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 2222b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void TearDown() override { 2223b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetDisabled(); 2224b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(s_instance); 2225b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat s_instance = NULL; 2226b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceEventTestFixture::TearDown(); 2227b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 2228b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2229b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat protected: 2230b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // For TraceEventCallbackAndRecordingX tests. 2231b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void VerifyCallbackAndRecordedEvents(size_t expected_callback_count, 2232b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat size_t expected_recorded_count) { 2233b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Callback events. 2234b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(expected_callback_count, collected_events_names_.size()); 2235b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (size_t i = 0; i < collected_events_names_.size(); ++i) { 2236b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("callback", collected_events_categories_[i]); 2237b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("yes", collected_events_names_[i]); 2238b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 2239b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2240b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Recorded events. 2241b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(expected_recorded_count, trace_parsed_.GetSize()); 2242b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(FindTraceEntry(trace_parsed_, "recording")); 2243b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(FindTraceEntry(trace_parsed_, "callback")); 2244b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(FindTraceEntry(trace_parsed_, "yes")); 2245b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(FindTraceEntry(trace_parsed_, "no")); 2246b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 2247b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2248b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void VerifyCollectedEvent(size_t i, 2249b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned phase, 2250b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const std::string& category, 2251b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const std::string& name) { 2252b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(phase, collected_events_phases_[i]); 2253b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(category, collected_events_categories_[i]); 2254b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(name, collected_events_names_[i]); 2255b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 2256b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2257b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::vector<std::string> collected_events_categories_; 2258b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::vector<std::string> collected_events_names_; 2259b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::vector<unsigned char> collected_events_phases_; 2260b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::vector<TraceTicks> collected_events_timestamps_; 2261b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2262b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static TraceEventCallbackTest* s_instance; 2263b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static void Callback(TraceTicks timestamp, 2264b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat char phase, 2265b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const unsigned char* category_group_enabled, 2266b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* name, 2267b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned long long id, 2268b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int num_args, 2269b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* const arg_names[], 2270b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const unsigned char arg_types[], 2271b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const unsigned long long arg_values[], 2272b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned char flags) { 2273b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat s_instance->collected_events_phases_.push_back(phase); 2274b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat s_instance->collected_events_categories_.push_back( 2275b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetCategoryGroupName(category_group_enabled)); 2276b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat s_instance->collected_events_names_.push_back(name); 2277b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat s_instance->collected_events_timestamps_.push_back(timestamp); 2278b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 2279b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 2280b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2281b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTraceEventCallbackTest* TraceEventCallbackTest::s_instance; 2282b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2283b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventCallbackTest, TraceEventCallback) { 2284b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("all", "before enable", TRACE_EVENT_SCOPE_THREAD); 2285b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEventCallbackEnabled( 2286b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceConfig(kRecordAllCategoryFilter, ""), Callback); 2287b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("all", "event1", TRACE_EVENT_SCOPE_GLOBAL); 2288b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("all", "event2", TRACE_EVENT_SCOPE_GLOBAL); 2289b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 2290b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT0("all", "duration"); 2291b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("all", "event3", TRACE_EVENT_SCOPE_GLOBAL); 2292b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 2293b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEventCallbackDisabled(); 2294b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("all", "after callback removed", 2295b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_SCOPE_GLOBAL); 2296b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_EQ(5u, collected_events_names_.size()); 2297b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("event1", collected_events_names_[0]); 2298b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(TRACE_EVENT_PHASE_INSTANT, collected_events_phases_[0]); 2299b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("event2", collected_events_names_[1]); 2300b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(TRACE_EVENT_PHASE_INSTANT, collected_events_phases_[1]); 2301b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("duration", collected_events_names_[2]); 2302b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(TRACE_EVENT_PHASE_BEGIN, collected_events_phases_[2]); 2303b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("event3", collected_events_names_[3]); 2304b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(TRACE_EVENT_PHASE_INSTANT, collected_events_phases_[3]); 2305b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("duration", collected_events_names_[4]); 2306b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(TRACE_EVENT_PHASE_END, collected_events_phases_[4]); 2307b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (size_t i = 1; i < collected_events_timestamps_.size(); i++) { 2308b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_LE(collected_events_timestamps_[i - 1], 2309b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat collected_events_timestamps_[i]); 2310b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 2311b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 2312b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2313b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventCallbackTest, TraceEventCallbackWhileFull) { 2314b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""), 2315b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::RECORDING_MODE); 2316b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat do { 2317b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("all", "badger badger", TRACE_EVENT_SCOPE_GLOBAL); 2318b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } while (!TraceLog::GetInstance()->BufferIsFull()); 2319b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEventCallbackEnabled( 2320b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceConfig(kRecordAllCategoryFilter, ""), Callback); 2321b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("all", "a snake", TRACE_EVENT_SCOPE_GLOBAL); 2322b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEventCallbackDisabled(); 2323b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_EQ(1u, collected_events_names_.size()); 2324b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("a snake", collected_events_names_[0]); 2325b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 2326b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2327b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// 1: Enable callback, enable recording, disable callback, disable recording. 2328b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventCallbackTest, TraceEventCallbackAndRecording1) { 2329b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("recording", "no", TRACE_EVENT_SCOPE_GLOBAL); 2330b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("callback", "no", TRACE_EVENT_SCOPE_GLOBAL); 2331b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEventCallbackEnabled(TraceConfig("callback", ""), 2332b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Callback); 2333b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("recording", "no", TRACE_EVENT_SCOPE_GLOBAL); 2334b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("callback", "yes", TRACE_EVENT_SCOPE_GLOBAL); 2335b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEnabled(TraceConfig("recording", ""), 2336b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::RECORDING_MODE); 2337b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("recording", "yes", TRACE_EVENT_SCOPE_GLOBAL); 2338b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("callback", "yes", TRACE_EVENT_SCOPE_GLOBAL); 2339b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEventCallbackDisabled(); 2340b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("recording", "yes", TRACE_EVENT_SCOPE_GLOBAL); 2341b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("callback", "no", TRACE_EVENT_SCOPE_GLOBAL); 2342b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 2343b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("recording", "no", TRACE_EVENT_SCOPE_GLOBAL); 2344b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("callback", "no", TRACE_EVENT_SCOPE_GLOBAL); 2345b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2346b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat DropTracedMetadataRecords(); 2347b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat VerifyCallbackAndRecordedEvents(2, 2); 2348b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 2349b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2350b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// 2: Enable callback, enable recording, disable recording, disable callback. 2351b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventCallbackTest, TraceEventCallbackAndRecording2) { 2352b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("recording", "no", TRACE_EVENT_SCOPE_GLOBAL); 2353b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("callback", "no", TRACE_EVENT_SCOPE_GLOBAL); 2354b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEventCallbackEnabled(TraceConfig("callback", ""), 2355b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Callback); 2356b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("recording", "no", TRACE_EVENT_SCOPE_GLOBAL); 2357b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("callback", "yes", TRACE_EVENT_SCOPE_GLOBAL); 2358b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEnabled(TraceConfig("recording", ""), 2359b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::RECORDING_MODE); 2360b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("recording", "yes", TRACE_EVENT_SCOPE_GLOBAL); 2361b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("callback", "yes", TRACE_EVENT_SCOPE_GLOBAL); 2362b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 2363b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("recording", "no", TRACE_EVENT_SCOPE_GLOBAL); 2364b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("callback", "yes", TRACE_EVENT_SCOPE_GLOBAL); 2365b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEventCallbackDisabled(); 2366b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("recording", "no", TRACE_EVENT_SCOPE_GLOBAL); 2367b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("callback", "no", TRACE_EVENT_SCOPE_GLOBAL); 2368b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2369b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat DropTracedMetadataRecords(); 2370b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat VerifyCallbackAndRecordedEvents(3, 1); 2371b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 2372b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2373b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// 3: Enable recording, enable callback, disable callback, disable recording. 2374b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventCallbackTest, TraceEventCallbackAndRecording3) { 2375b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("recording", "no", TRACE_EVENT_SCOPE_GLOBAL); 2376b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("callback", "no", TRACE_EVENT_SCOPE_GLOBAL); 2377b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEnabled(TraceConfig("recording", ""), 2378b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::RECORDING_MODE); 2379b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("recording", "yes", TRACE_EVENT_SCOPE_GLOBAL); 2380b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("callback", "no", TRACE_EVENT_SCOPE_GLOBAL); 2381b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEventCallbackEnabled(TraceConfig("callback", ""), 2382b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Callback); 2383b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("recording", "yes", TRACE_EVENT_SCOPE_GLOBAL); 2384b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("callback", "yes", TRACE_EVENT_SCOPE_GLOBAL); 2385b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEventCallbackDisabled(); 2386b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("recording", "yes", TRACE_EVENT_SCOPE_GLOBAL); 2387b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("callback", "no", TRACE_EVENT_SCOPE_GLOBAL); 2388b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 2389b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("recording", "no", TRACE_EVENT_SCOPE_GLOBAL); 2390b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("callback", "no", TRACE_EVENT_SCOPE_GLOBAL); 2391b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2392b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat DropTracedMetadataRecords(); 2393b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat VerifyCallbackAndRecordedEvents(1, 3); 2394b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 2395b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2396b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// 4: Enable recording, enable callback, disable recording, disable callback. 2397b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventCallbackTest, TraceEventCallbackAndRecording4) { 2398b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("recording", "no", TRACE_EVENT_SCOPE_GLOBAL); 2399b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("callback", "no", TRACE_EVENT_SCOPE_GLOBAL); 2400b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEnabled(TraceConfig("recording", ""), 2401b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::RECORDING_MODE); 2402b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("recording", "yes", TRACE_EVENT_SCOPE_GLOBAL); 2403b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("callback", "no", TRACE_EVENT_SCOPE_GLOBAL); 2404b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEventCallbackEnabled(TraceConfig("callback", ""), 2405b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Callback); 2406b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("recording", "yes", TRACE_EVENT_SCOPE_GLOBAL); 2407b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("callback", "yes", TRACE_EVENT_SCOPE_GLOBAL); 2408b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 2409b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("recording", "no", TRACE_EVENT_SCOPE_GLOBAL); 2410b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("callback", "yes", TRACE_EVENT_SCOPE_GLOBAL); 2411b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEventCallbackDisabled(); 2412b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("recording", "no", TRACE_EVENT_SCOPE_GLOBAL); 2413b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("callback", "no", TRACE_EVENT_SCOPE_GLOBAL); 2414b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2415b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat DropTracedMetadataRecords(); 2416b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat VerifyCallbackAndRecordedEvents(2, 2); 2417b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 2418b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2419b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventCallbackTest, TraceEventCallbackAndRecordingDuration) { 2420b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEventCallbackEnabled( 2421b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceConfig(kRecordAllCategoryFilter, ""), Callback); 2422b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 2423b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT0("callback", "duration1"); 2424b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEnabled( 2425b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceConfig(kRecordAllCategoryFilter, ""), TraceLog::RECORDING_MODE); 2426b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT0("callback", "duration2"); 2427b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 2428b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT0("callback", "duration3"); 2429b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 2430b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEventCallbackDisabled(); 2431b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2432b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_EQ(6u, collected_events_names_.size()); 2433b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat VerifyCollectedEvent(0, TRACE_EVENT_PHASE_BEGIN, "callback", "duration1"); 2434b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat VerifyCollectedEvent(1, TRACE_EVENT_PHASE_BEGIN, "callback", "duration2"); 2435b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat VerifyCollectedEvent(2, TRACE_EVENT_PHASE_BEGIN, "callback", "duration3"); 2436b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat VerifyCollectedEvent(3, TRACE_EVENT_PHASE_END, "callback", "duration3"); 2437b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat VerifyCollectedEvent(4, TRACE_EVENT_PHASE_END, "callback", "duration2"); 2438b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat VerifyCollectedEvent(5, TRACE_EVENT_PHASE_END, "callback", "duration1"); 2439b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 2440b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2441b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, TraceBufferVectorReportFull) { 2442b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog* trace_log = TraceLog::GetInstance(); 2443b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_log->SetEnabled( 2444b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceConfig(kRecordAllCategoryFilter, ""), TraceLog::RECORDING_MODE); 2445b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_log->logged_events_.reset( 2446b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_log->CreateTraceBufferVectorOfSize(100)); 2447b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat do { 2448b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_BEGIN_WITH_ID_TID_AND_TIMESTAMP0( 2449b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "all", "with_timestamp", 0, 0, TraceTicks::Now().ToInternalValue()); 2450b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_END_WITH_ID_TID_AND_TIMESTAMP0( 2451b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "all", "with_timestamp", 0, 0, TraceTicks::Now().ToInternalValue()); 2452b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } while (!trace_log->BufferIsFull()); 2453b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2454b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 2455b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2456b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const DictionaryValue* trace_full_metadata = NULL; 2457b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2458b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_full_metadata = FindTraceEntry(trace_parsed_, 2459b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "overflowed_at_ts"); 2460b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string phase; 2461b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat double buffer_limit_reached_timestamp = 0; 2462b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2463b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(trace_full_metadata); 2464b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(trace_full_metadata->GetString("ph", &phase)); 2465b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ("M", phase); 2466b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(trace_full_metadata->GetDouble( 2467b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "args.overflowed_at_ts", &buffer_limit_reached_timestamp)); 2468b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_DOUBLE_EQ( 2469b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static_cast<double>( 2470b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_log->buffer_limit_reached_timestamp_.ToInternalValue()), 2471b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat buffer_limit_reached_timestamp); 2472b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2473b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Test that buffer_limit_reached_timestamp's value is between the timestamp 2474b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // of the last trace event and current time. 2475b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat DropTracedMetadataRecords(); 2476b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const DictionaryValue* last_trace_event = NULL; 2477b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat double last_trace_event_timestamp = 0; 2478b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(trace_parsed_.GetDictionary(trace_parsed_.GetSize() - 1, 2479b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat &last_trace_event)); 2480b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(last_trace_event->GetDouble("ts", &last_trace_event_timestamp)); 2481b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_LE(last_trace_event_timestamp, buffer_limit_reached_timestamp); 2482b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_LE(buffer_limit_reached_timestamp, 2483b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_log->OffsetNow().ToInternalValue()); 2484b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 2485b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2486b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, TraceBufferRingBufferGetReturnChunk) { 2487b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEnabled( 2488b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceConfig(kRecordAllCategoryFilter, RECORD_CONTINUOUSLY), 2489b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::RECORDING_MODE); 2490b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceBuffer* buffer = TraceLog::GetInstance()->trace_buffer(); 2491b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat size_t capacity = buffer->Capacity(); 2492b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat size_t num_chunks = capacity / TraceBufferChunk::kTraceBufferChunkSize; 2493b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat uint32 last_seq = 0; 2494b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat size_t chunk_index; 2495b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(0u, buffer->Size()); 2496b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2497b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat scoped_ptr<TraceBufferChunk*[]> chunks(new TraceBufferChunk*[num_chunks]); 2498b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (size_t i = 0; i < num_chunks; ++i) { 2499b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat chunks[i] = buffer->GetChunk(&chunk_index).release(); 2500b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(chunks[i]); 2501b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(i, chunk_index); 2502b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_GT(chunks[i]->seq(), last_seq); 2503b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ((i + 1) * TraceBufferChunk::kTraceBufferChunkSize, 2504b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat buffer->Size()); 2505b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat last_seq = chunks[i]->seq(); 2506b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 2507b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2508b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Ring buffer is never full. 2509b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(buffer->IsFull()); 2510b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2511b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Return all chunks in original order. 2512b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (size_t i = 0; i < num_chunks; ++i) 2513b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat buffer->ReturnChunk(i, scoped_ptr<TraceBufferChunk>(chunks[i])); 2514b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2515b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Should recycle the chunks in the returned order. 2516b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (size_t i = 0; i < num_chunks; ++i) { 2517b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat chunks[i] = buffer->GetChunk(&chunk_index).release(); 2518b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(chunks[i]); 2519b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(i, chunk_index); 2520b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_GT(chunks[i]->seq(), last_seq); 2521b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat last_seq = chunks[i]->seq(); 2522b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 2523b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2524b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Return all chunks in reverse order. 2525b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (size_t i = 0; i < num_chunks; ++i) { 2526b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat buffer->ReturnChunk( 2527b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat num_chunks - i - 1, 2528b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat scoped_ptr<TraceBufferChunk>(chunks[num_chunks - i - 1])); 2529b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 2530b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2531b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Should recycle the chunks in the returned order. 2532b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (size_t i = 0; i < num_chunks; ++i) { 2533b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat chunks[i] = buffer->GetChunk(&chunk_index).release(); 2534b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(chunks[i]); 2535b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(num_chunks - i - 1, chunk_index); 2536b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_GT(chunks[i]->seq(), last_seq); 2537b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat last_seq = chunks[i]->seq(); 2538b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 2539b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2540b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (size_t i = 0; i < num_chunks; ++i) 2541b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat buffer->ReturnChunk(i, scoped_ptr<TraceBufferChunk>(chunks[i])); 2542b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2543b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetDisabled(); 2544b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 2545b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2546b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, TraceBufferRingBufferHalfIteration) { 2547b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEnabled( 2548b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceConfig(kRecordAllCategoryFilter, RECORD_CONTINUOUSLY), 2549b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::RECORDING_MODE); 2550b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceBuffer* buffer = TraceLog::GetInstance()->trace_buffer(); 2551b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat size_t capacity = buffer->Capacity(); 2552b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat size_t num_chunks = capacity / TraceBufferChunk::kTraceBufferChunkSize; 2553b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat size_t chunk_index; 2554b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(0u, buffer->Size()); 2555b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(buffer->NextChunk()); 2556b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2557b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat size_t half_chunks = num_chunks / 2; 2558b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat scoped_ptr<TraceBufferChunk*[]> chunks(new TraceBufferChunk*[half_chunks]); 2559b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2560b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (size_t i = 0; i < half_chunks; ++i) { 2561b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat chunks[i] = buffer->GetChunk(&chunk_index).release(); 2562b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(chunks[i]); 2563b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(i, chunk_index); 2564b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 2565b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (size_t i = 0; i < half_chunks; ++i) 2566b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat buffer->ReturnChunk(i, scoped_ptr<TraceBufferChunk>(chunks[i])); 2567b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2568b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (size_t i = 0; i < half_chunks; ++i) 2569b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(chunks[i], buffer->NextChunk()); 2570b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(buffer->NextChunk()); 2571b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetDisabled(); 2572b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 2573b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2574b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, TraceBufferRingBufferFullIteration) { 2575b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEnabled( 2576b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceConfig(kRecordAllCategoryFilter, RECORD_CONTINUOUSLY), 2577b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::RECORDING_MODE); 2578b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceBuffer* buffer = TraceLog::GetInstance()->trace_buffer(); 2579b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat size_t capacity = buffer->Capacity(); 2580b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat size_t num_chunks = capacity / TraceBufferChunk::kTraceBufferChunkSize; 2581b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat size_t chunk_index; 2582b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(0u, buffer->Size()); 2583b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(buffer->NextChunk()); 2584b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2585b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat scoped_ptr<TraceBufferChunk*[]> chunks(new TraceBufferChunk*[num_chunks]); 2586b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2587b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (size_t i = 0; i < num_chunks; ++i) { 2588b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat chunks[i] = buffer->GetChunk(&chunk_index).release(); 2589b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(chunks[i]); 2590b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(i, chunk_index); 2591b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 2592b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (size_t i = 0; i < num_chunks; ++i) 2593b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat buffer->ReturnChunk(i, scoped_ptr<TraceBufferChunk>(chunks[i])); 2594b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2595b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (size_t i = 0; i < num_chunks; ++i) 2596b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(chunks[i] == buffer->NextChunk()); 2597b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(buffer->NextChunk()); 2598b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetDisabled(); 2599b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 2600b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2601b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, TraceRecordAsMuchAsPossibleMode) { 2602b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEnabled( 2603b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceConfig(kRecordAllCategoryFilter, RECORD_AS_MUCH_AS_POSSIBLE), 2604b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::RECORDING_MODE); 2605b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceBuffer* buffer = TraceLog::GetInstance()->trace_buffer(); 2606b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(512000000UL, buffer->Capacity()); 2607b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetDisabled(); 2608b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 2609b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2610b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid BlockUntilStopped(WaitableEvent* task_start_event, 2611b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat WaitableEvent* task_stop_event) { 2612b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat task_start_event->Signal(); 2613b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat task_stop_event->Wait(); 2614b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 2615b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2616b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, SetCurrentThreadBlocksMessageLoopBeforeTracing) { 2617b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat BeginTrace(); 2618b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2619b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Thread thread("1"); 2620b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat WaitableEvent task_complete_event(false, false); 2621b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat thread.Start(); 2622b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat thread.task_runner()->PostTask( 2623b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FROM_HERE, Bind(&TraceLog::SetCurrentThreadBlocksMessageLoop, 2624b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Unretained(TraceLog::GetInstance()))); 2625b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2626b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat thread.task_runner()->PostTask( 2627b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FROM_HERE, Bind(&TraceWithAllMacroVariants, &task_complete_event)); 2628b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat task_complete_event.Wait(); 2629b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2630b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat WaitableEvent task_start_event(false, false); 2631b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat WaitableEvent task_stop_event(false, false); 2632b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat thread.task_runner()->PostTask( 2633b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FROM_HERE, Bind(&BlockUntilStopped, &task_start_event, &task_stop_event)); 2634b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat task_start_event.Wait(); 2635b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2636b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 2637b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ValidateAllTraceMacrosCreatedData(trace_parsed_); 2638b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2639b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat task_stop_event.Signal(); 2640b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat thread.Stop(); 2641b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 2642b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2643b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, ConvertTraceConfigToInternalOptions) { 2644b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog* trace_log = TraceLog::GetInstance(); 2645b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(TraceLog::kInternalRecordUntilFull, 2646b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_log->GetInternalOptionsFromTraceConfig( 2647b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceConfig(kRecordAllCategoryFilter, RECORD_UNTIL_FULL))); 2648b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2649b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(TraceLog::kInternalRecordContinuously, 2650b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_log->GetInternalOptionsFromTraceConfig( 2651b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceConfig(kRecordAllCategoryFilter, RECORD_CONTINUOUSLY))); 2652b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2653b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(TraceLog::kInternalEchoToConsole, 2654b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_log->GetInternalOptionsFromTraceConfig( 2655b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceConfig(kRecordAllCategoryFilter, ECHO_TO_CONSOLE))); 2656b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2657b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ( 2658b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::kInternalRecordUntilFull | TraceLog::kInternalEnableSampling, 2659b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_log->GetInternalOptionsFromTraceConfig( 2660b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceConfig(kRecordAllCategoryFilter, 2661b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "record-until-full,enable-sampling"))); 2662b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2663b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ( 2664b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::kInternalRecordContinuously | TraceLog::kInternalEnableSampling, 2665b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_log->GetInternalOptionsFromTraceConfig( 2666b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceConfig(kRecordAllCategoryFilter, 2667b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "record-continuously,enable-sampling"))); 2668b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2669b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ( 2670b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::kInternalEchoToConsole | TraceLog::kInternalEnableSampling, 2671b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_log->GetInternalOptionsFromTraceConfig( 2672b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceConfig(kRecordAllCategoryFilter, 2673b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "trace-to-console,enable-sampling"))); 2674b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2675b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ( 2676b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::kInternalEchoToConsole | TraceLog::kInternalEnableSampling, 2677b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_log->GetInternalOptionsFromTraceConfig( 2678b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceConfig("*", 2679b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "trace-to-console,enable-sampling,enable-systrace"))); 2680b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 2681b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2682b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid SetBlockingFlagAndBlockUntilStopped(WaitableEvent* task_start_event, 2683b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat WaitableEvent* task_stop_event) { 2684b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetCurrentThreadBlocksMessageLoop(); 2685b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat BlockUntilStopped(task_start_event, task_stop_event); 2686b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 2687b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2688b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, SetCurrentThreadBlocksMessageLoopAfterTracing) { 2689b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat BeginTrace(); 2690b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2691b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Thread thread("1"); 2692b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat WaitableEvent task_complete_event(false, false); 2693b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat thread.Start(); 2694b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2695b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat thread.task_runner()->PostTask( 2696b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FROM_HERE, Bind(&TraceWithAllMacroVariants, &task_complete_event)); 2697b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat task_complete_event.Wait(); 2698b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2699b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat WaitableEvent task_start_event(false, false); 2700b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat WaitableEvent task_stop_event(false, false); 2701b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat thread.task_runner()->PostTask( 2702b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FROM_HERE, Bind(&SetBlockingFlagAndBlockUntilStopped, &task_start_event, 2703b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat &task_stop_event)); 2704b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat task_start_event.Wait(); 2705b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2706b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 2707b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ValidateAllTraceMacrosCreatedData(trace_parsed_); 2708b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2709b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat task_stop_event.Signal(); 2710b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat thread.Stop(); 2711b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 2712b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2713b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, ThreadOnceBlocking) { 2714b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat BeginTrace(); 2715b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2716b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Thread thread("1"); 2717b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat WaitableEvent task_complete_event(false, false); 2718b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat thread.Start(); 2719b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2720b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat thread.task_runner()->PostTask( 2721b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FROM_HERE, Bind(&TraceWithAllMacroVariants, &task_complete_event)); 2722b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat task_complete_event.Wait(); 2723b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat task_complete_event.Reset(); 2724b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2725b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat WaitableEvent task_start_event(false, false); 2726b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat WaitableEvent task_stop_event(false, false); 2727b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat thread.task_runner()->PostTask( 2728b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FROM_HERE, Bind(&BlockUntilStopped, &task_start_event, &task_stop_event)); 2729b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat task_start_event.Wait(); 2730b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2731b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // The thread will timeout in this flush. 2732b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlushInThreadWithMessageLoop(); 2733b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Clear(); 2734b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2735b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Let the thread's message loop continue to spin. 2736b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat task_stop_event.Signal(); 2737b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2738b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // The following sequence ensures that the FlushCurrentThread task has been 2739b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // executed in the thread before continuing. 2740b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat task_start_event.Reset(); 2741b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat task_stop_event.Reset(); 2742b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat thread.task_runner()->PostTask( 2743b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FROM_HERE, Bind(&BlockUntilStopped, &task_start_event, &task_stop_event)); 2744b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat task_start_event.Wait(); 2745b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat task_stop_event.Signal(); 2746b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Clear(); 2747b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2748b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // TraceLog should discover the generation mismatch and recover the thread 2749b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // local buffer for the thread without any error. 2750b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat BeginTrace(); 2751b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat thread.task_runner()->PostTask( 2752b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FROM_HERE, Bind(&TraceWithAllMacroVariants, &task_complete_event)); 2753b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat task_complete_event.Wait(); 2754b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat task_complete_event.Reset(); 2755b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlushInThreadWithMessageLoop(); 2756b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ValidateAllTraceMacrosCreatedData(trace_parsed_); 2757b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 2758b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2759b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstd::string* g_log_buffer = NULL; 2760b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratbool MockLogMessageHandler(int, const char*, int, size_t, 2761b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const std::string& str) { 2762b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (!g_log_buffer) 2763b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat g_log_buffer = new std::string(); 2764b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat g_log_buffer->append(str); 2765b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return false; 2766b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 2767b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2768b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, EchoToConsole) { 2769b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat logging::LogMessageHandlerFunction old_log_message_handler = 2770b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat logging::GetLogMessageHandler(); 2771b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat logging::SetLogMessageHandler(MockLogMessageHandler); 2772b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2773b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEnabled( 2774b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceConfig(kRecordAllCategoryFilter, ECHO_TO_CONSOLE), 2775b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::RECORDING_MODE); 2776b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_BEGIN0("a", "begin_end"); 2777b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 2778b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT0("b", "duration"); 2779b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT0("b1", "duration1"); 2780b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 2781b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_INSTANT0("c", "instant", TRACE_EVENT_SCOPE_GLOBAL); 2782b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_END0("a", "begin_end"); 2783b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2784b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_NE(std::string::npos, g_log_buffer->find("begin_end[a]\x1b")); 2785b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_NE(std::string::npos, g_log_buffer->find("| duration[b]\x1b")); 2786b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_NE(std::string::npos, g_log_buffer->find("| | duration1[b1]\x1b")); 2787b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_NE(std::string::npos, g_log_buffer->find("| | duration1[b1] (")); 2788b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_NE(std::string::npos, g_log_buffer->find("| duration[b] (")); 2789b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_NE(std::string::npos, g_log_buffer->find("| instant[c]\x1b")); 2790b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_NE(std::string::npos, g_log_buffer->find("begin_end[a] (")); 2791b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2792b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 2793b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat delete g_log_buffer; 2794b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat logging::SetLogMessageHandler(old_log_message_handler); 2795b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat g_log_buffer = NULL; 2796b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 2797b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2798b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratbool LogMessageHandlerWithTraceEvent(int, const char*, int, size_t, 2799b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const std::string&) { 2800b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT0("log", "trace_event"); 2801b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return false; 2802b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 2803b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2804b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, EchoToConsoleTraceEventRecursion) { 2805b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat logging::LogMessageHandlerFunction old_log_message_handler = 2806b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat logging::GetLogMessageHandler(); 2807b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat logging::SetLogMessageHandler(LogMessageHandlerWithTraceEvent); 2808b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2809b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetEnabled( 2810b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceConfig(kRecordAllCategoryFilter, ECHO_TO_CONSOLE), 2811b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::RECORDING_MODE); 2812b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 2813b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // This should not cause deadlock or infinite recursion. 2814b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT0("b", "duration"); 2815b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 2816b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2817b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 2818b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat logging::SetLogMessageHandler(old_log_message_handler); 2819b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 2820b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2821b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, TimeOffset) { 2822b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat BeginTrace(); 2823b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Let TraceLog timer start from 0. 2824b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TimeDelta time_offset = TraceTicks::Now() - TraceTicks(); 2825b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceLog::GetInstance()->SetTimeOffset(time_offset); 2826b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2827b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 2828b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT0("all", "duration1"); 2829b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT0("all", "duration2"); 2830b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 2831b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_BEGIN_WITH_ID_TID_AND_TIMESTAMP0( 2832b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "all", "with_timestamp", 0, 0, TraceTicks::Now().ToInternalValue()); 2833b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_END_WITH_ID_TID_AND_TIMESTAMP0( 2834b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "all", "with_timestamp", 0, 0, TraceTicks::Now().ToInternalValue()); 2835b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2836b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 2837b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat DropTracedMetadataRecords(); 2838b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2839b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat double end_time = static_cast<double>( 2840b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat (TraceTicks::Now() - time_offset).ToInternalValue()); 2841b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat double last_timestamp = 0; 2842b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (size_t i = 0; i < trace_parsed_.GetSize(); ++i) { 2843b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const DictionaryValue* item; 2844b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(trace_parsed_.GetDictionary(i, &item)); 2845b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat double timestamp; 2846b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(item->GetDouble("ts", ×tamp)); 2847b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_GE(timestamp, last_timestamp); 2848b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_LE(timestamp, end_time); 2849b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat last_timestamp = timestamp; 2850b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 2851b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 2852b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2853b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, ConfigureSyntheticDelays) { 2854b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat BeginSpecificTrace("DELAY(test.Delay;0.05)"); 2855b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2856b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::TimeTicks start = base::TimeTicks::Now(); 2857b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 2858b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_SYNTHETIC_DELAY("test.Delay"); 2859b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 2860b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::TimeDelta duration = base::TimeTicks::Now() - start; 2861b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_GE(duration.InMilliseconds(), 50); 2862b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2863b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 2864b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 2865b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2866b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, BadSyntheticDelayConfigurations) { 2867b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* const filters[] = { 2868b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "", 2869b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "DELAY(", 2870b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "DELAY(;", 2871b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "DELAY(;)", 2872b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "DELAY(test.Delay)", 2873b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat "DELAY(test.Delay;)" 2874b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat }; 2875b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (size_t i = 0; i < arraysize(filters); i++) { 2876b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat BeginSpecificTrace(filters[i]); 2877b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EndTraceAndFlush(); 2878b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceConfig trace_config = TraceLog::GetInstance()->GetCurrentTraceConfig(); 2879b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(0u, trace_config.GetSyntheticDelayValues().size()); 2880b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 2881b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 2882b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2883b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, SyntheticDelayConfigurationMerging) { 2884b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceConfig config1("DELAY(test.Delay1;16)", ""); 2885b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceConfig config2("DELAY(test.Delay2;32)", ""); 2886b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat config1.Merge(config2); 2887b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(2u, config1.GetSyntheticDelayValues().size()); 2888b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 2889b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2890b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, SyntheticDelayConfigurationToString) { 2891b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char filter[] = "DELAY(test.Delay;16;oneshot)"; 2892b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceConfig config(filter, ""); 2893b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(filter, config.ToCategoryFilterString()); 2894b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 2895b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2896b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} // namespace trace_event 2897b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} // namespace base 2898