blob: ef4b62a278c01d2fdc55161ee95f6b1d97d8067f [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/privacy_sandbox/tracking_protection_onboarding.h"
#include <memory>
#include <optional>
#include <utility>
#include "base/test/metrics/histogram_tester.h"
#include "base/test/metrics/user_action_tester.h"
#include "base/test/scoped_feature_list.h"
#include "base/test/task_environment.h"
#include "base/time/time.h"
#include "components/prefs/testing_pref_service.h"
#include "components/privacy_sandbox/privacy_sandbox_features.h"
#include "components/privacy_sandbox/tracking_protection_prefs.h"
#include "components/version_info/channel.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace privacy_sandbox {
namespace {
using ::privacy_sandbox::tracking_protection::
TrackingProtectionOnboardingStatus;
using ::privacy_sandbox::tracking_protection::
TrackingProtectionOnboardingAckAction;
using NoticeType = ::privacy_sandbox::TrackingProtectionOnboarding::NoticeType;
using NoticeAction =
::privacy_sandbox::TrackingProtectionOnboarding::NoticeAction;
using SentimentSurveyGroup =
::privacy_sandbox::TrackingProtectionOnboarding::SentimentSurveyGroup;
class MockTrackingProtectionObserver
: public TrackingProtectionOnboarding::Observer {
public:
MOCK_METHOD(
void,
OnTrackingProtectionOnboardingUpdated,
(TrackingProtectionOnboarding::OnboardingStatus onboarding_status),
(override));
MOCK_METHOD(void, OnShouldShowNoticeUpdated, (), (override));
MOCK_METHOD(
void,
OnTrackingProtectionSilentOnboardingUpdated,
(TrackingProtectionOnboarding::SilentOnboardingStatus onboarding_status),
(override));
};
class TrackingProtectionOnboardingTest : public testing::Test {
public:
TrackingProtectionOnboardingTest()
: task_env_(base::test::TaskEnvironment::TimeSource::MOCK_TIME) {
tracking_protection::RegisterProfilePrefs(prefs()->registry());
}
void SetUp() override {
tracking_protection_onboarding_service_ =
std::make_unique<TrackingProtectionOnboarding>(
prefs(), version_info::Channel::UNKNOWN);
}
TrackingProtectionOnboarding* tracking_protection_onboarding() {
return tracking_protection_onboarding_service_.get();
}
TestingPrefServiceSimple* prefs() { return &prefs_; }
protected:
base::test::TaskEnvironment task_env_;
TestingPrefServiceSimple prefs_;
std::unique_ptr<TrackingProtectionOnboarding>
tracking_protection_onboarding_service_;
base::HistogramTester histogram_tester_;
base::test::ScopedFeatureList feature_list_;
};
TEST_F(TrackingProtectionOnboardingTest,
OnboardingProfileTriggersOnboardingObservers) {
MockTrackingProtectionObserver observer;
tracking_protection_onboarding()->AddObserver(&observer);
EXPECT_CALL(observer,
OnTrackingProtectionOnboardingUpdated(
TrackingProtectionOnboarding::OnboardingStatus::kOnboarded));
prefs()->SetInteger(
prefs::kTrackingProtectionOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kOnboarded));
testing::Mock::VerifyAndClearExpectations(&observer);
}
TEST_F(TrackingProtectionOnboardingTest,
EligibleProfileTriggersOnboardingObservers) {
MockTrackingProtectionObserver observer;
tracking_protection_onboarding()->AddObserver(&observer);
EXPECT_CALL(observer,
OnTrackingProtectionOnboardingUpdated(
TrackingProtectionOnboarding::OnboardingStatus::kEligible));
prefs()->SetInteger(
prefs::kTrackingProtectionOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kEligible));
testing::Mock::VerifyAndClearExpectations(&observer);
}
TEST_F(TrackingProtectionOnboardingTest,
MarkingAsEligibleTriggersShouldShowNoticeObservers) {
// Setup
MockTrackingProtectionObserver observer;
tracking_protection_onboarding()->AddObserver(&observer);
EXPECT_CALL(observer, OnShouldShowNoticeUpdated()).Times(1);
// Action
tracking_protection_onboarding()->MaybeMarkEligible();
// Verification
testing::Mock::VerifyAndClearExpectations(&observer);
}
TEST_F(TrackingProtectionOnboardingTest,
MarkingAsIneligibleTriggersShouldShowNoticeObservers) {
// Setup
// We start with an eligible profile
tracking_protection_onboarding()->MaybeMarkEligible();
MockTrackingProtectionObserver observer;
tracking_protection_onboarding()->AddObserver(&observer);
EXPECT_CALL(observer, OnShouldShowNoticeUpdated()).Times(1);
// Action
tracking_protection_onboarding()->MaybeMarkIneligible();
// Verification
testing::Mock::VerifyAndClearExpectations(&observer);
}
TEST_F(TrackingProtectionOnboardingTest,
NoticeActionTriggersShouldShowNoticeObservers) {
// Setup
// We start with an eligible profile
tracking_protection_onboarding()->MaybeMarkEligible();
MockTrackingProtectionObserver observer;
tracking_protection_onboarding()->AddObserver(&observer);
EXPECT_CALL(observer, OnShouldShowNoticeUpdated()).Times(1);
// Action
tracking_protection_onboarding()->OnboardingNoticeActionTaken(
TrackingProtectionOnboarding::NoticeAction::kSettings);
// Verification
testing::Mock::VerifyAndClearExpectations(&observer);
}
TEST_F(TrackingProtectionOnboardingTest,
NoticeShownDoesNotTriggerShouldShowNoticeObservers) {
// Setup
// We start with an eligible profile
tracking_protection_onboarding()->MaybeMarkEligible();
MockTrackingProtectionObserver observer;
tracking_protection_onboarding()->AddObserver(&observer);
EXPECT_CALL(observer, OnShouldShowNoticeUpdated()).Times(0);
// Action
tracking_protection_onboarding()->OnboardingNoticeShown();
// Verification
testing::Mock::VerifyAndClearExpectations(&observer);
}
TEST_F(TrackingProtectionOnboardingTest,
MaybeMarkEligibleDoesNothingIfProfileNotIneligible) {
// Setup
prefs()->SetInteger(
prefs::kTrackingProtectionOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kOnboarded));
// Action
tracking_protection_onboarding()->MaybeMarkEligible();
// Verification
EXPECT_EQ(static_cast<TrackingProtectionOnboardingStatus>(prefs()->GetInteger(
prefs::kTrackingProtectionOnboardingStatus)),
TrackingProtectionOnboardingStatus::kOnboarded);
}
TEST_F(TrackingProtectionOnboardingTest,
MaybeMarkEligibleMarksEligibleIfProfileIsIneligible) {
// Setup
prefs()->SetInteger(
prefs::kTrackingProtectionOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kIneligible));
// Action
tracking_protection_onboarding()->MaybeMarkEligible();
// Verification
EXPECT_EQ(static_cast<TrackingProtectionOnboardingStatus>(prefs()->GetInteger(
prefs::kTrackingProtectionOnboardingStatus)),
TrackingProtectionOnboardingStatus::kEligible);
EXPECT_EQ(prefs()->GetTime(prefs::kTrackingProtectionEligibleSince),
base::Time::Now());
}
TEST_F(TrackingProtectionOnboardingTest,
MaybeMarkIneligibleDoesNothingIfProfileNotEligible) {
// Setup
prefs()->SetInteger(
prefs::kTrackingProtectionOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kOnboarded));
// Action
tracking_protection_onboarding()->MaybeMarkIneligible();
// Verification
EXPECT_EQ(static_cast<TrackingProtectionOnboardingStatus>(prefs()->GetInteger(
prefs::kTrackingProtectionOnboardingStatus)),
TrackingProtectionOnboardingStatus::kOnboarded);
}
TEST_F(TrackingProtectionOnboardingTest,
MaybeMarkIneligibleMarksIneligibleIfProfileIsEligible) {
// Setup
prefs()->SetInteger(
prefs::kTrackingProtectionOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kEligible));
// Action
tracking_protection_onboarding()->MaybeMarkIneligible();
// Verification
EXPECT_EQ(static_cast<TrackingProtectionOnboardingStatus>(prefs()->GetInteger(
prefs::kTrackingProtectionOnboardingStatus)),
TrackingProtectionOnboardingStatus::kIneligible);
EXPECT_TRUE(prefs()
->FindPreference(prefs::kTrackingProtectionEligibleSince)
->IsDefaultValue());
}
TEST_F(TrackingProtectionOnboardingTest,
NoticeShownDoesNothingIfProfileNotEligible) {
// Setup
prefs()->SetInteger(
prefs::kTrackingProtectionOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kIneligible));
// Action
tracking_protection_onboarding()->OnboardingNoticeShown();
// Verification
EXPECT_EQ(static_cast<TrackingProtectionOnboardingStatus>(prefs()->GetInteger(
prefs::kTrackingProtectionOnboardingStatus)),
TrackingProtectionOnboardingStatus::kIneligible);
}
TEST_F(TrackingProtectionOnboardingTest,
NoticeShownMarksOnboardedIfProfileIsEligible) {
// Setup
prefs()->SetInteger(
prefs::kTrackingProtectionOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kEligible));
// Action
tracking_protection_onboarding()->OnboardingNoticeShown();
// Verification
EXPECT_EQ(static_cast<TrackingProtectionOnboardingStatus>(prefs()->GetInteger(
prefs::kTrackingProtectionOnboardingStatus)),
TrackingProtectionOnboardingStatus::kOnboarded);
EXPECT_EQ(prefs()->GetTime(prefs::kTrackingProtectionOnboardedSince),
base::Time::Now());
}
TEST_F(TrackingProtectionOnboardingTest, UpdatesLastNoticeShownCorrectly) {
// Setup
prefs()->SetInteger(
prefs::kTrackingProtectionOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kEligible));
// Action
tracking_protection_onboarding()->OnboardingNoticeShown();
auto delay = base::Seconds(15);
task_env_.FastForwardBy(delay);
// Show the notice again.
tracking_protection_onboarding()->OnboardingNoticeShown();
// Verification
EXPECT_EQ(static_cast<TrackingProtectionOnboardingStatus>(prefs()->GetInteger(
prefs::kTrackingProtectionOnboardingStatus)),
TrackingProtectionOnboardingStatus::kOnboarded);
EXPECT_EQ(prefs()->GetTime(prefs::kTrackingProtectionNoticeLastShown),
base::Time::Now());
EXPECT_EQ(prefs()->GetTime(prefs::kTrackingProtectionOnboardedSince),
base::Time::Now() - delay);
}
TEST_F(TrackingProtectionOnboardingTest,
PreviouslyAcknowledgedDoesntReacknowledge) {
// Ack with GotIt
tracking_protection_onboarding()->OnboardingNoticeActionTaken(
TrackingProtectionOnboarding::NoticeAction::kGotIt);
// Action: Re Ack with Learnmore
tracking_protection_onboarding()->OnboardingNoticeActionTaken(
TrackingProtectionOnboarding::NoticeAction::kLearnMore);
// Verification: LearnMore doesn't persit.
EXPECT_EQ(
static_cast<TrackingProtectionOnboardingAckAction>(
prefs()->GetInteger(prefs::kTrackingProtectionOnboardingAckAction)),
TrackingProtectionOnboardingAckAction::kGotIt);
}
TEST_F(TrackingProtectionOnboardingTest, AckingNoticeSetsAckedSincePref) {
// Ack the notice.
tracking_protection_onboarding()->OnboardingNoticeActionTaken(
TrackingProtectionOnboarding::NoticeAction::kGotIt);
// Verification
EXPECT_EQ(prefs()->GetTime(prefs::kTrackingProtectionOnboardingAckedSince),
base::Time::Now());
}
TEST_F(TrackingProtectionOnboardingTest,
ShouldShowNoticeReturnsIsFalseIfProfileIneligible) {
// Setup
prefs()->SetInteger(
prefs::kTrackingProtectionOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kIneligible));
// Verification
EXPECT_EQ(tracking_protection_onboarding()->ShouldShowOnboardingNotice(),
false);
}
TEST_F(TrackingProtectionOnboardingTest,
ShouldShowNoticeReturnsIsTrueIfProfileEligible) {
// Setup
prefs()->SetInteger(
prefs::kTrackingProtectionOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kEligible));
// Verification
EXPECT_EQ(tracking_protection_onboarding()->ShouldShowOnboardingNotice(),
true);
}
TEST_F(TrackingProtectionOnboardingTest,
ShouldShowNoticeReturnsIsTrueIfProfileOnboardedNotAcked) {
// Setup
prefs()->SetInteger(
prefs::kTrackingProtectionOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kOnboarded));
prefs()->SetBoolean(prefs::kTrackingProtectionOnboardingAcked, false);
// Verification
EXPECT_EQ(tracking_protection_onboarding()->ShouldShowOnboardingNotice(),
true);
}
TEST_F(TrackingProtectionOnboardingTest,
ShouldShowNoticeReturnsIsFalseIfProfileOnboardedAcked) {
// Setup
prefs()->SetInteger(
prefs::kTrackingProtectionOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kOnboarded));
prefs()->SetBoolean(prefs::kTrackingProtectionOnboardingAcked, true);
// Verification
EXPECT_EQ(tracking_protection_onboarding()->ShouldShowOnboardingNotice(),
false);
}
TEST_F(TrackingProtectionOnboardingTest, MaybeResetOnboardingPrefsInStable) {
// Setup
tracking_protection_onboarding_service_ =
std::make_unique<TrackingProtectionOnboarding>(
prefs(), version_info::Channel::STABLE);
prefs()->SetInteger(
prefs::kTrackingProtectionOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kOnboarded));
// Action
tracking_protection_onboarding()->MaybeResetOnboardingPrefs();
// Verification
EXPECT_EQ(static_cast<TrackingProtectionOnboardingStatus>(prefs()->GetInteger(
prefs::kTrackingProtectionOnboardingStatus)),
TrackingProtectionOnboardingStatus::kOnboarded);
}
TEST_F(TrackingProtectionOnboardingTest, MaybeResetOnboardingPrefsInCanary) {
// Setup
tracking_protection_onboarding_service_ =
std::make_unique<TrackingProtectionOnboarding>(
prefs(), version_info::Channel::CANARY);
prefs()->SetInteger(
prefs::kTrackingProtectionOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kOnboarded));
// Action
tracking_protection_onboarding()->MaybeResetOnboardingPrefs();
// Verification
EXPECT_FALSE(prefs()
->FindPreference(prefs::kTrackingProtectionOnboardingStatus)
->HasUserSetting());
}
TEST_F(TrackingProtectionOnboardingTest,
MaybeResetOnboardingPrefsInCanaryTriggersObserver) {
// Setup
tracking_protection_onboarding_service_ =
std::make_unique<TrackingProtectionOnboarding>(
prefs(), version_info::Channel::CANARY);
prefs()->SetInteger(
prefs::kTrackingProtectionOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kOnboarded));
prefs()->SetBoolean(prefs::kTrackingProtectionOnboardingAcked, true);
MockTrackingProtectionObserver observer;
tracking_protection_onboarding()->AddObserver(&observer);
EXPECT_CALL(observer,
OnTrackingProtectionOnboardingUpdated(
TrackingProtectionOnboarding::OnboardingStatus::kIneligible));
// Action
tracking_protection_onboarding()->MaybeResetOnboardingPrefs();
// Expectation
testing::Mock::VerifyAndClearExpectations(&observer);
}
TEST_F(TrackingProtectionOnboardingTest, OnboardedToAckForNotOnboardedProfile) {
tracking_protection_onboarding()->MaybeMarkEligible();
EXPECT_EQ(tracking_protection_onboarding()->OnboardedToAcknowledged(),
std::nullopt);
}
TEST_F(TrackingProtectionOnboardingTest, OnboardedToAckForNotAckedProfile) {
tracking_protection_onboarding()->MaybeMarkEligible();
tracking_protection_onboarding()->OnboardingNoticeShown();
EXPECT_EQ(tracking_protection_onboarding()->OnboardedToAcknowledged(),
std::nullopt);
}
TEST_F(TrackingProtectionOnboardingTest, OnboardedToAckForAckedProfile) {
tracking_protection_onboarding()->MaybeMarkEligible();
tracking_protection_onboarding()->OnboardingNoticeShown();
auto delay = base::Seconds(15);
task_env_.FastForwardBy(delay);
tracking_protection_onboarding()->OnboardingNoticeActionTaken(
TrackingProtectionOnboarding::NoticeAction::kGotIt);
EXPECT_EQ(tracking_protection_onboarding()->OnboardedToAcknowledged(),
std::make_optional(delay));
}
TEST_F(TrackingProtectionOnboardingTest, UserActionMetrics) {
base::UserActionTester user_action_tester;
tracking_protection_onboarding()->OnboardingNoticeShown();
EXPECT_EQ(
1, user_action_tester.GetActionCount("TrackingProtection.Notice.Shown"));
tracking_protection_onboarding()->OnboardingNoticeActionTaken(
TrackingProtectionOnboarding::NoticeAction::kOther);
EXPECT_EQ(1, user_action_tester.GetActionCount(
"TrackingProtection.Notice.DismissedOther"));
tracking_protection_onboarding()->OnboardingNoticeActionTaken(
TrackingProtectionOnboarding::NoticeAction::kGotIt);
EXPECT_EQ(1, user_action_tester.GetActionCount(
"TrackingProtection.Notice.GotItClicked"));
tracking_protection_onboarding()->OnboardingNoticeActionTaken(
TrackingProtectionOnboarding::NoticeAction::kSettings);
EXPECT_EQ(1, user_action_tester.GetActionCount(
"TrackingProtection.Notice.SettingsClicked"));
tracking_protection_onboarding()->OnboardingNoticeActionTaken(
TrackingProtectionOnboarding::NoticeAction::kLearnMore);
EXPECT_EQ(1, user_action_tester.GetActionCount(
"TrackingProtection.Notice.LearnMoreClicked"));
tracking_protection_onboarding()->OnboardingNoticeActionTaken(
TrackingProtectionOnboarding::NoticeAction::kClosed);
EXPECT_EQ(
1, user_action_tester.GetActionCount("TrackingProtection.Notice.Closed"));
}
TEST_F(TrackingProtectionOnboardingTest,
NoticeRequestSetsFirstTimePrefsCorrectly) {
// Setup
tracking_protection_onboarding()->MaybeMarkEligible();
// Action
tracking_protection_onboarding()->NoticeRequested(NoticeType::kOnboarding);
// Expectations
EXPECT_EQ(prefs()->GetTime(
prefs::kTrackingProtectionOnboardingNoticeFirstRequested),
base::Time::Now());
EXPECT_EQ(
prefs()->GetTime(prefs::kTrackingProtectionOnboardingNoticeLastRequested),
base::Time::Now());
}
TEST_F(TrackingProtectionOnboardingTest,
NoticeRequestSetsSubsequentTimePrefsCorrectly) {
// Setup
base::Time initial_time = base::Time::Now();
tracking_protection_onboarding()->MaybeMarkEligible();
tracking_protection_onboarding()->NoticeRequested(NoticeType::kOnboarding);
auto delay = base::Seconds(15);
task_env_.FastForwardBy(delay);
tracking_protection_onboarding()->NoticeRequested(NoticeType::kOnboarding);
histogram_tester_.ExpectTimeBucketCount(
"PrivacySandbox.TrackingProtection.Onboarding.NoticeRequested."
"SinceFirstRequested",
delay, 1);
histogram_tester_.ExpectTimeBucketCount(
"PrivacySandbox.TrackingProtection.Onboarding.NoticeRequested."
"SinceLastRequested",
delay, 1);
// Action
task_env_.FastForwardBy(delay);
tracking_protection_onboarding()->NoticeRequested(NoticeType::kOnboarding);
// Expectations
// First Time pref unchanged.
EXPECT_EQ(prefs()->GetTime(
prefs::kTrackingProtectionOnboardingNoticeFirstRequested),
initial_time);
EXPECT_EQ(
prefs()->GetTime(prefs::kTrackingProtectionOnboardingNoticeLastRequested),
initial_time + 2 * delay);
histogram_tester_.ExpectTimeBucketCount(
"PrivacySandbox.TrackingProtection.Onboarding.NoticeRequested."
"SinceFirstRequested",
2 * delay, 1);
histogram_tester_.ExpectTimeBucketCount(
"PrivacySandbox.TrackingProtection.Onboarding.NoticeRequested."
"SinceLastRequested",
delay, 2);
}
TEST_F(TrackingProtectionOnboardingTest,
NoticeShownEmitsCorrectHistogramsAfterNoticeRequest) {
// Setup
tracking_protection_onboarding()->MaybeMarkEligible();
tracking_protection_onboarding()->NoticeRequested(NoticeType::kOnboarding);
// Action
auto long_delay = base::Seconds(15);
task_env_.FastForwardBy(long_delay);
tracking_protection_onboarding()->NoticeRequested(NoticeType::kOnboarding);
auto short_delay = base::Seconds(2);
task_env_.FastForwardBy(short_delay);
tracking_protection_onboarding()->OnboardingNoticeShown();
EXPECT_EQ(tracking_protection_onboarding()->GetOnboardingStatus(),
TrackingProtectionOnboarding::OnboardingStatus::kOnboarded);
histogram_tester_.ExpectTimeBucketCount(
"PrivacySandbox.TrackingProtection.Onboarding."
"NoticeFirstRequestedToOnboardedDuration",
short_delay + long_delay, 1);
histogram_tester_.ExpectTimeBucketCount(
"PrivacySandbox.TrackingProtection.Onboarding."
"NoticeLastRequestedToOnboardedDuration",
short_delay, 1);
}
struct NoticeRequestStatusTransitionParams {
typedef void (TrackingProtectionOnboarding::*setup_function)(void);
std::vector<setup_function> setup_function_vector;
TrackingProtectionOnboarding::OnboardingStatus expected_onboarding_status;
TrackingProtectionOnboardingStatus expected_histogram_status;
};
class TrackingProtectionNoticeRequestStatusTransitions
: public TrackingProtectionOnboardingTest,
public testing::WithParamInterface<NoticeRequestStatusTransitionParams> {
};
TEST_P(TrackingProtectionNoticeRequestStatusTransitions,
UpdatesOnboardingStatusAndEmitsHistogram) {
// Setup
for (void (TrackingProtectionOnboarding::*setup_function)(void) :
GetParam().setup_function_vector) {
(tracking_protection_onboarding()->*setup_function)();
}
// Action
tracking_protection_onboarding()->NoticeRequested(NoticeType::kOnboarding);
// Expectations
EXPECT_EQ(tracking_protection_onboarding()->GetOnboardingStatus(),
GetParam().expected_onboarding_status);
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.Onboarding.NoticeRequestedForStatus",
GetParam().expected_histogram_status, 1);
}
INSTANTIATE_TEST_SUITE_P(
TrackingProtectionNoticeRequestStatusTransitions,
TrackingProtectionNoticeRequestStatusTransitions,
testing::Values(
NoticeRequestStatusTransitionParams{
// Ineligible Profile, Notice Requested.
.setup_function_vector =
{&TrackingProtectionOnboarding::MaybeMarkIneligible},
.expected_onboarding_status =
TrackingProtectionOnboarding::OnboardingStatus::kIneligible,
.expected_histogram_status =
TrackingProtectionOnboardingStatus::kIneligible},
// Onboarded Profile, Notice Requested
NoticeRequestStatusTransitionParams{
.setup_function_vector =
{&TrackingProtectionOnboarding::MaybeMarkEligible,
&TrackingProtectionOnboarding::OnboardingNoticeShown},
.expected_onboarding_status =
TrackingProtectionOnboarding::OnboardingStatus::kOnboarded,
.expected_histogram_status =
TrackingProtectionOnboardingStatus::kOnboarded},
// Eligible Profile, Notice Requested
NoticeRequestStatusTransitionParams{
.setup_function_vector =
{&TrackingProtectionOnboarding::MaybeMarkEligible},
.expected_onboarding_status = TrackingProtectionOnboarding::
OnboardingStatus::kOnboardingRequested,
.expected_histogram_status =
TrackingProtectionOnboardingStatus::kEligible},
// OnboardingRequested Profile, Notice Requested again.
NoticeRequestStatusTransitionParams{
.setup_function_vector =
{&TrackingProtectionOnboarding::MaybeMarkEligible,
&TrackingProtectionOnboarding::OnboardingNoticeRequested},
.expected_onboarding_status = TrackingProtectionOnboarding::
OnboardingStatus::kOnboardingRequested,
.expected_histogram_status =
TrackingProtectionOnboardingStatus::kRequested}));
class TrackingProtectionOnboardingAccessorTest
: public TrackingProtectionOnboardingTest,
public testing::WithParamInterface<
std::pair<TrackingProtectionOnboardingStatus,
TrackingProtectionOnboarding::OnboardingStatus>> {};
TEST_P(TrackingProtectionOnboardingAccessorTest,
ReturnsCorrectOnboardingValue) {
prefs()->SetInteger(prefs::kTrackingProtectionOnboardingStatus,
static_cast<int>(std::get<0>(GetParam())));
EXPECT_EQ(tracking_protection_onboarding()->GetOnboardingStatus(),
std::get<1>(GetParam()));
}
INSTANTIATE_TEST_SUITE_P(
TrackingProtectionOnboardingAccessorTest,
TrackingProtectionOnboardingAccessorTest,
testing::Values(
std::pair(TrackingProtectionOnboardingStatus::kIneligible,
TrackingProtectionOnboarding::OnboardingStatus::kIneligible),
std::pair(TrackingProtectionOnboardingStatus::kEligible,
TrackingProtectionOnboarding::OnboardingStatus::kEligible),
std::pair(TrackingProtectionOnboardingStatus::kRequested,
TrackingProtectionOnboarding::OnboardingStatus::
kOnboardingRequested),
std::pair(TrackingProtectionOnboardingStatus::kOnboarded,
TrackingProtectionOnboarding::OnboardingStatus::kOnboarded)));
class TrackingProtectionOnboardingAckActionTest
: public TrackingProtectionOnboardingTest,
public testing::WithParamInterface<std::pair<
TrackingProtectionOnboarding::NoticeAction,
tracking_protection::TrackingProtectionOnboardingAckAction>> {};
TEST_P(TrackingProtectionOnboardingAckActionTest,
UserNoticeActionTakenAcknowledgedCorrectly) {
// Action
tracking_protection_onboarding()->OnboardingNoticeActionTaken(
std::get<0>(GetParam()));
// Verification
EXPECT_EQ(prefs()->GetBoolean(prefs::kTrackingProtectionOnboardingAcked),
true);
EXPECT_EQ(
static_cast<TrackingProtectionOnboardingAckAction>(
prefs()->GetInteger(prefs::kTrackingProtectionOnboardingAckAction)),
std::get<1>(GetParam()));
}
INSTANTIATE_TEST_SUITE_P(
TrackingProtectionOnboardingAckActionTest,
TrackingProtectionOnboardingAckActionTest,
testing::Values(
std::pair(TrackingProtectionOnboarding::NoticeAction::kOther,
TrackingProtectionOnboardingAckAction::kOther),
std::pair(TrackingProtectionOnboarding::NoticeAction::kGotIt,
TrackingProtectionOnboardingAckAction::kGotIt),
std::pair(TrackingProtectionOnboarding::NoticeAction::kSettings,
TrackingProtectionOnboardingAckAction::kSettings),
std::pair(TrackingProtectionOnboarding::NoticeAction::kLearnMore,
TrackingProtectionOnboardingAckAction::kLearnMore),
std::pair(TrackingProtectionOnboarding::NoticeAction::kClosed,
TrackingProtectionOnboardingAckAction::kClosed)));
class TrackingProtectionSentimentTracking
: public TrackingProtectionOnboardingTest {
protected:
base::HistogramTester histogram_tester_;
};
TEST_F(TrackingProtectionSentimentTracking, RegistersProfileCorrectly) {
// Group unset initially.
EXPECT_TRUE(tracking_protection_onboarding()->RequiresSentimentSurveyGroup());
EXPECT_EQ(tracking_protection_onboarding()->GetEligibleSurveyGroup(),
SentimentSurveyGroup::kNotSet);
// Action: Register the group.
tracking_protection_onboarding()->RegisterSentimentSurveyGroup(
SentimentSurveyGroup::kControlImmediate);
// Verification: Registration no longer required.
EXPECT_FALSE(
tracking_protection_onboarding()->RequiresSentimentSurveyGroup());
// Registered group not yet returned
EXPECT_EQ(tracking_protection_onboarding()->GetEligibleSurveyGroup(),
SentimentSurveyGroup::kNotSet);
// Registered group returned once the profile is eligible for the survey:
// After the survey start time, but before the survey end time.
task_env_.FastForwardBy(base::Minutes(3));
EXPECT_EQ(tracking_protection_onboarding()->GetEligibleSurveyGroup(),
SentimentSurveyGroup::kControlImmediate);
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.SentimentSurvey.Registered",
TrackingProtectionOnboarding::SentimentSurveyGroupMetrics::
kControlImmediate,
1);
}
TEST_F(TrackingProtectionSentimentTracking,
ComputeSurveyEligibilityAfterEndTime) {
// Action: Register the group.
tracking_protection_onboarding()->RegisterSentimentSurveyGroup(
SentimentSurveyGroup::kControlDelayed);
// Verification: Registration no longer required.
EXPECT_FALSE(
tracking_protection_onboarding()->RequiresSentimentSurveyGroup());
// Registered group not yet returned
EXPECT_EQ(tracking_protection_onboarding()->GetEligibleSurveyGroup(),
SentimentSurveyGroup::kNotSet);
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.SentimentSurvey.Registered",
TrackingProtectionOnboarding::SentimentSurveyGroupMetrics::
kControlDelayed,
1);
// Registered group returned once the profile is eligible for the survey:
// After the survey start time, but before the survey end time.
task_env_.FastForwardBy(base::Days(14));
EXPECT_EQ(tracking_protection_onboarding()->GetEligibleSurveyGroup(),
SentimentSurveyGroup::kControlDelayed);
// Afte the end date, no longer return the registered group.
task_env_.FastForwardBy(base::Days(15));
EXPECT_EQ(tracking_protection_onboarding()->GetEligibleSurveyGroup(),
SentimentSurveyGroup::kNotSet);
}
TEST_F(TrackingProtectionSentimentTracking, RegistersTreatmentBeforeAck) {
// Setup
tracking_protection_onboarding()->MaybeMarkEligible();
tracking_protection_onboarding()->OnboardingNoticeShown();
// Action: Register the group.
tracking_protection_onboarding()->RegisterSentimentSurveyGroup(
SentimentSurveyGroup::kTreatmentImmediate);
// Verification: Registration no longer required.
EXPECT_FALSE(
tracking_protection_onboarding()->RequiresSentimentSurveyGroup());
// Registered group not yet returned
EXPECT_EQ(tracking_protection_onboarding()->GetEligibleSurveyGroup(),
SentimentSurveyGroup::kNotSet);
// Registered group Still not returned even after the survey start time, and
// before the survey end time.
task_env_.FastForwardBy(base::Minutes(3));
EXPECT_EQ(tracking_protection_onboarding()->GetEligibleSurveyGroup(),
SentimentSurveyGroup::kNotSet);
}
TEST_F(TrackingProtectionSentimentTracking, RegistersTreatmentAfterAck) {
// Setup
tracking_protection_onboarding()->MaybeMarkEligible();
tracking_protection_onboarding()->OnboardingNoticeShown();
tracking_protection_onboarding()->OnboardingNoticeActionTaken(
NoticeAction::kGotIt);
// Needs registration
EXPECT_TRUE(tracking_protection_onboarding()->RequiresSentimentSurveyGroup());
// Action: Register the group.
tracking_protection_onboarding()->RegisterSentimentSurveyGroup(
SentimentSurveyGroup::kTreatmentDelayed);
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.SentimentSurvey.Registered",
TrackingProtectionOnboarding::SentimentSurveyGroupMetrics::
kTreatmentDelayed,
1);
// Verification: Registration no longer required.
EXPECT_FALSE(
tracking_protection_onboarding()->RequiresSentimentSurveyGroup());
// Registered group not yet returned
EXPECT_EQ(tracking_protection_onboarding()->GetEligibleSurveyGroup(),
SentimentSurveyGroup::kNotSet);
// Registered returned after the survey start time, and before the survey end
// time.
task_env_.FastForwardBy(base::Days(14));
EXPECT_EQ(tracking_protection_onboarding()->GetEligibleSurveyGroup(),
SentimentSurveyGroup::kTreatmentDelayed);
}
TEST_F(TrackingProtectionSentimentTracking, RegistersTreatmentAndAcksLater) {
// Setup
tracking_protection_onboarding()->MaybeMarkEligible();
tracking_protection_onboarding()->OnboardingNoticeShown();
// Action: Register the group.
tracking_protection_onboarding()->RegisterSentimentSurveyGroup(
SentimentSurveyGroup::kTreatmentImmediate);
// Verification: Registration no longer required.
EXPECT_FALSE(
tracking_protection_onboarding()->RequiresSentimentSurveyGroup());
// Action: Ack the notice.
tracking_protection_onboarding()->OnboardingNoticeActionTaken(
NoticeAction::kGotIt);
// Registered group still not returned after Acking the notice
EXPECT_EQ(tracking_protection_onboarding()->GetEligibleSurveyGroup(),
SentimentSurveyGroup::kNotSet);
// Registered group returned after the survey start time, and before the
// survey end time.
task_env_.FastForwardBy(base::Minutes(3));
EXPECT_EQ(tracking_protection_onboarding()->GetEligibleSurveyGroup(),
SentimentSurveyGroup::kTreatmentImmediate);
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.SentimentSurvey.Registered",
TrackingProtectionOnboarding::SentimentSurveyGroupMetrics::
kTreatmentImmediate,
1);
}
class TrackingProtectionSentimentTrackinWithSilentOnboarding
: public TrackingProtectionSentimentTracking {
public:
void SetUp() override {
tracking_protection_onboarding_service_ =
std::make_unique<TrackingProtectionOnboarding>(
prefs(), version_info::Channel::UNKNOWN,
/* is_silent_onboarding_enabled=*/true);
}
};
TEST_F(TrackingProtectionSentimentTrackinWithSilentOnboarding,
RegistersControlBeforeOnboarding) {
// Setup
tracking_protection_onboarding()->MaybeMarkSilentEligible();
// Action: Register the group.
tracking_protection_onboarding()->RegisterSentimentSurveyGroup(
SentimentSurveyGroup::kControlImmediate);
// Verification: Registration no longer required.
EXPECT_FALSE(
tracking_protection_onboarding()->RequiresSentimentSurveyGroup());
// Registered group not yet returned
EXPECT_EQ(tracking_protection_onboarding()->GetEligibleSurveyGroup(),
SentimentSurveyGroup::kNotSet);
// Registered group Still not returned even after the survey start time, and
// before the survey end time.
task_env_.FastForwardBy(base::Minutes(3));
EXPECT_EQ(tracking_protection_onboarding()->GetEligibleSurveyGroup(),
SentimentSurveyGroup::kNotSet);
}
TEST_F(TrackingProtectionSentimentTrackinWithSilentOnboarding,
RegistersControlAfterSilentOnboarding) {
// Setup
tracking_protection_onboarding()->MaybeMarkSilentEligible();
tracking_protection_onboarding()->SilentOnboardingNoticeShown();
// Needs registration
EXPECT_TRUE(tracking_protection_onboarding()->RequiresSentimentSurveyGroup());
// Action: Register the group.
tracking_protection_onboarding()->RegisterSentimentSurveyGroup(
SentimentSurveyGroup::kControlDelayed);
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.SentimentSurvey.Registered",
TrackingProtectionOnboarding::SentimentSurveyGroupMetrics::
kControlDelayed,
1);
// Verification: Registration no longer required.
EXPECT_FALSE(
tracking_protection_onboarding()->RequiresSentimentSurveyGroup());
// Registered group not yet returned
EXPECT_EQ(tracking_protection_onboarding()->GetEligibleSurveyGroup(),
SentimentSurveyGroup::kNotSet);
// Registered returned after the survey start time, and before the survey end
// time.
task_env_.FastForwardBy(base::Days(14));
EXPECT_EQ(tracking_protection_onboarding()->GetEligibleSurveyGroup(),
SentimentSurveyGroup::kControlDelayed);
}
TEST_F(TrackingProtectionSentimentTrackinWithSilentOnboarding,
RegistersControlAndOnboardsLater) {
// Setup
tracking_protection_onboarding()->MaybeMarkSilentEligible();
// Action: Register the group.
tracking_protection_onboarding()->RegisterSentimentSurveyGroup(
SentimentSurveyGroup::kControlImmediate);
// Verification: Registration no longer required.
EXPECT_FALSE(
tracking_protection_onboarding()->RequiresSentimentSurveyGroup());
// Action: Silently onboard.
tracking_protection_onboarding()->SilentOnboardingNoticeShown();
// Registered group still not returned after Acking the notice
EXPECT_EQ(tracking_protection_onboarding()->GetEligibleSurveyGroup(),
SentimentSurveyGroup::kNotSet);
// Registered group returned after the survey start time, and before the
// survey end time.
task_env_.FastForwardBy(base::Minutes(3));
EXPECT_EQ(tracking_protection_onboarding()->GetEligibleSurveyGroup(),
SentimentSurveyGroup::kControlImmediate);
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.SentimentSurvey.Registered",
TrackingProtectionOnboarding::SentimentSurveyGroupMetrics::
kControlImmediate,
1);
}
class TrackingProtectionOnboardingStartupSentimentSurvey
: public TrackingProtectionOnboardingTest,
public testing::WithParamInterface<std::pair<
TrackingProtectionOnboarding::SentimentSurveyGroup,
TrackingProtectionOnboarding::SentimentSurveyGroupMetrics>> {
protected:
base::HistogramTester histogram_tester_;
};
TEST_P(TrackingProtectionOnboardingStartupSentimentSurvey,
OnboardingStartupSentimentSurveyHistograms) {
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.OnboardingStartup."
"SentimentSurveyGroup",
TrackingProtectionOnboarding::SentimentSurveyGroupMetrics::kNotSet, 1);
tracking_protection_onboarding()->MaybeMarkEligible();
tracking_protection_onboarding()->OnboardingNoticeShown();
tracking_protection_onboarding()->OnboardingNoticeActionTaken(
TrackingProtectionOnboarding::NoticeAction::kGotIt);
TrackingProtectionOnboarding::SentimentSurveyGroup register_group =
std::get<0>(GetParam());
TrackingProtectionOnboarding::SentimentSurveyGroupMetrics metric_group =
std::get<1>(GetParam());
tracking_protection_onboarding()->RegisterSentimentSurveyGroup(
register_group);
tracking_protection_onboarding_service_.reset();
tracking_protection_onboarding_service_ =
std::make_unique<TrackingProtectionOnboarding>(
prefs(), version_info::Channel::UNKNOWN);
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.OnboardingStartup."
"SentimentSurveyGroup",
metric_group, 1);
}
INSTANTIATE_TEST_SUITE_P(
TrackingProtectionOnboardingStartupSentimentSurvey,
TrackingProtectionOnboardingStartupSentimentSurvey,
testing::Values(
std::pair(
TrackingProtectionOnboarding::SentimentSurveyGroup::kControlDelayed,
TrackingProtectionOnboarding::SentimentSurveyGroupMetrics::
kControlDelayed),
std::pair(TrackingProtectionOnboarding::SentimentSurveyGroup::
kControlImmediate,
TrackingProtectionOnboarding::SentimentSurveyGroupMetrics::
kControlImmediate),
std::pair(TrackingProtectionOnboarding::SentimentSurveyGroup::
kTreatmentDelayed,
TrackingProtectionOnboarding::SentimentSurveyGroupMetrics::
kTreatmentDelayed),
std::pair(TrackingProtectionOnboarding::SentimentSurveyGroup::
kTreatmentImmediate,
TrackingProtectionOnboarding::SentimentSurveyGroupMetrics::
kTreatmentImmediate)));
class TrackingProtectionOffboardingTest
: public TrackingProtectionOnboardingTest {
public:
void RestartServiceWithRollbackFlag() {
feature_list_.InitAndEnableFeature(
privacy_sandbox::kTrackingProtectionOnboardingRollback);
tracking_protection_onboarding_service_ =
std::make_unique<TrackingProtectionOnboarding>(
prefs(), version_info::Channel::UNKNOWN);
}
void RestartServiceWithoutRollbackFlag() {
feature_list_.Reset();
tracking_protection_onboarding_service_ =
std::make_unique<TrackingProtectionOnboarding>(
prefs(), version_info::Channel::UNKNOWN);
}
private:
base::test::ScopedFeatureList feature_list_;
};
TEST_F(TrackingProtectionOffboardingTest, IneligibleProfileDoesntNeedNotice) {
// Setup
// We start with an ineligible profile (default)
// Action
RestartServiceWithRollbackFlag();
// Verification
EXPECT_EQ(tracking_protection_onboarding()->GetRequiredNotice(),
NoticeType::kNone);
}
TEST_F(TrackingProtectionOffboardingTest, NonOnboardedProfileDoesntNeedNoice) {
// Setup
// We start with an eligible profile
tracking_protection_onboarding()->MaybeMarkEligible();
// Action
RestartServiceWithRollbackFlag();
// Verification
EXPECT_EQ(tracking_protection_onboarding()->GetRequiredNotice(),
NoticeType::kNone);
}
TEST_F(TrackingProtectionOffboardingTest, OnboardedProfileNeedsNotice) {
// Setup
// We start with an eligible profile
tracking_protection_onboarding()->MaybeMarkEligible();
tracking_protection_onboarding()->NoticeShown(NoticeType::kOnboarding);
// Action
RestartServiceWithRollbackFlag();
// Verification
EXPECT_EQ(tracking_protection_onboarding()->GetRequiredNotice(),
NoticeType::kOffboarding);
}
TEST_F(TrackingProtectionOffboardingTest, AckedProfileNeedsNotice) {
// Setup
// We start with an eligible profile
tracking_protection_onboarding()->MaybeMarkEligible();
tracking_protection_onboarding()->NoticeShown(NoticeType::kOnboarding);
tracking_protection_onboarding()->NoticeActionTaken(
NoticeType::kOnboarding,
TrackingProtectionOnboarding::NoticeAction::kGotIt);
// Action
RestartServiceWithRollbackFlag();
// Verification
EXPECT_EQ(tracking_protection_onboarding()->GetRequiredNotice(),
NoticeType::kOffboarding);
}
TEST_F(TrackingProtectionOffboardingTest, NoticeNotRequiredIfShownOnce) {
// Setup
// We start with an onboarded profile
tracking_protection_onboarding()->MaybeMarkEligible();
tracking_protection_onboarding()->NoticeShown(NoticeType::kOnboarding);
RestartServiceWithRollbackFlag();
// Action
tracking_protection_onboarding()->NoticeShown(NoticeType::kOffboarding);
// Verification
EXPECT_EQ(tracking_protection_onboarding()->GetRequiredNotice(),
NoticeType::kNone);
}
TEST_F(TrackingProtectionOffboardingTest, OffboardedNotifies) {
// Setup
// We start with an onboarded profile
tracking_protection_onboarding()->MaybeMarkEligible();
tracking_protection_onboarding()->NoticeShown(NoticeType::kOnboarding);
RestartServiceWithRollbackFlag();
MockTrackingProtectionObserver observer;
tracking_protection_onboarding()->AddObserver(&observer);
EXPECT_CALL(observer,
OnTrackingProtectionOnboardingUpdated(
TrackingProtectionOnboarding::OnboardingStatus::kOffboarded));
// Action
tracking_protection_onboarding()->NoticeShown(NoticeType::kOffboarding);
// Verification
testing::Mock::VerifyAndClearExpectations(&observer);
}
TEST_F(TrackingProtectionOffboardingTest, NoticeShownDoesntNotify) {
// Setup
// We start with an onboarded profile
tracking_protection_onboarding()->MaybeMarkEligible();
tracking_protection_onboarding()->NoticeShown(NoticeType::kOnboarding);
RestartServiceWithRollbackFlag();
MockTrackingProtectionObserver observer;
tracking_protection_onboarding()->AddObserver(&observer);
EXPECT_CALL(observer, OnShouldShowNoticeUpdated()).Times(0);
// Offborading notice is required before the action.
EXPECT_EQ(tracking_protection_onboarding()->GetRequiredNotice(),
NoticeType::kOffboarding);
// Action
tracking_protection_onboarding()->NoticeShown(NoticeType::kOffboarding);
// Verification
EXPECT_EQ(tracking_protection_onboarding()->GetRequiredNotice(),
NoticeType::kNone);
testing::Mock::VerifyAndClearExpectations(&observer);
}
TEST_F(TrackingProtectionOffboardingTest, NoticeShownPersists) {
// Setup
// We start with an onboarded profile
tracking_protection_onboarding()->MaybeMarkEligible();
tracking_protection_onboarding()->NoticeShown(NoticeType::kOnboarding);
RestartServiceWithRollbackFlag();
// Action
tracking_protection_onboarding()->NoticeShown(NoticeType::kOffboarding);
// Verification
EXPECT_TRUE(prefs()->GetBoolean(prefs::kTrackingProtectionOffboarded));
EXPECT_EQ(prefs()->GetTime(prefs::kTrackingProtectionOffboardedSince),
base::Time::Now());
}
TEST_F(TrackingProtectionOffboardingTest, NoticeActionTakenPersists) {
// Setup
// We start with an onboarded profile
tracking_protection_onboarding()->MaybeMarkEligible();
tracking_protection_onboarding()->NoticeShown(NoticeType::kOnboarding);
RestartServiceWithRollbackFlag();
// Action
tracking_protection_onboarding()->NoticeShown(NoticeType::kOffboarding);
tracking_protection_onboarding()->NoticeActionTaken(
NoticeType::kOffboarding,
TrackingProtectionOnboarding::NoticeAction::kGotIt);
// Verification
EXPECT_EQ(
static_cast<TrackingProtectionOnboardingAckAction>(
prefs()->GetInteger(prefs::kTrackingProtectionOffboardingAckAction)),
TrackingProtectionOnboardingAckAction::kGotIt);
}
TEST_F(TrackingProtectionOffboardingTest,
GoesBackToPreviousStatusWhenOffboardingDisabled) {
// Setup
// We start with an onboarded profile
tracking_protection_onboarding()->MaybeMarkEligible();
tracking_protection_onboarding()->NoticeShown(NoticeType::kOnboarding);
RestartServiceWithRollbackFlag();
// Action
// Before showing the offboarding notice, the user is considered onboarded:
EXPECT_EQ(tracking_protection_onboarding()->GetOnboardingStatus(),
TrackingProtectionOnboarding::OnboardingStatus::kOnboarded);
tracking_protection_onboarding()->NoticeShown(NoticeType::kOffboarding);
// Verification
// User was offboarded successfully.
EXPECT_EQ(tracking_protection_onboarding()->GetOnboardingStatus(),
TrackingProtectionOnboarding::OnboardingStatus::kOffboarded);
// Restarting without the flag is equivalent to "disabling" offboarding.
// User's status should go back to its value before the offboarding.
RestartServiceWithoutRollbackFlag();
EXPECT_EQ(tracking_protection_onboarding()->GetOnboardingStatus(),
TrackingProtectionOnboarding::OnboardingStatus::kOnboarded);
}
class TrackingProtectionOnboardingStartupStateTest
: public TrackingProtectionOnboardingTest {
protected:
base::HistogramTester histogram_tester_;
};
TEST_F(TrackingProtectionOnboardingStartupStateTest,
OnboardingStartupStateIneligible) {
// Onboarding startup state starts as ineligible
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.OnboardingStartup.State",
TrackingProtectionOnboarding::OnboardingStartupState::kIneligible, 1);
}
TEST_F(TrackingProtectionOnboardingStartupStateTest,
OnboardingStartupStateEligible) {
tracking_protection_onboarding_service_->MaybeMarkEligible();
tracking_protection_onboarding_service_.reset();
tracking_protection_onboarding_service_ =
std::make_unique<TrackingProtectionOnboarding>(
prefs(), version_info::Channel::UNKNOWN);
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.OnboardingStartup.State",
TrackingProtectionOnboarding::OnboardingStartupState::
kEligibleWaitingToOnboard,
1);
}
TEST_F(TrackingProtectionOnboardingStartupStateTest,
OnboardingStartupStateOnboardingWaitingToAck) {
tracking_protection_onboarding_service_->MaybeMarkEligible();
tracking_protection_onboarding_service_->OnboardingNoticeShown();
tracking_protection_onboarding_service_.reset();
tracking_protection_onboarding_service_ =
std::make_unique<TrackingProtectionOnboarding>(
prefs(), version_info::Channel::UNKNOWN);
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.OnboardingStartup.State",
TrackingProtectionOnboarding::OnboardingStartupState::
kOnboardedWaitingToAck,
1);
}
class TrackingProtectionOnboardingStartupStateAckedTest
: public TrackingProtectionOnboardingTest,
public testing::WithParamInterface<
std::pair<TrackingProtectionOnboarding::NoticeAction,
TrackingProtectionOnboarding::OnboardingStartupState>> {
protected:
base::HistogramTester histogram_tester_;
};
TEST_P(TrackingProtectionOnboardingStartupStateAckedTest,
OnboardingStartupStateAckedAction) {
tracking_protection_onboarding_service_->MaybeMarkEligible();
tracking_protection_onboarding_service_->OnboardingNoticeShown();
tracking_protection_onboarding_service_->OnboardingNoticeActionTaken(
std::get<0>(GetParam()));
tracking_protection_onboarding_service_.reset();
tracking_protection_onboarding_service_ =
std::make_unique<TrackingProtectionOnboarding>(
prefs(), version_info::Channel::UNKNOWN);
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.OnboardingStartup.State",
std::get<1>(GetParam()), 1);
}
INSTANTIATE_TEST_SUITE_P(
TrackingProtectionOnboardingStartupStateAckedTest,
TrackingProtectionOnboardingStartupStateAckedTest,
testing::Values(
std::pair(
TrackingProtectionOnboarding::NoticeAction::kGotIt,
TrackingProtectionOnboarding::OnboardingStartupState::kAckedGotIt),
std::pair(TrackingProtectionOnboarding::NoticeAction::kSettings,
TrackingProtectionOnboarding::OnboardingStartupState::
kAckedSettings),
std::pair(
TrackingProtectionOnboarding::NoticeAction::kClosed,
TrackingProtectionOnboarding::OnboardingStartupState::kAckedClosed),
std::pair(TrackingProtectionOnboarding::NoticeAction::kLearnMore,
TrackingProtectionOnboarding::OnboardingStartupState::
kAckedLearnMore),
std::pair(TrackingProtectionOnboarding::NoticeAction::kOther,
TrackingProtectionOnboarding::OnboardingStartupState::
kAckedOther)));
TEST_F(TrackingProtectionOnboardingStartupStateTest,
OnboardingStartupStateEligibleWaitingToOnboardSince) {
// Setup
tracking_protection_onboarding_service_->MaybeMarkEligible();
auto delay = base::Seconds(15);
task_env_.FastForwardBy(delay);
// Action
tracking_protection_onboarding_service_.reset();
tracking_protection_onboarding_service_ =
std::make_unique<TrackingProtectionOnboarding>(
prefs(), version_info::Channel::UNKNOWN);
// Verification
histogram_tester_.ExpectTimeBucketCount(
"PrivacySandbox.TrackingProtection.OnboardingStartup."
"WaitingToOnboardSince",
delay, 1);
}
TEST_F(TrackingProtectionOnboardingStartupStateTest,
OnboardingStartupStateOnboardedWaitingToAckTimings) {
// Setup
tracking_protection_onboarding_service_->MaybeMarkEligible();
tracking_protection_onboarding_service_->OnboardingNoticeShown();
auto delay = base::Seconds(15);
task_env_.FastForwardBy(delay);
// Action
tracking_protection_onboarding_service_.reset();
tracking_protection_onboarding_service_ =
std::make_unique<TrackingProtectionOnboarding>(
prefs(), version_info::Channel::UNKNOWN);
// Verification
histogram_tester_.ExpectTimeBucketCount(
"PrivacySandbox.TrackingProtection.OnboardingStartup.WaitingToAckSince",
delay, 1);
auto eligible_to_onboarded_duration =
prefs()->GetTime(prefs::kTrackingProtectionOnboardedSince) -
prefs()->GetTime(prefs::kTrackingProtectionEligibleSince);
histogram_tester_.ExpectTimeBucketCount(
"PrivacySandbox.TrackingProtection.OnboardingStartup."
"EligibleToOnboardedDuration",
eligible_to_onboarded_duration, 1);
}
TEST_F(TrackingProtectionOnboardingStartupStateTest,
OnboardingStartupStateEligibleToOnboardingDuration) {
tracking_protection_onboarding_service_->MaybeMarkEligible();
tracking_protection_onboarding_service_->OnboardingNoticeShown();
tracking_protection_onboarding_service_->OnboardingNoticeActionTaken(
TrackingProtectionOnboarding::NoticeAction::kOther);
tracking_protection_onboarding_service_.reset();
tracking_protection_onboarding_service_ =
std::make_unique<TrackingProtectionOnboarding>(
prefs(), version_info::Channel::UNKNOWN);
auto eligible_to_onboarded_duration =
prefs()->GetTime(prefs::kTrackingProtectionOnboardedSince) -
prefs()->GetTime(prefs::kTrackingProtectionEligibleSince);
histogram_tester_.ExpectTimeBucketCount(
"PrivacySandbox.TrackingProtection.OnboardingStartup."
"EligibleToOnboardedDuration",
eligible_to_onboarded_duration, 1);
}
TEST_F(TrackingProtectionOnboardingTest,
OnboardingEligibleToOnboardingDuration) {
tracking_protection_onboarding_service_->MaybeMarkEligible();
tracking_protection_onboarding_service_->OnboardingNoticeShown();
tracking_protection_onboarding_service_.reset();
tracking_protection_onboarding_service_ =
std::make_unique<TrackingProtectionOnboarding>(
prefs(), version_info::Channel::UNKNOWN);
auto eligible_to_onboarded_duration =
prefs()->GetTime(prefs::kTrackingProtectionOnboardedSince) -
prefs()->GetTime(prefs::kTrackingProtectionEligibleSince);
histogram_tester_.ExpectTimeBucketCount(
"PrivacySandbox.TrackingProtection.Onboarding."
"EligibleToOnboardedDuration",
eligible_to_onboarded_duration, 1);
}
TEST_F(TrackingProtectionOnboardingTest, OnboardingOnboardedToAckedDuration) {
tracking_protection_onboarding_service_->MaybeMarkEligible();
tracking_protection_onboarding_service_->OnboardingNoticeShown();
tracking_protection_onboarding_service_->OnboardingNoticeActionTaken(
TrackingProtectionOnboarding::NoticeAction::kOther);
tracking_protection_onboarding_service_.reset();
tracking_protection_onboarding_service_ =
std::make_unique<TrackingProtectionOnboarding>(
prefs(), version_info::Channel::UNKNOWN);
auto onboarding_to_acked_duration =
base::Time::Now() -
prefs()->GetTime(prefs::kTrackingProtectionOnboardedSince);
histogram_tester_.ExpectTimeBucketCount(
"PrivacySandbox.TrackingProtection.Onboarding.OnboardedToAckedDuration",
onboarding_to_acked_duration, 1);
}
TEST_F(TrackingProtectionOnboardingTest, OnboardingLastShownToAckedDuration) {
tracking_protection_onboarding_service_->MaybeMarkEligible();
tracking_protection_onboarding_service_->OnboardingNoticeShown();
tracking_protection_onboarding_service_->OnboardingNoticeActionTaken(
TrackingProtectionOnboarding::NoticeAction::kOther);
tracking_protection_onboarding_service_.reset();
tracking_protection_onboarding_service_ =
std::make_unique<TrackingProtectionOnboarding>(
prefs(), version_info::Channel::UNKNOWN);
auto last_shown_to_acked_duration =
prefs()->GetTime(prefs::kTrackingProtectionNoticeLastShown) -
base::Time::Now();
histogram_tester_.ExpectTimeBucketCount(
"PrivacySandbox.TrackingProtection.Onboarding.LastShownToAckedDuration",
last_shown_to_acked_duration, 1);
}
TEST_F(TrackingProtectionOnboardingTest, OnboardingMaybeMarkEligibleHistogram) {
// Setup
prefs()->SetInteger(
prefs::kTrackingProtectionOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kEligible));
// Action
tracking_protection_onboarding_service_->MaybeMarkEligible();
// Verification
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.Onboarding.MaybeMarkEligible", false,
1);
// Setup
prefs()->SetInteger(
prefs::kTrackingProtectionOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kIneligible));
// Action
tracking_protection_onboarding_service_->MaybeMarkEligible();
// Verification
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.Onboarding.MaybeMarkEligible", true,
1);
}
TEST_F(TrackingProtectionOnboardingTest,
OnboardingMaybeMarkIneligibleHistogram) {
// Setup
prefs()->SetInteger(
prefs::kTrackingProtectionOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kIneligible));
// Action
tracking_protection_onboarding_service_->MaybeMarkIneligible();
// Verification
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.Onboarding.MaybeMarkIneligible", false,
1);
// Setup
prefs()->SetInteger(
prefs::kTrackingProtectionOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kEligible));
// Action
tracking_protection_onboarding_service_->MaybeMarkIneligible();
// Verification
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.Onboarding.MaybeMarkIneligible", true,
1);
}
TEST_F(TrackingProtectionOnboardingTest,
OnboardingDidNoticeShownOnboardHistogram) {
// Action
tracking_protection_onboarding_service_->OnboardingNoticeShown();
// Verification
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.Onboarding.DidNoticeShownOnboard",
false, 1);
// Setup
tracking_protection_onboarding_service_->MaybeMarkEligible();
// Action
tracking_protection_onboarding_service_->OnboardingNoticeShown();
// Verification
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.Onboarding.DidNoticeShownOnboard",
true, 1);
}
TEST_F(TrackingProtectionOnboardingTest,
OnboardingDidNoticeActionAckowledgeHistogram) {
// Setup
prefs()->SetBoolean(prefs::kTrackingProtectionOnboardingAcked, true);
// Action
tracking_protection_onboarding_service_->OnboardingNoticeActionTaken(
TrackingProtectionOnboarding::NoticeAction::kOther);
// Verification
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.Onboarding.DidNoticeActionAckowledge",
false, 1);
// Setup
prefs()->SetBoolean(prefs::kTrackingProtectionOnboardingAcked, false);
// Action
tracking_protection_onboarding_service_->OnboardingNoticeActionTaken(
TrackingProtectionOnboarding::NoticeAction::kOther);
// Verification
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.Onboarding.DidNoticeActionAckowledge",
true, 1);
}
class TrackingProtectionSilentOnboardingTest
: public TrackingProtectionOnboardingTest {};
TEST_F(TrackingProtectionSilentOnboardingTest,
OnboardingProfileTriggersOnboardingObservers) {
MockTrackingProtectionObserver observer;
tracking_protection_onboarding()->AddObserver(&observer);
EXPECT_CALL(
observer,
OnTrackingProtectionSilentOnboardingUpdated(
TrackingProtectionOnboarding::SilentOnboardingStatus::kOnboarded));
prefs()->SetInteger(
prefs::kTrackingProtectionSilentOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kOnboarded));
testing::Mock::VerifyAndClearExpectations(&observer);
}
TEST_F(TrackingProtectionSilentOnboardingTest,
EligibleProfileTriggersOnboardingObservers) {
MockTrackingProtectionObserver observer;
tracking_protection_onboarding()->AddObserver(&observer);
EXPECT_CALL(
observer,
OnTrackingProtectionSilentOnboardingUpdated(
TrackingProtectionOnboarding::SilentOnboardingStatus::kEligible));
prefs()->SetInteger(
prefs::kTrackingProtectionSilentOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kEligible));
testing::Mock::VerifyAndClearExpectations(&observer);
}
TEST_F(TrackingProtectionSilentOnboardingTest,
MarkingAsEligibleTriggersShouldShowNoticeObservers) {
// Setup
MockTrackingProtectionObserver observer;
tracking_protection_onboarding()->AddObserver(&observer);
EXPECT_CALL(observer, OnShouldShowNoticeUpdated()).Times(1);
// Action
tracking_protection_onboarding()->MaybeMarkSilentEligible();
// Verification
testing::Mock::VerifyAndClearExpectations(&observer);
}
TEST_F(TrackingProtectionSilentOnboardingTest,
MarkingAsIneligibleTriggersShouldShowNoticeObservers) {
// Setup
// We start with an eligible profile
tracking_protection_onboarding()->MaybeMarkSilentEligible();
MockTrackingProtectionObserver observer;
tracking_protection_onboarding()->AddObserver(&observer);
EXPECT_CALL(observer, OnShouldShowNoticeUpdated()).Times(1);
// Action
tracking_protection_onboarding()->MaybeMarkSilentIneligible();
// Verification
testing::Mock::VerifyAndClearExpectations(&observer);
}
TEST_F(TrackingProtectionSilentOnboardingTest,
NoticeShownTriggersShouldShowNoticeObservers) {
// Setup
// We start with an eligible profile
tracking_protection_onboarding()->MaybeMarkSilentEligible();
MockTrackingProtectionObserver observer;
tracking_protection_onboarding()->AddObserver(&observer);
EXPECT_CALL(observer, OnShouldShowNoticeUpdated()).Times(1);
// Action
tracking_protection_onboarding()->SilentOnboardingNoticeShown();
// Verification
testing::Mock::VerifyAndClearExpectations(&observer);
}
TEST_F(TrackingProtectionSilentOnboardingTest,
MaybeMarkEligibleDoesNothingIfProfileNotIneligible) {
// Setup
prefs()->SetInteger(
prefs::kTrackingProtectionSilentOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kOnboarded));
// Action
tracking_protection_onboarding()->MaybeMarkSilentEligible();
// Verification
EXPECT_EQ(static_cast<TrackingProtectionOnboardingStatus>(prefs()->GetInteger(
prefs::kTrackingProtectionSilentOnboardingStatus)),
TrackingProtectionOnboardingStatus::kOnboarded);
}
TEST_F(TrackingProtectionSilentOnboardingTest,
MaybeMarkEligibleMarksEligibleIfProfileIsIneligible) {
// Setup
prefs()->SetInteger(
prefs::kTrackingProtectionSilentOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kIneligible));
// Action
tracking_protection_onboarding()->MaybeMarkSilentEligible();
// Verification
EXPECT_EQ(static_cast<TrackingProtectionOnboardingStatus>(prefs()->GetInteger(
prefs::kTrackingProtectionSilentOnboardingStatus)),
TrackingProtectionOnboardingStatus::kEligible);
EXPECT_EQ(prefs()->GetTime(prefs::kTrackingProtectionSilentEligibleSince),
base::Time::Now());
}
TEST_F(TrackingProtectionSilentOnboardingTest,
MaybeMarkIneligibleDoesNothingIfProfileNotEligible) {
// Setup
prefs()->SetInteger(
prefs::kTrackingProtectionSilentOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kOnboarded));
// Action
tracking_protection_onboarding()->MaybeMarkSilentIneligible();
// Verification
EXPECT_EQ(static_cast<TrackingProtectionOnboardingStatus>(prefs()->GetInteger(
prefs::kTrackingProtectionSilentOnboardingStatus)),
TrackingProtectionOnboardingStatus::kOnboarded);
}
TEST_F(TrackingProtectionSilentOnboardingTest,
MaybeMarkSilentIneligibleMarksIneligibleIfProfileIsEligible) {
// Setup
prefs()->SetInteger(
prefs::kTrackingProtectionSilentOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kEligible));
// Action
tracking_protection_onboarding()->MaybeMarkSilentIneligible();
// Verification
EXPECT_EQ(static_cast<TrackingProtectionOnboardingStatus>(prefs()->GetInteger(
prefs::kTrackingProtectionSilentOnboardingStatus)),
TrackingProtectionOnboardingStatus::kIneligible);
EXPECT_TRUE(
prefs()
->FindPreference(prefs::kTrackingProtectionSilentEligibleSince)
->IsDefaultValue());
}
TEST_F(TrackingProtectionSilentOnboardingTest,
NoticeShownDoesNothingIfProfileNotEligible) {
// Setup
prefs()->SetInteger(
prefs::kTrackingProtectionSilentOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kIneligible));
// Action
tracking_protection_onboarding()->SilentOnboardingNoticeShown();
// Verification
EXPECT_EQ(static_cast<TrackingProtectionOnboardingStatus>(prefs()->GetInteger(
prefs::kTrackingProtectionSilentOnboardingStatus)),
TrackingProtectionOnboardingStatus::kIneligible);
}
TEST_F(TrackingProtectionSilentOnboardingTest,
NoticeShownMarksOnboardedIfProfileIsEligible) {
// Setup
prefs()->SetInteger(
prefs::kTrackingProtectionSilentOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kEligible));
// Action
tracking_protection_onboarding()->SilentOnboardingNoticeShown();
// Verification
EXPECT_EQ(static_cast<TrackingProtectionOnboardingStatus>(prefs()->GetInteger(
prefs::kTrackingProtectionSilentOnboardingStatus)),
TrackingProtectionOnboardingStatus::kOnboarded);
EXPECT_EQ(prefs()->GetTime(prefs::kTrackingProtectionSilentOnboardedSince),
base::Time::Now());
}
TEST_F(TrackingProtectionSilentOnboardingTest,
ShouldNotShowNoticeIfProfileIneligible) {
// Setup
prefs()->SetInteger(
prefs::kTrackingProtectionOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kIneligible));
prefs()->SetInteger(
prefs::kTrackingProtectionSilentOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kIneligible));
// Verification
EXPECT_EQ(tracking_protection_onboarding()->GetRequiredNotice(),
NoticeType::kNone);
}
TEST_F(TrackingProtectionSilentOnboardingTest,
ShouldShowNoticeIfProfileEligible) {
// Setup
prefs()->SetInteger(
prefs::kTrackingProtectionOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kIneligible));
prefs()->SetInteger(
prefs::kTrackingProtectionSilentOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kEligible));
// Verification
EXPECT_EQ(tracking_protection_onboarding()->GetRequiredNotice(),
NoticeType::kSilentOnboarding);
}
TEST_F(TrackingProtectionSilentOnboardingTest,
ShouldNotShowNoticeIfProfileOnboarded) {
// Setup
prefs()->SetInteger(
prefs::kTrackingProtectionOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kIneligible));
prefs()->SetInteger(
prefs::kTrackingProtectionSilentOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kOnboarded));
// Verification
EXPECT_EQ(tracking_protection_onboarding()->GetRequiredNotice(),
NoticeType::kNone);
}
TEST_F(TrackingProtectionSilentOnboardingTest,
OnboardingEligibleToOnboardedDuration) {
tracking_protection_onboarding_service_->MaybeMarkSilentEligible();
tracking_protection_onboarding_service_->SilentOnboardingNoticeShown();
tracking_protection_onboarding_service_.reset();
tracking_protection_onboarding_service_ =
std::make_unique<TrackingProtectionOnboarding>(
prefs(), version_info::Channel::UNKNOWN);
auto eligible_to_onboarded_duration =
prefs()->GetTime(prefs::kTrackingProtectionSilentOnboardedSince) -
prefs()->GetTime(prefs::kTrackingProtectionSilentEligibleSince);
histogram_tester_.ExpectTimeBucketCount(
"PrivacySandbox.TrackingProtection.SilentOnboarding."
"EligibleToOnboardedDuration",
eligible_to_onboarded_duration, 1);
}
TEST_F(TrackingProtectionSilentOnboardingTest, MaybeMarkEligibleHistogram) {
// Setup
prefs()->SetInteger(
prefs::kTrackingProtectionSilentOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kEligible));
// Action
tracking_protection_onboarding_service_->MaybeMarkSilentEligible();
// Verification
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.SilentOnboarding.MaybeMarkEligible",
false, 1);
// Setup
prefs()->SetInteger(
prefs::kTrackingProtectionSilentOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kIneligible));
// Action
tracking_protection_onboarding_service_->MaybeMarkSilentEligible();
// Verification
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.SilentOnboarding.MaybeMarkEligible",
true, 1);
}
TEST_F(TrackingProtectionSilentOnboardingTest, MaybeMarkIneligibleHistogram) {
// Setup
prefs()->SetInteger(
prefs::kTrackingProtectionSilentOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kIneligible));
// Action
tracking_protection_onboarding_service_->MaybeMarkSilentIneligible();
// Verification
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.SilentOnboarding.MaybeMarkIneligible",
false, 1);
// Setup
prefs()->SetInteger(
prefs::kTrackingProtectionSilentOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kEligible));
// Action
tracking_protection_onboarding_service_->MaybeMarkSilentIneligible();
// Verification
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.SilentOnboarding.MaybeMarkIneligible",
true, 1);
}
TEST_F(TrackingProtectionSilentOnboardingTest, DidNoticeShownOnboardHistogram) {
// Action
tracking_protection_onboarding_service_->SilentOnboardingNoticeShown();
// Verification
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.SilentOnboarding."
"DidNoticeShownOnboard",
false, 1);
// Setup
tracking_protection_onboarding_service_->MaybeMarkSilentEligible();
// Action
tracking_protection_onboarding_service_->SilentOnboardingNoticeShown();
// Verification
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.SilentOnboarding."
"DidNoticeShownOnboard",
true, 1);
}
TEST_F(TrackingProtectionSilentOnboardingTest,
MaybeResetOnboardingPrefsInStable) {
// Setup
tracking_protection_onboarding_service_ =
std::make_unique<TrackingProtectionOnboarding>(
prefs(), version_info::Channel::STABLE);
prefs()->SetInteger(
prefs::kTrackingProtectionSilentOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kOnboarded));
// Action
tracking_protection_onboarding()->MaybeResetOnboardingPrefs();
// Verification
EXPECT_EQ(static_cast<TrackingProtectionOnboardingStatus>(prefs()->GetInteger(
prefs::kTrackingProtectionSilentOnboardingStatus)),
TrackingProtectionOnboardingStatus::kOnboarded);
}
TEST_F(TrackingProtectionSilentOnboardingTest,
MaybeResetOnboardingPrefsInCanary) {
// Setup
tracking_protection_onboarding_service_ =
std::make_unique<TrackingProtectionOnboarding>(
prefs(), version_info::Channel::CANARY);
prefs()->SetInteger(
prefs::kTrackingProtectionSilentOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kOnboarded));
// Action
tracking_protection_onboarding()->MaybeResetOnboardingPrefs();
// Verification
EXPECT_FALSE(
prefs()
->FindPreference(prefs::kTrackingProtectionSilentOnboardingStatus)
->HasUserSetting());
}
TEST_F(TrackingProtectionSilentOnboardingTest,
MaybeResetOnboardingPrefsInCanaryTriggersObserver) {
// Setup
tracking_protection_onboarding_service_ =
std::make_unique<TrackingProtectionOnboarding>(
prefs(), version_info::Channel::CANARY);
prefs()->SetInteger(
prefs::kTrackingProtectionSilentOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kOnboarded));
prefs()->SetBoolean(prefs::kTrackingProtectionOnboardingAcked, true);
MockTrackingProtectionObserver observer;
tracking_protection_onboarding()->AddObserver(&observer);
EXPECT_CALL(
observer,
OnTrackingProtectionSilentOnboardingUpdated(
TrackingProtectionOnboarding::SilentOnboardingStatus::kIneligible));
// Action
tracking_protection_onboarding()->MaybeResetOnboardingPrefs();
// Expectation
testing::Mock::VerifyAndClearExpectations(&observer);
}
class TrackingProtectionSilentOnboardingAccessorTest
: public TrackingProtectionSilentOnboardingTest,
public testing::WithParamInterface<
std::pair<TrackingProtectionOnboardingStatus,
TrackingProtectionOnboarding::SilentOnboardingStatus>> {};
TEST_P(TrackingProtectionSilentOnboardingAccessorTest,
ReturnsCorrectOnboardingValue) {
prefs()->SetInteger(prefs::kTrackingProtectionSilentOnboardingStatus,
static_cast<int>(std::get<0>(GetParam())));
EXPECT_EQ(tracking_protection_onboarding()->GetSilentOnboardingStatus(),
std::get<1>(GetParam()));
}
INSTANTIATE_TEST_SUITE_P(
TrackingProtectionSilentOnboardingAccessorTest,
TrackingProtectionSilentOnboardingAccessorTest,
testing::Values(
std::pair(
TrackingProtectionOnboardingStatus::kIneligible,
TrackingProtectionOnboarding::SilentOnboardingStatus::kIneligible),
std::pair(
TrackingProtectionOnboardingStatus::kEligible,
TrackingProtectionOnboarding::SilentOnboardingStatus::kEligible),
std::pair(
TrackingProtectionOnboardingStatus::kOnboarded,
TrackingProtectionOnboarding::SilentOnboardingStatus::kOnboarded)));
class TrackingProtectionSilentOnboardingStartupStateTest
: public TrackingProtectionSilentOnboardingTest {
protected:
base::HistogramTester histogram_tester_;
};
TEST_F(TrackingProtectionSilentOnboardingStartupStateTest,
StartupStateIneligible) {
// Silent onboarding startup state starts as ineligible
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.SilentOnboardingStartup.State",
TrackingProtectionOnboarding::OnboardingStartupState::kIneligible, 1);
}
TEST_F(TrackingProtectionSilentOnboardingStartupStateTest,
StartupStateEligible) {
tracking_protection_onboarding_service_->MaybeMarkSilentEligible();
tracking_protection_onboarding_service_.reset();
tracking_protection_onboarding_service_ =
std::make_unique<TrackingProtectionOnboarding>(
prefs(), version_info::Channel::UNKNOWN);
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.SilentOnboardingStartup.State",
TrackingProtectionOnboarding::SilentOnboardingStartupState::
kEligibleWaitingToOnboard,
1);
}
TEST_F(TrackingProtectionSilentOnboardingStartupStateTest,
StartupStateOnboarded) {
tracking_protection_onboarding_service_->MaybeMarkSilentEligible();
tracking_protection_onboarding_service_->SilentOnboardingNoticeShown();
tracking_protection_onboarding_service_.reset();
tracking_protection_onboarding_service_ =
std::make_unique<TrackingProtectionOnboarding>(
prefs(), version_info::Channel::UNKNOWN);
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.SilentOnboardingStartup.State",
TrackingProtectionOnboarding::SilentOnboardingStartupState::kOnboarded,
1);
}
TEST_F(TrackingProtectionSilentOnboardingStartupStateTest,
StartupStateEligibleWaitingToOnboardSince) {
// Setup
tracking_protection_onboarding_service_->MaybeMarkSilentEligible();
auto delay = base::Seconds(15);
task_env_.FastForwardBy(delay);
// Action
tracking_protection_onboarding_service_.reset();
tracking_protection_onboarding_service_ =
std::make_unique<TrackingProtectionOnboarding>(
prefs(), version_info::Channel::UNKNOWN);
// Verification
histogram_tester_.ExpectTimeBucketCount(
"PrivacySandbox.TrackingProtection.SilentOnboardingStartup."
"WaitingToOnboardSince",
delay, 1);
}
TEST_F(TrackingProtectionSilentOnboardingStartupStateTest,
StartupStateEligibleToOnboardedDuration) {
tracking_protection_onboarding_service_->MaybeMarkSilentEligible();
tracking_protection_onboarding_service_->SilentOnboardingNoticeShown();
tracking_protection_onboarding_service_.reset();
tracking_protection_onboarding_service_ =
std::make_unique<TrackingProtectionOnboarding>(
prefs(), version_info::Channel::UNKNOWN);
auto eligible_to_onboarded_duration =
prefs()->GetTime(prefs::kTrackingProtectionSilentOnboardedSince) -
prefs()->GetTime(prefs::kTrackingProtectionSilentEligibleSince);
histogram_tester_.ExpectTimeBucketCount(
"PrivacySandbox.TrackingProtection.SilentOnboardingStartup."
"EligibleToOnboardedDuration",
eligible_to_onboarded_duration, 1);
}
TEST_F(TrackingProtectionOnboardingStartupStateTest,
OnboardingStartupAckedSinceHistogram) {
// Setup
tracking_protection_onboarding_service_->MaybeMarkEligible();
tracking_protection_onboarding_service_->OnboardingNoticeShown();
tracking_protection_onboarding_service_->OnboardingNoticeActionTaken(
TrackingProtectionOnboarding::NoticeAction::kGotIt);
auto delay = base::Seconds(15);
task_env_.FastForwardBy(delay);
// Action
tracking_protection_onboarding_service_.reset();
tracking_protection_onboarding_service_ =
std::make_unique<TrackingProtectionOnboarding>(
prefs(), version_info::Channel::UNKNOWN);
// Verification
histogram_tester_.ExpectTimeBucketCount(
"PrivacySandbox.TrackingProtection.OnboardingStartup."
"AckedSince",
delay, 1);
}
} // namespace
} // namespace privacy_sandbox