Files
brave-core/components/p3a_utils/feature_usage_unittest.cc
T

299 lines
12 KiB
C++

// Copyright (c) 2022 The Brave Authors. All rights reserved.
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
// you can obtain one at http://mozilla.org/MPL/2.0/.
#include "brave/components/p3a_utils/feature_usage.h"
#include "base/test/metrics/histogram_tester.h"
#include "components/prefs/testing_pref_service.h"
#include "content/public/test/browser_task_environment.h"
namespace p3a_utils {
constexpr char kFirstUsagePrefName[] = "brave.feature_usage.first_use";
constexpr char kLastUsagePrefName[] = "brave.feature_usage.last_use";
constexpr char kUsedSecondDayPrefName[] = "brave.feature_usage.used_second_day";
constexpr char kDaysInMonthPrefName[] = "brave.feature_usage.days_in_month";
constexpr char kDaysInWeekPrefName[] = "brave.feature_usage.days_in_week";
constexpr char kNewUserReturningHistogramName[] =
"Brave.Feature.NewUserReturning";
constexpr char kDaysInMonthHistogramName[] = "Brave.Feature.DaysInMonth";
constexpr char kDaysInWeekHistogramName[] = "Brave.Feature.DaysInWeek";
constexpr char kLastUsageTimeHistogramName[] = "Brave.Feature.LastUsageTime";
class FeatureUsageTest : public testing::Test {
public:
FeatureUsageTest()
: task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME) {}
protected:
void SetUp() override {
PrefRegistrySimple* registry = pref_service_.registry();
RegisterFeatureUsagePrefs(registry, kFirstUsagePrefName, kLastUsagePrefName,
kUsedSecondDayPrefName, kDaysInMonthPrefName,
kDaysInWeekPrefName);
task_environment_.AdvanceClock(base::Days(2));
}
void RecordFeatureUsage() {
::p3a_utils::RecordFeatureUsage(&pref_service_, kFirstUsagePrefName,
kLastUsagePrefName);
}
void RecordFeatureNewUserReturning() {
::p3a_utils::RecordFeatureNewUserReturning(
&pref_service_, kFirstUsagePrefName, kLastUsagePrefName,
kUsedSecondDayPrefName, kNewUserReturningHistogramName);
}
void RecordFeatureDaysInMonthUsed(bool is_add) {
::p3a_utils::RecordFeatureDaysInMonthUsed(
&pref_service_, is_add, kLastUsagePrefName, kDaysInMonthPrefName,
kDaysInMonthHistogramName);
}
void RecordFeatureDaysInWeekUsed(bool is_add) {
::p3a_utils::RecordFeatureDaysInWeekUsed(
&pref_service_, is_add, kDaysInWeekPrefName, kDaysInWeekHistogramName);
}
void RecordFeatureLastUsageTimeMetric() {
::p3a_utils::RecordFeatureLastUsageTimeMetric(
&pref_service_, kLastUsagePrefName, kLastUsageTimeHistogramName);
}
void RecordFeatureLastUsageTimeMetricSingleMonth() {
::p3a_utils::RecordFeatureLastUsageTimeMetric(
&pref_service_, kLastUsagePrefName, kLastUsageTimeHistogramName, true);
}
content::BrowserTaskEnvironment task_environment_;
base::HistogramTester histogram_tester_;
private:
TestingPrefServiceSimple pref_service_;
};
TEST_F(FeatureUsageTest, TestLastUsageTime) {
RecordFeatureLastUsageTimeMetric();
// Should not report if News was never used
histogram_tester_.ExpectTotalCount(kLastUsageTimeHistogramName, 0);
RecordFeatureUsage();
RecordFeatureLastUsageTimeMetric();
histogram_tester_.ExpectTotalCount(kLastUsageTimeHistogramName, 1);
histogram_tester_.ExpectBucketCount(kLastUsageTimeHistogramName, 1, 1);
task_environment_.AdvanceClock(base::Days(7));
RecordFeatureLastUsageTimeMetric();
histogram_tester_.ExpectTotalCount(kLastUsageTimeHistogramName, 2);
histogram_tester_.ExpectBucketCount(kLastUsageTimeHistogramName, 2, 1);
task_environment_.AdvanceClock(base::Days(7));
RecordFeatureLastUsageTimeMetric();
histogram_tester_.ExpectTotalCount(kLastUsageTimeHistogramName, 3);
histogram_tester_.ExpectBucketCount(kLastUsageTimeHistogramName, 3, 1);
RecordFeatureUsage();
RecordFeatureLastUsageTimeMetric();
histogram_tester_.ExpectTotalCount(kLastUsageTimeHistogramName, 4);
histogram_tester_.ExpectBucketCount(kLastUsageTimeHistogramName, 1, 2);
task_environment_.AdvanceClock(base::Days(21));
RecordFeatureLastUsageTimeMetric();
histogram_tester_.ExpectTotalCount(kLastUsageTimeHistogramName, 5);
histogram_tester_.ExpectBucketCount(kLastUsageTimeHistogramName, 4, 1);
task_environment_.AdvanceClock(base::Days(7));
RecordFeatureLastUsageTimeMetric();
histogram_tester_.ExpectTotalCount(kLastUsageTimeHistogramName, 6);
histogram_tester_.ExpectBucketCount(kLastUsageTimeHistogramName, 5, 1);
task_environment_.AdvanceClock(base::Days(33));
RecordFeatureLastUsageTimeMetric();
histogram_tester_.ExpectTotalCount(kLastUsageTimeHistogramName, 7);
histogram_tester_.ExpectBucketCount(kLastUsageTimeHistogramName, 6, 1);
task_environment_.AdvanceClock(base::Days(90));
RecordFeatureLastUsageTimeMetric();
histogram_tester_.ExpectTotalCount(kLastUsageTimeHistogramName, 8);
histogram_tester_.ExpectBucketCount(kLastUsageTimeHistogramName, 6, 2);
}
TEST_F(FeatureUsageTest, TestLastUsageTimeSingleMonth) {
RecordFeatureLastUsageTimeMetricSingleMonth();
// Should not report if News was never used
histogram_tester_.ExpectTotalCount(kLastUsageTimeHistogramName, 0);
RecordFeatureUsage();
RecordFeatureLastUsageTimeMetricSingleMonth();
histogram_tester_.ExpectTotalCount(kLastUsageTimeHistogramName, 1);
histogram_tester_.ExpectBucketCount(kLastUsageTimeHistogramName, 1, 1);
task_environment_.AdvanceClock(base::Days(7));
RecordFeatureLastUsageTimeMetricSingleMonth();
histogram_tester_.ExpectTotalCount(kLastUsageTimeHistogramName, 2);
histogram_tester_.ExpectBucketCount(kLastUsageTimeHistogramName, 2, 1);
task_environment_.AdvanceClock(base::Days(7));
RecordFeatureLastUsageTimeMetricSingleMonth();
histogram_tester_.ExpectTotalCount(kLastUsageTimeHistogramName, 3);
histogram_tester_.ExpectBucketCount(kLastUsageTimeHistogramName, 3, 1);
RecordFeatureUsage();
RecordFeatureLastUsageTimeMetricSingleMonth();
histogram_tester_.ExpectTotalCount(kLastUsageTimeHistogramName, 4);
histogram_tester_.ExpectBucketCount(kLastUsageTimeHistogramName, 1, 2);
task_environment_.AdvanceClock(base::Days(21));
RecordFeatureLastUsageTimeMetricSingleMonth();
histogram_tester_.ExpectTotalCount(kLastUsageTimeHistogramName, 5);
histogram_tester_.ExpectBucketCount(kLastUsageTimeHistogramName, 4, 1);
task_environment_.AdvanceClock(base::Days(7));
RecordFeatureLastUsageTimeMetricSingleMonth();
histogram_tester_.ExpectTotalCount(kLastUsageTimeHistogramName, 6);
histogram_tester_.ExpectBucketCount(kLastUsageTimeHistogramName, 4, 2);
task_environment_.AdvanceClock(base::Days(2));
RecordFeatureLastUsageTimeMetricSingleMonth();
histogram_tester_.ExpectTotalCount(kLastUsageTimeHistogramName, 7);
histogram_tester_.ExpectBucketCount(kLastUsageTimeHistogramName, 4, 3);
task_environment_.AdvanceClock(base::Days(1));
RecordFeatureLastUsageTimeMetricSingleMonth();
histogram_tester_.ExpectTotalCount(kLastUsageTimeHistogramName, 7);
}
TEST_F(FeatureUsageTest, TestDaysInMonthUsedCount) {
RecordFeatureDaysInMonthUsed(false);
// Should not report if News was never used
histogram_tester_.ExpectTotalCount(kDaysInMonthHistogramName, 0);
RecordFeatureUsage();
RecordFeatureDaysInMonthUsed(true);
histogram_tester_.ExpectBucketCount(kDaysInMonthHistogramName, 1, 1);
task_environment_.AdvanceClock(base::Days(1));
RecordFeatureDaysInMonthUsed(true);
histogram_tester_.ExpectBucketCount(kDaysInMonthHistogramName, 2, 1);
task_environment_.AdvanceClock(base::Days(14));
RecordFeatureDaysInMonthUsed(true);
RecordFeatureDaysInMonthUsed(true);
RecordFeatureDaysInMonthUsed(true);
task_environment_.AdvanceClock(base::Days(1));
RecordFeatureDaysInMonthUsed(true);
RecordFeatureDaysInMonthUsed(true);
RecordFeatureDaysInMonthUsed(true);
histogram_tester_.ExpectTotalCount(kDaysInMonthHistogramName, 8);
histogram_tester_.ExpectBucketCount(kDaysInMonthHistogramName, 3, 6);
task_environment_.AdvanceClock(base::Days(20));
RecordFeatureDaysInMonthUsed(false);
histogram_tester_.ExpectTotalCount(kDaysInMonthHistogramName, 9);
histogram_tester_.ExpectBucketCount(kDaysInMonthHistogramName, 2, 2);
}
TEST_F(FeatureUsageTest, TestDaysInWeekUsedCount) {
histogram_tester_.ExpectTotalCount(kDaysInWeekHistogramName, 0);
RecordFeatureDaysInWeekUsed(true);
histogram_tester_.ExpectUniqueSample(kDaysInWeekHistogramName, 1, 1);
// same day
RecordFeatureDaysInWeekUsed(true);
histogram_tester_.ExpectUniqueSample(kDaysInWeekHistogramName, 1, 2);
task_environment_.AdvanceClock(base::Days(1));
RecordFeatureDaysInWeekUsed(true);
// second day
histogram_tester_.ExpectUniqueSample(kDaysInWeekHistogramName, 1, 3);
task_environment_.AdvanceClock(base::Days(1));
RecordFeatureDaysInWeekUsed(true);
histogram_tester_.ExpectBucketCount(kDaysInWeekHistogramName, 2, 1);
task_environment_.AdvanceClock(base::Days(14));
RecordFeatureDaysInWeekUsed(true);
histogram_tester_.ExpectBucketCount(kDaysInWeekHistogramName, 1, 4);
RecordFeatureDaysInWeekUsed(false);
RecordFeatureDaysInWeekUsed(false);
RecordFeatureDaysInWeekUsed(false);
RecordFeatureDaysInWeekUsed(false);
histogram_tester_.ExpectBucketCount(kDaysInWeekHistogramName, 1, 8);
histogram_tester_.ExpectTotalCount(kDaysInWeekHistogramName, 9);
task_environment_.AdvanceClock(base::Days(14));
RecordFeatureDaysInWeekUsed(false);
histogram_tester_.ExpectTotalCount(kDaysInWeekHistogramName, 9);
}
TEST_F(FeatureUsageTest, TestNewUserReturningFollowingDay) {
RecordFeatureNewUserReturning();
histogram_tester_.ExpectTotalCount(kNewUserReturningHistogramName, 1);
histogram_tester_.ExpectBucketCount(kNewUserReturningHistogramName, 0, 1);
RecordFeatureUsage();
RecordFeatureNewUserReturning();
histogram_tester_.ExpectTotalCount(kNewUserReturningHistogramName, 2);
histogram_tester_.ExpectBucketCount(kNewUserReturningHistogramName, 2, 1);
task_environment_.AdvanceClock(base::Days(1));
RecordFeatureUsage();
RecordFeatureNewUserReturning();
histogram_tester_.ExpectTotalCount(kNewUserReturningHistogramName, 3);
histogram_tester_.ExpectBucketCount(kNewUserReturningHistogramName, 3, 1);
task_environment_.AdvanceClock(base::Days(2));
RecordFeatureUsage();
RecordFeatureNewUserReturning();
histogram_tester_.ExpectTotalCount(kNewUserReturningHistogramName, 4);
histogram_tester_.ExpectBucketCount(kNewUserReturningHistogramName, 3, 2);
task_environment_.AdvanceClock(base::Days(5));
RecordFeatureNewUserReturning();
histogram_tester_.ExpectTotalCount(kNewUserReturningHistogramName, 5);
histogram_tester_.ExpectBucketCount(kNewUserReturningHistogramName, 1, 1);
}
TEST_F(FeatureUsageTest, TestNewUserReturningNotFollowingDay) {
RecordFeatureNewUserReturning();
histogram_tester_.ExpectTotalCount(kNewUserReturningHistogramName, 1);
histogram_tester_.ExpectBucketCount(kNewUserReturningHistogramName, 0, 1);
RecordFeatureUsage();
RecordFeatureNewUserReturning();
histogram_tester_.ExpectTotalCount(kNewUserReturningHistogramName, 2);
histogram_tester_.ExpectBucketCount(kNewUserReturningHistogramName, 2, 1);
task_environment_.AdvanceClock(base::Days(2));
RecordFeatureNewUserReturning();
histogram_tester_.ExpectTotalCount(kNewUserReturningHistogramName, 3);
histogram_tester_.ExpectBucketCount(kNewUserReturningHistogramName, 2, 2);
RecordFeatureUsage();
RecordFeatureNewUserReturning();
histogram_tester_.ExpectTotalCount(kNewUserReturningHistogramName, 4);
histogram_tester_.ExpectBucketCount(kNewUserReturningHistogramName, 4, 1);
task_environment_.AdvanceClock(base::Days(2));
RecordFeatureNewUserReturning();
histogram_tester_.ExpectTotalCount(kNewUserReturningHistogramName, 5);
histogram_tester_.ExpectBucketCount(kNewUserReturningHistogramName, 4, 2);
task_environment_.AdvanceClock(base::Days(4));
RecordFeatureNewUserReturning();
histogram_tester_.ExpectTotalCount(kNewUserReturningHistogramName, 6);
histogram_tester_.ExpectBucketCount(kNewUserReturningHistogramName, 1, 1);
}
} // namespace p3a_utils