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