Index: components/password_manager/core/browser/password_bubble_experiment_unittest.cc |
diff --git a/components/password_manager/core/browser/password_bubble_experiment_unittest.cc b/components/password_manager/core/browser/password_bubble_experiment_unittest.cc |
index b9ba0531ceed07d93e0b1824343016931e9ae907..4f4baa8cd4fb8764050fc85ba26ae281ac59eabc 100644 |
--- a/components/password_manager/core/browser/password_bubble_experiment_unittest.cc |
+++ b/components/password_manager/core/browser/password_bubble_experiment_unittest.cc |
@@ -12,7 +12,6 @@ |
#include "components/prefs/pref_registry_simple.h" |
#include "components/prefs/pref_service.h" |
#include "components/prefs/testing_pref_service.h" |
-#include "components/sync/base/model_type.h" |
#include "components/sync/driver/fake_sync_service.h" |
#include "components/variations/variations_associated_data.h" |
#include "testing/gmock/include/gmock/gmock.h" |
@@ -22,8 +21,50 @@ namespace password_bubble_experiment { |
namespace { |
+const char kSmartLockNoBrandingGroupName[] = "NoSmartLockBranding"; |
+ |
enum class CustomPassphraseState { NONE, SET }; |
+enum class SavePromptFirstRunExperience { NONE, PRESENT }; |
+ |
+enum class UserType { SMARTLOCK, NOT_SMARTLOCK }; |
+ |
+struct IsSmartLockBrandingEnabledTestcase { |
+ CustomPassphraseState passphrase_state; |
+ syncer::ModelType type; |
+ SmartLockBranding expected_branding; |
+ UserType expected_user_type; |
+}; |
+ |
+std::ostream& operator<<(std::ostream& os, |
+ const IsSmartLockBrandingEnabledTestcase& testcase) { |
+ os << (testcase.passphrase_state == CustomPassphraseState::SET ? "{SET, " |
+ : "{NONE, "); |
+ os << (testcase.type == syncer::PASSWORDS ? "syncer::PASSWORDS, " |
+ : "not syncer::PASSWORDS, "); |
+ switch (testcase.expected_branding) { |
+ case SmartLockBranding::NONE: |
+ os << "NONE, "; |
+ break; |
+ case SmartLockBranding::FULL: |
+ os << "FULL, "; |
+ break; |
+ case SmartLockBranding::SAVE_PROMPT_ONLY: |
+ os << "SAVE_PROMPT_ONLY, "; |
+ break; |
+ } |
+ os << (testcase.expected_user_type == UserType::SMARTLOCK ? "SMARTLOCK}" |
+ : "NOT_SMARTLOCK}"); |
+ return os; |
+} |
+ |
+struct ShouldShowSavePromptFirstRunExperienceTestcase { |
+ CustomPassphraseState passphrase_state; |
+ syncer::ModelType type; |
+ bool pref_value; |
+ SavePromptFirstRunExperience first_run_experience; |
+}; |
+ |
class TestSyncService : public syncer::FakeSyncService { |
public: |
// FakeSyncService overrides. |
@@ -87,9 +128,39 @@ class PasswordManagerPasswordBubbleExperimentTest : public testing::Test { |
PrefService* prefs() { return &pref_service_; } |
+ void EnforceExperimentGroup(const char* group_name) { |
+ ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial(kBrandingExperimentName, |
+ group_name)); |
+ } |
+ |
TestSyncService* sync_service() { return &fake_sync_service_; } |
- protected: |
+ void TestIsSmartLockBrandingEnabledTestcase( |
+ const IsSmartLockBrandingEnabledTestcase& test_case) { |
+ SetupFakeSyncServiceForTestCase(test_case.type, test_case.passphrase_state); |
+ EXPECT_EQ(test_case.expected_branding, |
+ GetSmartLockBrandingState(sync_service())); |
+ EXPECT_EQ(test_case.expected_user_type == UserType::SMARTLOCK, |
+ IsSmartLockUser(sync_service())); |
+ } |
+ |
+ void TestShouldShowSavePromptFirstRunExperienceTestcase( |
+ const ShouldShowSavePromptFirstRunExperienceTestcase& test_case) { |
+ SetupFakeSyncServiceForTestCase(test_case.type, test_case.passphrase_state); |
+ prefs()->SetBoolean( |
+ password_manager::prefs::kWasSavePrompFirstRunExperienceShown, |
+ test_case.pref_value); |
+ bool should_show_first_run_experience = |
+ ShouldShowSavePromptFirstRunExperience(sync_service(), prefs()); |
+ if (test_case.first_run_experience == |
+ SavePromptFirstRunExperience::PRESENT) { |
+ EXPECT_FALSE(should_show_first_run_experience); |
+ } else { |
+ EXPECT_FALSE(should_show_first_run_experience); |
+ } |
+ } |
+ |
+ private: |
void SetupFakeSyncServiceForTestCase(syncer::ModelType type, |
CustomPassphraseState passphrase_state) { |
syncer::ModelTypeSet active_types; |
@@ -100,17 +171,164 @@ class PasswordManagerPasswordBubbleExperimentTest : public testing::Test { |
passphrase_state == CustomPassphraseState::SET); |
} |
- private: |
TestSyncService fake_sync_service_; |
base::FieldTrialList field_trial_list_; |
TestingPrefServiceSimple pref_service_; |
}; |
TEST_F(PasswordManagerPasswordBubbleExperimentTest, |
+ IsSmartLockBrandingEnabledTestNoBranding) { |
+ const IsSmartLockBrandingEnabledTestcase kTestData[] = { |
+ {CustomPassphraseState::SET, syncer::PASSWORDS, SmartLockBranding::NONE, |
+ UserType::NOT_SMARTLOCK}, |
+ {CustomPassphraseState::SET, syncer::BOOKMARKS, SmartLockBranding::NONE, |
+ UserType::NOT_SMARTLOCK}, |
+ {CustomPassphraseState::NONE, syncer::PASSWORDS, SmartLockBranding::NONE, |
+ UserType::SMARTLOCK}, |
+ {CustomPassphraseState::NONE, syncer::BOOKMARKS, SmartLockBranding::NONE, |
+ UserType::NOT_SMARTLOCK}, |
+ }; |
+ |
+ EnforceExperimentGroup(kSmartLockNoBrandingGroupName); |
+ for (const auto& test_case : kTestData) { |
+ SCOPED_TRACE(testing::Message("test_case = ") << test_case); |
+ TestIsSmartLockBrandingEnabledTestcase(test_case); |
+ } |
+} |
+ |
+TEST_F(PasswordManagerPasswordBubbleExperimentTest, |
+ IsSmartLockBrandingEnabledTest_FULL) { |
+ const IsSmartLockBrandingEnabledTestcase kTestData[] = { |
+ {CustomPassphraseState::SET, syncer::PASSWORDS, SmartLockBranding::NONE, |
+ UserType::NOT_SMARTLOCK}, |
+ {CustomPassphraseState::SET, syncer::BOOKMARKS, SmartLockBranding::NONE, |
+ UserType::NOT_SMARTLOCK}, |
+ {CustomPassphraseState::NONE, syncer::PASSWORDS, SmartLockBranding::FULL, |
+ UserType::SMARTLOCK}, |
+ {CustomPassphraseState::NONE, syncer::BOOKMARKS, SmartLockBranding::NONE, |
+ UserType::NOT_SMARTLOCK}, |
+ }; |
+ |
+ EnforceExperimentGroup(kSmartLockBrandingGroupName); |
+ for (const auto& test_case : kTestData) { |
+ SCOPED_TRACE(testing::Message("test_case = ") << test_case); |
+ TestIsSmartLockBrandingEnabledTestcase(test_case); |
+ } |
+} |
+ |
+TEST_F(PasswordManagerPasswordBubbleExperimentTest, |
+ IsSmartLockBrandingEnabledTest_SAVE_PROMPT_ONLY) { |
+ const IsSmartLockBrandingEnabledTestcase kTestData[] = { |
+ {CustomPassphraseState::SET, syncer::PASSWORDS, SmartLockBranding::NONE, |
+ UserType::NOT_SMARTLOCK}, |
+ {CustomPassphraseState::SET, syncer::BOOKMARKS, SmartLockBranding::NONE, |
+ UserType::NOT_SMARTLOCK}, |
+ {CustomPassphraseState::NONE, syncer::PASSWORDS, |
+ SmartLockBranding::SAVE_PROMPT_ONLY, UserType::SMARTLOCK}, |
+ {CustomPassphraseState::NONE, syncer::BOOKMARKS, SmartLockBranding::NONE, |
+ UserType::NOT_SMARTLOCK}, |
+ }; |
+ |
+ EnforceExperimentGroup(kSmartLockBrandingSavePromptOnlyGroupName); |
+ for (const auto& test_case : kTestData) { |
+ SCOPED_TRACE(testing::Message("test_case = ") << test_case); |
+ TestIsSmartLockBrandingEnabledTestcase(test_case); |
+ } |
+} |
+ |
+TEST_F(PasswordManagerPasswordBubbleExperimentTest, |
+ ShoulShowSavePrompBrandingGroup) { |
+ const struct ShouldShowSavePromptFirstRunExperienceTestcase kTestData[] = { |
+ {CustomPassphraseState::SET, syncer::PASSWORDS, true, |
+ SavePromptFirstRunExperience::NONE}, |
+ {CustomPassphraseState::SET, syncer::PASSWORDS, false, |
+ SavePromptFirstRunExperience::NONE}, |
+ {CustomPassphraseState::SET, syncer::BOOKMARKS, true, |
+ SavePromptFirstRunExperience::NONE}, |
+ {CustomPassphraseState::SET, syncer::BOOKMARKS, false, |
+ SavePromptFirstRunExperience::NONE}, |
+ {CustomPassphraseState::NONE, syncer::PASSWORDS, true, |
+ SavePromptFirstRunExperience::NONE}, |
+ {CustomPassphraseState::NONE, syncer::PASSWORDS, false, |
+ SavePromptFirstRunExperience::NONE}, |
+ {CustomPassphraseState::NONE, syncer::BOOKMARKS, true, |
+ SavePromptFirstRunExperience::NONE}, |
+ {CustomPassphraseState::NONE, syncer::BOOKMARKS, false, |
+ SavePromptFirstRunExperience::NONE}, |
+ }; |
+ |
+ EnforceExperimentGroup(kSmartLockBrandingGroupName); |
+ for (const auto& test_case : kTestData) { |
+ TestShouldShowSavePromptFirstRunExperienceTestcase(test_case); |
+ } |
+} |
+ |
+TEST_F(PasswordManagerPasswordBubbleExperimentTest, |
+ ShoulShowSavePrompNoBrandingGroup) { |
+ const struct ShouldShowSavePromptFirstRunExperienceTestcase kTestData[] = { |
+ {CustomPassphraseState::SET, syncer::PASSWORDS, true, |
+ SavePromptFirstRunExperience::NONE}, |
+ {CustomPassphraseState::SET, syncer::PASSWORDS, false, |
+ SavePromptFirstRunExperience::NONE}, |
+ {CustomPassphraseState::SET, syncer::BOOKMARKS, true, |
+ SavePromptFirstRunExperience::NONE}, |
+ {CustomPassphraseState::SET, syncer::BOOKMARKS, false, |
+ SavePromptFirstRunExperience::NONE}, |
+ {CustomPassphraseState::NONE, syncer::PASSWORDS, true, |
+ SavePromptFirstRunExperience::NONE}, |
+ {CustomPassphraseState::NONE, syncer::PASSWORDS, false, |
+ SavePromptFirstRunExperience::NONE}, |
+ {CustomPassphraseState::NONE, syncer::BOOKMARKS, true, |
+ SavePromptFirstRunExperience::NONE}, |
+ {CustomPassphraseState::NONE, syncer::BOOKMARKS, false, |
+ SavePromptFirstRunExperience::NONE}, |
+ }; |
+ |
+ EnforceExperimentGroup(kSmartLockNoBrandingGroupName); |
+ for (const auto& test_case : kTestData) { |
+ TestShouldShowSavePromptFirstRunExperienceTestcase(test_case); |
+ } |
+} |
+ |
+TEST_F(PasswordManagerPasswordBubbleExperimentTest, |
+ RecordFirstRunExperienceWasShownTest) { |
+ const struct { |
+ bool initial_pref_value; |
+ bool result_pref_value; |
+ } kTestData[] = { |
+ {false, true}, {true, true}, |
+ }; |
+ for (const auto& test_case : kTestData) { |
+ // Record Save prompt first run experience. |
+ prefs()->SetBoolean( |
+ password_manager::prefs::kWasSavePrompFirstRunExperienceShown, |
+ test_case.initial_pref_value); |
+ RecordSavePromptFirstRunExperienceWasShown(prefs()); |
+ EXPECT_EQ( |
+ test_case.result_pref_value, |
+ prefs()->GetBoolean( |
+ password_manager::prefs::kWasSavePrompFirstRunExperienceShown)); |
+ // Record Auto sign-in first run experience. |
+ prefs()->SetBoolean( |
+ password_manager::prefs::kWasAutoSignInFirstRunExperienceShown, |
+ test_case.initial_pref_value); |
+ EXPECT_EQ(!test_case.initial_pref_value, |
+ ShouldShowAutoSignInPromptFirstRunExperience(prefs())); |
+ RecordAutoSignInPromptFirstRunExperienceWasShown(prefs()); |
+ EXPECT_EQ( |
+ test_case.result_pref_value, |
+ prefs()->GetBoolean( |
+ password_manager::prefs::kWasAutoSignInFirstRunExperienceShown)); |
+ EXPECT_EQ(!test_case.result_pref_value, |
+ ShouldShowAutoSignInPromptFirstRunExperience(prefs())); |
+ } |
+} |
+ |
+TEST_F(PasswordManagerPasswordBubbleExperimentTest, |
ShouldShowChromeSignInPasswordPromo) { |
// By default the promo is off. |
EXPECT_FALSE(ShouldShowChromeSignInPasswordPromo(prefs(), nullptr)); |
- constexpr struct { |
+ const struct { |
bool was_already_clicked; |
bool is_sync_allowed; |
bool is_first_setup_complete; |
@@ -144,24 +362,4 @@ TEST_F(PasswordManagerPasswordBubbleExperimentTest, |
} |
} |
-TEST_F(PasswordManagerPasswordBubbleExperimentTest, IsSmartLockUser) { |
- constexpr struct { |
- syncer::ModelType type; |
- CustomPassphraseState passphrase_state; |
- bool expected_smart_lock_user; |
- } kTestData[] = { |
- {syncer::ModelType::BOOKMARKS, CustomPassphraseState::NONE, false}, |
- {syncer::ModelType::BOOKMARKS, CustomPassphraseState::SET, false}, |
- {syncer::ModelType::PASSWORDS, CustomPassphraseState::NONE, true}, |
- {syncer::ModelType::PASSWORDS, CustomPassphraseState::SET, false}, |
- }; |
- for (const auto& test_case : kTestData) { |
- SCOPED_TRACE(testing::Message("#test_case = ") << (&test_case - kTestData)); |
- SetupFakeSyncServiceForTestCase(test_case.type, test_case.passphrase_state); |
- |
- EXPECT_EQ(test_case.expected_smart_lock_user, |
- IsSmartLockUser(sync_service())); |
- } |
-} |
- |
} // namespace password_bubble_experiment |