aw_component_metrics_provider_delegate_unittests.cc 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. // Copyright 2021 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/metrics/aw_component_metrics_provider_delegate.h"
  5. #include <memory>
  6. #include <string>
  7. #include <utility>
  8. #include <vector>
  9. #include "android_webview/browser/lifecycle/webview_app_state_observer.h"
  10. #include "android_webview/browser/metrics/aw_metrics_service_client.h"
  11. #include "android_webview/common/components/aw_apps_package_names_allowlist_component_utils.h"
  12. #include "android_webview/common/metrics/app_package_name_logging_rule.h"
  13. #include "base/memory/scoped_refptr.h"
  14. #include "base/test/test_simple_task_runner.h"
  15. #include "base/time/time.h"
  16. #include "base/version.h"
  17. #include "components/component_updater/android/components_info_holder.h"
  18. #include "components/component_updater/component_updater_service.h"
  19. #include "components/metrics/component_metrics_provider.h"
  20. #include "components/metrics/metrics_service.h"
  21. #include "components/prefs/testing_pref_service.h"
  22. #include "testing/gtest/include/gtest/gtest.h"
  23. #include "third_party/metrics_proto/system_profile.pb.h"
  24. using component_updater::ComponentInfo;
  25. namespace android_webview {
  26. namespace {
  27. class AwMetricsServiceClientTestDelegate
  28. : public AwMetricsServiceClient::Delegate {
  29. void RegisterAdditionalMetricsProviders(
  30. metrics::MetricsService* service) override {}
  31. void AddWebViewAppStateObserver(WebViewAppStateObserver* observer) override {}
  32. bool HasAwContentsEverCreated() const override { return false; }
  33. };
  34. class AwComponentMetricsProviderDelegateTest : public testing::Test {
  35. protected:
  36. AwComponentMetricsProviderDelegateTest()
  37. : task_runner_(new base::TestSimpleTaskRunner),
  38. prefs_(std::make_unique<TestingPrefServiceSimple>()),
  39. client_(std::make_unique<AwMetricsServiceClient>(
  40. std::make_unique<AwMetricsServiceClientTestDelegate>())) {
  41. // Required by MetricsService.
  42. base::SetRecordActionTaskRunner(task_runner_);
  43. AwMetricsServiceClient::RegisterMetricsPrefs(prefs_->registry());
  44. client_->Initialize(prefs_.get());
  45. }
  46. AwMetricsServiceClient* GetClient() { return client_.get(); }
  47. private:
  48. scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
  49. std::unique_ptr<TestingPrefServiceSimple> prefs_;
  50. std::unique_ptr<AwMetricsServiceClient> client_;
  51. };
  52. } // namespace
  53. TEST_F(AwComponentMetricsProviderDelegateTest,
  54. TestAppsPackageNamesComponent_NotLoaded) {
  55. metrics::ComponentMetricsProvider provider(
  56. std::make_unique<AwComponentMetricsProviderDelegate>(GetClient()));
  57. metrics::SystemProfileProto system_profile;
  58. provider.ProvideSystemProfileMetrics(&system_profile);
  59. EXPECT_TRUE(system_profile.chrome_component().empty());
  60. }
  61. TEST_F(AwComponentMetricsProviderDelegateTest,
  62. TestAppsPackageNamesComponent_Loaded) {
  63. metrics::ComponentMetricsProvider provider(
  64. std::make_unique<AwComponentMetricsProviderDelegate>(GetClient()));
  65. std::string allowlist_version = "123.456.78.9";
  66. GetClient()->SetAppPackageNameLoggingRule(AppPackageNameLoggingRule(
  67. base::Version(allowlist_version), base::Time::Now()));
  68. metrics::SystemProfileProto system_profile;
  69. provider.ProvideSystemProfileMetrics(&system_profile);
  70. ASSERT_EQ(1, system_profile.chrome_component().size());
  71. metrics::SystemProfileProto::ChromeComponent allowlist_component =
  72. system_profile.chrome_component()[0];
  73. EXPECT_EQ(
  74. metrics::
  75. SystemProfileProto_ComponentId_WEBVIEW_APPS_PACKAGE_NAMES_ALLOWLIST,
  76. allowlist_component.component_id());
  77. EXPECT_EQ(allowlist_version, allowlist_component.version());
  78. }
  79. TEST_F(AwComponentMetricsProviderDelegateTest,
  80. TestAppsPackageNamesComponent_CachedIsDifferentFromLoaded) {
  81. metrics::ComponentMetricsProvider provider(
  82. std::make_unique<AwComponentMetricsProviderDelegate>(GetClient()));
  83. std::string allowlist_version = "123.456.78.9";
  84. GetClient()->SetAppPackageNameLoggingRule(AppPackageNameLoggingRule(
  85. base::Version(allowlist_version), base::Time::Now()));
  86. component_updater::ComponentsInfoHolder::GetInstance()->AddComponent(
  87. kWebViewAppsPackageNamesAllowlistComponentId,
  88. base::Version("222.333.444.555"));
  89. metrics::SystemProfileProto system_profile;
  90. provider.ProvideSystemProfileMetrics(&system_profile);
  91. ASSERT_EQ(1, system_profile.chrome_component().size());
  92. metrics::SystemProfileProto::ChromeComponent allowlist_component =
  93. system_profile.chrome_component()[0];
  94. EXPECT_EQ(
  95. metrics::
  96. SystemProfileProto_ComponentId_WEBVIEW_APPS_PACKAGE_NAMES_ALLOWLIST,
  97. allowlist_component.component_id());
  98. EXPECT_EQ(allowlist_version, allowlist_component.version());
  99. }
  100. TEST_F(AwComponentMetricsProviderDelegateTest, TestMultipleComponents) {
  101. AwComponentMetricsProviderDelegate delegate(GetClient());
  102. std::string fake_component_id = "abcdefgh";
  103. base::Version fake_component_version("123.456.78.9");
  104. component_updater::ComponentsInfoHolder::GetInstance()->AddComponent(
  105. fake_component_id, fake_component_version);
  106. component_updater::ComponentsInfoHolder::GetInstance()->AddComponent(
  107. kWebViewAppsPackageNamesAllowlistComponentId,
  108. base::Version("222.333.444.555"));
  109. std::vector<ComponentInfo> components = delegate.GetComponents();
  110. ASSERT_EQ(1u, components.size());
  111. EXPECT_EQ(fake_component_id, components[0].id);
  112. EXPECT_EQ(fake_component_version, components[0].version);
  113. }
  114. } // namespace android_webview