aw_background_tracing_metrics_provider_unittest.cc 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. // Copyright 2022 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "android_webview/browser/tracing/aw_background_tracing_metrics_provider.h"
  5. #include <utility>
  6. #include "base/bind.h"
  7. #include "components/tracing/common/trace_startup_config.h"
  8. #include "content/public/browser/background_tracing_config.h"
  9. #include "content/public/browser/background_tracing_manager.h"
  10. #include "content/public/browser/content_browser_client.h"
  11. #include "content/public/common/content_client.h"
  12. #include "content/public/test/browser_task_environment.h"
  13. #include "testing/gtest/include/gtest/gtest.h"
  14. #include "third_party/metrics_proto/chrome_user_metrics_extension.pb.h"
  15. #include "third_party/metrics_proto/trace_log.pb.h"
  16. namespace tracing {
  17. namespace {
  18. const char kDummyTrace[] = "Trace bytes as serialized proto";
  19. } // namespace
  20. class AwBackgroundTracingMetricsProviderTest : public testing::Test {
  21. public:
  22. AwBackgroundTracingMetricsProviderTest() {
  23. content::SetContentClient(&content_client_);
  24. content::SetBrowserClientForTesting(&browser_client_);
  25. }
  26. ~AwBackgroundTracingMetricsProviderTest() override {
  27. content::SetBrowserClientForTesting(nullptr);
  28. content::SetContentClient(nullptr);
  29. }
  30. void SetUp() override {
  31. base::Value::Dict dict;
  32. ;
  33. dict.Set("mode", "REACTIVE_TRACING_MODE");
  34. dict.Set("custom_categories",
  35. tracing::TraceStartupConfig::kDefaultStartupCategories);
  36. base::Value::List rules_list;
  37. {
  38. base::Value::Dict rules_dict;
  39. rules_dict.Set("rule", "MONITOR_AND_DUMP_WHEN_TRIGGER_NAMED");
  40. rules_dict.Set("trigger_name", "test");
  41. rules_list.Append(std::move(rules_dict));
  42. }
  43. dict.Set("configs", std::move(rules_list));
  44. std::unique_ptr<content::BackgroundTracingConfig> config(
  45. content::BackgroundTracingConfig::FromDict(std::move(dict)));
  46. ASSERT_TRUE(config);
  47. ASSERT_TRUE(
  48. content::BackgroundTracingManager::GetInstance().SetActiveScenario(
  49. std::move(config),
  50. content::BackgroundTracingManager::ANONYMIZE_DATA));
  51. }
  52. private:
  53. content::BrowserTaskEnvironment task_environment_;
  54. content::ContentClient content_client_;
  55. content::ContentBrowserClient browser_client_;
  56. };
  57. TEST_F(AwBackgroundTracingMetricsProviderTest, NoTraceData) {
  58. AwBackgroundTracingMetricsProvider provider;
  59. ASSERT_FALSE(provider.HasIndependentMetrics());
  60. }
  61. TEST_F(AwBackgroundTracingMetricsProviderTest, UploadsTraceLog) {
  62. AwBackgroundTracingMetricsProvider provider;
  63. EXPECT_FALSE(provider.HasIndependentMetrics());
  64. content::BackgroundTracingManager::GetInstance().SetTraceToUploadForTesting(
  65. std::make_unique<std::string>(kDummyTrace));
  66. EXPECT_TRUE(provider.HasIndependentMetrics());
  67. metrics::ChromeUserMetricsExtension uma_proto;
  68. uma_proto.set_client_id(100);
  69. uma_proto.set_session_id(15);
  70. provider.ProvideIndependentMetrics(
  71. base::BindOnce([](bool success) { EXPECT_TRUE(success); }), &uma_proto,
  72. /* snapshot_manager=*/nullptr);
  73. EXPECT_EQ(100u, uma_proto.client_id());
  74. EXPECT_EQ(15, uma_proto.session_id());
  75. ASSERT_EQ(1, uma_proto.trace_log_size());
  76. EXPECT_EQ(kDummyTrace, uma_proto.trace_log(0).raw_data());
  77. EXPECT_FALSE(provider.HasIndependentMetrics());
  78. }
  79. TEST_F(AwBackgroundTracingMetricsProviderTest, ClearsAppPackageName) {
  80. AwBackgroundTracingMetricsProvider provider;
  81. EXPECT_FALSE(provider.HasIndependentMetrics());
  82. content::BackgroundTracingManager::GetInstance().SetTraceToUploadForTesting(
  83. std::make_unique<std::string>(kDummyTrace));
  84. EXPECT_TRUE(provider.HasIndependentMetrics());
  85. metrics::ChromeUserMetricsExtension uma_proto;
  86. uma_proto.mutable_system_profile()->set_app_package_name("my_app");
  87. provider.ProvideIndependentMetrics(
  88. base::BindOnce([](bool success) { EXPECT_TRUE(success); }), &uma_proto,
  89. /* snapshot_manager=*/nullptr);
  90. EXPECT_TRUE(uma_proto.system_profile().app_package_name().empty());
  91. ASSERT_EQ(1, uma_proto.trace_log_size());
  92. EXPECT_EQ(kDummyTrace, uma_proto.trace_log(0).raw_data());
  93. EXPECT_FALSE(provider.HasIndependentMetrics());
  94. }
  95. TEST_F(AwBackgroundTracingMetricsProviderTest, HandlesMissingTrace) {
  96. AwBackgroundTracingMetricsProvider provider;
  97. EXPECT_FALSE(provider.HasIndependentMetrics());
  98. content::BackgroundTracingManager::GetInstance().SetTraceToUploadForTesting(
  99. std::make_unique<std::string>(kDummyTrace));
  100. EXPECT_TRUE(provider.HasIndependentMetrics());
  101. content::BackgroundTracingManager::GetInstance().SetTraceToUploadForTesting(
  102. nullptr);
  103. metrics::ChromeUserMetricsExtension uma_proto;
  104. uma_proto.set_client_id(100);
  105. uma_proto.set_session_id(15);
  106. provider.ProvideIndependentMetrics(
  107. base::BindOnce([](bool success) { EXPECT_FALSE(success); }), &uma_proto,
  108. /* snapshot_manager=*/nullptr);
  109. EXPECT_EQ(100u, uma_proto.client_id());
  110. EXPECT_EQ(15, uma_proto.session_id());
  111. EXPECT_EQ(0, uma_proto.trace_log_size());
  112. EXPECT_FALSE(provider.HasIndependentMetrics());
  113. }
  114. } // namespace tracing