1 // Copyright 2021 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 #include "base/test/trace_test_utils.h"
5
6 #include "base/no_destructor.h"
7 #include "base/task/sequenced_task_runner.h"
8 #include "base/tracing/perfetto_platform.h"
9 #include "third_party/perfetto/include/perfetto/tracing/core/data_source_config.h"
10
11 namespace base {
12 namespace test {
13 namespace {
14
15 // A proxy task runner which can be dynamically pointed to route tasks into a
16 // different task runner.
17 class RebindableTaskRunner : public base::SequencedTaskRunner {
18 public:
19 RebindableTaskRunner();
20
set_task_runner(scoped_refptr<base::SequencedTaskRunner> task_runner)21 void set_task_runner(scoped_refptr<base::SequencedTaskRunner> task_runner) {
22 task_runner_ = task_runner;
23 }
24
25 // base::SequencedTaskRunner implementation.
26 bool PostDelayedTask(const base::Location& from_here,
27 base::OnceClosure task,
28 base::TimeDelta delay) override;
29 bool PostNonNestableDelayedTask(const base::Location& from_here,
30 base::OnceClosure task,
31 base::TimeDelta delay) override;
32 bool RunsTasksInCurrentSequence() const override;
33
34 private:
35 ~RebindableTaskRunner() override;
36
37 scoped_refptr<base::SequencedTaskRunner> task_runner_;
38 };
39
40 RebindableTaskRunner::RebindableTaskRunner() = default;
41 RebindableTaskRunner::~RebindableTaskRunner() = default;
42
PostDelayedTask(const base::Location & from_here,base::OnceClosure task,base::TimeDelta delay)43 bool RebindableTaskRunner::PostDelayedTask(const base::Location& from_here,
44 base::OnceClosure task,
45 base::TimeDelta delay) {
46 return task_runner_->PostDelayedTask(from_here, std::move(task), delay);
47 }
48
PostNonNestableDelayedTask(const base::Location & from_here,base::OnceClosure task,base::TimeDelta delay)49 bool RebindableTaskRunner::PostNonNestableDelayedTask(
50 const base::Location& from_here,
51 base::OnceClosure task,
52 base::TimeDelta delay) {
53 return task_runner_->PostNonNestableDelayedTask(from_here, std::move(task),
54 delay);
55 }
56
RunsTasksInCurrentSequence() const57 bool RebindableTaskRunner::RunsTasksInCurrentSequence() const {
58 return task_runner_->RunsTasksInCurrentSequence();
59 }
60
GetClientLibTaskRunner()61 RebindableTaskRunner* GetClientLibTaskRunner() {
62 static base::NoDestructor<scoped_refptr<RebindableTaskRunner>> task_runner(
63 MakeRefCounted<RebindableTaskRunner>());
64 return task_runner.get()->get();
65 }
66
67 } // namespace
68
TracingEnvironment()69 TracingEnvironment::TracingEnvironment() {
70 trace_event::TraceLog::GetInstance()->ResetForTesting();
71 }
72
TracingEnvironment(TaskEnvironment & task_environment,scoped_refptr<SequencedTaskRunner> task_runner,tracing::PerfettoPlatform * perfetto_platform)73 TracingEnvironment::TracingEnvironment(
74 TaskEnvironment& task_environment,
75 scoped_refptr<SequencedTaskRunner> task_runner,
76 tracing::PerfettoPlatform* perfetto_platform)
77 : task_environment_(&task_environment) {
78 // Since Perfetto's platform backend can only be initialized once in a
79 // process, we give it a task runner that can outlive the per-test task
80 // environment.
81 auto* client_lib_task_runner = GetClientLibTaskRunner();
82 if (!perfetto_platform->did_start_task_runner())
83 perfetto_platform->StartTaskRunner(client_lib_task_runner);
84 client_lib_task_runner->set_task_runner(std::move(task_runner));
85
86 // Wait for any posted construction tasks to execute.
87 task_environment_->RunUntilIdle();
88 }
89
~TracingEnvironment()90 TracingEnvironment::~TracingEnvironment() {
91 if (task_environment_) {
92 // Wait for any posted destruction tasks to execute.
93 task_environment_->RunUntilIdle();
94 }
95 perfetto::Tracing::ResetForTesting();
96 }
97
98 // static
GetDefaultTraceConfig()99 perfetto::protos::gen::TraceConfig TracingEnvironment::GetDefaultTraceConfig() {
100 perfetto::protos::gen::TraceConfig trace_config;
101 auto* buffer_config = trace_config.add_buffers();
102 buffer_config->set_size_kb(32 * 1024);
103 auto* data_source = trace_config.add_data_sources();
104 auto* source_config = data_source->mutable_config();
105 source_config->set_name("track_event");
106 source_config->set_target_buffer(0);
107 return trace_config;
108 }
109
110 } // namespace test
111 } // namespace base
112