| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Test of FieldTrial class | 5 // Test of FieldTrial class |
| 6 | 6 |
| 7 #include "base/metrics/field_trial.h" | 7 #include "base/metrics/field_trial.h" |
| 8 | 8 |
| 9 #include "base/rand_util.h" | 9 #include "base/rand_util.h" |
| 10 #include "base/stringprintf.h" | 10 #include "base/stringprintf.h" |
| (...skipping 29 matching lines...) Expand all Loading... |
| 40 }; | 40 }; |
| 41 | 41 |
| 42 // Test registration, and also check that destructors are called for trials | 42 // Test registration, and also check that destructors are called for trials |
| 43 // (and that Valgrind doesn't catch us leaking). | 43 // (and that Valgrind doesn't catch us leaking). |
| 44 TEST_F(FieldTrialTest, Registration) { | 44 TEST_F(FieldTrialTest, Registration) { |
| 45 const char* name1 = "name 1 test"; | 45 const char* name1 = "name 1 test"; |
| 46 const char* name2 = "name 2 test"; | 46 const char* name2 = "name 2 test"; |
| 47 EXPECT_FALSE(FieldTrialList::Find(name1)); | 47 EXPECT_FALSE(FieldTrialList::Find(name1)); |
| 48 EXPECT_FALSE(FieldTrialList::Find(name2)); | 48 EXPECT_FALSE(FieldTrialList::Find(name2)); |
| 49 | 49 |
| 50 FieldTrial* trial1 = | 50 FieldTrial* trial1 = FieldTrial::CreateInstance( |
| 51 new FieldTrial(name1, 10, "default name 1 test", next_year_, 12, 31); | 51 name1, 10, "default name 1 test", next_year_, 12, 31); |
| 52 EXPECT_EQ(FieldTrial::kNotFinalized, trial1->group_); | 52 EXPECT_EQ(FieldTrial::kNotFinalized, trial1->group_); |
| 53 EXPECT_EQ(name1, trial1->name()); | 53 EXPECT_EQ(name1, trial1->name()); |
| 54 EXPECT_EQ("", trial1->group_name_internal()); | 54 EXPECT_EQ("", trial1->group_name_internal()); |
| 55 | 55 |
| 56 trial1->AppendGroup("", 7); | 56 trial1->AppendGroup("", 7); |
| 57 | 57 |
| 58 EXPECT_EQ(trial1, FieldTrialList::Find(name1)); | 58 EXPECT_EQ(trial1, FieldTrialList::Find(name1)); |
| 59 EXPECT_FALSE(FieldTrialList::Find(name2)); | 59 EXPECT_FALSE(FieldTrialList::Find(name2)); |
| 60 | 60 |
| 61 FieldTrial* trial2 = | 61 FieldTrial* trial2 = FieldTrial::CreateInstance( |
| 62 new FieldTrial(name2, 10, "default name 2 test", next_year_, 12, 31); | 62 name2, 10, "default name 2 test", next_year_, 12, 31); |
| 63 EXPECT_EQ(FieldTrial::kNotFinalized, trial2->group_); | 63 EXPECT_EQ(FieldTrial::kNotFinalized, trial2->group_); |
| 64 EXPECT_EQ(name2, trial2->name()); | 64 EXPECT_EQ(name2, trial2->name()); |
| 65 EXPECT_EQ("", trial2->group_name_internal()); | 65 EXPECT_EQ("", trial2->group_name_internal()); |
| 66 | 66 |
| 67 trial2->AppendGroup("a first group", 7); | 67 trial2->AppendGroup("a first group", 7); |
| 68 | 68 |
| 69 EXPECT_EQ(trial1, FieldTrialList::Find(name1)); | 69 EXPECT_EQ(trial1, FieldTrialList::Find(name1)); |
| 70 EXPECT_EQ(trial2, FieldTrialList::Find(name2)); | 70 EXPECT_EQ(trial2, FieldTrialList::Find(name2)); |
| 71 // Note: FieldTrialList should delete the objects at shutdown. | 71 // Note: FieldTrialList should delete the objects at shutdown. |
| 72 } | 72 } |
| 73 | 73 |
| 74 TEST_F(FieldTrialTest, AbsoluteProbabilities) { | 74 TEST_F(FieldTrialTest, AbsoluteProbabilities) { |
| 75 char always_true[] = " always true"; | 75 char always_true[] = " always true"; |
| 76 char default_always_true[] = " default always true"; | 76 char default_always_true[] = " default always true"; |
| 77 char always_false[] = " always false"; | 77 char always_false[] = " always false"; |
| 78 char default_always_false[] = " default always false"; | 78 char default_always_false[] = " default always false"; |
| 79 for (int i = 1; i < 250; ++i) { | 79 for (int i = 1; i < 250; ++i) { |
| 80 // Try lots of names, by changing the first character of the name. | 80 // Try lots of names, by changing the first character of the name. |
| 81 always_true[0] = i; | 81 always_true[0] = i; |
| 82 default_always_true[0] = i; | 82 default_always_true[0] = i; |
| 83 always_false[0] = i; | 83 always_false[0] = i; |
| 84 default_always_false[0] = i; | 84 default_always_false[0] = i; |
| 85 | 85 |
| 86 FieldTrial* trial_true = | 86 FieldTrial* trial_true = FieldTrial::CreateInstance( |
| 87 new FieldTrial( | 87 always_true, 10, default_always_true, next_year_, 12, 31); |
| 88 always_true, 10, default_always_true, next_year_, 12, 31); | |
| 89 const std::string winner = "TheWinner"; | 88 const std::string winner = "TheWinner"; |
| 90 int winner_group = trial_true->AppendGroup(winner, 10); | 89 int winner_group = trial_true->AppendGroup(winner, 10); |
| 91 | 90 |
| 92 EXPECT_EQ(winner_group, trial_true->group()); | 91 EXPECT_EQ(winner_group, trial_true->group()); |
| 93 EXPECT_EQ(winner, trial_true->group_name()); | 92 EXPECT_EQ(winner, trial_true->group_name()); |
| 94 | 93 |
| 95 FieldTrial* trial_false = | 94 FieldTrial* trial_false = FieldTrial::CreateInstance( |
| 96 new FieldTrial( | 95 always_false, 10, default_always_false, next_year_, 12, 31); |
| 97 always_false, 10, default_always_false, next_year_, 12, 31); | |
| 98 int loser_group = trial_false->AppendGroup("ALoser", 0); | 96 int loser_group = trial_false->AppendGroup("ALoser", 0); |
| 99 | 97 |
| 100 EXPECT_NE(loser_group, trial_false->group()); | 98 EXPECT_NE(loser_group, trial_false->group()); |
| 101 } | 99 } |
| 102 } | 100 } |
| 103 | 101 |
| 104 TEST_F(FieldTrialTest, RemainingProbability) { | 102 TEST_F(FieldTrialTest, RemainingProbability) { |
| 105 // First create a test that hasn't had a winner yet. | 103 // First create a test that hasn't had a winner yet. |
| 106 const std::string winner = "Winner"; | 104 const std::string winner = "Winner"; |
| 107 const std::string loser = "Loser"; | 105 const std::string loser = "Loser"; |
| 108 scoped_refptr<FieldTrial> trial; | 106 scoped_refptr<FieldTrial> trial; |
| 109 int counter = 0; | 107 int counter = 0; |
| 110 do { | 108 do { |
| 111 std::string name = StringPrintf("trial%d", ++counter); | 109 std::string name = StringPrintf("trial%d", ++counter); |
| 112 trial = new FieldTrial(name, 10, winner, next_year_, 12, 31); | 110 trial = FieldTrial::CreateInstance(name, 10, winner, next_year_, 12, 31); |
| 113 trial->AppendGroup(loser, 5); // 50% chance of not being chosen. | 111 trial->AppendGroup(loser, 5); // 50% chance of not being chosen. |
| 114 // If a group is not assigned, group_ will be kNotFinalized. | 112 // If a group is not assigned, group_ will be kNotFinalized. |
| 115 } while (trial->group_ != FieldTrial::kNotFinalized); | 113 } while (trial->group_ != FieldTrial::kNotFinalized); |
| 116 | 114 |
| 117 // And that 'default' group (winner) should always win. | 115 // And that 'default' group (winner) should always win. |
| 118 EXPECT_EQ(FieldTrial::kDefaultGroupNumber, trial->group()); | 116 EXPECT_EQ(FieldTrial::kDefaultGroupNumber, trial->group()); |
| 119 | 117 |
| 120 // And that winner should ALWAYS win. | 118 // And that winner should ALWAYS win. |
| 121 EXPECT_EQ(winner, trial->group_name()); | 119 EXPECT_EQ(winner, trial->group_name()); |
| 122 } | 120 } |
| 123 | 121 |
| 124 TEST_F(FieldTrialTest, FiftyFiftyProbability) { | 122 TEST_F(FieldTrialTest, FiftyFiftyProbability) { |
| 125 // Check that even with small divisors, we have the proper probabilities, and | 123 // Check that even with small divisors, we have the proper probabilities, and |
| 126 // all outcomes are possible. Since this is a 50-50 test, it should get both | 124 // all outcomes are possible. Since this is a 50-50 test, it should get both |
| 127 // outcomes in a few tries, but we'll try no more than 100 times (and be flaky | 125 // outcomes in a few tries, but we'll try no more than 100 times (and be flaky |
| 128 // with probability around 1 in 2^99). | 126 // with probability around 1 in 2^99). |
| 129 bool first_winner = false; | 127 bool first_winner = false; |
| 130 bool second_winner = false; | 128 bool second_winner = false; |
| 131 int counter = 0; | 129 int counter = 0; |
| 132 do { | 130 do { |
| 133 std::string name = base::StringPrintf("FiftyFifty%d", ++counter); | 131 std::string name = base::StringPrintf("FiftyFifty%d", ++counter); |
| 134 std::string default_group_name = base::StringPrintf("Default FiftyFifty%d", | 132 std::string default_group_name = base::StringPrintf("Default FiftyFifty%d", |
| 135 ++counter); | 133 ++counter); |
| 136 scoped_refptr<FieldTrial> trial( | 134 scoped_refptr<FieldTrial> trial(FieldTrial::CreateInstance( |
| 137 new FieldTrial(name, 2, default_group_name, next_year_, 12, 31)); | 135 name, 2, default_group_name, next_year_, 12, 31)); |
| 138 trial->AppendGroup("first", 1); // 50% chance of being chosen. | 136 trial->AppendGroup("first", 1); // 50% chance of being chosen. |
| 139 // If group_ is kNotFinalized, then a group assignement hasn't been done. | 137 // If group_ is kNotFinalized, then a group assignement hasn't been done. |
| 140 if (trial->group_ != FieldTrial::kNotFinalized) { | 138 if (trial->group_ != FieldTrial::kNotFinalized) { |
| 141 first_winner = true; | 139 first_winner = true; |
| 142 continue; | 140 continue; |
| 143 } | 141 } |
| 144 trial->AppendGroup("second", 1); // Always chosen at this point. | 142 trial->AppendGroup("second", 1); // Always chosen at this point. |
| 145 EXPECT_NE(FieldTrial::kNotFinalized, trial->group()); | 143 EXPECT_NE(FieldTrial::kNotFinalized, trial->group()); |
| 146 second_winner = true; | 144 second_winner = true; |
| 147 } while ((!second_winner || !first_winner) && counter < 100); | 145 } while ((!second_winner || !first_winner) && counter < 100); |
| 148 EXPECT_TRUE(second_winner); | 146 EXPECT_TRUE(second_winner); |
| 149 EXPECT_TRUE(first_winner); | 147 EXPECT_TRUE(first_winner); |
| 150 } | 148 } |
| 151 | 149 |
| 152 TEST_F(FieldTrialTest, MiddleProbabilities) { | 150 TEST_F(FieldTrialTest, MiddleProbabilities) { |
| 153 char name[] = " same name"; | 151 char name[] = " same name"; |
| 154 char default_group_name[] = " default same name"; | 152 char default_group_name[] = " default same name"; |
| 155 bool false_event_seen = false; | 153 bool false_event_seen = false; |
| 156 bool true_event_seen = false; | 154 bool true_event_seen = false; |
| 157 for (int i = 1; i < 250; ++i) { | 155 for (int i = 1; i < 250; ++i) { |
| 158 name[0] = i; | 156 name[0] = i; |
| 159 default_group_name[0] = i; | 157 default_group_name[0] = i; |
| 160 FieldTrial* trial = | 158 FieldTrial* trial = FieldTrial::CreateInstance( |
| 161 new FieldTrial(name, 10, default_group_name, next_year_, 12, 31); | 159 name, 10, default_group_name, next_year_, 12, 31); |
| 162 int might_win = trial->AppendGroup("MightWin", 5); | 160 int might_win = trial->AppendGroup("MightWin", 5); |
| 163 | 161 |
| 164 if (trial->group() == might_win) { | 162 if (trial->group() == might_win) { |
| 165 true_event_seen = true; | 163 true_event_seen = true; |
| 166 } else { | 164 } else { |
| 167 false_event_seen = true; | 165 false_event_seen = true; |
| 168 } | 166 } |
| 169 if (false_event_seen && true_event_seen) | 167 if (false_event_seen && true_event_seen) |
| 170 return; // Successful test!!! | 168 return; // Successful test!!! |
| 171 } | 169 } |
| 172 // Very surprising to get here. Probability should be around 1 in 2 ** 250. | 170 // Very surprising to get here. Probability should be around 1 in 2 ** 250. |
| 173 // One of the following will fail. | 171 // One of the following will fail. |
| 174 EXPECT_TRUE(false_event_seen); | 172 EXPECT_TRUE(false_event_seen); |
| 175 EXPECT_TRUE(true_event_seen); | 173 EXPECT_TRUE(true_event_seen); |
| 176 } | 174 } |
| 177 | 175 |
| 178 TEST_F(FieldTrialTest, OneWinner) { | 176 TEST_F(FieldTrialTest, OneWinner) { |
| 179 char name[] = "Some name"; | 177 char name[] = "Some name"; |
| 180 char default_group_name[] = "Default some name"; | 178 char default_group_name[] = "Default some name"; |
| 181 int group_count(10); | 179 int group_count(10); |
| 182 | 180 |
| 183 FieldTrial* trial = | 181 FieldTrial* trial = FieldTrial::CreateInstance( |
| 184 new FieldTrial( | 182 name, group_count, default_group_name, next_year_, 12, 31); |
| 185 name, group_count, default_group_name, next_year_, 12, 31); | |
| 186 int winner_index(-2); | 183 int winner_index(-2); |
| 187 std::string winner_name; | 184 std::string winner_name; |
| 188 | 185 |
| 189 for (int i = 1; i <= group_count; ++i) { | 186 for (int i = 1; i <= group_count; ++i) { |
| 190 int might_win = trial->AppendGroup("", 1); | 187 int might_win = trial->AppendGroup("", 1); |
| 191 | 188 |
| 192 // Because we keep appending groups, we want to see if the last group that | 189 // Because we keep appending groups, we want to see if the last group that |
| 193 // was added has been assigned or not. | 190 // was added has been assigned or not. |
| 194 if (trial->group_ == might_win) { | 191 if (trial->group_ == might_win) { |
| 195 EXPECT_EQ(-2, winner_index); | 192 EXPECT_EQ(-2, winner_index); |
| 196 winner_index = might_win; | 193 winner_index = might_win; |
| 197 StringAppendF(&winner_name, "%d", might_win); | 194 StringAppendF(&winner_name, "%d", might_win); |
| 198 EXPECT_EQ(winner_name, trial->group_name()); | 195 EXPECT_EQ(winner_name, trial->group_name()); |
| 199 } | 196 } |
| 200 } | 197 } |
| 201 EXPECT_GE(winner_index, 0); | 198 EXPECT_GE(winner_index, 0); |
| 202 EXPECT_EQ(trial->group(), winner_index); | 199 EXPECT_EQ(trial->group(), winner_index); |
| 203 EXPECT_EQ(trial->group_name(), winner_name); | 200 EXPECT_EQ(trial->group_name(), winner_name); |
| 204 } | 201 } |
| 205 | 202 |
| 206 TEST_F(FieldTrialTest, DisableProbability) { | 203 TEST_F(FieldTrialTest, DisableProbability) { |
| 207 const std::string default_group_name = "Default group"; | 204 const std::string default_group_name = "Default group"; |
| 208 const std::string loser = "Loser"; | 205 const std::string loser = "Loser"; |
| 209 const std::string name = "Trial"; | 206 const std::string name = "Trial"; |
| 210 | 207 |
| 211 // Create a field trail that has expired. | 208 // Create a field trail that has expired. |
| 212 scoped_refptr<FieldTrial> trial; | 209 scoped_refptr<FieldTrial> trial; |
| 213 trial = new FieldTrial( | 210 trial = FieldTrial::CreateInstance( |
| 214 name, 1000000000, default_group_name, last_year_, 1, 1); | 211 name, 1000000000, default_group_name, last_year_, 1, 1); |
| 215 trial->AppendGroup(loser, 999999999); // 99.9999999% chance of being chosen. | 212 trial->AppendGroup(loser, 999999999); // 99.9999999% chance of being chosen. |
| 216 | 213 |
| 217 // Because trial has expired, we should always be in the default group. | 214 // Because trial has expired, we should always be in the default group. |
| 218 EXPECT_EQ(FieldTrial::kDefaultGroupNumber, trial->group()); | 215 EXPECT_EQ(FieldTrial::kDefaultGroupNumber, trial->group()); |
| 219 | 216 |
| 220 // And that default_group_name should ALWAYS win. | 217 // And that default_group_name should ALWAYS win. |
| 221 EXPECT_EQ(default_group_name, trial->group_name()); | 218 EXPECT_EQ(default_group_name, trial->group_name()); |
| 222 } | 219 } |
| 223 | 220 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 238 }; | 235 }; |
| 239 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(known_hashes); ++i) { | 236 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(known_hashes); ++i) { |
| 240 EXPECT_EQ(known_hashes[i].hash_value, | 237 EXPECT_EQ(known_hashes[i].hash_value, |
| 241 FieldTrial::HashName(known_hashes[i].name)); | 238 FieldTrial::HashName(known_hashes[i].name)); |
| 242 } | 239 } |
| 243 } | 240 } |
| 244 | 241 |
| 245 TEST_F(FieldTrialTest, NameGroupIds) { | 242 TEST_F(FieldTrialTest, NameGroupIds) { |
| 246 std::string no_group("No Group"); | 243 std::string no_group("No Group"); |
| 247 uint32 no_group_id = FieldTrial::HashName(no_group); | 244 uint32 no_group_id = FieldTrial::HashName(no_group); |
| 248 scoped_refptr<FieldTrial> trial(new FieldTrial( | 245 scoped_refptr<FieldTrial> trial(FieldTrial::CreateInstance( |
| 249 no_group, 10, "Default", next_year_, 12, 31)); | 246 no_group, 10, "Default", next_year_, 12, 31)); |
| 250 | 247 |
| 251 // There is no winner yet, so no NameGroupId should be returned. | 248 // There is no winner yet, so no NameGroupId should be returned. |
| 252 FieldTrial::NameGroupId name_group_id; | 249 FieldTrial::NameGroupId name_group_id; |
| 253 EXPECT_FALSE(trial->GetNameGroupId(&name_group_id)); | 250 EXPECT_FALSE(trial->GetNameGroupId(&name_group_id)); |
| 254 | 251 |
| 255 // Create a single winning group. | 252 // Create a single winning group. |
| 256 std::string one_winner("One Winner"); | 253 std::string one_winner("One Winner"); |
| 257 uint32 one_winner_id = FieldTrial::HashName(one_winner); | 254 uint32 one_winner_id = FieldTrial::HashName(one_winner); |
| 258 trial = new FieldTrial(one_winner, 10, "Default", next_year_, 12, 31); | 255 trial = FieldTrial::CreateInstance( |
| 256 one_winner, 10, "Default", next_year_, 12, 31); |
| 259 std::string winner("Winner"); | 257 std::string winner("Winner"); |
| 260 uint32 winner_group_id = FieldTrial::HashName(winner); | 258 uint32 winner_group_id = FieldTrial::HashName(winner); |
| 261 trial->AppendGroup(winner, 10); | 259 trial->AppendGroup(winner, 10); |
| 262 EXPECT_TRUE(trial->GetNameGroupId(&name_group_id)); | 260 EXPECT_TRUE(trial->GetNameGroupId(&name_group_id)); |
| 263 EXPECT_EQ(one_winner_id, name_group_id.name); | 261 EXPECT_EQ(one_winner_id, name_group_id.name); |
| 264 EXPECT_EQ(winner_group_id, name_group_id.group); | 262 EXPECT_EQ(winner_group_id, name_group_id.group); |
| 265 | 263 |
| 266 std::string multi_group("MultiGroup"); | 264 std::string multi_group("MultiGroup"); |
| 267 uint32 multi_group_id = FieldTrial::HashName(multi_group); | 265 uint32 multi_group_id = FieldTrial::HashName(multi_group); |
| 268 scoped_refptr<FieldTrial> multi_group_trial = | 266 scoped_refptr<FieldTrial> multi_group_trial = FieldTrial::CreateInstance( |
| 269 new FieldTrial(multi_group, 9, "Default", next_year_, 12, 31); | 267 multi_group, 9, "Default", next_year_, 12, 31); |
| 270 | 268 |
| 271 multi_group_trial->AppendGroup("Me", 3); | 269 multi_group_trial->AppendGroup("Me", 3); |
| 272 multi_group_trial->AppendGroup("You", 3); | 270 multi_group_trial->AppendGroup("You", 3); |
| 273 multi_group_trial->AppendGroup("Them", 3); | 271 multi_group_trial->AppendGroup("Them", 3); |
| 274 EXPECT_TRUE(multi_group_trial->GetNameGroupId(&name_group_id)); | 272 EXPECT_TRUE(multi_group_trial->GetNameGroupId(&name_group_id)); |
| 275 EXPECT_EQ(multi_group_id, name_group_id.name); | 273 EXPECT_EQ(multi_group_id, name_group_id.name); |
| 276 uint32 multi_group_winner_id = | 274 uint32 multi_group_winner_id = |
| 277 FieldTrial::HashName(multi_group_trial->group_name()); | 275 FieldTrial::HashName(multi_group_trial->group_name()); |
| 278 EXPECT_EQ(multi_group_winner_id, name_group_id.group); | 276 EXPECT_EQ(multi_group_winner_id, name_group_id.group); |
| 279 | 277 |
| 280 // Now check if the list is built properly... | 278 // Now check if the list is built properly... |
| 281 std::vector<FieldTrial::NameGroupId> name_group_ids; | 279 std::vector<FieldTrial::NameGroupId> name_group_ids; |
| 282 FieldTrialList::GetFieldTrialNameGroupIds(&name_group_ids); | 280 FieldTrialList::GetFieldTrialNameGroupIds(&name_group_ids); |
| 283 EXPECT_EQ(2U, name_group_ids.size()); | 281 EXPECT_EQ(2U, name_group_ids.size()); |
| 284 for (size_t i = 0; i < name_group_ids.size(); ++i) { | 282 for (size_t i = 0; i < name_group_ids.size(); ++i) { |
| 285 // Order is not guaranteed, so check all values. | 283 // Order is not guaranteed, so check all values. |
| 286 EXPECT_NE(no_group_id, name_group_ids[i].name); | 284 EXPECT_NE(no_group_id, name_group_ids[i].name); |
| 287 EXPECT_TRUE(one_winner_id != name_group_ids[i].name || | 285 EXPECT_TRUE(one_winner_id != name_group_ids[i].name || |
| 288 winner_group_id == name_group_ids[i].group); | 286 winner_group_id == name_group_ids[i].group); |
| 289 EXPECT_TRUE(multi_group_id != name_group_ids[i].name || | 287 EXPECT_TRUE(multi_group_id != name_group_ids[i].name || |
| 290 multi_group_winner_id == name_group_ids[i].group); | 288 multi_group_winner_id == name_group_ids[i].group); |
| 291 } | 289 } |
| 292 } | 290 } |
| 293 | 291 |
| 294 TEST_F(FieldTrialTest, Save) { | 292 TEST_F(FieldTrialTest, Save) { |
| 295 std::string save_string; | 293 std::string save_string; |
| 296 | 294 |
| 297 FieldTrial* trial = | 295 FieldTrial* trial = FieldTrial::CreateInstance( |
| 298 new FieldTrial( | 296 "Some name", 10, "Default some name", next_year_, 12, 31); |
| 299 "Some name", 10, "Default some name", next_year_, 12, 31); | |
| 300 // There is no winner yet, so no textual group name is associated with trial. | 297 // There is no winner yet, so no textual group name is associated with trial. |
| 301 // In this case, the trial should not be included. | 298 // In this case, the trial should not be included. |
| 302 EXPECT_EQ("", trial->group_name_internal()); | 299 EXPECT_EQ("", trial->group_name_internal()); |
| 303 FieldTrialList::StatesToString(&save_string); | 300 FieldTrialList::StatesToString(&save_string); |
| 304 EXPECT_EQ("", save_string); | 301 EXPECT_EQ("", save_string); |
| 305 save_string.clear(); | 302 save_string.clear(); |
| 306 | 303 |
| 307 // Create a winning group. | 304 // Create a winning group. |
| 308 trial->AppendGroup("Winner", 10); | 305 trial->AppendGroup("Winner", 10); |
| 309 FieldTrialList::StatesToString(&save_string); | 306 FieldTrialList::StatesToString(&save_string); |
| 310 EXPECT_EQ("Some name/Winner/", save_string); | 307 EXPECT_EQ("Some name/Winner/", save_string); |
| 311 save_string.clear(); | 308 save_string.clear(); |
| 312 | 309 |
| 313 // Create a second trial and winning group. | 310 // Create a second trial and winning group. |
| 314 FieldTrial* trial2 = | 311 FieldTrial* trial2 = FieldTrial::CreateInstance( |
| 315 new FieldTrial("xxx", 10, "Default xxx", next_year_, 12, 31); | 312 "xxx", 10, "Default xxx", next_year_, 12, 31); |
| 316 trial2->AppendGroup("yyyy", 10); | 313 trial2->AppendGroup("yyyy", 10); |
| 317 | 314 |
| 318 FieldTrialList::StatesToString(&save_string); | 315 FieldTrialList::StatesToString(&save_string); |
| 319 // We assume names are alphabetized... though this is not critical. | 316 // We assume names are alphabetized... though this is not critical. |
| 320 EXPECT_EQ("Some name/Winner/xxx/yyyy/", save_string); | 317 EXPECT_EQ("Some name/Winner/xxx/yyyy/", save_string); |
| 321 } | 318 } |
| 322 | 319 |
| 323 TEST_F(FieldTrialTest, Restore) { | 320 TEST_F(FieldTrialTest, Restore) { |
| 324 EXPECT_TRUE(FieldTrialList::Find("Some_name") == NULL); | 321 EXPECT_TRUE(FieldTrialList::Find("Some_name") == NULL); |
| 325 EXPECT_TRUE(FieldTrialList::Find("xxx") == NULL); | 322 EXPECT_TRUE(FieldTrialList::Find("xxx") == NULL); |
| 326 | 323 |
| 327 FieldTrialList::CreateTrialsInChildProcess("Some_name/Winner/xxx/yyyy/"); | 324 FieldTrialList::CreateTrialsFromString("Some_name/Winner/xxx/yyyy/"); |
| 328 | 325 |
| 329 FieldTrial* trial = FieldTrialList::Find("Some_name"); | 326 FieldTrial* trial = FieldTrialList::Find("Some_name"); |
| 330 ASSERT_NE(static_cast<FieldTrial*>(NULL), trial); | 327 ASSERT_NE(static_cast<FieldTrial*>(NULL), trial); |
| 331 EXPECT_EQ("Winner", trial->group_name()); | 328 EXPECT_EQ("Winner", trial->group_name()); |
| 332 EXPECT_EQ("Some_name", trial->name()); | 329 EXPECT_EQ("Some_name", trial->name()); |
| 333 | 330 |
| 334 trial = FieldTrialList::Find("xxx"); | 331 trial = FieldTrialList::Find("xxx"); |
| 335 ASSERT_NE(static_cast<FieldTrial*>(NULL), trial); | 332 ASSERT_NE(static_cast<FieldTrial*>(NULL), trial); |
| 336 EXPECT_EQ("yyyy", trial->group_name()); | 333 EXPECT_EQ("yyyy", trial->group_name()); |
| 337 EXPECT_EQ("xxx", trial->name()); | 334 EXPECT_EQ("xxx", trial->name()); |
| 338 } | 335 } |
| 339 | 336 |
| 340 TEST_F(FieldTrialTest, BogusRestore) { | 337 TEST_F(FieldTrialTest, BogusRestore) { |
| 341 EXPECT_FALSE(FieldTrialList::CreateTrialsInChildProcess("MissingSlash")); | 338 EXPECT_FALSE(FieldTrialList::CreateTrialsFromString("MissingSlash")); |
| 342 EXPECT_FALSE(FieldTrialList::CreateTrialsInChildProcess("MissingGroupName/")); | 339 EXPECT_FALSE(FieldTrialList::CreateTrialsFromString("MissingGroupName/")); |
| 343 EXPECT_FALSE(FieldTrialList::CreateTrialsInChildProcess( | 340 EXPECT_FALSE(FieldTrialList::CreateTrialsFromString( |
| 344 "MissingFinalSlash/gname")); | 341 "MissingFinalSlash/gname")); |
| 345 EXPECT_FALSE(FieldTrialList::CreateTrialsInChildProcess( | 342 EXPECT_FALSE(FieldTrialList::CreateTrialsFromString( |
| 346 "noname, only group/")); | 343 "noname, only group/")); |
| 347 } | 344 } |
| 348 | 345 |
| 349 TEST_F(FieldTrialTest, DuplicateRestore) { | 346 TEST_F(FieldTrialTest, DuplicateRestore) { |
| 350 FieldTrial* trial = | 347 FieldTrial* trial = FieldTrial::CreateInstance( |
| 351 new FieldTrial( | 348 "Some name", 10, "Default some name", next_year_, 12, 31); |
| 352 "Some name", 10, "Default some name", next_year_, 12, 31); | |
| 353 trial->AppendGroup("Winner", 10); | 349 trial->AppendGroup("Winner", 10); |
| 354 std::string save_string; | 350 std::string save_string; |
| 355 FieldTrialList::StatesToString(&save_string); | 351 FieldTrialList::StatesToString(&save_string); |
| 356 EXPECT_EQ("Some name/Winner/", save_string); | 352 EXPECT_EQ("Some name/Winner/", save_string); |
| 357 | 353 |
| 358 // It is OK if we redundantly specify a winner. | 354 // It is OK if we redundantly specify a winner. |
| 359 EXPECT_TRUE(FieldTrialList::CreateTrialsInChildProcess(save_string)); | 355 EXPECT_TRUE(FieldTrialList::CreateTrialsFromString(save_string)); |
| 360 | 356 |
| 361 // But it is an error to try to change to a different winner. | 357 // But it is an error to try to change to a different winner. |
| 362 EXPECT_FALSE(FieldTrialList::CreateTrialsInChildProcess( | 358 EXPECT_FALSE(FieldTrialList::CreateTrialsFromString( |
| 363 "Some name/Loser/")); | 359 "Some name/Loser/")); |
| 364 } | 360 } |
| 365 | 361 |
| 366 TEST_F(FieldTrialTest, CreateFieldTrial) { | 362 TEST_F(FieldTrialTest, CreateFieldTrial) { |
| 367 EXPECT_TRUE(FieldTrialList::Find("Some_name") == NULL); | 363 EXPECT_TRUE(FieldTrialList::Find("Some_name") == NULL); |
| 368 | 364 |
| 369 FieldTrialList::CreateFieldTrial("Some_name", "Winner"); | 365 FieldTrialList::CreateFieldTrial("Some_name", "Winner"); |
| 370 | 366 |
| 371 FieldTrial* trial = FieldTrialList::Find("Some_name"); | 367 FieldTrial* trial = FieldTrialList::Find("Some_name"); |
| 372 ASSERT_NE(static_cast<FieldTrial*>(NULL), trial); | 368 ASSERT_NE(static_cast<FieldTrial*>(NULL), trial); |
| 373 EXPECT_EQ("Winner", trial->group_name()); | 369 EXPECT_EQ("Winner", trial->group_name()); |
| 374 EXPECT_EQ("Some_name", trial->name()); | 370 EXPECT_EQ("Some_name", trial->name()); |
| 375 } | 371 } |
| 376 | 372 |
| 377 TEST_F(FieldTrialTest, DuplicateFieldTrial) { | 373 TEST_F(FieldTrialTest, DuplicateFieldTrial) { |
| 378 FieldTrial* trial = | 374 FieldTrial* trial = FieldTrial::CreateInstance( |
| 379 new FieldTrial( | 375 "Some_name", 10, "Default some name", next_year_, 12, 31); |
| 380 "Some_name", 10, "Default some name", next_year_, 12, 31); | |
| 381 trial->AppendGroup("Winner", 10); | 376 trial->AppendGroup("Winner", 10); |
| 382 | 377 |
| 383 // It is OK if we redundantly specify a winner. | 378 // It is OK if we redundantly specify a winner. |
| 384 FieldTrial* trial1 = FieldTrialList::CreateFieldTrial("Some_name", "Winner"); | 379 FieldTrial* trial1 = FieldTrialList::CreateFieldTrial("Some_name", "Winner"); |
| 385 EXPECT_TRUE(trial1 != NULL); | 380 EXPECT_TRUE(trial1 != NULL); |
| 386 | 381 |
| 387 // But it is an error to try to change to a different winner. | 382 // But it is an error to try to change to a different winner. |
| 388 FieldTrial* trial2 = FieldTrialList::CreateFieldTrial("Some_name", "Loser"); | 383 FieldTrial* trial2 = FieldTrialList::CreateFieldTrial("Some_name", "Loser"); |
| 389 EXPECT_TRUE(trial2 == NULL); | 384 EXPECT_TRUE(trial2 == NULL); |
| 390 } | 385 } |
| 391 | 386 |
| 392 TEST_F(FieldTrialTest, MakeName) { | 387 TEST_F(FieldTrialTest, MakeName) { |
| 393 FieldTrial* trial = | 388 FieldTrial* trial = FieldTrial::CreateInstance( |
| 394 new FieldTrial("Field Trial", 10, "Winner", next_year_, 12, 31); | 389 "Field Trial", 10, "Winner", next_year_, 12, 31); |
| 395 trial->group(); | 390 trial->group(); |
| 396 EXPECT_EQ("Histogram_Winner", | 391 EXPECT_EQ("Histogram_Winner", |
| 397 FieldTrial::MakeName("Histogram", "Field Trial")); | 392 FieldTrial::MakeName("Histogram", "Field Trial")); |
| 398 } | 393 } |
| 399 | 394 |
| 400 TEST_F(FieldTrialTest, HashClientId) { | 395 TEST_F(FieldTrialTest, HashClientId) { |
| 401 double results[] = { | 396 double results[] = { |
| 402 FieldTrial::HashClientId("hi", "1"), | 397 FieldTrial::HashClientId("hi", "1"), |
| 403 FieldTrial::HashClientId("there", "1"), | 398 FieldTrial::HashClientId("there", "1"), |
| 404 }; | 399 }; |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 460 } | 455 } |
| 461 | 456 |
| 462 TEST_F(FieldTrialTest, UseOneTimeRandomization) { | 457 TEST_F(FieldTrialTest, UseOneTimeRandomization) { |
| 463 // Simply asserts that two trials using one-time randomization | 458 // Simply asserts that two trials using one-time randomization |
| 464 // that have different names, normally generate different results. | 459 // that have different names, normally generate different results. |
| 465 // | 460 // |
| 466 // Note that depending on the one-time random initialization, they | 461 // Note that depending on the one-time random initialization, they |
| 467 // _might_ actually give the same result, but we know that given | 462 // _might_ actually give the same result, but we know that given |
| 468 // the particular client_id we use for unit tests they won't. | 463 // the particular client_id we use for unit tests they won't. |
| 469 scoped_refptr<FieldTrial> trials[] = { | 464 scoped_refptr<FieldTrial> trials[] = { |
| 470 new FieldTrial("one", 100, "default", next_year_, 1, 1), | 465 FieldTrial::CreateInstance("one", 100, "default", next_year_, 1, 1), |
| 471 new FieldTrial("two", 100, "default", next_year_, 1, 1), | 466 FieldTrial::CreateInstance("two", 100, "default", next_year_, 1, 1), |
| 472 }; | 467 }; |
| 473 | 468 |
| 474 for (size_t i = 0; i < arraysize(trials); ++i) { | 469 for (size_t i = 0; i < arraysize(trials); ++i) { |
| 475 trials[i]->UseOneTimeRandomization(); | 470 trials[i]->UseOneTimeRandomization(); |
| 476 | 471 |
| 477 for (int j = 0; j < 100; ++j) { | 472 for (int j = 0; j < 100; ++j) { |
| 478 trials[i]->AppendGroup("", 1); | 473 trials[i]->AppendGroup("", 1); |
| 479 } | 474 } |
| 480 } | 475 } |
| 481 | 476 |
| 482 // The trials are most likely to give different results since they have | 477 // The trials are most likely to give different results since they have |
| 483 // different names. | 478 // different names. |
| 484 ASSERT_NE(trials[0]->group(), trials[1]->group()); | 479 ASSERT_NE(trials[0]->group(), trials[1]->group()); |
| 485 ASSERT_NE(trials[0]->group_name(), trials[1]->group_name()); | 480 ASSERT_NE(trials[0]->group_name(), trials[1]->group_name()); |
| 486 } | 481 } |
| 487 | 482 |
| 488 TEST_F(FieldTrialTest, DisableImmediately) { | 483 TEST_F(FieldTrialTest, DisableImmediately) { |
| 489 FieldTrial* trial = | 484 FieldTrial* trial = |
| 490 new FieldTrial("trial", 100, "default", next_year_, 12, 31); | 485 FieldTrial::CreateInstance("trial", 100, "default", next_year_, 12, 31); |
| 491 trial->Disable(); | 486 trial->Disable(); |
| 492 ASSERT_EQ("default", trial->group_name()); | 487 ASSERT_EQ("default", trial->group_name()); |
| 493 ASSERT_EQ(FieldTrial::kDefaultGroupNumber, trial->group()); | 488 ASSERT_EQ(FieldTrial::kDefaultGroupNumber, trial->group()); |
| 494 } | 489 } |
| 495 | 490 |
| 496 TEST_F(FieldTrialTest, DisableAfterInitialization) { | 491 TEST_F(FieldTrialTest, DisableAfterInitialization) { |
| 497 FieldTrial* trial = | 492 FieldTrial* trial = |
| 498 new FieldTrial("trial", 100, "default", next_year_, 12, 31); | 493 FieldTrial::CreateInstance("trial", 100, "default", next_year_, 12, 31); |
| 499 trial->AppendGroup("non_default", 100); | 494 trial->AppendGroup("non_default", 100); |
| 500 ASSERT_EQ("non_default", trial->group_name()); | 495 ASSERT_EQ("non_default", trial->group_name()); |
| 501 trial->Disable(); | 496 trial->Disable(); |
| 502 ASSERT_EQ("default", trial->group_name()); | 497 ASSERT_EQ("default", trial->group_name()); |
| 503 } | 498 } |
| 504 | 499 |
| 505 } // namespace base | 500 } // namespace base |
| OLD | NEW |