- add sources.
[platform/framework/web/crosswalk.git] / src / components / variations / variations_associated_data_unittest.cc
1 // 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
5 #include "components/variations/variations_associated_data.h"
6
7 #include "base/metrics/field_trial.h"
8 #include "testing/gtest/include/gtest/gtest.h"
9
10 namespace chrome_variations {
11
12 namespace {
13
14 const VariationID TEST_VALUE_A = 3300200;
15 const VariationID TEST_VALUE_B = 3300201;
16
17 // Convenience helper to retrieve the chrome_variations::VariationID for a
18 // FieldTrial. Note that this will do the group assignment in |trial| if not
19 // already done.
20 VariationID GetIDForTrial(IDCollectionKey key, base::FieldTrial* trial) {
21   return GetGoogleVariationID(key, trial->trial_name(), trial->group_name());
22 }
23
24 // Tests whether a field trial is active (i.e. group() has been called on it).
25 bool IsFieldTrialActive(const std::string& trial_name) {
26   base::FieldTrial::ActiveGroups active_groups;
27   base::FieldTrialList::GetActiveFieldTrialGroups(&active_groups);
28   for (size_t i = 0; i < active_groups.size(); ++i) {
29     if (active_groups[i].trial_name == trial_name)
30       return true;
31   }
32   return false;
33 }
34
35 // Call FieldTrialList::FactoryGetFieldTrial() with a future expiry date.
36 scoped_refptr<base::FieldTrial> CreateFieldTrial(
37     const std::string& trial_name,
38     int total_probability,
39     const std::string& default_group_name,
40     int* default_group_number) {
41   return base::FieldTrialList::FactoryGetFieldTrial(
42       trial_name, total_probability, default_group_name,
43       base::FieldTrialList::kNoExpirationYear, 1, 1,
44       base::FieldTrial::SESSION_RANDOMIZED, default_group_number);
45 }
46
47 }  // namespace
48
49 class VariationsAssociatedDataTest : public ::testing::Test {
50  public:
51   VariationsAssociatedDataTest() : field_trial_list_(NULL) {
52   }
53
54   virtual ~VariationsAssociatedDataTest() {
55     // Ensure that the maps are cleared between tests, since they are stored as
56     // process singletons.
57     testing::ClearAllVariationIDs();
58   }
59
60  private:
61   base::FieldTrialList field_trial_list_;
62
63   DISALLOW_COPY_AND_ASSIGN(VariationsAssociatedDataTest);
64 };
65
66 // Test that if the trial is immediately disabled, GetGoogleVariationID just
67 // returns the empty ID.
68 TEST_F(VariationsAssociatedDataTest, DisableImmediately) {
69   int default_group_number = -1;
70   scoped_refptr<base::FieldTrial> trial(
71       CreateFieldTrial("trial", 100, "default", &default_group_number));
72
73   ASSERT_EQ(default_group_number, trial->group());
74   ASSERT_EQ(EMPTY_ID, GetIDForTrial(GOOGLE_WEB_PROPERTIES, trial.get()));
75 }
76
77 // Test that successfully associating the FieldTrial with some ID, and then
78 // disabling the FieldTrial actually makes GetGoogleVariationID correctly
79 // return the empty ID.
80 TEST_F(VariationsAssociatedDataTest, DisableAfterInitialization) {
81   const std::string default_name = "default";
82   const std::string non_default_name = "non_default";
83
84   scoped_refptr<base::FieldTrial> trial(
85       CreateFieldTrial("trial", 100, default_name, NULL));
86
87   trial->AppendGroup(non_default_name, 100);
88   AssociateGoogleVariationID(GOOGLE_WEB_PROPERTIES, trial->trial_name(),
89       default_name, TEST_VALUE_A);
90   AssociateGoogleVariationID(GOOGLE_WEB_PROPERTIES, trial->trial_name(),
91       non_default_name, TEST_VALUE_B);
92   trial->Disable();
93   ASSERT_EQ(default_name, trial->group_name());
94   ASSERT_EQ(TEST_VALUE_A, GetIDForTrial(GOOGLE_WEB_PROPERTIES, trial.get()));
95 }
96
97 // Test various successful association cases.
98 TEST_F(VariationsAssociatedDataTest, AssociateGoogleVariationID) {
99   const std::string default_name1 = "default";
100   scoped_refptr<base::FieldTrial> trial_true(
101       CreateFieldTrial("d1", 10, default_name1, NULL));
102   const std::string winner = "TheWinner";
103   int winner_group = trial_true->AppendGroup(winner, 10);
104
105   // Set GoogleVariationIDs so we can verify that they were chosen correctly.
106   AssociateGoogleVariationID(GOOGLE_WEB_PROPERTIES, trial_true->trial_name(),
107       default_name1, TEST_VALUE_A);
108   AssociateGoogleVariationID(GOOGLE_WEB_PROPERTIES, trial_true->trial_name(),
109       winner, TEST_VALUE_B);
110
111   EXPECT_EQ(winner_group, trial_true->group());
112   EXPECT_EQ(winner, trial_true->group_name());
113   EXPECT_EQ(TEST_VALUE_B,
114             GetIDForTrial(GOOGLE_WEB_PROPERTIES, trial_true.get()));
115
116   const std::string default_name2 = "default2";
117   scoped_refptr<base::FieldTrial> trial_false(
118       CreateFieldTrial("d2", 10, default_name2, NULL));
119   const std::string loser = "ALoser";
120   const int loser_group = trial_false->AppendGroup(loser, 0);
121
122   AssociateGoogleVariationID(GOOGLE_WEB_PROPERTIES, trial_false->trial_name(),
123       default_name2, TEST_VALUE_A);
124   AssociateGoogleVariationID(GOOGLE_WEB_PROPERTIES, trial_false->trial_name(),
125       loser, TEST_VALUE_B);
126
127   EXPECT_NE(loser_group, trial_false->group());
128   EXPECT_EQ(TEST_VALUE_A,
129             GetIDForTrial(GOOGLE_WEB_PROPERTIES, trial_false.get()));
130 }
131
132 // Test that not associating a FieldTrial with any IDs ensure that the empty ID
133 // will be returned.
134 TEST_F(VariationsAssociatedDataTest, NoAssociation) {
135   const std::string default_name = "default";
136   scoped_refptr<base::FieldTrial> no_id_trial(
137       CreateFieldTrial("d3", 10, default_name, NULL));
138
139   const std::string winner = "TheWinner";
140   const int winner_group = no_id_trial->AppendGroup(winner, 10);
141
142   // Ensure that despite the fact that a normal winner is elected, it does not
143   // have a valid VariationID associated with it.
144   EXPECT_EQ(winner_group, no_id_trial->group());
145   EXPECT_EQ(winner, no_id_trial->group_name());
146   EXPECT_EQ(EMPTY_ID, GetIDForTrial(GOOGLE_WEB_PROPERTIES, no_id_trial.get()));
147 }
148
149 // Ensure that the AssociateGoogleVariationIDForce works as expected.
150 TEST_F(VariationsAssociatedDataTest, ForceAssociation) {
151   EXPECT_EQ(EMPTY_ID,
152             GetGoogleVariationID(GOOGLE_WEB_PROPERTIES, "trial", "group"));
153   AssociateGoogleVariationID(GOOGLE_WEB_PROPERTIES, "trial", "group",
154                              TEST_VALUE_A);
155   EXPECT_EQ(TEST_VALUE_A,
156             GetGoogleVariationID(GOOGLE_WEB_PROPERTIES, "trial", "group"));
157   AssociateGoogleVariationID(GOOGLE_WEB_PROPERTIES, "trial", "group",
158                              TEST_VALUE_B);
159   EXPECT_EQ(TEST_VALUE_A,
160             GetGoogleVariationID(GOOGLE_WEB_PROPERTIES, "trial", "group"));
161   AssociateGoogleVariationIDForce(GOOGLE_WEB_PROPERTIES, "trial", "group",
162                                   TEST_VALUE_B);
163   EXPECT_EQ(TEST_VALUE_B,
164             GetGoogleVariationID(GOOGLE_WEB_PROPERTIES, "trial", "group"));
165 }
166
167 // Ensure that two collections can coexist without affecting each other.
168 TEST_F(VariationsAssociatedDataTest, CollectionsCoexist) {
169   const std::string default_name = "default";
170   int default_group_number = -1;
171   scoped_refptr<base::FieldTrial> trial_true(
172       CreateFieldTrial("d1", 10, default_name, &default_group_number));
173   ASSERT_EQ(default_group_number, trial_true->group());
174   ASSERT_EQ(default_name, trial_true->group_name());
175
176   EXPECT_EQ(EMPTY_ID,
177             GetIDForTrial(GOOGLE_WEB_PROPERTIES, trial_true.get()));
178   EXPECT_EQ(EMPTY_ID,
179             GetIDForTrial(GOOGLE_UPDATE_SERVICE, trial_true.get()));
180
181   AssociateGoogleVariationID(GOOGLE_WEB_PROPERTIES, trial_true->trial_name(),
182       default_name, TEST_VALUE_A);
183   EXPECT_EQ(TEST_VALUE_A,
184             GetIDForTrial(GOOGLE_WEB_PROPERTIES, trial_true.get()));
185   EXPECT_EQ(EMPTY_ID,
186             GetIDForTrial(GOOGLE_UPDATE_SERVICE, trial_true.get()));
187
188   AssociateGoogleVariationID(GOOGLE_UPDATE_SERVICE, trial_true->trial_name(),
189       default_name, TEST_VALUE_A);
190   EXPECT_EQ(TEST_VALUE_A,
191             GetIDForTrial(GOOGLE_WEB_PROPERTIES, trial_true.get()));
192   EXPECT_EQ(TEST_VALUE_A,
193             GetIDForTrial(GOOGLE_UPDATE_SERVICE, trial_true.get()));
194 }
195
196 TEST_F(VariationsAssociatedDataTest, AssociateVariationParams) {
197   const std::string kTrialName = "AssociateVariationParams";
198
199   {
200     std::map<std::string, std::string> params;
201     params["a"] = "10";
202     params["b"] = "test";
203     ASSERT_TRUE(AssociateVariationParams(kTrialName, "A", params));
204   }
205   {
206     std::map<std::string, std::string> params;
207     params["a"] = "5";
208     ASSERT_TRUE(AssociateVariationParams(kTrialName, "B", params));
209   }
210
211   base::FieldTrialList::CreateFieldTrial(kTrialName, "B");
212   EXPECT_EQ("5", GetVariationParamValue(kTrialName, "a"));
213   EXPECT_EQ(std::string(), GetVariationParamValue(kTrialName, "b"));
214   EXPECT_EQ(std::string(), GetVariationParamValue(kTrialName, "x"));
215
216   std::map<std::string, std::string> params;
217   EXPECT_TRUE(GetVariationParams(kTrialName, &params));
218   EXPECT_EQ(1U, params.size());
219   EXPECT_EQ("5", params["a"]);
220 }
221
222 TEST_F(VariationsAssociatedDataTest, AssociateVariationParams_Fail) {
223   const std::string kTrialName = "AssociateVariationParams_Fail";
224   const std::string kGroupName = "A";
225
226   std::map<std::string, std::string> params;
227   params["a"] = "10";
228   ASSERT_TRUE(AssociateVariationParams(kTrialName, kGroupName, params));
229   params["a"] = "1";
230   params["b"] = "2";
231   ASSERT_FALSE(AssociateVariationParams(kTrialName, kGroupName, params));
232
233   base::FieldTrialList::CreateFieldTrial(kTrialName, kGroupName);
234   EXPECT_EQ("10", GetVariationParamValue(kTrialName, "a"));
235   EXPECT_EQ(std::string(), GetVariationParamValue(kTrialName, "b"));
236 }
237
238 TEST_F(VariationsAssociatedDataTest, AssociateVariationParams_TrialActiveFail) {
239   const std::string kTrialName = "AssociateVariationParams_TrialActiveFail";
240   base::FieldTrialList::CreateFieldTrial(kTrialName, "A");
241   ASSERT_EQ("A", base::FieldTrialList::FindFullName(kTrialName));
242
243   std::map<std::string, std::string> params;
244   params["a"] = "10";
245   EXPECT_FALSE(AssociateVariationParams(kTrialName, "B", params));
246   EXPECT_FALSE(AssociateVariationParams(kTrialName, "A", params));
247 }
248
249 TEST_F(VariationsAssociatedDataTest,
250        AssociateVariationParams_DoesntActivateTrial) {
251   const std::string kTrialName = "AssociateVariationParams_DoesntActivateTrial";
252
253   ASSERT_FALSE(IsFieldTrialActive(kTrialName));
254   scoped_refptr<base::FieldTrial> trial(
255       CreateFieldTrial(kTrialName, 100, "A", NULL));
256   ASSERT_FALSE(IsFieldTrialActive(kTrialName));
257
258   std::map<std::string, std::string> params;
259   params["a"] = "10";
260   EXPECT_TRUE(AssociateVariationParams(kTrialName, "A", params));
261   ASSERT_FALSE(IsFieldTrialActive(kTrialName));
262 }
263
264 TEST_F(VariationsAssociatedDataTest, GetVariationParams_NoTrial) {
265   const std::string kTrialName = "GetVariationParams_NoParams";
266
267   std::map<std::string, std::string> params;
268   EXPECT_FALSE(GetVariationParams(kTrialName, &params));
269   EXPECT_EQ(std::string(), GetVariationParamValue(kTrialName, "x"));
270   EXPECT_EQ(std::string(), GetVariationParamValue(kTrialName, "y"));
271 }
272
273 TEST_F(VariationsAssociatedDataTest, GetVariationParams_NoParams) {
274   const std::string kTrialName = "GetVariationParams_NoParams";
275
276   base::FieldTrialList::CreateFieldTrial(kTrialName, "A");
277
278   std::map<std::string, std::string> params;
279   EXPECT_FALSE(GetVariationParams(kTrialName, &params));
280   EXPECT_EQ(std::string(), GetVariationParamValue(kTrialName, "x"));
281   EXPECT_EQ(std::string(), GetVariationParamValue(kTrialName, "y"));
282 }
283
284 TEST_F(VariationsAssociatedDataTest, GetVariationParams_ActivatesTrial) {
285   const std::string kTrialName = "GetVariationParams_ActivatesTrial";
286
287   ASSERT_FALSE(IsFieldTrialActive(kTrialName));
288   scoped_refptr<base::FieldTrial> trial(
289       CreateFieldTrial(kTrialName, 100, "A", NULL));
290   ASSERT_FALSE(IsFieldTrialActive(kTrialName));
291
292   std::map<std::string, std::string> params;
293   EXPECT_FALSE(GetVariationParams(kTrialName, &params));
294   ASSERT_TRUE(IsFieldTrialActive(kTrialName));
295 }
296
297 TEST_F(VariationsAssociatedDataTest, GetVariationParamValue_ActivatesTrial) {
298   const std::string kTrialName = "GetVariationParamValue_ActivatesTrial";
299
300   ASSERT_FALSE(IsFieldTrialActive(kTrialName));
301   scoped_refptr<base::FieldTrial> trial(
302       CreateFieldTrial(kTrialName, 100, "A", NULL));
303   ASSERT_FALSE(IsFieldTrialActive(kTrialName));
304
305   std::map<std::string, std::string> params;
306   EXPECT_EQ(std::string(), GetVariationParamValue(kTrialName, "x"));
307   ASSERT_TRUE(IsFieldTrialActive(kTrialName));
308 }
309
310 }  // namespace chrome_variations