Index: base/trace_event/heap_profiler_allocation_context_tracker_unittest.cc |
diff --git a/base/trace_event/heap_profiler_allocation_context_tracker_unittest.cc b/base/trace_event/heap_profiler_allocation_context_tracker_unittest.cc |
index 436f7542e2a491b293ec577a66d719208c838e7e..07d5f253dd46ed77ea4a332101f5779b02407c9f 100644 |
--- a/base/trace_event/heap_profiler_allocation_context_tracker_unittest.cc |
+++ b/base/trace_event/heap_profiler_allocation_context_tracker_unittest.cc |
@@ -19,6 +19,7 @@ namespace trace_event { |
// Define all strings once, because the pseudo stack requires pointer equality, |
// and string interning is unreliable. |
+const char kThreadName[] = "TestThread"; |
const char kCupcake[] = "Cupcake"; |
const char kDonut[] = "Donut"; |
const char kEclair[] = "Eclair"; |
@@ -49,12 +50,14 @@ void AssertBacktraceEquals(const StackFrame(&expected_backtrace)[N]) { |
ASSERT_EQ(expected, expected_bottom); |
} |
-void AssertBacktraceEmpty() { |
+void AssertBacktraceContainsOnlyThreadName() { |
+ StackFrame t = StackFrame::FromThreadName(kThreadName); |
AllocationContext ctx = |
AllocationContextTracker::GetInstanceForCurrentThread() |
->GetContextSnapshot(); |
- ASSERT_EQ(0u, ctx.backtrace.frame_count); |
+ ASSERT_EQ(1u, ctx.backtrace.frame_count); |
+ ASSERT_EQ(t, ctx.backtrace.frames[0]); |
} |
class AllocationContextTrackerTest : public testing::Test { |
@@ -64,6 +67,7 @@ class AllocationContextTrackerTest : public testing::Test { |
TraceLog::GetInstance()->SetEnabled(config, TraceLog::RECORDING_MODE); |
AllocationContextTracker::SetCaptureMode( |
AllocationContextTracker::CaptureMode::PSEUDO_STACK); |
+ AllocationContextTracker::SetCurrentThreadName(kThreadName); |
} |
void TearDown() override { |
@@ -75,21 +79,22 @@ class AllocationContextTrackerTest : public testing::Test { |
// Check that |TRACE_EVENT| macros push and pop to the pseudo stack correctly. |
TEST_F(AllocationContextTrackerTest, PseudoStackScopedTrace) { |
+ StackFrame t = StackFrame::FromThreadName(kThreadName); |
StackFrame c = StackFrame::FromTraceEventName(kCupcake); |
StackFrame d = StackFrame::FromTraceEventName(kDonut); |
StackFrame e = StackFrame::FromTraceEventName(kEclair); |
StackFrame f = StackFrame::FromTraceEventName(kFroyo); |
- AssertBacktraceEmpty(); |
+ AssertBacktraceContainsOnlyThreadName(); |
{ |
TRACE_EVENT0("Testing", kCupcake); |
- StackFrame frame_c[] = {c}; |
+ StackFrame frame_c[] = {t, c}; |
AssertBacktraceEquals(frame_c); |
{ |
TRACE_EVENT0("Testing", kDonut); |
- StackFrame frame_cd[] = {c, d}; |
+ StackFrame frame_cd[] = {t, c, d}; |
AssertBacktraceEquals(frame_cd); |
} |
@@ -97,38 +102,39 @@ TEST_F(AllocationContextTrackerTest, PseudoStackScopedTrace) { |
{ |
TRACE_EVENT0("Testing", kEclair); |
- StackFrame frame_ce[] = {c, e}; |
+ StackFrame frame_ce[] = {t, c, e}; |
AssertBacktraceEquals(frame_ce); |
} |
AssertBacktraceEquals(frame_c); |
} |
- AssertBacktraceEmpty(); |
+ AssertBacktraceContainsOnlyThreadName(); |
{ |
TRACE_EVENT0("Testing", kFroyo); |
- StackFrame frame_f[] = {f}; |
+ StackFrame frame_f[] = {t, f}; |
AssertBacktraceEquals(frame_f); |
} |
- AssertBacktraceEmpty(); |
+ AssertBacktraceContainsOnlyThreadName(); |
} |
// Same as |PseudoStackScopedTrace|, but now test the |TRACE_EVENT_BEGIN| and |
// |TRACE_EVENT_END| macros. |
TEST_F(AllocationContextTrackerTest, PseudoStackBeginEndTrace) { |
+ StackFrame t = StackFrame::FromThreadName(kThreadName); |
StackFrame c = StackFrame::FromTraceEventName(kCupcake); |
StackFrame d = StackFrame::FromTraceEventName(kDonut); |
StackFrame e = StackFrame::FromTraceEventName(kEclair); |
StackFrame f = StackFrame::FromTraceEventName(kFroyo); |
- StackFrame frame_c[] = {c}; |
- StackFrame frame_cd[] = {c, d}; |
- StackFrame frame_ce[] = {c, e}; |
- StackFrame frame_f[] = {f}; |
+ StackFrame frame_c[] = {t, c}; |
+ StackFrame frame_cd[] = {t, c, d}; |
+ StackFrame frame_ce[] = {t, c, e}; |
+ StackFrame frame_f[] = {t, f}; |
- AssertBacktraceEmpty(); |
+ AssertBacktraceContainsOnlyThreadName(); |
TRACE_EVENT_BEGIN0("Testing", kCupcake); |
AssertBacktraceEquals(frame_c); |
@@ -146,27 +152,28 @@ TEST_F(AllocationContextTrackerTest, PseudoStackBeginEndTrace) { |
AssertBacktraceEquals(frame_c); |
TRACE_EVENT_END0("Testing", kCupcake); |
- AssertBacktraceEmpty(); |
+ AssertBacktraceContainsOnlyThreadName(); |
TRACE_EVENT_BEGIN0("Testing", kFroyo); |
AssertBacktraceEquals(frame_f); |
TRACE_EVENT_END0("Testing", kFroyo); |
- AssertBacktraceEmpty(); |
+ AssertBacktraceContainsOnlyThreadName(); |
} |
TEST_F(AllocationContextTrackerTest, PseudoStackMixedTrace) { |
+ StackFrame t = StackFrame::FromThreadName(kThreadName); |
StackFrame c = StackFrame::FromTraceEventName(kCupcake); |
StackFrame d = StackFrame::FromTraceEventName(kDonut); |
StackFrame e = StackFrame::FromTraceEventName(kEclair); |
StackFrame f = StackFrame::FromTraceEventName(kFroyo); |
- StackFrame frame_c[] = {c}; |
- StackFrame frame_cd[] = {c, d}; |
- StackFrame frame_e[] = {e}; |
- StackFrame frame_ef[] = {e, f}; |
+ StackFrame frame_c[] = {t, c}; |
+ StackFrame frame_cd[] = {t, c, d}; |
+ StackFrame frame_e[] = {t, e}; |
+ StackFrame frame_ef[] = {t, e, f}; |
- AssertBacktraceEmpty(); |
+ AssertBacktraceContainsOnlyThreadName(); |
TRACE_EVENT_BEGIN0("Testing", kCupcake); |
AssertBacktraceEquals(frame_c); |
@@ -178,7 +185,7 @@ TEST_F(AllocationContextTrackerTest, PseudoStackMixedTrace) { |
AssertBacktraceEquals(frame_c); |
TRACE_EVENT_END0("Testing", kCupcake); |
- AssertBacktraceEmpty(); |
+ AssertBacktraceContainsOnlyThreadName(); |
{ |
TRACE_EVENT0("Testing", kEclair); |
@@ -190,15 +197,15 @@ TEST_F(AllocationContextTrackerTest, PseudoStackMixedTrace) { |
AssertBacktraceEquals(frame_e); |
} |
- AssertBacktraceEmpty(); |
+ AssertBacktraceContainsOnlyThreadName(); |
} |
TEST_F(AllocationContextTrackerTest, BacktraceTakesTop) { |
+ StackFrame t = StackFrame::FromThreadName(kThreadName); |
StackFrame c = StackFrame::FromTraceEventName(kCupcake); |
StackFrame f = StackFrame::FromTraceEventName(kFroyo); |
- // Push 12 events onto the pseudo stack. |
- TRACE_EVENT0("Testing", kCupcake); |
+ // Push 11 events onto the pseudo stack. |
TRACE_EVENT0("Testing", kCupcake); |
TRACE_EVENT0("Testing", kCupcake); |
TRACE_EVENT0("Testing", kCupcake); |
@@ -220,7 +227,8 @@ TEST_F(AllocationContextTrackerTest, BacktraceTakesTop) { |
->GetContextSnapshot(); |
// The pseudo stack relies on pointer equality, not deep string comparisons. |
- ASSERT_EQ(c, ctx.backtrace.frames[0]); |
+ ASSERT_EQ(t, ctx.backtrace.frames[0]); |
+ ASSERT_EQ(c, ctx.backtrace.frames[1]); |
ASSERT_EQ(f, ctx.backtrace.frames[11]); |
} |
@@ -228,33 +236,12 @@ TEST_F(AllocationContextTrackerTest, BacktraceTakesTop) { |
AllocationContext ctx = |
AllocationContextTracker::GetInstanceForCurrentThread() |
->GetContextSnapshot(); |
- ASSERT_EQ(c, ctx.backtrace.frames[0]); |
+ ASSERT_EQ(t, ctx.backtrace.frames[0]); |
+ ASSERT_EQ(c, ctx.backtrace.frames[1]); |
ASSERT_EQ(f, ctx.backtrace.frames[11]); |
} |
} |
-TEST_F(AllocationContextTrackerTest, SetCurrentThreadName) { |
- TRACE_EVENT0("Testing", kCupcake); |
- |
- // Test if the thread name is inserted into backtrace. |
- const char kThread1[] = "thread1"; |
- AllocationContextTracker::SetCurrentThreadName(kThread1); |
- AllocationContext ctx1 = |
- AllocationContextTracker::GetInstanceForCurrentThread() |
- ->GetContextSnapshot(); |
- ASSERT_EQ(StackFrame::FromThreadName(kThread1), ctx1.backtrace.frames[0]); |
- ASSERT_EQ(StackFrame::FromTraceEventName(kCupcake), ctx1.backtrace.frames[1]); |
- |
- // Test if the thread name is reset. |
- const char kThread2[] = "thread2"; |
- AllocationContextTracker::SetCurrentThreadName(kThread2); |
- AllocationContext ctx2 = |
- AllocationContextTracker::GetInstanceForCurrentThread() |
- ->GetContextSnapshot(); |
- ASSERT_EQ(StackFrame::FromThreadName(kThread2), ctx2.backtrace.frames[0]); |
- ASSERT_EQ(StackFrame::FromTraceEventName(kCupcake), ctx2.backtrace.frames[1]); |
-} |
- |
TEST_F(AllocationContextTrackerTest, TrackTaskContext) { |
const char kContext1[] = "context1"; |
const char kContext2[] = "context2"; |