| Index: base/debug/trace_memory_unittest.cc
|
| diff --git a/base/debug/trace_memory_unittest.cc b/base/debug/trace_memory_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..2c25ec6607554c6853cfaed5988e3eaff38c9bc1
|
| --- /dev/null
|
| +++ b/base/debug/trace_memory_unittest.cc
|
| @@ -0,0 +1,89 @@
|
| +// Copyright 2013 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "base/debug/trace_memory.h"
|
| +
|
| +#include "base/debug/trace_event_impl.h"
|
| +#include "base/message_loop.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace base {
|
| +namespace debug {
|
| +
|
| +typedef testing::Test TraceMemoryTest;
|
| +
|
| +TEST_F(TraceMemoryTest, TraceMemoryTraceLogObserver) {
|
| + MessageLoop message_loop;
|
| +
|
| + // Start with no observers of the TraceLog.
|
| + EXPECT_EQ(0u, TraceLog::GetInstance()->GetObserverCountForTest());
|
| +
|
| + // Creating an observer adds it to the TraceLog observer list.
|
| + scoped_ptr<TraceMemoryTraceLogObserver> observer(
|
| + new TraceMemoryTraceLogObserver(
|
| + message_loop.message_loop_proxy()));
|
| + EXPECT_EQ(1u, TraceLog::GetInstance()->GetObserverCountForTest());
|
| + EXPECT_TRUE(TraceLog::GetInstance()->HasEnabledStateObserver(observer.get()));
|
| +
|
| + // By default the observer isn't dumping memory profiles.
|
| + EXPECT_FALSE(observer->IsTimerRunningForTest());
|
| +
|
| + // Simulate enabling tracing.
|
| + observer->OnTraceLogEnabled();
|
| + message_loop.RunUntilIdle();
|
| + EXPECT_TRUE(observer->IsTimerRunningForTest());
|
| +
|
| + // Simulate disabling tracing.
|
| + observer->OnTraceLogDisabled();
|
| + message_loop.RunUntilIdle();
|
| + EXPECT_FALSE(observer->IsTimerRunningForTest());
|
| +
|
| + // Deleting the observer removes it from the TraceLog observer list.
|
| + observer.reset();
|
| + EXPECT_EQ(0u, TraceLog::GetInstance()->GetObserverCountForTest());
|
| +}
|
| +
|
| +TEST_F(TraceMemoryTest, ScopedTraceMemory) {
|
| + // Start with an empty stack.
|
| + EXPECT_EQ(0, ScopedTraceMemory::GetStackIndexForTest());
|
| +
|
| + {
|
| + // Push an item.
|
| + const char kScope1[] = "scope1";
|
| + ScopedTraceMemory scope1(kScope1);
|
| + EXPECT_EQ(1, ScopedTraceMemory::GetStackIndexForTest());
|
| + EXPECT_EQ(kScope1, ScopedTraceMemory::GetItemForTest(0));
|
| +
|
| + {
|
| + // One more item.
|
| + const char kScope2[] = "scope2";
|
| + ScopedTraceMemory scope2(kScope2);
|
| + EXPECT_EQ(2, ScopedTraceMemory::GetStackIndexForTest());
|
| + EXPECT_EQ(kScope2, ScopedTraceMemory::GetItemForTest(1));
|
| + }
|
| +
|
| + // Ended scope 2.
|
| + EXPECT_EQ(1, ScopedTraceMemory::GetStackIndexForTest());
|
| + }
|
| +
|
| + // Ended scope 1.
|
| + EXPECT_EQ(0, ScopedTraceMemory::GetStackIndexForTest());
|
| +}
|
| +
|
| +void TestDeepScopeNesting(int current, int depth) {
|
| + EXPECT_EQ(current, ScopedTraceMemory::GetStackIndexForTest());
|
| + const char kCategory[] = "foo";
|
| + ScopedTraceMemory scope(kCategory);
|
| + if (current < depth)
|
| + TestDeepScopeNesting(current + 1, depth);
|
| + EXPECT_EQ(current + 1, ScopedTraceMemory::GetStackIndexForTest());
|
| +}
|
| +
|
| +TEST_F(TraceMemoryTest, DeepScopeNesting) {
|
| + // Ensure really deep scopes don't crash.
|
| + TestDeepScopeNesting(0, 100);
|
| +}
|
| +
|
| +} // namespace debug
|
| +} // namespace base
|
|
|