blob: da948d391d7c1fee1ff3c9c7366521b18f8b21f6 [file] [log] [blame]
// 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