| // Copyright 2015 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 <stddef.h> | 
 |  | 
 | #include <iterator> | 
 |  | 
 | #include "base/memory/ref_counted.h" | 
 | #include "base/pending_task.h" | 
 | #include "base/strings/string_piece.h" | 
 | #include "base/trace_event/heap_profiler.h" | 
 | #include "base/trace_event/heap_profiler_allocation_context.h" | 
 | #include "base/trace_event/heap_profiler_allocation_context_tracker.h" | 
 | #include "base/trace_event/memory_dump_manager.h" | 
 | #include "base/trace_event/trace_event.h" | 
 | #include "testing/gtest/include/gtest/gtest.h" | 
 |  | 
 | namespace base { | 
 | namespace trace_event { | 
 |  | 
 | const char kThreadName[] = "TestThread"; | 
 |  | 
 | // Asserts that the fixed-size array |expected_backtrace| matches the backtrace | 
 | // in |AllocationContextTracker::GetContextSnapshot|. | 
 | template <size_t N> | 
 | void AssertBacktraceEquals(const StackFrame(&expected_backtrace)[N]) { | 
 |   AllocationContext ctx; | 
 |   ASSERT_TRUE(AllocationContextTracker::GetInstanceForCurrentThread() | 
 |                   ->GetContextSnapshot(&ctx)); | 
 |  | 
 |   auto* actual = std::begin(ctx.backtrace.frames); | 
 |   auto* actual_bottom = actual + ctx.backtrace.frame_count; | 
 |   auto expected = std::begin(expected_backtrace); | 
 |   auto expected_bottom = std::end(expected_backtrace); | 
 |  | 
 |   // Note that this requires the pointers to be equal, this is not doing a deep | 
 |   // string comparison. | 
 |   for (; actual != actual_bottom && expected != expected_bottom; | 
 |        actual++, expected++) | 
 |     ASSERT_EQ(*expected, *actual); | 
 |  | 
 |   // Ensure that the height of the stacks is the same. | 
 |   ASSERT_EQ(actual, actual_bottom); | 
 |   ASSERT_EQ(expected, expected_bottom); | 
 | } | 
 |  | 
 | void AssertBacktraceContainsOnlyThreadName() { | 
 |   StackFrame t = StackFrame::FromThreadName(kThreadName); | 
 |   AllocationContext ctx; | 
 |   ASSERT_TRUE(AllocationContextTracker::GetInstanceForCurrentThread() | 
 |                   ->GetContextSnapshot(&ctx)); | 
 |  | 
 |   ASSERT_GE(ctx.backtrace.frame_count, 1u); | 
 |   ASSERT_EQ(t, ctx.backtrace.frames[0]); | 
 | } | 
 |  | 
 | class AllocationContextTrackerTest : public testing::Test { | 
 |  public: | 
 |   void SetUp() override { | 
 |     AllocationContextTracker::SetCaptureMode( | 
 |         AllocationContextTracker::CaptureMode::NATIVE_STACK); | 
 |     AllocationContextTracker::SetCurrentThreadName(kThreadName); | 
 |   } | 
 |  | 
 |   void TearDown() override { | 
 |     AllocationContextTracker::SetCaptureMode( | 
 |         AllocationContextTracker::CaptureMode::DISABLED); | 
 |   } | 
 | }; | 
 |  | 
 | TEST_F(AllocationContextTrackerTest, StackContainsThreadName) { | 
 |   AssertBacktraceContainsOnlyThreadName(); | 
 | } | 
 |  | 
 | TEST_F(AllocationContextTrackerTest, IgnoreAllocationTest) { | 
 |   HEAP_PROFILER_SCOPED_IGNORE; | 
 |   AllocationContext ctx; | 
 |   ASSERT_FALSE(AllocationContextTracker::GetInstanceForCurrentThread() | 
 |                    ->GetContextSnapshot(&ctx)); | 
 | } | 
 |  | 
 | }  // namespace trace_event | 
 | }  // namespace base |