| // Copyright 2013 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "components/variations/variations_associated_data.h" |
| |
| #include "base/macros.h" |
| #include "base/metrics/field_trial.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace variations { |
| |
| namespace { |
| |
| const VariationID TEST_VALUE_A = 3300200; |
| const VariationID TEST_VALUE_B = 3300201; |
| |
| // Convenience helper to retrieve the variations::VariationID for a FieldTrial. |
| // Note that this will do the group assignment in |trial| if not already done. |
| VariationID GetIDForTrial(IDCollectionKey key, base::FieldTrial* trial) { |
| return GetGoogleVariationID(key, trial->trial_name(), trial->group_name()); |
| } |
| |
| // Call FieldTrialList::FactoryGetFieldTrial() with a future expiry date. |
| scoped_refptr<base::FieldTrial> CreateFieldTrial( |
| const std::string& trial_name, |
| int total_probability, |
| const std::string& default_group_name, |
| int* default_group_number) { |
| return base::FieldTrialList::FactoryGetFieldTrial( |
| trial_name, total_probability, default_group_name, |
| base::FieldTrialList::kNoExpirationYear, 1, 1, |
| base::FieldTrial::SESSION_RANDOMIZED, default_group_number); |
| } |
| |
| } // namespace |
| |
| class VariationsAssociatedDataTest : public ::testing::Test { |
| public: |
| VariationsAssociatedDataTest() : field_trial_list_(nullptr) {} |
| |
| ~VariationsAssociatedDataTest() override { |
| // Ensure that the maps are cleared between tests, since they are stored as |
| // process singletons. |
| testing::ClearAllVariationIDs(); |
| } |
| |
| private: |
| base::FieldTrialList field_trial_list_; |
| |
| DISALLOW_COPY_AND_ASSIGN(VariationsAssociatedDataTest); |
| }; |
| |
| // Test that if the trial is immediately disabled, GetGoogleVariationID just |
| // returns the empty ID. |
| TEST_F(VariationsAssociatedDataTest, DisableImmediately) { |
| int default_group_number = -1; |
| scoped_refptr<base::FieldTrial> trial( |
| CreateFieldTrial("trial", 100, "default", &default_group_number)); |
| |
| ASSERT_EQ(default_group_number, trial->group()); |
| ASSERT_EQ(EMPTY_ID, GetIDForTrial(GOOGLE_WEB_PROPERTIES, trial.get())); |
| } |
| |
| // Test that successfully associating the FieldTrial with some ID, and then |
| // disabling the FieldTrial actually makes GetGoogleVariationID correctly |
| // return the empty ID. |
| TEST_F(VariationsAssociatedDataTest, DisableAfterInitialization) { |
| const std::string default_name = "default"; |
| const std::string non_default_name = "non_default"; |
| |
| scoped_refptr<base::FieldTrial> trial( |
| CreateFieldTrial("trial", 100, default_name, nullptr)); |
| |
| trial->AppendGroup(non_default_name, 100); |
| AssociateGoogleVariationID(GOOGLE_WEB_PROPERTIES, trial->trial_name(), |
| default_name, TEST_VALUE_A); |
| AssociateGoogleVariationID(GOOGLE_WEB_PROPERTIES, trial->trial_name(), |
| non_default_name, TEST_VALUE_B); |
| trial->Disable(); |
| ASSERT_EQ(default_name, trial->group_name()); |
| ASSERT_EQ(TEST_VALUE_A, GetIDForTrial(GOOGLE_WEB_PROPERTIES, trial.get())); |
| } |
| |
| // Test various successful association cases. |
| TEST_F(VariationsAssociatedDataTest, AssociateGoogleVariationID) { |
| const std::string default_name1 = "default"; |
| scoped_refptr<base::FieldTrial> trial_true( |
| CreateFieldTrial("d1", 10, default_name1, nullptr)); |
| const std::string winner = "TheWinner"; |
| int winner_group = trial_true->AppendGroup(winner, 10); |
| |
| // Set GoogleVariationIDs so we can verify that they were chosen correctly. |
| AssociateGoogleVariationID(GOOGLE_WEB_PROPERTIES, trial_true->trial_name(), |
| default_name1, TEST_VALUE_A); |
| AssociateGoogleVariationID(GOOGLE_WEB_PROPERTIES, trial_true->trial_name(), |
| winner, TEST_VALUE_B); |
| |
| EXPECT_EQ(winner_group, trial_true->group()); |
| EXPECT_EQ(winner, trial_true->group_name()); |
| EXPECT_EQ(TEST_VALUE_B, |
| GetIDForTrial(GOOGLE_WEB_PROPERTIES, trial_true.get())); |
| |
| const std::string default_name2 = "default2"; |
| scoped_refptr<base::FieldTrial> trial_false( |
| CreateFieldTrial("d2", 10, default_name2, nullptr)); |
| const std::string loser = "ALoser"; |
| const int loser_group = trial_false->AppendGroup(loser, 0); |
| |
| AssociateGoogleVariationID(GOOGLE_WEB_PROPERTIES, trial_false->trial_name(), |
| default_name2, TEST_VALUE_A); |
| AssociateGoogleVariationID(GOOGLE_WEB_PROPERTIES, trial_false->trial_name(), |
| loser, TEST_VALUE_B); |
| |
| EXPECT_NE(loser_group, trial_false->group()); |
| EXPECT_EQ(TEST_VALUE_A, |
| GetIDForTrial(GOOGLE_WEB_PROPERTIES, trial_false.get())); |
| } |
| |
| // Test that not associating a FieldTrial with any IDs ensure that the empty ID |
| // will be returned. |
| TEST_F(VariationsAssociatedDataTest, NoAssociation) { |
| const std::string default_name = "default"; |
| scoped_refptr<base::FieldTrial> no_id_trial( |
| CreateFieldTrial("d3", 10, default_name, nullptr)); |
| |
| const std::string winner = "TheWinner"; |
| const int winner_group = no_id_trial->AppendGroup(winner, 10); |
| |
| // Ensure that despite the fact that a normal winner is elected, it does not |
| // have a valid VariationID associated with it. |
| EXPECT_EQ(winner_group, no_id_trial->group()); |
| EXPECT_EQ(winner, no_id_trial->group_name()); |
| EXPECT_EQ(EMPTY_ID, GetIDForTrial(GOOGLE_WEB_PROPERTIES, no_id_trial.get())); |
| } |
| |
| // Ensure that the AssociateGoogleVariationIDForce works as expected. |
| TEST_F(VariationsAssociatedDataTest, ForceAssociation) { |
| EXPECT_EQ(EMPTY_ID, |
| GetGoogleVariationID(GOOGLE_WEB_PROPERTIES, "trial", "group")); |
| AssociateGoogleVariationID(GOOGLE_WEB_PROPERTIES, "trial", "group", |
| TEST_VALUE_A); |
| EXPECT_EQ(TEST_VALUE_A, |
| GetGoogleVariationID(GOOGLE_WEB_PROPERTIES, "trial", "group")); |
| AssociateGoogleVariationID(GOOGLE_WEB_PROPERTIES, "trial", "group", |
| TEST_VALUE_B); |
| EXPECT_EQ(TEST_VALUE_A, |
| GetGoogleVariationID(GOOGLE_WEB_PROPERTIES, "trial", "group")); |
| AssociateGoogleVariationIDForce(GOOGLE_WEB_PROPERTIES, "trial", "group", |
| TEST_VALUE_B); |
| EXPECT_EQ(TEST_VALUE_B, |
| GetGoogleVariationID(GOOGLE_WEB_PROPERTIES, "trial", "group")); |
| } |
| |
| // Ensure that two collections can coexist without affecting each other. |
| TEST_F(VariationsAssociatedDataTest, CollectionsCoexist) { |
| const std::string default_name = "default"; |
| int default_group_number = -1; |
| scoped_refptr<base::FieldTrial> trial_true( |
| CreateFieldTrial("d1", 10, default_name, &default_group_number)); |
| ASSERT_EQ(default_group_number, trial_true->group()); |
| ASSERT_EQ(default_name, trial_true->group_name()); |
| |
| EXPECT_EQ(EMPTY_ID, |
| GetIDForTrial(GOOGLE_WEB_PROPERTIES, trial_true.get())); |
| EXPECT_EQ(EMPTY_ID, |
| GetIDForTrial(GOOGLE_WEB_PROPERTIES_TRIGGER, trial_true.get())); |
| EXPECT_EQ(EMPTY_ID, |
| GetIDForTrial(CHROME_SYNC_EVENT_LOGGER, trial_true.get())); |
| |
| AssociateGoogleVariationID(GOOGLE_WEB_PROPERTIES, trial_true->trial_name(), |
| default_name, TEST_VALUE_A); |
| EXPECT_EQ(TEST_VALUE_A, |
| GetIDForTrial(GOOGLE_WEB_PROPERTIES, trial_true.get())); |
| EXPECT_EQ(EMPTY_ID, |
| GetIDForTrial(CHROME_SYNC_EVENT_LOGGER, trial_true.get())); |
| |
| AssociateGoogleVariationID(CHROME_SYNC_EVENT_LOGGER, trial_true->trial_name(), |
| default_name, TEST_VALUE_A); |
| EXPECT_EQ(TEST_VALUE_A, |
| GetIDForTrial(GOOGLE_WEB_PROPERTIES, trial_true.get())); |
| EXPECT_EQ(TEST_VALUE_A, |
| GetIDForTrial(CHROME_SYNC_EVENT_LOGGER, trial_true.get())); |
| |
| trial_true = CreateFieldTrial("d2", 10, default_name, &default_group_number); |
| ASSERT_EQ(default_group_number, trial_true->group()); |
| ASSERT_EQ(default_name, trial_true->group_name()); |
| |
| AssociateGoogleVariationID(GOOGLE_WEB_PROPERTIES_TRIGGER, |
| trial_true->trial_name(), default_name, |
| TEST_VALUE_A); |
| EXPECT_EQ(TEST_VALUE_A, |
| GetIDForTrial(GOOGLE_WEB_PROPERTIES_TRIGGER, trial_true.get())); |
| EXPECT_EQ(EMPTY_ID, |
| GetIDForTrial(CHROME_SYNC_EVENT_LOGGER, trial_true.get())); |
| |
| AssociateGoogleVariationID(CHROME_SYNC_EVENT_LOGGER, trial_true->trial_name(), |
| default_name, TEST_VALUE_A); |
| EXPECT_EQ(TEST_VALUE_A, |
| GetIDForTrial(GOOGLE_WEB_PROPERTIES_TRIGGER, trial_true.get())); |
| EXPECT_EQ(TEST_VALUE_A, |
| GetIDForTrial(CHROME_SYNC_EVENT_LOGGER, trial_true.get())); |
| } |
| |
| } // namespace variations |