// Copyright 2019 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/task_trace.h" #include #include "base/memory/raw_ptr.h" #include "base/run_loop.h" #include "base/test/bind.h" #include "base/test/task_environment.h" #include "testing/gtest/include/gtest/gtest.h" namespace base { namespace debug { TEST(TaskTraceTest, NoTask) { TaskTrace task_trace; EXPECT_TRUE(task_trace.empty()); EXPECT_EQ(task_trace.AddressesForTesting().size(), 0ul); } class ThreeTasksTest { public: ThreeTasksTest() {} void Run() { task_runner.PostTask(FROM_HERE, base::BindOnce(&ThreeTasksTest::TaskA, base::Unretained(this))); task_environment.RunUntilIdle(); } void TaskA() { TaskTrace task_trace; EXPECT_FALSE(task_trace.empty()); base::span addresses = task_trace.AddressesForTesting(); EXPECT_EQ(addresses.size(), 1ul); task_a_address = addresses[0]; task_runner.PostTask(FROM_HERE, base::BindOnce(&ThreeTasksTest::TaskB, base::Unretained(this))); } void TaskB() { TaskTrace task_trace; EXPECT_FALSE(task_trace.empty()); base::span addresses = task_trace.AddressesForTesting(); EXPECT_EQ(addresses.size(), 2ul); task_b_address = addresses[0]; EXPECT_EQ(addresses[1], task_a_address); task_runner.PostTask(FROM_HERE, base::BindOnce(&ThreeTasksTest::TaskC, base::Unretained(this))); } void TaskC() { TaskTrace task_trace; EXPECT_FALSE(task_trace.empty()); base::span addresses = task_trace.AddressesForTesting(); EXPECT_EQ(addresses.size(), 3ul); EXPECT_EQ(addresses[1], task_b_address); EXPECT_EQ(addresses[2], task_a_address); } private: base::test::TaskEnvironment task_environment; base::SingleThreadTaskRunner& task_runner = *task_environment.GetMainThreadTaskRunner(); raw_ptr task_a_address = nullptr; raw_ptr task_b_address = nullptr; }; TEST(TaskTraceTest, ThreeTasks) { ThreeTasksTest().Run(); } } // namespace debug } // namespace base