aw_metrics_service_client_unittest.cc 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  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_metrics_service_client.h"
  5. #include <memory>
  6. #include "android_webview/common/aw_features.h"
  7. #include "android_webview/common/metrics/app_package_name_logging_rule.h"
  8. #include "base/metrics/histogram.h"
  9. #include "base/metrics/user_metrics.h"
  10. #include "base/test/metrics/histogram_tester.h"
  11. #include "base/test/scoped_feature_list.h"
  12. #include "base/test/task_environment.h"
  13. #include "base/test/test_simple_task_runner.h"
  14. #include "base/time/time.h"
  15. #include "base/version.h"
  16. #include "components/embedder_support/android/metrics/android_metrics_service_client.h"
  17. #include "components/metrics/metrics_switches.h"
  18. #include "components/prefs/testing_pref_service.h"
  19. #include "content/public/test/browser_task_environment.h"
  20. #include "content/public/test/test_content_client_initializer.h"
  21. #include "testing/gtest/include/gtest/gtest.h"
  22. namespace android_webview {
  23. using AppPackageNameLoggingRuleStatus =
  24. AwMetricsServiceClient::AppPackageNameLoggingRuleStatus;
  25. using InstallerPackageType =
  26. metrics::AndroidMetricsServiceClient::InstallerPackageType;
  27. namespace {
  28. constexpr char kTestAllowlistVersion[] = "123.456.789.10";
  29. class AwMetricsServiceClientTestDelegate
  30. : public AwMetricsServiceClient::Delegate {
  31. void RegisterAdditionalMetricsProviders(
  32. metrics::MetricsService* service) override {}
  33. void AddWebViewAppStateObserver(WebViewAppStateObserver* observer) override {}
  34. bool HasAwContentsEverCreated() const override { return false; }
  35. };
  36. // Adds support for setting whether metric reporting is in sample.
  37. class AwMetricsServiceTestClient : public AwMetricsServiceClient {
  38. public:
  39. explicit AwMetricsServiceTestClient(std::unique_ptr<Delegate> delegate)
  40. : AwMetricsServiceClient(std::move(delegate)) {}
  41. void SetInSample(bool in_sample) { in_sample_ = in_sample; }
  42. protected:
  43. bool IsInSample() const override { return in_sample_; }
  44. private:
  45. bool in_sample_ = false;
  46. };
  47. class AwMetricsServiceClientTest : public testing::Test {
  48. AwMetricsServiceClientTest& operator=(const AwMetricsServiceClientTest&) =
  49. delete;
  50. AwMetricsServiceClientTest(AwMetricsServiceClientTest&&) = delete;
  51. AwMetricsServiceClientTest& operator=(AwMetricsServiceClientTest&&) = delete;
  52. protected:
  53. AwMetricsServiceClientTest()
  54. : task_runner_(new base::TestSimpleTaskRunner),
  55. prefs_(std::make_unique<TestingPrefServiceSimple>()),
  56. client_(std::make_unique<AwMetricsServiceTestClient>(
  57. std::make_unique<AwMetricsServiceClientTestDelegate>())) {
  58. // Required by MetricsService.
  59. base::SetRecordActionTaskRunner(task_runner_);
  60. AwMetricsServiceTestClient::RegisterMetricsPrefs(prefs_->registry());
  61. client_->Initialize(prefs_.get());
  62. }
  63. AwMetricsServiceTestClient* GetClient() { return client_.get(); }
  64. TestingPrefServiceSimple* GetPrefs() { return prefs_.get(); }
  65. void TriggerDelayedRecordAppDataDirectorySize() {
  66. task_environment_.FastForwardBy(kRecordAppDataDirectorySizeDelay);
  67. }
  68. private:
  69. // Needed since starting metrics reporting triggers code that uses content::
  70. // objects.
  71. content::TestContentClientInitializer test_content_initializer_;
  72. // Needed since starting metrics reporting triggers code that expects to be
  73. // running on the browser UI thread. Also needed for its FastForwardBy method.
  74. content::BrowserTaskEnvironment task_environment_{
  75. base::test::TaskEnvironment::TimeSource::MOCK_TIME};
  76. scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
  77. std::unique_ptr<TestingPrefServiceSimple> prefs_;
  78. std::unique_ptr<AwMetricsServiceTestClient> client_;
  79. };
  80. } // namespace
  81. TEST_F(AwMetricsServiceClientTest, TestShouldRecordPackageName_CacheNotSet) {
  82. base::HistogramTester histogram_tester;
  83. AwMetricsServiceClient* client = GetClient();
  84. EXPECT_FALSE(client->ShouldRecordPackageName());
  85. EXPECT_FALSE(client->GetCachedAppPackageNameLoggingRule().has_value());
  86. histogram_tester.ExpectTotalCount(
  87. "Android.WebView.Metrics.PackagesAllowList.ResultReceivingDelay", 0);
  88. histogram_tester.ExpectBucketCount(
  89. "Android.WebView.Metrics.PackagesAllowList.RecordStatus",
  90. AppPackageNameLoggingRuleStatus::kNotLoadedNoCache, 1);
  91. histogram_tester.ExpectTotalCount(
  92. "Android.WebView.Metrics.PackagesAllowList.RecordStatus", 1);
  93. }
  94. TEST_F(AwMetricsServiceClientTest, TestShouldRecordPackageName_WithCache) {
  95. base::HistogramTester histogram_tester;
  96. AwMetricsServiceClient* client = GetClient();
  97. TestingPrefServiceSimple* prefs = GetPrefs();
  98. auto one_day_from_now = base::Time::Now() + base::Days(1);
  99. AppPackageNameLoggingRule expected_record(
  100. base::Version(kTestAllowlistVersion), one_day_from_now);
  101. prefs->Set(prefs::kMetricsAppPackageNameLoggingRule,
  102. expected_record.ToDictionary());
  103. absl::optional<AppPackageNameLoggingRule> cached_record =
  104. client->GetCachedAppPackageNameLoggingRule();
  105. EXPECT_TRUE(client->ShouldRecordPackageName());
  106. ASSERT_TRUE(cached_record.has_value());
  107. EXPECT_TRUE(expected_record.IsSameAs(cached_record.value()));
  108. histogram_tester.ExpectTotalCount(
  109. "Android.WebView.Metrics.PackagesAllowList.ResultReceivingDelay", 0);
  110. histogram_tester.ExpectBucketCount(
  111. "Android.WebView.Metrics.PackagesAllowList.RecordStatus",
  112. AppPackageNameLoggingRuleStatus::kNotLoadedUseCache, 1);
  113. histogram_tester.ExpectTotalCount(
  114. "Android.WebView.Metrics.PackagesAllowList.RecordStatus", 1);
  115. }
  116. TEST_F(AwMetricsServiceClientTest,
  117. TestShouldRecordPackageName_TestShouldNotRecordPackageName) {
  118. base::HistogramTester histogram_tester;
  119. AwMetricsServiceClient* client = GetClient();
  120. AppPackageNameLoggingRule expected_record(
  121. base::Version(kTestAllowlistVersion), base::Time::Min());
  122. client->SetAppPackageNameLoggingRule(expected_record);
  123. absl::optional<AppPackageNameLoggingRule> cached_record =
  124. client->GetCachedAppPackageNameLoggingRule();
  125. EXPECT_FALSE(client->ShouldRecordPackageName());
  126. ASSERT_TRUE(cached_record.has_value());
  127. EXPECT_TRUE(expected_record.IsSameAs(cached_record.value()));
  128. histogram_tester.ExpectTotalCount(
  129. "Android.WebView.Metrics.PackagesAllowList.ResultReceivingDelay", 1);
  130. histogram_tester.ExpectBucketCount(
  131. "Android.WebView.Metrics.PackagesAllowList.RecordStatus",
  132. AppPackageNameLoggingRuleStatus::kNewVersionLoaded, 1);
  133. histogram_tester.ExpectTotalCount(
  134. "Android.WebView.Metrics.PackagesAllowList.RecordStatus", 1);
  135. }
  136. TEST_F(AwMetricsServiceClientTest,
  137. TestShouldRecordPackageName_TestShouldRecordPackageName) {
  138. base::HistogramTester histogram_tester;
  139. auto one_day_from_now = base::Time::Now() + base::Days(1);
  140. AwMetricsServiceClient* client = GetClient();
  141. AppPackageNameLoggingRule expected_record(
  142. base::Version(kTestAllowlistVersion), one_day_from_now);
  143. client->SetAppPackageNameLoggingRule(expected_record);
  144. absl::optional<AppPackageNameLoggingRule> cached_record =
  145. client->GetCachedAppPackageNameLoggingRule();
  146. EXPECT_TRUE(client->ShouldRecordPackageName());
  147. ASSERT_TRUE(cached_record.has_value());
  148. EXPECT_TRUE(expected_record.IsSameAs(cached_record.value()));
  149. histogram_tester.ExpectTotalCount(
  150. "Android.WebView.Metrics.PackagesAllowList.ResultReceivingDelay", 1);
  151. histogram_tester.ExpectBucketCount(
  152. "Android.WebView.Metrics.PackagesAllowList.RecordStatus",
  153. AppPackageNameLoggingRuleStatus::kNewVersionLoaded, 1);
  154. histogram_tester.ExpectTotalCount(
  155. "Android.WebView.Metrics.PackagesAllowList.RecordStatus", 1);
  156. }
  157. TEST_F(AwMetricsServiceClientTest,
  158. TestShouldRecordPackageName_TestFailureAfterValidResult) {
  159. base::HistogramTester histogram_tester;
  160. auto one_day_from_now = base::Time::Now() + base::Days(1);
  161. AwMetricsServiceClient* client = GetClient();
  162. AppPackageNameLoggingRule expected_record(
  163. base::Version(kTestAllowlistVersion), one_day_from_now);
  164. client->SetAppPackageNameLoggingRule(expected_record);
  165. client->SetAppPackageNameLoggingRule(
  166. absl::optional<AppPackageNameLoggingRule>());
  167. absl::optional<AppPackageNameLoggingRule> cached_record =
  168. client->GetCachedAppPackageNameLoggingRule();
  169. EXPECT_TRUE(client->ShouldRecordPackageName());
  170. ASSERT_TRUE(cached_record.has_value());
  171. EXPECT_TRUE(expected_record.IsSameAs(cached_record.value()));
  172. histogram_tester.ExpectTotalCount(
  173. "Android.WebView.Metrics.PackagesAllowList.ResultReceivingDelay", 1);
  174. histogram_tester.ExpectBucketCount(
  175. "Android.WebView.Metrics.PackagesAllowList.RecordStatus",
  176. AppPackageNameLoggingRuleStatus::kNewVersionFailedUseCache, 1);
  177. histogram_tester.ExpectTotalCount(
  178. "Android.WebView.Metrics.PackagesAllowList.RecordStatus", 1);
  179. }
  180. TEST_F(AwMetricsServiceClientTest, TestShouldRecordPackageName_FailedResult) {
  181. base::HistogramTester histogram_tester;
  182. AwMetricsServiceClient* client = GetClient();
  183. client->SetAppPackageNameLoggingRule(
  184. absl::optional<AppPackageNameLoggingRule>());
  185. EXPECT_FALSE(client->ShouldRecordPackageName());
  186. histogram_tester.ExpectTotalCount(
  187. "Android.WebView.Metrics.PackagesAllowList.ResultReceivingDelay", 0);
  188. histogram_tester.ExpectBucketCount(
  189. "Android.WebView.Metrics.PackagesAllowList.RecordStatus",
  190. AppPackageNameLoggingRuleStatus::kNewVersionFailedNoCache, 1);
  191. histogram_tester.ExpectTotalCount(
  192. "Android.WebView.Metrics.PackagesAllowList.RecordStatus", 1);
  193. }
  194. TEST_F(AwMetricsServiceClientTest, TestShouldRecordPackageName_SameAsCache) {
  195. base::HistogramTester histogram_tester;
  196. AwMetricsServiceClient* client = GetClient();
  197. TestingPrefServiceSimple* prefs = GetPrefs();
  198. AppPackageNameLoggingRule record(base::Version(kTestAllowlistVersion),
  199. base::Time::Now() + base::Days(1));
  200. prefs->Set(prefs::kMetricsAppPackageNameLoggingRule, record.ToDictionary());
  201. client->SetAppPackageNameLoggingRule(record);
  202. EXPECT_TRUE(client->ShouldRecordPackageName());
  203. histogram_tester.ExpectTotalCount(
  204. "Android.WebView.Metrics.PackagesAllowList.ResultReceivingDelay", 0);
  205. histogram_tester.ExpectBucketCount(
  206. "Android.WebView.Metrics.PackagesAllowList.RecordStatus",
  207. AppPackageNameLoggingRuleStatus::kSameVersionAsCache, 1);
  208. histogram_tester.ExpectTotalCount(
  209. "Android.WebView.Metrics.PackagesAllowList.RecordStatus", 1);
  210. }
  211. TEST_F(AwMetricsServiceClientTest, TestGetAppPackageNameIfLoggable) {
  212. class TestClient : public AwMetricsServiceClient {
  213. public:
  214. TestClient()
  215. : AwMetricsServiceClient(
  216. std::make_unique<AwMetricsServiceClientTestDelegate>()) {}
  217. ~TestClient() override = default;
  218. bool ShouldRecordPackageName() override {
  219. return should_record_package_name_;
  220. }
  221. void SetShouldRecordPackageName(bool value) {
  222. should_record_package_name_ = value;
  223. }
  224. InstallerPackageType GetInstallerPackageType() override {
  225. return installer_type_;
  226. }
  227. void SetInstallerPackageType(InstallerPackageType installer_type) {
  228. installer_type_ = installer_type;
  229. }
  230. private:
  231. bool should_record_package_name_;
  232. InstallerPackageType installer_type_;
  233. };
  234. TestClient client;
  235. // Package names of system apps are always loggable even if they are not in
  236. // the allowlist of apps.
  237. client.SetInstallerPackageType(InstallerPackageType::SYSTEM_APP);
  238. client.SetShouldRecordPackageName(false);
  239. EXPECT_FALSE(client.GetAppPackageNameIfLoggable().empty());
  240. client.SetShouldRecordPackageName(true);
  241. EXPECT_FALSE(client.GetAppPackageNameIfLoggable().empty());
  242. // Package names of APPs that are installed by the Play Store are loggable if
  243. // they are in the allowlist of apps.
  244. client.SetInstallerPackageType(InstallerPackageType::GOOGLE_PLAY_STORE);
  245. client.SetShouldRecordPackageName(false);
  246. EXPECT_TRUE(client.GetAppPackageNameIfLoggable().empty());
  247. client.SetShouldRecordPackageName(true);
  248. EXPECT_FALSE(client.GetAppPackageNameIfLoggable().empty());
  249. // Package names of APPs that are not system apps nor installed by the Play
  250. // Store are not loggable.
  251. client.SetInstallerPackageType(InstallerPackageType::OTHER);
  252. client.SetShouldRecordPackageName(false);
  253. EXPECT_TRUE(client.GetAppPackageNameIfLoggable().empty());
  254. client.SetShouldRecordPackageName(true);
  255. EXPECT_TRUE(client.GetAppPackageNameIfLoggable().empty());
  256. }
  257. TEST_F(
  258. AwMetricsServiceClientTest,
  259. TestAppDataDirectorySize_RecordedIfFeatureEnabledConsentGrantedAndInSample) {
  260. base::test::ScopedFeatureList scoped_list;
  261. scoped_list.InitAndEnableFeature(
  262. android_webview::features::kWebViewRecordAppDataDirectorySize);
  263. base::HistogramTester histogram_tester;
  264. GetClient()->SetInSample(true);
  265. GetClient()->SetHaveMetricsConsent(true, true);
  266. TriggerDelayedRecordAppDataDirectorySize();
  267. histogram_tester.ExpectTotalCount("Android.WebView.AppDataDirectory.Size", 1);
  268. histogram_tester.ExpectTotalCount(
  269. "Android.WebView.AppDataDirectory.TimeToComputeSize", 1);
  270. }
  271. TEST_F(AwMetricsServiceClientTest,
  272. TestAppDataDirectorySize_NotRecordedIfFeatureDisabled) {
  273. base::test::ScopedFeatureList scoped_list;
  274. scoped_list.InitAndDisableFeature(
  275. android_webview::features::kWebViewRecordAppDataDirectorySize);
  276. base::HistogramTester histogram_tester;
  277. GetClient()->SetInSample(true);
  278. GetClient()->SetHaveMetricsConsent(true, true);
  279. TriggerDelayedRecordAppDataDirectorySize();
  280. histogram_tester.ExpectTotalCount("Android.WebView.AppDataDirectory,Size", 0);
  281. histogram_tester.ExpectTotalCount(
  282. "Android.WebView.AppDataDirectory.TimeToComputeSize", 0);
  283. }
  284. TEST_F(AwMetricsServiceClientTest,
  285. TestAppDataDirectorySize_NotRecordedIfConsentNotGranted) {
  286. base::test::ScopedFeatureList scoped_list;
  287. scoped_list.InitAndEnableFeature(
  288. android_webview::features::kWebViewRecordAppDataDirectorySize);
  289. base::HistogramTester histogram_tester;
  290. GetClient()->SetInSample(true);
  291. GetClient()->SetHaveMetricsConsent(true, false);
  292. TriggerDelayedRecordAppDataDirectorySize();
  293. histogram_tester.ExpectTotalCount("Android.WebView.AppDataDirectory.Size", 0);
  294. histogram_tester.ExpectTotalCount(
  295. "Android.WebView.AppDataDirectory.TimeToComputeSize", 0);
  296. }
  297. TEST_F(AwMetricsServiceClientTest,
  298. TestAppDataDirectorySize_NotRecordedIfNotInSample) {
  299. base::test::ScopedFeatureList scoped_list;
  300. scoped_list.InitAndEnableFeature(
  301. android_webview::features::kWebViewRecordAppDataDirectorySize);
  302. base::HistogramTester histogram_tester;
  303. GetClient()->SetInSample(false);
  304. GetClient()->SetHaveMetricsConsent(true, true);
  305. TriggerDelayedRecordAppDataDirectorySize();
  306. histogram_tester.ExpectTotalCount("Android.WebView.AppDataDirectory.Size", 0);
  307. histogram_tester.ExpectTotalCount(
  308. "Android.WebView.AppDataDirectory.TimeToComputeSize", 0);
  309. }
  310. } // namespace android_webview