#include <thread>
#include "base/files/scoped_temp_dir.h"
#include "base/metrics/histogram_macros.h"
#include "base/strings/stringprintf.h"
#include "base/task/common/task_annotator.h"
#include "base/test/test_trace_processor.h"
#include "base/test/trace_test_utils.h"
#include "build/build_config.h"
#include "components/variations/active_field_trials.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/content_browser_test.h"
#include "content/public/test/content_browser_test_utils.h"
#include "services/resource_coordinator/public/cpp/memory_instrumentation/tracing_observer_proto.h"
#include "services/tracing/public/cpp/perfetto/metadata_data_source.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "third_party/perfetto/protos/perfetto/config/chrome/chrome_config.gen.h"
#if BUILDFLAG(IS_POSIX)
#include "base/test/bind.h"
#include "base/test/scoped_feature_list.h"
#include "base/tracing/perfetto_platform.h"
#include "base/tracing/perfetto_task_runner.h"
#include "services/tracing/public/cpp/tracing_features.h"
#include "third_party/perfetto/include/perfetto/ext/tracing/ipc/service_ipc_host.h"
#include "third_party/perfetto/protos/perfetto/common/tracing_service_state.gen.h"
#endif
namespace content {
namespace {
const char kDetailedDumpMode[] = …;
const char kBackgroundDumpMode[] = …;
perfetto::protos::gen::TraceConfig TraceConfigWithHistograms(
const std::string& category_filter_string,
const std::vector<std::string>& histograms) { … }
perfetto::protos::gen::TraceConfig TraceConfigWithMemoryDumps(
const char* mode) { … }
perfetto::protos::gen::TraceConfig TraceConfigWithMetadata(
const std::string& category_filter_string) { … }
perfetto::protos::gen::TraceConfig TraceConfigWithMetadataMultisession(
const std::string& category_filter_string) { … }
}
class TracingEndToEndBrowserTest : public ContentBrowserTest { … };
IN_PROC_BROWSER_TEST_F(TracingEndToEndBrowserTest, SimpleTraceEvent) { … }
IN_PROC_BROWSER_TEST_F(TracingEndToEndBrowserTest, Metadata) { … }
IN_PROC_BROWSER_TEST_F(TracingEndToEndBrowserTest, MetadataMultisession) { … }
IN_PROC_BROWSER_TEST_F(TracingEndToEndBrowserTest, TaskExecutionEvent) { … }
IN_PROC_BROWSER_TEST_F(TracingEndToEndBrowserTest, ThreadAndProcessName) { … }
#if defined(TEST_TRACE_PROCESSOR_ENABLED)
IN_PROC_BROWSER_TEST_F(TracingEndToEndBrowserTest, CorrectSqliteVersion) { … }
#endif
IN_PROC_BROWSER_TEST_F(TracingEndToEndBrowserTest,
MemoryInstrumentationBackground) { … }
IN_PROC_BROWSER_TEST_F(TracingEndToEndBrowserTest,
MemoryInstrumentationDetailed) { … }
#if BUILDFLAG(IS_ANDROID)
IN_PROC_BROWSER_TEST_F(TracingEndToEndBrowserTest,
PackageNameRecordedTraceLogSet) {
base::trace_event::TraceLog::GetInstance()->SetRecordHostAppPackageName(true);
base::test::TestTraceProcessor ttp;
ttp.StartTrace(base::test::DefaultTraceConfig("foo", false),
perfetto::kCustomBackend);
{
TRACE_EVENT("foo", "test_event");
}
absl::Status status = ttp.StopAndParseTrace();
ASSERT_TRUE(status.ok()) << status.message();
std::string query =
"SELECT "
"DISTINCT(EXTRACT_ARG(arg_set_id, \"chrome.host_app_package_name\")) "
"AS name "
"FROM process "
"WHERE "
"EXTRACT_ARG(arg_set_id, \"chrome.host_app_package_name\") IS NOT NULL";
auto result = ttp.RunQuery(query);
ASSERT_TRUE(result.has_value()) << result.error();
EXPECT_THAT(
result.value(),
::testing::ElementsAre(
std::vector<std::string>{"name"},
std::vector<std::string>{"org.chromium.content_browsertests_apk"}));
}
IN_PROC_BROWSER_TEST_F(TracingEndToEndBrowserTest,
PackageNameNotRecordedTraceLogNotSet) {
base::trace_event::TraceLog::GetInstance()->SetRecordHostAppPackageName(
false);
base::test::TestTraceProcessor ttp;
ttp.StartTrace(base::test::DefaultTraceConfig("foo", false),
perfetto::kCustomBackend);
{
TRACE_EVENT("foo", "test_event");
}
absl::Status status = ttp.StopAndParseTrace();
ASSERT_TRUE(status.ok()) << status.message();
std::string query =
"SELECT "
"DISTINCT(EXTRACT_ARG(arg_set_id, \"chrome.host_app_package_name\")) "
"AS name "
"FROM process "
"WHERE "
"EXTRACT_ARG(arg_set_id, \"chrome.host_app_package_name\") IS NOT NULL";
auto result = ttp.RunQuery(query);
ASSERT_TRUE(result.has_value()) << result.error();
EXPECT_THAT(result.value(),
::testing::ElementsAre(std::vector<std::string>{"name"}));
}
#endif
IN_PROC_BROWSER_TEST_F(TracingEndToEndBrowserTest, TwoSessionsSimple) { … }
IN_PROC_BROWSER_TEST_F(TracingEndToEndBrowserTest, TwoSessionsHistograms) { … }
IN_PROC_BROWSER_TEST_F(TracingEndToEndBrowserTest, TwoSessionsProcessNames) { … }
IN_PROC_BROWSER_TEST_F(TracingEndToEndBrowserTest,
TwoSessionsMemoryInstrumentation) { … }
IN_PROC_BROWSER_TEST_F(TracingEndToEndBrowserTest, TwoSessionsMetadata) { … }
#if BUILDFLAG(IS_POSIX)
class SystemTracingEndToEndBrowserTest : public ContentBrowserTest { … };
IN_PROC_BROWSER_TEST_F(SystemTracingEndToEndBrowserTest, SimpleTraceEvent) { … }
#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_MAC)
#define MAYBE_PerformanceMark …
#else
#define MAYBE_PerformanceMark …
#endif
IN_PROC_BROWSER_TEST_F(SystemTracingEndToEndBrowserTest,
MAYBE_PerformanceMark) { … }
#endif
}