// Copyright 2020 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "base/profiler/thread_delegate_posix.h" #include "base/numerics/clamped_math.h" #include "base/process/process_handle.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" #include "testing/gtest/include/gtest/gtest.h" namespace base { // ASAN moves local variables outside of the stack extents. #if defined(ADDRESS_SANITIZER) #define MAYBE_CurrentThreadBase DISABLED_CurrentThreadBase #elif BUILDFLAG(IS_LINUX) // We don't support getting the stack base address on Linux. // https://crbug.com/1394278 #define MAYBE_CurrentThreadBase DISABLED_CurrentThreadBase #else #define MAYBE_CurrentThreadBase CurrentThreadBase #endif TEST(ThreadDelegatePosixTest, MAYBE_CurrentThreadBase) { auto delegate = ThreadDelegatePosix::Create(GetSamplingProfilerCurrentThreadToken()); ASSERT_TRUE(delegate); uintptr_t base = delegate->GetStackBaseAddress(); EXPECT_GT(base, 0u); uintptr_t stack_addr = reinterpret_cast(&base); // Check that end of stack is within 4MiB of a current stack address. EXPECT_LE(base, ClampAdd(stack_addr, 4 * 1024 * 1024)); } #if BUILDFLAG(IS_ANDROID) // On ChromeOS, this functionality is tested by // GetThreadStackBaseAddressTest.MainThread. TEST(ThreadDelegatePosixTest, MainThreadStackBase) { // The delegate does not use pthread id for main thread. auto delegate = ThreadDelegatePosix::Create( SamplingProfilerThreadToken{GetCurrentProcId(), pthread_t()}); ASSERT_TRUE(delegate); uintptr_t base = delegate->GetStackBaseAddress(); EXPECT_GT(base, 0u); } #endif // BUILDFLAG(IS_ANDROID) } // namespace base