// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef BASE_TEST_TRACE_TEST_UTILS_H_
#define BASE_TEST_TRACE_TEST_UTILS_H_

#include "base/memory/raw_ptr.h"
#include "base/task/thread_pool.h"
#include "base/test/task_environment.h"
#include "base/trace_event/trace_log.h"
#include "third_party/perfetto/protos/perfetto/config/trace_config.gen.h"

namespace base {
namespace tracing {
class PerfettoPlatform;
}

namespace test {

// A scoped class that sets up and tears down tracing support for unit tests.
// Note that only in-process tracing is supported by this harness. See
// //services/tracing for recording traces in multiprocess configurations.
class TracingEnvironment {
 public:
  // Construct a tracing environment using the default Perfetto tracing
  // platform.
  TracingEnvironment();

  // Constructs a tracing environment with the given task runner and Perfetto
  // tracing platform.
  explicit TracingEnvironment(TaskEnvironment&,
                              scoped_refptr<SequencedTaskRunner> =
                                  ThreadPool::CreateSequencedTaskRunner({}),
                              base::tracing::PerfettoPlatform* = nullptr);
  ~TracingEnvironment();

  // Builds a default Perfetto trace config with track events enabled.
  static perfetto::protos::gen::TraceConfig GetDefaultTraceConfig();

 private:
  raw_ptr<TaskEnvironment> task_environment_ = nullptr;
};

}  // namespace test
}  // namespace base

#endif  // BASE_TEST_TRACE_TEST_UTILS_H_
