blob: ab51b5ee7c15bc4e817b0641d8c23ae6202aeded [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 "privacy_sandbox_notice_constants.h"
#include "privacy_sandbox_notice_storage.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "tracking_protection_onboarding.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 SurfaceType =
::privacy_sandbox::TrackingProtectionOnboarding::SurfaceType;
using ::testing::Combine;
using ::testing::Values;
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 RecreateOnboardingService(
version_info::Channel channel = version_info::Channel::UNKNOWN) {
tracking_protection_onboarding_service_ =
std::make_unique<TrackingProtectionOnboarding>(prefs(), channel);
}
void SetUp() override { RecreateOnboardingService(); }
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()->MaybeMarkModeBEligible();
// Verification
testing::Mock::VerifyAndClearExpectations(&observer);
}
TEST_F(TrackingProtectionOnboardingTest,
MarkingAsIneligibleTriggersShouldShowNoticeObservers) {
// Setup
// We start with an eligible profile
tracking_protection_onboarding()->MaybeMarkModeBEligible();
MockTrackingProtectionObserver observer;
tracking_protection_onboarding()->AddObserver(&observer);
EXPECT_CALL(observer, OnShouldShowNoticeUpdated()).Times(1);
// Action
tracking_protection_onboarding()->MaybeMarkModeBIneligible();
// Verification
testing::Mock::VerifyAndClearExpectations(&observer);
}
TEST_F(TrackingProtectionOnboardingTest,
NoticeActionTriggersShouldShowNoticeObservers) {
// Setup
// We start with an eligible profile
tracking_protection_onboarding()->MaybeMarkModeBEligible();
MockTrackingProtectionObserver observer;
tracking_protection_onboarding()->AddObserver(&observer);
EXPECT_CALL(observer, OnShouldShowNoticeUpdated()).Times(1);
// Action
tracking_protection_onboarding()->NoticeActionTaken(
SurfaceType::kDesktop, NoticeType::kModeBOnboarding,
NoticeAction::kSettings);
// Verification
testing::Mock::VerifyAndClearExpectations(&observer);
}
TEST_F(TrackingProtectionOnboardingTest,
NoticeShownDoesNotTriggerShouldShowNoticeObservers) {
// Setup
// We start with an eligible profile
tracking_protection_onboarding()->MaybeMarkModeBEligible();
MockTrackingProtectionObserver observer;
tracking_protection_onboarding()->AddObserver(&observer);
EXPECT_CALL(observer, OnShouldShowNoticeUpdated()).Times(0);
// Action
tracking_protection_onboarding()->NoticeShown(SurfaceType::kDesktop,
NoticeType::kModeBOnboarding);
// Verification
testing::Mock::VerifyAndClearExpectations(&observer);
}
TEST_F(TrackingProtectionOnboardingTest,
MaybeMarkEligibleDoesNothingIfProfileNotIneligible) {
// Setup
prefs()->SetInteger(
prefs::kTrackingProtectionOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kOnboarded));
// Action
tracking_protection_onboarding()->MaybeMarkModeBEligible();
// 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()->MaybeMarkModeBEligible();
// 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()->MaybeMarkModeBIneligible();
// 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()->MaybeMarkModeBIneligible();
// 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()->NoticeShown(SurfaceType::kDesktop,
NoticeType::kModeBOnboarding);
// 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()->NoticeShown(SurfaceType::kDesktop,
NoticeType::kModeBOnboarding);
// 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()->NoticeShown(SurfaceType::kDesktop,
NoticeType::kModeBOnboarding);
auto delay = base::Seconds(15);
task_env_.FastForwardBy(delay);
// Show the notice again.
tracking_protection_onboarding()->NoticeShown(SurfaceType::kDesktop,
NoticeType::kModeBOnboarding);
// 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()->NoticeActionTaken(
SurfaceType::kDesktop, NoticeType::kModeBOnboarding,
NoticeAction::kGotIt);
// Action: Re Ack with Learnmore
tracking_protection_onboarding()->NoticeActionTaken(
SurfaceType::kDesktop, NoticeType::kModeBOnboarding,
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()->NoticeActionTaken(
SurfaceType::kDesktop, NoticeType::kModeBOnboarding,
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()->GetRequiredNotice(
SurfaceType::kDesktop),
NoticeType::kNone);
}
TEST_F(TrackingProtectionOnboardingTest,
ShouldShowNoticeReturnsIsTrueIfProfileEligible) {
// Setup
prefs()->SetInteger(
prefs::kTrackingProtectionOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kEligible));
// Verification
EXPECT_EQ(tracking_protection_onboarding()->GetRequiredNotice(
SurfaceType::kDesktop),
NoticeType::kModeBOnboarding);
}
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()->GetRequiredNotice(
SurfaceType::kDesktop),
NoticeType::kModeBOnboarding);
}
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()->GetRequiredNotice(
SurfaceType::kDesktop),
NoticeType::kNone);
}
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()->MaybeResetModeBOnboardingPrefs();
// 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()->MaybeResetModeBOnboardingPrefs();
// 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()->MaybeResetModeBOnboardingPrefs();
// Expectation
testing::Mock::VerifyAndClearExpectations(&observer);
}
TEST_F(TrackingProtectionOnboardingTest, OnboardedToAckForNotOnboardedProfile) {
tracking_protection_onboarding()->MaybeMarkModeBEligible();
EXPECT_EQ(tracking_protection_onboarding()->OnboardedToAcknowledged(),
std::nullopt);
}
TEST_F(TrackingProtectionOnboardingTest, OnboardedToAckForNotAckedProfile) {
tracking_protection_onboarding()->MaybeMarkModeBEligible();
tracking_protection_onboarding()->NoticeShown(SurfaceType::kDesktop,
NoticeType::kModeBOnboarding);
EXPECT_EQ(tracking_protection_onboarding()->OnboardedToAcknowledged(),
std::nullopt);
}
TEST_F(TrackingProtectionOnboardingTest, OnboardedToAckForAckedProfile) {
tracking_protection_onboarding()->MaybeMarkModeBEligible();
tracking_protection_onboarding()->NoticeShown(SurfaceType::kDesktop,
NoticeType::kModeBOnboarding);
auto delay = base::Seconds(15);
task_env_.FastForwardBy(delay);
tracking_protection_onboarding()->NoticeActionTaken(
SurfaceType::kDesktop, NoticeType::kModeBOnboarding,
NoticeAction::kGotIt);
EXPECT_EQ(tracking_protection_onboarding()->OnboardedToAcknowledged(),
std::make_optional(delay));
}
TEST_F(TrackingProtectionOnboardingTest,
OnboardingTimestampIsNullForNotOnboardedProfile) {
tracking_protection_onboarding()->MaybeMarkModeBEligible();
EXPECT_EQ(tracking_protection_onboarding()->GetOnboardingTimestamp(),
std::nullopt);
}
TEST_F(TrackingProtectionOnboardingTest,
ReturnsOnboardingTimestampForOnboardedProfile) {
tracking_protection_onboarding()->MaybeMarkModeBEligible();
tracking_protection_onboarding()->NoticeShown(SurfaceType::kDesktop,
NoticeType::kModeBOnboarding);
EXPECT_EQ(tracking_protection_onboarding()->GetOnboardingTimestamp(),
std::make_optional(base::Time::Now()));
}
TEST_F(TrackingProtectionOnboardingTest, UserActionMetrics) {
base::UserActionTester user_action_tester;
tracking_protection_onboarding()->NoticeShown(SurfaceType::kDesktop,
NoticeType::kModeBOnboarding);
EXPECT_EQ(
1, user_action_tester.GetActionCount("TrackingProtection.Notice.Shown"));
tracking_protection_onboarding()->NoticeActionTaken(
SurfaceType::kDesktop, NoticeType::kModeBOnboarding,
NoticeAction::kOther);
EXPECT_EQ(1, user_action_tester.GetActionCount(
"TrackingProtection.Notice.DismissedOther"));
tracking_protection_onboarding()->NoticeActionTaken(
SurfaceType::kDesktop, NoticeType::kModeBOnboarding,
NoticeAction::kGotIt);
EXPECT_EQ(1, user_action_tester.GetActionCount(
"TrackingProtection.Notice.GotItClicked"));
tracking_protection_onboarding()->NoticeActionTaken(
SurfaceType::kDesktop, NoticeType::kModeBOnboarding,
NoticeAction::kSettings);
EXPECT_EQ(1, user_action_tester.GetActionCount(
"TrackingProtection.Notice.SettingsClicked"));
tracking_protection_onboarding()->NoticeActionTaken(
SurfaceType::kDesktop, NoticeType::kModeBOnboarding,
NoticeAction::kLearnMore);
EXPECT_EQ(1, user_action_tester.GetActionCount(
"TrackingProtection.Notice.LearnMoreClicked"));
tracking_protection_onboarding()->NoticeActionTaken(
SurfaceType::kDesktop, NoticeType::kModeBOnboarding,
NoticeAction::kClosed);
EXPECT_EQ(
1, user_action_tester.GetActionCount("TrackingProtection.Notice.Closed"));
}
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::kOnboarded,
TrackingProtectionOnboarding::OnboardingStatus::kOnboarded)));
class TrackingProtectionOnboardingAckActionTest
: public TrackingProtectionOnboardingTest,
public testing::WithParamInterface<std::pair<
NoticeAction,
tracking_protection::TrackingProtectionOnboardingAckAction>> {};
TEST_P(TrackingProtectionOnboardingAckActionTest,
UserNoticeActionTakenAcknowledgedCorrectly) {
// Action
tracking_protection_onboarding()->NoticeActionTaken(
SurfaceType::kDesktop, NoticeType::kModeBOnboarding,
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(NoticeAction::kOther,
TrackingProtectionOnboardingAckAction::kOther),
std::pair(NoticeAction::kGotIt,
TrackingProtectionOnboardingAckAction::kGotIt),
std::pair(NoticeAction::kSettings,
TrackingProtectionOnboardingAckAction::kSettings),
std::pair(NoticeAction::kLearnMore,
TrackingProtectionOnboardingAckAction::kLearnMore),
std::pair(NoticeAction::kClosed,
TrackingProtectionOnboardingAckAction::kClosed)));
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_->MaybeMarkModeBEligible();
tracking_protection_onboarding_service_.reset();
RecreateOnboardingService();
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.OnboardingStartup.State",
TrackingProtectionOnboarding::OnboardingStartupState::
kEligibleWaitingToOnboard,
1);
}
TEST_F(TrackingProtectionOnboardingStartupStateTest,
OnboardingStartupStateOnboardingWaitingToAck) {
tracking_protection_onboarding_service_->MaybeMarkModeBEligible();
tracking_protection_onboarding_service_->NoticeShown(
SurfaceType::kDesktop, NoticeType::kModeBOnboarding);
tracking_protection_onboarding_service_.reset();
RecreateOnboardingService();
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.OnboardingStartup.State",
TrackingProtectionOnboarding::OnboardingStartupState::
kOnboardedWaitingToAck,
1);
}
class TrackingProtectionOnboardingStartupStateAckedTest
: public TrackingProtectionOnboardingTest,
public testing::WithParamInterface<
std::pair<NoticeAction,
TrackingProtectionOnboarding::OnboardingStartupState>> {
protected:
base::HistogramTester histogram_tester_;
};
TEST_P(TrackingProtectionOnboardingStartupStateAckedTest,
OnboardingStartupStateAckedAction) {
tracking_protection_onboarding_service_->MaybeMarkModeBEligible();
tracking_protection_onboarding_service_->NoticeShown(
SurfaceType::kDesktop, NoticeType::kModeBOnboarding);
tracking_protection_onboarding_service_->NoticeActionTaken(
SurfaceType::kDesktop, NoticeType::kModeBOnboarding,
std::get<0>(GetParam()));
tracking_protection_onboarding_service_.reset();
RecreateOnboardingService();
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.OnboardingStartup.State",
std::get<1>(GetParam()), 1);
}
INSTANTIATE_TEST_SUITE_P(
TrackingProtectionOnboardingStartupStateAckedTest,
TrackingProtectionOnboardingStartupStateAckedTest,
testing::Values(
std::pair(
NoticeAction::kGotIt,
TrackingProtectionOnboarding::OnboardingStartupState::kAckedGotIt),
std::pair(NoticeAction::kSettings,
TrackingProtectionOnboarding::OnboardingStartupState::
kAckedSettings),
std::pair(
NoticeAction::kClosed,
TrackingProtectionOnboarding::OnboardingStartupState::kAckedClosed),
std::pair(NoticeAction::kLearnMore,
TrackingProtectionOnboarding::OnboardingStartupState::
kAckedLearnMore),
std::pair(NoticeAction::kOther,
TrackingProtectionOnboarding::OnboardingStartupState::
kAckedOther)));
TEST_F(TrackingProtectionOnboardingStartupStateTest,
OnboardingStartupStateEligibleWaitingToOnboardSince) {
// Setup
tracking_protection_onboarding_service_->MaybeMarkModeBEligible();
auto delay = base::Seconds(15);
task_env_.FastForwardBy(delay);
// Action
tracking_protection_onboarding_service_.reset();
RecreateOnboardingService();
// Verification
histogram_tester_.ExpectTimeBucketCount(
"PrivacySandbox.TrackingProtection.OnboardingStartup."
"WaitingToOnboardSince",
delay, 1);
}
TEST_F(TrackingProtectionOnboardingStartupStateTest,
OnboardingStartupStateOnboardedWaitingToAckTimings) {
// Setup
tracking_protection_onboarding_service_->MaybeMarkModeBEligible();
tracking_protection_onboarding_service_->NoticeShown(
SurfaceType::kDesktop, NoticeType::kModeBOnboarding);
auto delay = base::Seconds(15);
task_env_.FastForwardBy(delay);
// Action
tracking_protection_onboarding_service_.reset();
RecreateOnboardingService();
// 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_->MaybeMarkModeBEligible();
tracking_protection_onboarding_service_->NoticeShown(
SurfaceType::kDesktop, NoticeType::kModeBOnboarding);
tracking_protection_onboarding_service_->NoticeActionTaken(
SurfaceType::kDesktop, NoticeType::kModeBOnboarding,
NoticeAction::kOther);
tracking_protection_onboarding_service_.reset();
RecreateOnboardingService();
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_->MaybeMarkModeBEligible();
tracking_protection_onboarding_service_->NoticeShown(
SurfaceType::kDesktop, NoticeType::kModeBOnboarding);
tracking_protection_onboarding_service_.reset();
RecreateOnboardingService();
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_->MaybeMarkModeBEligible();
tracking_protection_onboarding_service_->NoticeShown(
SurfaceType::kDesktop, NoticeType::kModeBOnboarding);
tracking_protection_onboarding_service_->NoticeActionTaken(
SurfaceType::kDesktop, NoticeType::kModeBOnboarding,
NoticeAction::kOther);
tracking_protection_onboarding_service_.reset();
RecreateOnboardingService();
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_->MaybeMarkModeBEligible();
tracking_protection_onboarding_service_->NoticeShown(
SurfaceType::kDesktop, NoticeType::kModeBOnboarding);
tracking_protection_onboarding_service_->NoticeActionTaken(
SurfaceType::kDesktop, NoticeType::kModeBOnboarding,
NoticeAction::kOther);
tracking_protection_onboarding_service_.reset();
RecreateOnboardingService();
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_->MaybeMarkModeBEligible();
// 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_->MaybeMarkModeBEligible();
// 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_->MaybeMarkModeBIneligible();
// 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_->MaybeMarkModeBIneligible();
// Verification
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.Onboarding.MaybeMarkIneligible", true,
1);
}
TEST_F(TrackingProtectionOnboardingTest,
OnboardingDidNoticeShownOnboardHistogram) {
// Action
tracking_protection_onboarding_service_->NoticeShown(
SurfaceType::kDesktop, NoticeType::kModeBOnboarding);
// Verification
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.Onboarding.DidNoticeShownOnboard",
false, 1);
// Setup
tracking_protection_onboarding_service_->MaybeMarkModeBEligible();
// Action
tracking_protection_onboarding_service_->NoticeShown(
SurfaceType::kDesktop, NoticeType::kModeBOnboarding);
// 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_->NoticeActionTaken(
SurfaceType::kDesktop, NoticeType::kModeBOnboarding,
NoticeAction::kOther);
// Verification
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.Onboarding.DidNoticeActionAckowledge",
false, 1);
// Setup
prefs()->SetBoolean(prefs::kTrackingProtectionOnboardingAcked, false);
// Action
tracking_protection_onboarding_service_->NoticeActionTaken(
SurfaceType::kDesktop, NoticeType::kModeBOnboarding,
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()->MaybeMarkModeBSilentEligible();
// Verification
testing::Mock::VerifyAndClearExpectations(&observer);
}
TEST_F(TrackingProtectionSilentOnboardingTest,
MarkingAsIneligibleTriggersShouldShowNoticeObservers) {
// Setup
// We start with an eligible profile
tracking_protection_onboarding()->MaybeMarkModeBSilentEligible();
MockTrackingProtectionObserver observer;
tracking_protection_onboarding()->AddObserver(&observer);
EXPECT_CALL(observer, OnShouldShowNoticeUpdated()).Times(1);
// Action
tracking_protection_onboarding()->MaybeMarkModeBSilentIneligible();
// Verification
testing::Mock::VerifyAndClearExpectations(&observer);
}
TEST_F(TrackingProtectionSilentOnboardingTest,
NoticeShownTriggersShouldShowNoticeObservers) {
// Setup
// We start with an eligible profile
tracking_protection_onboarding()->MaybeMarkModeBSilentEligible();
MockTrackingProtectionObserver observer;
tracking_protection_onboarding()->AddObserver(&observer);
EXPECT_CALL(observer, OnShouldShowNoticeUpdated()).Times(1);
// Action
tracking_protection_onboarding()->NoticeShown(
SurfaceType::kDesktop, NoticeType::kModeBSilentOnboarding);
// Verification
testing::Mock::VerifyAndClearExpectations(&observer);
}
TEST_F(TrackingProtectionSilentOnboardingTest,
MaybeMarkEligibleDoesNothingIfProfileNotIneligible) {
// Setup
prefs()->SetInteger(
prefs::kTrackingProtectionSilentOnboardingStatus,
static_cast<int>(TrackingProtectionOnboardingStatus::kOnboarded));
// Action
tracking_protection_onboarding()->MaybeMarkModeBSilentEligible();
// 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()->MaybeMarkModeBSilentEligible();
// 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()->MaybeMarkModeBSilentIneligible();
// 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()->MaybeMarkModeBSilentIneligible();
// 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()->NoticeShown(
SurfaceType::kDesktop, NoticeType::kModeBSilentOnboarding);
// 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()->NoticeShown(
SurfaceType::kDesktop, NoticeType::kModeBSilentOnboarding);
// 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(
SurfaceType::kDesktop),
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(
SurfaceType::kDesktop),
NoticeType::kModeBSilentOnboarding);
}
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(
SurfaceType::kDesktop),
NoticeType::kNone);
}
TEST_F(TrackingProtectionSilentOnboardingTest,
OnboardingEligibleToOnboardedDuration) {
tracking_protection_onboarding_service_->MaybeMarkModeBSilentEligible();
tracking_protection_onboarding_service_->NoticeShown(
SurfaceType::kDesktop, NoticeType::kModeBSilentOnboarding);
tracking_protection_onboarding_service_.reset();
RecreateOnboardingService();
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_->MaybeMarkModeBSilentEligible();
// 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_->MaybeMarkModeBSilentEligible();
// 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_->MaybeMarkModeBSilentIneligible();
// 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_->MaybeMarkModeBSilentIneligible();
// Verification
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.SilentOnboarding.MaybeMarkIneligible",
true, 1);
}
TEST_F(TrackingProtectionSilentOnboardingTest, DidNoticeShownOnboardHistogram) {
// Action
tracking_protection_onboarding_service_->NoticeShown(
SurfaceType::kDesktop, NoticeType::kModeBSilentOnboarding);
// Verification
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.SilentOnboarding."
"DidNoticeShownOnboard",
false, 1);
// Setup
tracking_protection_onboarding_service_->MaybeMarkModeBSilentEligible();
// Action
tracking_protection_onboarding_service_->NoticeShown(
SurfaceType::kDesktop, NoticeType::kModeBSilentOnboarding);
// 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()->MaybeResetModeBOnboardingPrefs();
// 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()->MaybeResetModeBOnboardingPrefs();
// 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()->MaybeResetModeBOnboardingPrefs();
// Expectation
testing::Mock::VerifyAndClearExpectations(&observer);
}
TEST_F(TrackingProtectionSilentOnboardingTest,
SilentOnboardingTimestampIsNullForNotOnboardedProfile) {
tracking_protection_onboarding()->MaybeMarkModeBSilentEligible();
EXPECT_EQ(tracking_protection_onboarding()->GetSilentOnboardingTimestamp(),
std::nullopt);
}
TEST_F(TrackingProtectionSilentOnboardingTest,
ReturnsSilentOnboardingTimestampForSilentlyOnboardedProfile) {
tracking_protection_onboarding()->MaybeMarkModeBSilentEligible();
tracking_protection_onboarding()->NoticeShown(
SurfaceType::kDesktop, NoticeType::kModeBSilentOnboarding);
EXPECT_EQ(tracking_protection_onboarding()->GetSilentOnboardingTimestamp(),
std::make_optional(base::Time::Now()));
}
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_->MaybeMarkModeBSilentEligible();
tracking_protection_onboarding_service_.reset();
RecreateOnboardingService();
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.SilentOnboardingStartup.State",
TrackingProtectionOnboarding::SilentOnboardingStartupState::
kEligibleWaitingToOnboard,
1);
}
TEST_F(TrackingProtectionSilentOnboardingStartupStateTest,
StartupStateOnboarded) {
tracking_protection_onboarding_service_->MaybeMarkModeBSilentEligible();
tracking_protection_onboarding_service_->NoticeShown(
SurfaceType::kDesktop, NoticeType::kModeBSilentOnboarding);
tracking_protection_onboarding_service_.reset();
RecreateOnboardingService();
histogram_tester_.ExpectBucketCount(
"PrivacySandbox.TrackingProtection.SilentOnboardingStartup.State",
TrackingProtectionOnboarding::SilentOnboardingStartupState::kOnboarded,
1);
}
TEST_F(TrackingProtectionSilentOnboardingStartupStateTest,
StartupStateEligibleWaitingToOnboardSince) {
// Setup
tracking_protection_onboarding_service_->MaybeMarkModeBSilentEligible();
auto delay = base::Seconds(15);
task_env_.FastForwardBy(delay);
// Action
tracking_protection_onboarding_service_.reset();
RecreateOnboardingService();
// Verification
histogram_tester_.ExpectTimeBucketCount(
"PrivacySandbox.TrackingProtection.SilentOnboardingStartup."
"WaitingToOnboardSince",
delay, 1);
}
TEST_F(TrackingProtectionSilentOnboardingStartupStateTest,
StartupStateEligibleToOnboardedDuration) {
tracking_protection_onboarding_service_->MaybeMarkModeBSilentEligible();
tracking_protection_onboarding_service_->NoticeShown(
SurfaceType::kDesktop, NoticeType::kModeBSilentOnboarding);
tracking_protection_onboarding_service_.reset();
RecreateOnboardingService();
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_->MaybeMarkModeBEligible();
tracking_protection_onboarding_service_->NoticeShown(
SurfaceType::kDesktop, NoticeType::kModeBOnboarding);
tracking_protection_onboarding_service_->NoticeActionTaken(
SurfaceType::kDesktop, NoticeType::kModeBOnboarding,
NoticeAction::kGotIt);
auto delay = base::Seconds(15);
task_env_.FastForwardBy(delay);
// Action
tracking_protection_onboarding_service_.reset();
RecreateOnboardingService();
// Verification
histogram_tester_.ExpectTimeBucketCount(
"PrivacySandbox.TrackingProtection.OnboardingStartup."
"AckedSince",
delay, 1);
}
} // namespace
} // namespace privacy_sandbox