1bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch// found in the LICENSE file. 4bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 5bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "base/debug/trace_event_memory.h" 6bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 7bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include <sstream> 8bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include <string> 9bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 10bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "base/debug/trace_event_impl.h" 11bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "base/message_loop/message_loop.h" 12bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "testing/gtest/include/gtest/gtest.h" 13bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 14bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#if defined(TCMALLOC_TRACE_MEMORY_SUPPORTED) 15bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "third_party/tcmalloc/chromium/src/gperftools/heap-profiler.h" 16bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#endif 17bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 18bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochnamespace base { 19bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochnamespace debug { 20bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 21bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch// Tests for the trace event memory tracking system. Exists as a class so it 22bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch// can be a friend of TraceMemoryController. 23bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochclass TraceMemoryTest : public testing::Test { 24bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch public: 25bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch TraceMemoryTest() {} 26bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch virtual ~TraceMemoryTest() {} 27bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 28bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch private: 29bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch DISALLOW_COPY_AND_ASSIGN(TraceMemoryTest); 30bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch}; 31bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 32bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch////////////////////////////////////////////////////////////////////////////// 33bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 34bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#if defined(TCMALLOC_TRACE_MEMORY_SUPPORTED) 35bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 36bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochTEST_F(TraceMemoryTest, TraceMemoryController) { 37bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch MessageLoop message_loop; 38bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 39bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Start with no observers of the TraceLog. 40bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_EQ(0u, TraceLog::GetInstance()->GetObserverCountForTest()); 41bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 42bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Creating a controller adds it to the TraceLog observer list. 43bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch scoped_ptr<TraceMemoryController> controller( 44bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch new TraceMemoryController( 45bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch message_loop.message_loop_proxy(), 46bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch ::HeapProfilerWithPseudoStackStart, 47bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch ::HeapProfilerStop, 48bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch ::GetHeapProfile)); 49bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_EQ(1u, TraceLog::GetInstance()->GetObserverCountForTest()); 50bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_TRUE( 51bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch TraceLog::GetInstance()->HasEnabledStateObserver(controller.get())); 52bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 53bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // By default the observer isn't dumping memory profiles. 54bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_FALSE(controller->IsTimerRunningForTest()); 55bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 56bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Simulate enabling tracing. 57bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch controller->StartProfiling(); 58bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch message_loop.RunUntilIdle(); 59bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_TRUE(controller->IsTimerRunningForTest()); 60bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 61bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Simulate disabling tracing. 62bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch controller->StopProfiling(); 63bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch message_loop.RunUntilIdle(); 64bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_FALSE(controller->IsTimerRunningForTest()); 65bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 66bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Deleting the observer removes it from the TraceLog observer list. 67bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch controller.reset(); 68bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_EQ(0u, TraceLog::GetInstance()->GetObserverCountForTest()); 69bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 70bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 71bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochTEST_F(TraceMemoryTest, ScopedTraceMemory) { 72bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch ScopedTraceMemory::InitForTest(); 73bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 74bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Start with an empty stack. 75bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_EQ(0, ScopedTraceMemory::GetStackIndexForTest()); 76bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 77bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch { 78bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Push an item. 79bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch const char kScope1[] = "scope1"; 80bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch ScopedTraceMemory scope1(kScope1); 81bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_EQ(1, ScopedTraceMemory::GetStackIndexForTest()); 82bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_EQ(kScope1, ScopedTraceMemory::GetItemForTest(0)); 83bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 84bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch { 85bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // One more item. 86bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch const char kScope2[] = "scope2"; 87bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch ScopedTraceMemory scope2(kScope2); 88bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_EQ(2, ScopedTraceMemory::GetStackIndexForTest()); 89bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_EQ(kScope2, ScopedTraceMemory::GetItemForTest(1)); 90bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 91bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 92bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Ended scope 2. 93bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_EQ(1, ScopedTraceMemory::GetStackIndexForTest()); 94bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 95bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 96bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Ended scope 1. 97bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_EQ(0, ScopedTraceMemory::GetStackIndexForTest()); 98bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 99bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch ScopedTraceMemory::CleanupForTest(); 100bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 101bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 102bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochvoid TestDeepScopeNesting(int current, int depth) { 103bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_EQ(current, ScopedTraceMemory::GetStackIndexForTest()); 104bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch const char kCategory[] = "foo"; 105bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch ScopedTraceMemory scope(kCategory); 106bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (current < depth) 107bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch TestDeepScopeNesting(current + 1, depth); 108bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_EQ(current + 1, ScopedTraceMemory::GetStackIndexForTest()); 109bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 110bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 111bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochTEST_F(TraceMemoryTest, DeepScopeNesting) { 112bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch ScopedTraceMemory::InitForTest(); 113bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 114bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Ensure really deep scopes don't crash. 115bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch TestDeepScopeNesting(0, 100); 116bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 117bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch ScopedTraceMemory::CleanupForTest(); 118bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 119bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 120bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#endif // defined(TRACE_MEMORY_SUPPORTED) 121bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 122bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch///////////////////////////////////////////////////////////////////////////// 123bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 124bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochTEST_F(TraceMemoryTest, AppendHeapProfileTotalsAsTraceFormat) { 125bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Empty input gives empty output. 126bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch std::string empty_output; 127bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch AppendHeapProfileTotalsAsTraceFormat("", &empty_output); 128bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_EQ("", empty_output); 129bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 130bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Typical case. 131bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch const char input[] = 132bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch "heap profile: 357: 55227 [ 14653: 2624014] @ heapprofile"; 133bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch const std::string kExpectedOutput = 134bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch "{\"current_allocs\": 357, \"current_bytes\": 55227, \"trace\": \"\"}"; 135bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch std::string output; 136bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch AppendHeapProfileTotalsAsTraceFormat(input, &output); 137bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_EQ(kExpectedOutput, output); 138bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 139bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 140bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochTEST_F(TraceMemoryTest, AppendHeapProfileLineAsTraceFormat) { 141bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Empty input gives empty output. 142bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch std::string empty_output; 143bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_FALSE(AppendHeapProfileLineAsTraceFormat("", &empty_output)); 144bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_EQ("", empty_output); 145bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 146bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Invalid input returns false. 147bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch std::string junk_output; 148bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_FALSE(AppendHeapProfileLineAsTraceFormat("junk", &junk_output)); 149bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 150bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Input with the addresses of name1 and name2. 151bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch const char kName1[] = "name1"; 152bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch const char kName2[] = "name2"; 153bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch std::ostringstream input; 154bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch input << " 68: 4195 [ 1087: 98009] @ " << &kName1 << " " << &kName2; 155bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch const std::string kExpectedOutput = 156bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch ",\n" 157bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch "{" 158bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch "\"current_allocs\": 68, " 159bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch "\"current_bytes\": 4195, " 160bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch "\"trace\": \"name1 name2 \"" 161bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch "}"; 162bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch std::string output; 163bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_TRUE( 164bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch AppendHeapProfileLineAsTraceFormat(input.str().c_str(), &output)); 165bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_EQ(kExpectedOutput, output); 166bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 167bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Zero current allocations is skipped. 168bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch std::ostringstream zero_input; 169bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch zero_input << " 0: 0 [ 1087: 98009] @ " << &kName1 << " " 170bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch << &kName2; 171bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch std::string zero_output; 172bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_FALSE(AppendHeapProfileLineAsTraceFormat(zero_input.str().c_str(), 173bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch &zero_output)); 174bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_EQ("", zero_output); 175bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 176bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 177bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochTEST_F(TraceMemoryTest, AppendHeapProfileAsTraceFormat) { 178bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Empty input gives empty output. 179bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch std::string empty_output; 180bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch AppendHeapProfileAsTraceFormat("", &empty_output); 181bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_EQ("", empty_output); 182bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 183bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Typical case. 184bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch const char input[] = 185bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch "heap profile: 357: 55227 [ 14653: 2624014] @ heapprofile\n" 186bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch " 95: 40940 [ 649: 114260] @\n" 187bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch " 77: 32546 [ 742: 106234] @ 0x0 0x0\n" 188bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch " 0: 0 [ 132: 4236] @ 0x0\n" 189bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch "\n" 190bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch "MAPPED_LIBRARIES:\n" 191bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch "1be411fc1000-1be4139e4000 rw-p 00000000 00:00 0\n" 192bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch "1be4139e4000-1be4139e5000 ---p 00000000 00:00 0\n"; 193bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch const std::string kExpectedOutput = 194bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch "[{" 195bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch "\"current_allocs\": 357, " 196bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch "\"current_bytes\": 55227, " 197bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch "\"trace\": \"\"},\n" 198bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch "{\"current_allocs\": 95, " 199bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch "\"current_bytes\": 40940, " 200bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch "\"trace\": \"\"},\n" 201bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch "{\"current_allocs\": 77, " 202bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch "\"current_bytes\": 32546, " 203bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch "\"trace\": \"null null \"" 204bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch "}]\n"; 205bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch std::string output; 206bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch AppendHeapProfileAsTraceFormat(input, &output); 207bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_EQ(kExpectedOutput, output); 208bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 209bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 210bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} // namespace debug 211bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} // namespace base 212