#include "chrome/browser/tracing/chrome_background_tracing_metrics_provider.h"
#include <utility>
#include "base/barrier_closure.h"
#include "base/functional/bind.h"
#include "base/run_loop.h"
#include "base/test/bind.h"
#include "chrome/test/base/scoped_testing_local_state.h"
#include "chrome/test/base/testing_browser_process.h"
#include "content/public/browser/background_tracing_config.h"
#include "content/public/browser/background_tracing_manager.h"
#include "content/public/test/background_tracing_test_support.h"
#include "content/public/test/browser_task_environment.h"
#include "services/tracing/public/cpp/trace_startup_config.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/metrics_proto/chrome_user_metrics_extension.pb.h"
#include "third_party/metrics_proto/trace_log.pb.h"
#include "third_party/zlib/google/compression_utils.h"
#if BUILDFLAG(IS_CHROMEOS_ASH)
#include "chrome/browser/ash/login/demo_mode/demo_session.h"
#include "chrome/browser/metrics/chromeos_system_profile_provider.h"
#include "chromeos/ash/components/login/login_state/login_state.h"
#include "chromeos/ash/components/system/fake_statistics_provider.h"
#include "chromeos/dbus/power/power_manager_client.h"
#include "chromeos/dbus/tpm_manager/tpm_manager_client.h"
#endif
namespace tracing {
namespace {
const char kDummyTrace[] = …;
class TestBackgroundTracingHelper
: public content::BackgroundTracingManager::EnabledStateTestObserver { … };
}
class ChromeBackgroundTracingMetricsProviderTest : public testing::Test { … };
TEST_F(ChromeBackgroundTracingMetricsProviderTest, NoTraceData) { … }
TEST_F(ChromeBackgroundTracingMetricsProviderTest, UploadsTraceLog) { … }
TEST_F(ChromeBackgroundTracingMetricsProviderTest, HandleMissingTrace) { … }
#if BUILDFLAG(IS_CHROMEOS_ASH)
class ChromeBackgroundTracingMetricsProviderChromeOSTest
: public ChromeBackgroundTracingMetricsProviderTest {
public:
void SetUp() override {
ChromeBackgroundTracingMetricsProviderTest::SetUp();
chromeos::PowerManagerClient::InitializeFake();
chromeos::TpmManagerClient::InitializeFake();
ash::DemoSession::SetDemoConfigForTesting(
ash::DemoSession::DemoModeConfig::kNone);
ash::LoginState::Initialize();
}
void TearDown() override {
ChromeBackgroundTracingMetricsProviderTest::TearDown();
ash::LoginState::Shutdown();
ash::DemoSession::ResetDemoConfigForTesting();
chromeos::TpmManagerClient::Shutdown();
chromeos::PowerManagerClient::Shutdown();
}
};
TEST_F(ChromeBackgroundTracingMetricsProviderChromeOSTest, HardwareClass) {
constexpr char kFakeHardwareClass[] = "Fake hardware class";
ash::system::ScopedFakeStatisticsProvider fake_statistics_provider;
fake_statistics_provider.SetMachineStatistic("hardware_class",
kFakeHardwareClass);
auto system_profile_provider =
std::make_unique<ChromeOSSystemProfileProvider>();
ChromeBackgroundTracingMetricsProvider provider(
system_profile_provider.get());
provider.Init();
{
base::RunLoop run_loop;
base::RepeatingClosure barrier =
base::BarrierClosure(2, run_loop.QuitWhenIdleClosure());
provider.AsyncInit(barrier);
system_profile_provider->AsyncInit(barrier);
run_loop.Run();
}
TestBackgroundTracingHelper background_tracing_helper;
content::BackgroundTracingManager::GetInstance().SaveTraceForTesting(
kDummyTrace, "test_scenario", "test_rule", base::Token::CreateRandom());
background_tracing_helper.WaitForTraceSaved();
ASSERT_TRUE(provider.HasIndependentMetrics());
metrics::ChromeUserMetricsExtension uma_proto;
{
base::RunLoop run_loop;
provider.ProvideIndependentMetrics(
base::DoNothing(), base::BindLambdaForTesting([&](bool success) {
EXPECT_TRUE(success);
run_loop.Quit();
}),
&uma_proto,
nullptr);
run_loop.Run();
}
ASSERT_EQ(1, uma_proto.trace_log_size());
const metrics::SystemProfileProto& system_profile =
uma_proto.system_profile();
const metrics::SystemProfileProto::Hardware& hardware =
system_profile.hardware();
EXPECT_EQ(kFakeHardwareClass, hardware.full_hardware_class());
EXPECT_FALSE(provider.HasIndependentMetrics());
}
#endif
}