OLD | NEW |
(Empty) | |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "base/debug/trace_memory.h" |
| 6 |
| 7 #include "base/debug/trace_event_impl.h" |
| 8 #include "base/message_loop.h" |
| 9 #include "testing/gtest/include/gtest/gtest.h" |
| 10 |
| 11 namespace base { |
| 12 namespace debug { |
| 13 |
| 14 typedef testing::Test TraceMemoryTest; |
| 15 |
| 16 TEST_F(TraceMemoryTest, TraceMemoryTraceLogObserver) { |
| 17 MessageLoop message_loop; |
| 18 |
| 19 // Start with no observers of the TraceLog. |
| 20 EXPECT_EQ(0u, TraceLog::GetInstance()->GetObserverCountForTest()); |
| 21 |
| 22 // Creating an observer adds it to the TraceLog observer list. |
| 23 scoped_ptr<TraceMemoryTraceLogObserver> observer( |
| 24 new TraceMemoryTraceLogObserver( |
| 25 message_loop.message_loop_proxy())); |
| 26 EXPECT_EQ(1u, TraceLog::GetInstance()->GetObserverCountForTest()); |
| 27 EXPECT_TRUE(TraceLog::GetInstance()->HasEnabledStateObserver(observer.get())); |
| 28 |
| 29 // By default the observer isn't dumping memory profiles. |
| 30 EXPECT_FALSE(observer->IsTimerRunningForTest()); |
| 31 |
| 32 // Simulate enabling tracing. |
| 33 observer->OnTraceLogEnabled(); |
| 34 message_loop.RunUntilIdle(); |
| 35 EXPECT_TRUE(observer->IsTimerRunningForTest()); |
| 36 |
| 37 // Simulate disabling tracing. |
| 38 observer->OnTraceLogDisabled(); |
| 39 message_loop.RunUntilIdle(); |
| 40 EXPECT_FALSE(observer->IsTimerRunningForTest()); |
| 41 |
| 42 // Deleting the observer removes it from the TraceLog observer list. |
| 43 observer.reset(); |
| 44 EXPECT_EQ(0u, TraceLog::GetInstance()->GetObserverCountForTest()); |
| 45 } |
| 46 |
| 47 TEST_F(TraceMemoryTest, ScopedTraceMemory) { |
| 48 // Start with an empty stack. |
| 49 EXPECT_EQ(0, ScopedTraceMemory::GetStackIndexForTest()); |
| 50 |
| 51 { |
| 52 // Push an item. |
| 53 const char kScope1[] = "scope1"; |
| 54 ScopedTraceMemory scope1(kScope1); |
| 55 EXPECT_EQ(1, ScopedTraceMemory::GetStackIndexForTest()); |
| 56 EXPECT_EQ(kScope1, ScopedTraceMemory::GetItemForTest(0)); |
| 57 |
| 58 { |
| 59 // One more item. |
| 60 const char kScope2[] = "scope2"; |
| 61 ScopedTraceMemory scope2(kScope2); |
| 62 EXPECT_EQ(2, ScopedTraceMemory::GetStackIndexForTest()); |
| 63 EXPECT_EQ(kScope2, ScopedTraceMemory::GetItemForTest(1)); |
| 64 } |
| 65 |
| 66 // Ended scope 2. |
| 67 EXPECT_EQ(1, ScopedTraceMemory::GetStackIndexForTest()); |
| 68 } |
| 69 |
| 70 // Ended scope 1. |
| 71 EXPECT_EQ(0, ScopedTraceMemory::GetStackIndexForTest()); |
| 72 } |
| 73 |
| 74 void TestDeepScopeNesting(int current, int depth) { |
| 75 EXPECT_EQ(current, ScopedTraceMemory::GetStackIndexForTest()); |
| 76 const char kCategory[] = "foo"; |
| 77 ScopedTraceMemory scope(kCategory); |
| 78 if (current < depth) |
| 79 TestDeepScopeNesting(current + 1, depth); |
| 80 EXPECT_EQ(current + 1, ScopedTraceMemory::GetStackIndexForTest()); |
| 81 } |
| 82 |
| 83 TEST_F(TraceMemoryTest, DeepScopeNesting) { |
| 84 // Ensure really deep scopes don't crash. |
| 85 TestDeepScopeNesting(0, 100); |
| 86 } |
| 87 |
| 88 } // namespace debug |
| 89 } // namespace base |
OLD | NEW |