blob: 31fd33458268b3717450a19fbfc9caf94b8b3918 [file] [log] [blame]
[email protected]7e797792013-08-05 18:24:401// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]50ae9f12013-08-29 18:03:225#include "components/variations/variations_associated_data.h"
[email protected]7e797792013-08-05 18:24:406
avi5dd91f82015-12-25 22:30:467#include "base/macros.h"
[email protected]7e797792013-08-05 18:24:408#include "base/metrics/field_trial.h"
9#include "testing/gtest/include/gtest/gtest.h"
10
[email protected]59b6f672014-07-26 18:35:4711namespace variations {
[email protected]7e797792013-08-05 18:24:4012
13namespace {
14
[email protected]2b9badf2013-08-16 22:15:1815const VariationID TEST_VALUE_A = 3300200;
16const VariationID TEST_VALUE_B = 3300201;
17
[email protected]59b6f672014-07-26 18:35:4718// Convenience helper to retrieve the variations::VariationID for a FieldTrial.
19// Note that this will do the group assignment in |trial| if not already done.
[email protected]7e797792013-08-05 18:24:4020VariationID GetIDForTrial(IDCollectionKey key, base::FieldTrial* trial) {
21 return GetGoogleVariationID(key, trial->trial_name(), trial->group_name());
22}
23
[email protected]7e797792013-08-05 18:24:4024// Call FieldTrialList::FactoryGetFieldTrial() with a future expiry date.
25scoped_refptr<base::FieldTrial> CreateFieldTrial(
26 const std::string& trial_name,
27 int total_probability,
28 const std::string& default_group_name,
29 int* default_group_number) {
30 return base::FieldTrialList::FactoryGetFieldTrial(
31 trial_name, total_probability, default_group_name,
32 base::FieldTrialList::kNoExpirationYear, 1, 1,
33 base::FieldTrial::SESSION_RANDOMIZED, default_group_number);
34}
35
36} // namespace
37
38class VariationsAssociatedDataTest : public ::testing::Test {
39 public:
Ivan Kotenkov75b1c3a2017-10-24 14:47:2440 VariationsAssociatedDataTest() : field_trial_list_(nullptr) {}
[email protected]7e797792013-08-05 18:24:4041
dcheng30a1b1542014-10-29 21:27:5042 ~VariationsAssociatedDataTest() override {
[email protected]7e797792013-08-05 18:24:4043 // Ensure that the maps are cleared between tests, since they are stored as
44 // process singletons.
45 testing::ClearAllVariationIDs();
asvitkine9499b8d2016-08-09 05:37:0746 }
47
[email protected]7e797792013-08-05 18:24:4048 private:
49 base::FieldTrialList field_trial_list_;
50
51 DISALLOW_COPY_AND_ASSIGN(VariationsAssociatedDataTest);
52};
53
54// Test that if the trial is immediately disabled, GetGoogleVariationID just
55// returns the empty ID.
56TEST_F(VariationsAssociatedDataTest, DisableImmediately) {
57 int default_group_number = -1;
58 scoped_refptr<base::FieldTrial> trial(
59 CreateFieldTrial("trial", 100, "default", &default_group_number));
60
61 ASSERT_EQ(default_group_number, trial->group());
62 ASSERT_EQ(EMPTY_ID, GetIDForTrial(GOOGLE_WEB_PROPERTIES, trial.get()));
63}
64
65// Test that successfully associating the FieldTrial with some ID, and then
66// disabling the FieldTrial actually makes GetGoogleVariationID correctly
67// return the empty ID.
68TEST_F(VariationsAssociatedDataTest, DisableAfterInitialization) {
69 const std::string default_name = "default";
70 const std::string non_default_name = "non_default";
71
72 scoped_refptr<base::FieldTrial> trial(
Ivan Kotenkov75b1c3a2017-10-24 14:47:2473 CreateFieldTrial("trial", 100, default_name, nullptr));
[email protected]7e797792013-08-05 18:24:4074
75 trial->AppendGroup(non_default_name, 100);
76 AssociateGoogleVariationID(GOOGLE_WEB_PROPERTIES, trial->trial_name(),
77 default_name, TEST_VALUE_A);
78 AssociateGoogleVariationID(GOOGLE_WEB_PROPERTIES, trial->trial_name(),
79 non_default_name, TEST_VALUE_B);
80 trial->Disable();
81 ASSERT_EQ(default_name, trial->group_name());
82 ASSERT_EQ(TEST_VALUE_A, GetIDForTrial(GOOGLE_WEB_PROPERTIES, trial.get()));
83}
84
85// Test various successful association cases.
86TEST_F(VariationsAssociatedDataTest, AssociateGoogleVariationID) {
87 const std::string default_name1 = "default";
88 scoped_refptr<base::FieldTrial> trial_true(
Ivan Kotenkov75b1c3a2017-10-24 14:47:2489 CreateFieldTrial("d1", 10, default_name1, nullptr));
[email protected]7e797792013-08-05 18:24:4090 const std::string winner = "TheWinner";
91 int winner_group = trial_true->AppendGroup(winner, 10);
92
93 // Set GoogleVariationIDs so we can verify that they were chosen correctly.
94 AssociateGoogleVariationID(GOOGLE_WEB_PROPERTIES, trial_true->trial_name(),
95 default_name1, TEST_VALUE_A);
96 AssociateGoogleVariationID(GOOGLE_WEB_PROPERTIES, trial_true->trial_name(),
97 winner, TEST_VALUE_B);
98
99 EXPECT_EQ(winner_group, trial_true->group());
100 EXPECT_EQ(winner, trial_true->group_name());
101 EXPECT_EQ(TEST_VALUE_B,
102 GetIDForTrial(GOOGLE_WEB_PROPERTIES, trial_true.get()));
103
104 const std::string default_name2 = "default2";
105 scoped_refptr<base::FieldTrial> trial_false(
Ivan Kotenkov75b1c3a2017-10-24 14:47:24106 CreateFieldTrial("d2", 10, default_name2, nullptr));
[email protected]7e797792013-08-05 18:24:40107 const std::string loser = "ALoser";
108 const int loser_group = trial_false->AppendGroup(loser, 0);
109
110 AssociateGoogleVariationID(GOOGLE_WEB_PROPERTIES, trial_false->trial_name(),
111 default_name2, TEST_VALUE_A);
112 AssociateGoogleVariationID(GOOGLE_WEB_PROPERTIES, trial_false->trial_name(),
113 loser, TEST_VALUE_B);
114
115 EXPECT_NE(loser_group, trial_false->group());
116 EXPECT_EQ(TEST_VALUE_A,
117 GetIDForTrial(GOOGLE_WEB_PROPERTIES, trial_false.get()));
118}
119
120// Test that not associating a FieldTrial with any IDs ensure that the empty ID
121// will be returned.
122TEST_F(VariationsAssociatedDataTest, NoAssociation) {
123 const std::string default_name = "default";
124 scoped_refptr<base::FieldTrial> no_id_trial(
Ivan Kotenkov75b1c3a2017-10-24 14:47:24125 CreateFieldTrial("d3", 10, default_name, nullptr));
[email protected]7e797792013-08-05 18:24:40126
127 const std::string winner = "TheWinner";
128 const int winner_group = no_id_trial->AppendGroup(winner, 10);
129
130 // Ensure that despite the fact that a normal winner is elected, it does not
131 // have a valid VariationID associated with it.
132 EXPECT_EQ(winner_group, no_id_trial->group());
133 EXPECT_EQ(winner, no_id_trial->group_name());
134 EXPECT_EQ(EMPTY_ID, GetIDForTrial(GOOGLE_WEB_PROPERTIES, no_id_trial.get()));
135}
136
137// Ensure that the AssociateGoogleVariationIDForce works as expected.
138TEST_F(VariationsAssociatedDataTest, ForceAssociation) {
139 EXPECT_EQ(EMPTY_ID,
140 GetGoogleVariationID(GOOGLE_WEB_PROPERTIES, "trial", "group"));
141 AssociateGoogleVariationID(GOOGLE_WEB_PROPERTIES, "trial", "group",
142 TEST_VALUE_A);
143 EXPECT_EQ(TEST_VALUE_A,
144 GetGoogleVariationID(GOOGLE_WEB_PROPERTIES, "trial", "group"));
145 AssociateGoogleVariationID(GOOGLE_WEB_PROPERTIES, "trial", "group",
146 TEST_VALUE_B);
147 EXPECT_EQ(TEST_VALUE_A,
148 GetGoogleVariationID(GOOGLE_WEB_PROPERTIES, "trial", "group"));
149 AssociateGoogleVariationIDForce(GOOGLE_WEB_PROPERTIES, "trial", "group",
150 TEST_VALUE_B);
151 EXPECT_EQ(TEST_VALUE_B,
152 GetGoogleVariationID(GOOGLE_WEB_PROPERTIES, "trial", "group"));
153}
154
155// Ensure that two collections can coexist without affecting each other.
156TEST_F(VariationsAssociatedDataTest, CollectionsCoexist) {
157 const std::string default_name = "default";
158 int default_group_number = -1;
159 scoped_refptr<base::FieldTrial> trial_true(
160 CreateFieldTrial("d1", 10, default_name, &default_group_number));
161 ASSERT_EQ(default_group_number, trial_true->group());
162 ASSERT_EQ(default_name, trial_true->group_name());
163
164 EXPECT_EQ(EMPTY_ID,
165 GetIDForTrial(GOOGLE_WEB_PROPERTIES, trial_true.get()));
166 EXPECT_EQ(EMPTY_ID,
[email protected]e51dcb0c2014-05-06 16:56:10167 GetIDForTrial(GOOGLE_WEB_PROPERTIES_TRIGGER, trial_true.get()));
168 EXPECT_EQ(EMPTY_ID,
Sky Malicea846ad7d2017-12-05 00:44:42169 GetIDForTrial(CHROME_SYNC_EVENT_LOGGER, trial_true.get()));
[email protected]7e797792013-08-05 18:24:40170
171 AssociateGoogleVariationID(GOOGLE_WEB_PROPERTIES, trial_true->trial_name(),
172 default_name, TEST_VALUE_A);
173 EXPECT_EQ(TEST_VALUE_A,
174 GetIDForTrial(GOOGLE_WEB_PROPERTIES, trial_true.get()));
175 EXPECT_EQ(EMPTY_ID,
Sky Malicea846ad7d2017-12-05 00:44:42176 GetIDForTrial(CHROME_SYNC_EVENT_LOGGER, trial_true.get()));
gayane8a516c42015-01-21 14:23:14177
Sky Malicea846ad7d2017-12-05 00:44:42178 AssociateGoogleVariationID(CHROME_SYNC_EVENT_LOGGER, trial_true->trial_name(),
179 default_name, TEST_VALUE_A);
gayane8a516c42015-01-21 14:23:14180 EXPECT_EQ(TEST_VALUE_A,
181 GetIDForTrial(GOOGLE_WEB_PROPERTIES, trial_true.get()));
182 EXPECT_EQ(TEST_VALUE_A,
Sky Malicea846ad7d2017-12-05 00:44:42183 GetIDForTrial(CHROME_SYNC_EVENT_LOGGER, trial_true.get()));
[email protected]e51dcb0c2014-05-06 16:56:10184
185 trial_true = CreateFieldTrial("d2", 10, default_name, &default_group_number);
186 ASSERT_EQ(default_group_number, trial_true->group());
187 ASSERT_EQ(default_name, trial_true->group_name());
188
189 AssociateGoogleVariationID(GOOGLE_WEB_PROPERTIES_TRIGGER,
190 trial_true->trial_name(), default_name,
191 TEST_VALUE_A);
192 EXPECT_EQ(TEST_VALUE_A,
193 GetIDForTrial(GOOGLE_WEB_PROPERTIES_TRIGGER, trial_true.get()));
194 EXPECT_EQ(EMPTY_ID,
Sky Malicea846ad7d2017-12-05 00:44:42195 GetIDForTrial(CHROME_SYNC_EVENT_LOGGER, trial_true.get()));
gayane8a516c42015-01-21 14:23:14196
Sky Malicea846ad7d2017-12-05 00:44:42197 AssociateGoogleVariationID(CHROME_SYNC_EVENT_LOGGER, trial_true->trial_name(),
198 default_name, TEST_VALUE_A);
gayane8a516c42015-01-21 14:23:14199 EXPECT_EQ(TEST_VALUE_A,
200 GetIDForTrial(GOOGLE_WEB_PROPERTIES_TRIGGER, trial_true.get()));
201 EXPECT_EQ(TEST_VALUE_A,
Sky Malicea846ad7d2017-12-05 00:44:42202 GetIDForTrial(CHROME_SYNC_EVENT_LOGGER, trial_true.get()));
[email protected]7e797792013-08-05 18:24:40203}
204
[email protected]59b6f672014-07-26 18:35:47205} // namespace variations