Avi Drissman | e4622aa | 2022-09-08 20:36:06 | [diff] [blame] | 1 | // Copyright 2019 The Chromium Authors |
Alan Cutter | 9b0e1ab | 2019-03-21 04:22:16 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #include "base/debug/task_trace.h" |
| 6 | |
| 7 | #include <ostream> |
| 8 | |
Keishi Hattori | 0e45c02 | 2021-11-27 09:25:52 | [diff] [blame] | 9 | #include "base/memory/raw_ptr.h" |
Ali Hijazi | a887789 | 2022-11-10 20:51:03 | [diff] [blame] | 10 | #include "base/memory/raw_ref.h" |
Alan Cutter | 9b0e1ab | 2019-03-21 04:22:16 | [diff] [blame] | 11 | #include "base/run_loop.h" |
Sean Maher | e672a66 | 2023-01-09 21:42:28 | [diff] [blame] | 12 | #include "base/task/single_thread_task_runner.h" |
Guido Urdaneta | ef4e9194 | 2020-11-09 15:06:24 | [diff] [blame] | 13 | #include "base/test/bind.h" |
Gabriel Charette | c710874 | 2019-08-23 03:31:40 | [diff] [blame] | 14 | #include "base/test/task_environment.h" |
Alan Cutter | 9b0e1ab | 2019-03-21 04:22:16 | [diff] [blame] | 15 | #include "testing/gtest/include/gtest/gtest.h" |
| 16 | |
Peter Kasting | 811504a7 | 2025-01-09 03:18:50 | [diff] [blame] | 17 | namespace base::debug { |
Alan Cutter | 9b0e1ab | 2019-03-21 04:22:16 | [diff] [blame] | 18 | |
| 19 | TEST(TaskTraceTest, NoTask) { |
| 20 | TaskTrace task_trace; |
| 21 | EXPECT_TRUE(task_trace.empty()); |
Mark Brand | 82fbec84 | 2023-01-18 15:39:46 | [diff] [blame] | 22 | std::array<const void*, 4> addresses = {0}; |
| 23 | EXPECT_EQ(task_trace.GetAddresses(addresses), 0ul); |
Alan Cutter | 9b0e1ab | 2019-03-21 04:22:16 | [diff] [blame] | 24 | } |
| 25 | |
| 26 | class ThreeTasksTest { |
| 27 | public: |
Sorin Jianu | 1ed1f6c | 2024-09-28 00:31:40 | [diff] [blame] | 28 | ThreeTasksTest() = default; |
Alan Cutter | 9b0e1ab | 2019-03-21 04:22:16 | [diff] [blame] | 29 | |
| 30 | void Run() { |
Ali Hijazi | a887789 | 2022-11-10 20:51:03 | [diff] [blame] | 31 | task_runner->PostTask(FROM_HERE, base::BindOnce(&ThreeTasksTest::TaskA, |
| 32 | base::Unretained(this))); |
Alan Cutter | 9b0e1ab | 2019-03-21 04:22:16 | [diff] [blame] | 33 | task_environment.RunUntilIdle(); |
| 34 | } |
| 35 | |
| 36 | void TaskA() { |
| 37 | TaskTrace task_trace; |
| 38 | EXPECT_FALSE(task_trace.empty()); |
Mark Brand | 82fbec84 | 2023-01-18 15:39:46 | [diff] [blame] | 39 | std::array<const void*, 4> addresses = {0}; |
| 40 | EXPECT_EQ(task_trace.GetAddresses(addresses), 1ul); |
Alan Cutter | 9b0e1ab | 2019-03-21 04:22:16 | [diff] [blame] | 41 | task_a_address = addresses[0]; |
Ali Hijazi | a887789 | 2022-11-10 20:51:03 | [diff] [blame] | 42 | task_runner->PostTask(FROM_HERE, base::BindOnce(&ThreeTasksTest::TaskB, |
| 43 | base::Unretained(this))); |
Alan Cutter | 9b0e1ab | 2019-03-21 04:22:16 | [diff] [blame] | 44 | } |
| 45 | |
| 46 | void TaskB() { |
| 47 | TaskTrace task_trace; |
| 48 | EXPECT_FALSE(task_trace.empty()); |
Mark Brand | 82fbec84 | 2023-01-18 15:39:46 | [diff] [blame] | 49 | std::array<const void*, 4> addresses = {0}; |
| 50 | EXPECT_EQ(task_trace.GetAddresses(addresses), 2ul); |
Alan Cutter | 9b0e1ab | 2019-03-21 04:22:16 | [diff] [blame] | 51 | task_b_address = addresses[0]; |
| 52 | EXPECT_EQ(addresses[1], task_a_address); |
Ali Hijazi | a887789 | 2022-11-10 20:51:03 | [diff] [blame] | 53 | task_runner->PostTask(FROM_HERE, base::BindOnce(&ThreeTasksTest::TaskC, |
| 54 | base::Unretained(this))); |
Alan Cutter | 9b0e1ab | 2019-03-21 04:22:16 | [diff] [blame] | 55 | } |
| 56 | |
| 57 | void TaskC() { |
| 58 | TaskTrace task_trace; |
| 59 | EXPECT_FALSE(task_trace.empty()); |
Mark Brand | 82fbec84 | 2023-01-18 15:39:46 | [diff] [blame] | 60 | std::array<const void*, 4> addresses; |
| 61 | EXPECT_EQ(task_trace.GetAddresses(addresses), 3ul); |
Alan Cutter | 9b0e1ab | 2019-03-21 04:22:16 | [diff] [blame] | 62 | EXPECT_EQ(addresses[1], task_b_address); |
| 63 | EXPECT_EQ(addresses[2], task_a_address); |
| 64 | } |
| 65 | |
| 66 | private: |
Gabriel Charette | 694c3c33 | 2019-08-19 14:53:05 | [diff] [blame] | 67 | base::test::TaskEnvironment task_environment; |
Ali Hijazi | a887789 | 2022-11-10 20:51:03 | [diff] [blame] | 68 | const raw_ref<base::SingleThreadTaskRunner> task_runner{ |
| 69 | *task_environment.GetMainThreadTaskRunner()}; |
Alan Cutter | 9b0e1ab | 2019-03-21 04:22:16 | [diff] [blame] | 70 | |
Keishi Hattori | 0e45c02 | 2021-11-27 09:25:52 | [diff] [blame] | 71 | raw_ptr<const void> task_a_address = nullptr; |
| 72 | raw_ptr<const void> task_b_address = nullptr; |
Alan Cutter | 9b0e1ab | 2019-03-21 04:22:16 | [diff] [blame] | 73 | }; |
| 74 | |
| 75 | TEST(TaskTraceTest, ThreeTasks) { |
| 76 | ThreeTasksTest().Run(); |
| 77 | } |
| 78 | |
Peter Kasting | 811504a7 | 2025-01-09 03:18:50 | [diff] [blame] | 79 | } // namespace base::debug |