15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/field_trial.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/rand_util.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/run_loop.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Default group name used by several tests. 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDefaultGroupName[] = "DefaultGroup"; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// Call FieldTrialList::FactoryGetFieldTrial() with a future expiry date. 22d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochscoped_refptr<base::FieldTrial> CreateFieldTrial( 23d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& trial_name, 24d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch int total_probability, 25d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& default_group_name, 26d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch int* default_group_number) { 27d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return FieldTrialList::FactoryGetFieldTrial( 28d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch trial_name, total_probability, default_group_name, 29d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch base::FieldTrialList::kNoExpirationYear, 1, 1, 30d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch base::FieldTrial::SESSION_RANDOMIZED, default_group_number); 31d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch} 32d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 33d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochint GetLastYear() { 34d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Time last_year_time = Time::NowFromSystemTime() - TimeDelta::FromDays(365); 35d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Time::Exploded exploded; 36d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch last_year_time.LocalExplode(&exploded); 37d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return exploded.year; 38d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch} 39d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// FieldTrialList::Observer implementation for testing. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestFieldTrialObserver : public FieldTrialList::Observer { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestFieldTrialObserver() { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrialList::AddObserver(this); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestFieldTrialObserver() { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrialList::RemoveObserver(this); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnFieldTrialGroupFinalized(const std::string& trial, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& group) OVERRIDE { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial_name_ = trial; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group_name_ = group; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& trial_name() const { return trial_name_; } 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& group_name() const { return group_name_; } 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string trial_name_; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string group_name_; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestFieldTrialObserver); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FieldTrialTest : public testing::Test { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 71d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch FieldTrialTest() : trial_list_(NULL) {} 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 74d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch MessageLoop message_loop_; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrialList trial_list_; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test registration, and also check that destructors are called for trials 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (and that Valgrind doesn't catch us leaking). 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FieldTrialTest, Registration) { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* name1 = "name 1 test"; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* name2 = "name 2 test"; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(FieldTrialList::Find(name1)); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(FieldTrialList::Find(name2)); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FieldTrial> trial1 = 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateFieldTrial(name1, 10, "default name 1 test", NULL); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(FieldTrial::kNotFinalized, trial1->group_); 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(name1, trial1->trial_name()); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", trial1->group_name_internal()); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) trial1->AppendGroup(std::string(), 7); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(trial1.get(), FieldTrialList::Find(name1)); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(FieldTrialList::Find(name2)); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FieldTrial> trial2 = 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateFieldTrial(name2, 10, "default name 2 test", NULL); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(FieldTrial::kNotFinalized, trial2->group_); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(name2, trial2->trial_name()); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", trial2->group_name_internal()); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial2->AppendGroup("a first group", 7); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(trial1.get(), FieldTrialList::Find(name1)); 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(trial2.get(), FieldTrialList::Find(name2)); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: FieldTrialList should delete the objects at shutdown. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FieldTrialTest, AbsoluteProbabilities) { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char always_true[] = " always true"; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char default_always_true[] = " default always true"; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char always_false[] = " always false"; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char default_always_false[] = " default always false"; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 1; i < 250; ++i) { 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try lots of names, by changing the first character of the name. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) always_true[0] = i; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_always_true[0] = i; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) always_false[0] = i; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_always_false[0] = i; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FieldTrial> trial_true = 123d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch CreateFieldTrial(always_true, 10, default_always_true, NULL); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string winner = "TheWinner"; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int winner_group = trial_true->AppendGroup(winner, 10); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(winner_group, trial_true->group()); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(winner, trial_true->group_name()); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FieldTrial> trial_false = 131d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch CreateFieldTrial(always_false, 10, default_always_false, NULL); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int loser_group = trial_false->AppendGroup("ALoser", 0); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(loser_group, trial_false->group()); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FieldTrialTest, RemainingProbability) { 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // First create a test that hasn't had a winner yet. 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string winner = "Winner"; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string loser = "Loser"; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<FieldTrial> trial; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int counter = 0; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int default_group_number = -1; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string name = StringPrintf("trial%d", ++counter); 147d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch trial = CreateFieldTrial(name, 10, winner, &default_group_number); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial->AppendGroup(loser, 5); // 50% chance of not being chosen. 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If a group is not assigned, group_ will be kNotFinalized. 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (trial->group_ != FieldTrial::kNotFinalized); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And that 'default' group (winner) should always win. 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(default_group_number, trial->group()); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And that winner should ALWAYS win. 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(winner, trial->group_name()); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FieldTrialTest, FiftyFiftyProbability) { 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that even with small divisors, we have the proper probabilities, and 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // all outcomes are possible. Since this is a 50-50 test, it should get both 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // outcomes in a few tries, but we'll try no more than 100 times (and be flaky 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with probability around 1 in 2^99). 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool first_winner = false; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool second_winner = false; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int counter = 0; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string name = base::StringPrintf("FiftyFifty%d", ++counter); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string default_group_name = base::StringPrintf("Default FiftyFifty%d", 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++counter); 1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FieldTrial> trial = 1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateFieldTrial(name, 2, default_group_name, NULL); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial->AppendGroup("first", 1); // 50% chance of being chosen. 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If group_ is kNotFinalized, then a group assignement hasn't been done. 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (trial->group_ != FieldTrial::kNotFinalized) { 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_winner = true; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial->AppendGroup("second", 1); // Always chosen at this point. 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(FieldTrial::kNotFinalized, trial->group()); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_winner = true; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while ((!second_winner || !first_winner) && counter < 100); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(second_winner); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(first_winner); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FieldTrialTest, MiddleProbabilities) { 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char name[] = " same name"; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char default_group_name[] = " default same name"; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool false_event_seen = false; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool true_event_seen = false; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 1; i < 250; ++i) { 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name[0] = i; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_group_name[0] = i; 1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FieldTrial> trial = 1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateFieldTrial(name, 10, default_group_name, NULL); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int might_win = trial->AppendGroup("MightWin", 5); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (trial->group() == might_win) { 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true_event_seen = true; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false_event_seen = true; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (false_event_seen && true_event_seen) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; // Successful test!!! 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Very surprising to get here. Probability should be around 1 in 2 ** 250. 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // One of the following will fail. 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(false_event_seen); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(true_event_seen); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FieldTrialTest, OneWinner) { 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char name[] = "Some name"; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char default_group_name[] = "Default some name"; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int group_count(10); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int default_group_number = -1; 2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FieldTrial> trial = 220d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch CreateFieldTrial(name, group_count, default_group_name, NULL); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int winner_index(-2); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string winner_name; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 1; i <= group_count; ++i) { 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int might_win = trial->AppendGroup(std::string(), 1); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Because we keep appending groups, we want to see if the last group that 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // was added has been assigned or not. 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (trial->group_ == might_win) { 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-2, winner_index); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) winner_index = might_win; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringAppendF(&winner_name, "%d", might_win); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(winner_name, trial->group_name()); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GE(winner_index, 0); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Since all groups cover the total probability, we should not have 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // chosen the default group. 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(trial->group(), default_group_number); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(trial->group(), winner_index); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(trial->group_name(), winner_name); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FieldTrialTest, DisableProbability) { 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string default_group_name = "Default group"; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string loser = "Loser"; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string name = "Trial"; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a field trail that has expired. 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int default_group_number = -1; 251d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch FieldTrial* trial = FieldTrialList::FactoryGetFieldTrial( 252d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch name, 1000000000, default_group_name, GetLastYear(), 1, 1, 253d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch FieldTrial::SESSION_RANDOMIZED, 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_group_number); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial->AppendGroup(loser, 999999999); // 99.9999999% chance of being chosen. 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Because trial has expired, we should always be in the default group. 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(default_group_number, trial->group()); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And that default_group_name should ALWAYS win. 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(default_group_name, trial->group_name()); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FieldTrialTest, ActiveGroups) { 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string no_group("No Group"); 2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FieldTrial> trial = 2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateFieldTrial(no_group, 10, "Default", NULL); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There is no winner yet, so no NameGroupId should be returned. 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrial::ActiveGroup active_group; 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(trial->GetActiveGroup(&active_group)); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a single winning group. 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string one_winner("One Winner"); 275d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch trial = CreateFieldTrial(one_winner, 10, "Default", NULL); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string winner("Winner"); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial->AppendGroup(winner, 10); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(trial->GetActiveGroup(&active_group)); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Finalize the group selection by accessing the selected group. 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial->group(); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(trial->GetActiveGroup(&active_group)); 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(one_winner, active_group.trial_name); 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(winner, active_group.group_name); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string multi_group("MultiGroup"); 2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FieldTrial> multi_group_trial = 287d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch CreateFieldTrial(multi_group, 9, "Default", NULL); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) multi_group_trial->AppendGroup("Me", 3); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) multi_group_trial->AppendGroup("You", 3); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) multi_group_trial->AppendGroup("Them", 3); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(multi_group_trial->GetActiveGroup(&active_group)); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Finalize the group selection by accessing the selected group. 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) multi_group_trial->group(); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(multi_group_trial->GetActiveGroup(&active_group)); 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(multi_group, active_group.trial_name); 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(multi_group_trial->group_name(), active_group.group_name); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now check if the list is built properly... 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrial::ActiveGroups active_groups; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrialList::GetActiveFieldTrialGroups(&active_groups); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2U, active_groups.size()); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < active_groups.size(); ++i) { 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Order is not guaranteed, so check all values. 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(no_group, active_groups[i].trial_name); 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(one_winner != active_groups[i].trial_name || 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) winner == active_groups[i].group_name); 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(multi_group != active_groups[i].trial_name || 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) multi_group_trial->group_name() == active_groups[i].group_name); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FieldTrialTest, ActiveGroupsNotFinalized) { 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kTrialName[] = "TestTrial"; 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kSecondaryGroupName[] = "SecondaryGroup"; 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int default_group = -1; 3181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FieldTrial> trial = 319d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch CreateFieldTrial(kTrialName, 100, kDefaultGroupName, &default_group); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int secondary_group = trial->AppendGroup(kSecondaryGroupName, 50); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Before |group()| is called, |GetActiveGroup()| should return false. 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrial::ActiveGroup active_group; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(trial->GetActiveGroup(&active_group)); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |GetActiveFieldTrialGroups()| should also not include the trial. 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrial::ActiveGroups active_groups; 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrialList::GetActiveFieldTrialGroups(&active_groups); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(active_groups.empty()); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // After |group()| has been called, both APIs should succeed. 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int chosen_group = trial->group(); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(chosen_group == default_group || chosen_group == secondary_group); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(trial->GetActiveGroup(&active_group)); 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kTrialName, active_group.trial_name); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (chosen_group == default_group) 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kDefaultGroupName, active_group.group_name); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kSecondaryGroupName, active_group.group_name); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrialList::GetActiveFieldTrialGroups(&active_groups); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, active_groups.size()); 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kTrialName, active_groups[0].trial_name); 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(active_group.group_name, active_groups[0].group_name); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FieldTrialTest, Save) { 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string save_string; 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FieldTrial> trial = 352d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch CreateFieldTrial("Some name", 10, "Default some name", NULL); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There is no winner yet, so no textual group name is associated with trial. 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In this case, the trial should not be included. 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", trial->group_name_internal()); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrialList::StatesToString(&save_string); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", save_string); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_string.clear(); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a winning group. 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial->AppendGroup("Winner", 10); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Finalize the group selection by accessing the selected group. 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial->group(); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrialList::StatesToString(&save_string); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("Some name/Winner/", save_string); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_string.clear(); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a second trial and winning group. 3691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FieldTrial> trial2 = 3701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateFieldTrial("xxx", 10, "Default xxx", NULL); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial2->AppendGroup("yyyy", 10); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Finalize the group selection by accessing the selected group. 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial2->group(); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrialList::StatesToString(&save_string); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We assume names are alphabetized... though this is not critical. 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("Some name/Winner/xxx/yyyy/", save_string); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_string.clear(); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a third trial with only the default group. 3811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FieldTrial> trial3 = 3821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateFieldTrial("zzz", 10, "default", NULL); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Finalize the group selection by accessing the selected group. 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial3->group(); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrialList::StatesToString(&save_string); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("Some name/Winner/xxx/yyyy/zzz/default/", save_string); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FieldTrialTest, Restore) { 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(FieldTrialList::TrialExists("Some_name")); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(FieldTrialList::TrialExists("xxx")); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 394eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FieldTrialList::CreateTrialsFromString("Some_name/Winner/xxx/yyyy/", 3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FieldTrialList::DONT_ACTIVATE_TRIALS, 3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::set<std::string>()); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrial* trial = FieldTrialList::Find("Some_name"); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(static_cast<FieldTrial*>(NULL), trial); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("Winner", trial->group_name()); 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("Some_name", trial->trial_name()); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial = FieldTrialList::Find("xxx"); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(static_cast<FieldTrial*>(NULL), trial); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("yyyy", trial->group_name()); 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("xxx", trial->trial_name()); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(FieldTrialTest, RestoreNotEndingWithSlash) { 4101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(FieldTrialList::CreateTrialsFromString( 4111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "tname/gname", FieldTrialList::DONT_ACTIVATE_TRIALS, 4121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::set<std::string>())); 4131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FieldTrial* trial = FieldTrialList::Find("tname"); 4151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_NE(static_cast<FieldTrial*>(NULL), trial); 4161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ("gname", trial->group_name()); 4171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ("tname", trial->trial_name()); 4181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 4191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FieldTrialTest, BogusRestore) { 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(FieldTrialList::CreateTrialsFromString( 4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "MissingSlash", FieldTrialList::DONT_ACTIVATE_TRIALS, 4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::set<std::string>())); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(FieldTrialList::CreateTrialsFromString( 4255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "MissingGroupName/", FieldTrialList::DONT_ACTIVATE_TRIALS, 4265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::set<std::string>())); 427eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(FieldTrialList::CreateTrialsFromString( 4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "noname, only group/", FieldTrialList::DONT_ACTIVATE_TRIALS, 4295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::set<std::string>())); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FieldTrialTest, DuplicateRestore) { 4331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FieldTrial> trial = 4341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateFieldTrial("Some name", 10, "Default", NULL); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial->AppendGroup("Winner", 10); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Finalize the group selection by accessing the selected group. 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial->group(); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string save_string; 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrialList::StatesToString(&save_string); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("Some name/Winner/", save_string); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It is OK if we redundantly specify a winner. 443eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(FieldTrialList::CreateTrialsFromString( 4445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) save_string, FieldTrialList::DONT_ACTIVATE_TRIALS, 4455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::set<std::string>())); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // But it is an error to try to change to a different winner. 448eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(FieldTrialList::CreateTrialsFromString( 4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Some name/Loser/", FieldTrialList::DONT_ACTIVATE_TRIALS, 4505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::set<std::string>())); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 453eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(FieldTrialTest, CreateTrialsFromStringActive) { 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(FieldTrialList::TrialExists("Abc")); 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(FieldTrialList::TrialExists("Xyz")); 456eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(FieldTrialList::CreateTrialsFromString( 4575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Abc/def/Xyz/zyx/", FieldTrialList::ACTIVATE_TRIALS, 4585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::set<std::string>())); 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FieldTrial::ActiveGroups active_groups; 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FieldTrialList::GetActiveFieldTrialGroups(&active_groups); 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(2U, active_groups.size()); 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("Abc", active_groups[0].trial_name); 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("def", active_groups[0].group_name); 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("Xyz", active_groups[1].trial_name); 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("zyx", active_groups[1].group_name); 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 469eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(FieldTrialTest, CreateTrialsFromStringNotActive) { 470eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_FALSE(FieldTrialList::TrialExists("Abc")); 471eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_FALSE(FieldTrialList::TrialExists("Xyz")); 472eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(FieldTrialList::CreateTrialsFromString( 4735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Abc/def/Xyz/zyx/", FieldTrialList::DONT_ACTIVATE_TRIALS, 4745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::set<std::string>())); 475eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 476eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FieldTrial::ActiveGroups active_groups; 477eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FieldTrialList::GetActiveFieldTrialGroups(&active_groups); 478eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(active_groups.empty()); 479eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 480eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Check that the values still get returned and querying them activates them. 481eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("def", FieldTrialList::FindFullName("Abc")); 482eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("zyx", FieldTrialList::FindFullName("Xyz")); 483eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 484eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FieldTrialList::GetActiveFieldTrialGroups(&active_groups); 485eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_EQ(2U, active_groups.size()); 486eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("Abc", active_groups[0].trial_name); 487eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("def", active_groups[0].group_name); 488eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("Xyz", active_groups[1].trial_name); 489eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("zyx", active_groups[1].group_name); 490eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 491eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 492eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(FieldTrialTest, CreateTrialsFromStringActiveObserver) { 493eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_FALSE(FieldTrialList::TrialExists("Abc")); 494eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 495eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestFieldTrialObserver observer; 496eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(FieldTrialList::CreateTrialsFromString( 4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Abc/def/", FieldTrialList::ACTIVATE_TRIALS, std::set<std::string>())); 498eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 499eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RunLoop().RunUntilIdle(); 500eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("Abc", observer.trial_name()); 501eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("def", observer.group_name()); 502eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 503eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 504eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(FieldTrialTest, CreateTrialsFromStringNotActiveObserver) { 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(FieldTrialList::TrialExists("Abc")); 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestFieldTrialObserver observer; 508eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(FieldTrialList::CreateTrialsFromString( 5095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Abc/def/", FieldTrialList::DONT_ACTIVATE_TRIALS, 5105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::set<std::string>())); 511eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RunLoop().RunUntilIdle(); 512eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Observer shouldn't be notified. 513eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(observer.trial_name().empty()); 514eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 515eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Check that the values still get returned and querying them activates them. 516eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("def", FieldTrialList::FindFullName("Abc")); 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunLoop().RunUntilIdle(); 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("Abc", observer.trial_name()); 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("def", observer.group_name()); 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(FieldTrialTest, CreateTrialsFromStringWithIgnoredFieldTrials) { 5245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(FieldTrialList::TrialExists("Unaccepted1")); 5255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(FieldTrialList::TrialExists("Foo")); 5265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(FieldTrialList::TrialExists("Unaccepted2")); 5275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(FieldTrialList::TrialExists("Bar")); 5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(FieldTrialList::TrialExists("Unaccepted3")); 5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::set<std::string> ignored_trial_names; 5315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ignored_trial_names.insert("Unaccepted1"); 5325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ignored_trial_names.insert("Unaccepted2"); 5335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ignored_trial_names.insert("Unaccepted3"); 5345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FieldTrialList::CreateTrialsFromString( 5365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Unaccepted1/Unaccepted1_name/" 5375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Foo/Foo_name/" 5385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Unaccepted2/Unaccepted2_name/" 5395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Bar/Bar_name/" 5405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Unaccepted3/Unaccepted3_name/", 5415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FieldTrialList::DONT_ACTIVATE_TRIALS, 5425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ignored_trial_names); 5435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(FieldTrialList::TrialExists("Unaccepted1")); 5455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(FieldTrialList::TrialExists("Foo")); 5465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(FieldTrialList::TrialExists("Unaccepted2")); 5475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(FieldTrialList::TrialExists("Bar")); 5485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(FieldTrialList::TrialExists("Unaccepted3")); 5495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FieldTrial::ActiveGroups active_groups; 5515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FieldTrialList::GetActiveFieldTrialGroups(&active_groups); 5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(active_groups.empty()); 5535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FieldTrial* trial = FieldTrialList::Find("Foo"); 5555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_NE(static_cast<FieldTrial*>(NULL), trial); 5565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("Foo", trial->trial_name()); 5575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("Foo_name", trial->group_name()); 5585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) trial = FieldTrialList::Find("Bar"); 5605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_NE(static_cast<FieldTrial*>(NULL), trial); 5615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("Bar", trial->trial_name()); 5625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("Bar_name", trial->group_name()); 5635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FieldTrialTest, CreateFieldTrial) { 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(FieldTrialList::TrialExists("Some_name")); 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrialList::CreateFieldTrial("Some_name", "Winner"); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrial* trial = FieldTrialList::Find("Some_name"); 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(static_cast<FieldTrial*>(NULL), trial); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("Winner", trial->group_name()); 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("Some_name", trial->trial_name()); 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(FieldTrialTest, CreateFieldTrialIsNotActive) { 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char kTrialName[] = "CreateFieldTrialIsActiveTrial"; 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char kWinnerGroup[] = "Winner"; 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(FieldTrialList::TrialExists(kTrialName)); 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FieldTrialList::CreateFieldTrial(kTrialName, kWinnerGroup); 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FieldTrial::ActiveGroups active_groups; 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FieldTrialList::GetActiveFieldTrialGroups(&active_groups); 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(active_groups.empty()); 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FieldTrialTest, DuplicateFieldTrial) { 5881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FieldTrial> trial = 5891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateFieldTrial("Some_name", 10, "Default", NULL); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial->AppendGroup("Winner", 10); 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It is OK if we redundantly specify a winner. 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrial* trial1 = FieldTrialList::CreateFieldTrial("Some_name", "Winner"); 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(trial1 != NULL); 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // But it is an error to try to change to a different winner. 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrial* trial2 = FieldTrialList::CreateFieldTrial("Some_name", "Loser"); 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(trial2 == NULL); 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FieldTrialTest, DisableImmediately) { 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int default_group_number = -1; 6031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FieldTrial> trial = 604d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch CreateFieldTrial("trial", 100, "default", &default_group_number); 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial->Disable(); 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ("default", trial->group_name()); 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(default_group_number, trial->group()); 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FieldTrialTest, DisableAfterInitialization) { 6111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FieldTrial> trial = 6121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateFieldTrial("trial", 100, "default", NULL); 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial->AppendGroup("non_default", 100); 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial->Disable(); 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ("default", trial->group_name()); 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FieldTrialTest, ForcedFieldTrials) { 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Validate we keep the forced choice. 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrial* forced_trial = FieldTrialList::CreateFieldTrial("Use the", 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Force"); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("Force", forced_trial->group_name().c_str()); 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int default_group_number = -1; 6251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FieldTrial> factory_trial = 626d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch CreateFieldTrial("Use the", 1000, "default", &default_group_number); 6271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(factory_trial.get(), forced_trial); 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int chosen_group = factory_trial->AppendGroup("Force", 100); 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(chosen_group, factory_trial->group()); 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int not_chosen_group = factory_trial->AppendGroup("Dark Side", 100); 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(chosen_group, not_chosen_group); 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Since we didn't force the default group, we should not be returned the 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // chosen group as the default group. 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(default_group_number, chosen_group); 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int new_group = factory_trial->AppendGroup("Duck Tape", 800); 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(chosen_group, new_group); 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The new group should not be the default group either. 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(default_group_number, new_group); 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(FieldTrialTest, ForcedFieldTrialsDefaultGroup) { 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Forcing the default should use the proper group ID. 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FieldTrial* forced_trial = FieldTrialList::CreateFieldTrial("Trial Name", 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Default"); 6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int default_group_number = -1; 6481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FieldTrial> factory_trial = 649d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch CreateFieldTrial("Trial Name", 1000, "Default", &default_group_number); 6501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(forced_trial, factory_trial.get()); 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int other_group = factory_trial->AppendGroup("Not Default", 100); 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("Default", factory_trial->group_name().c_str()); 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(default_group_number, factory_trial->group()); 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(other_group, factory_trial->group()); 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int new_other_group = factory_trial->AppendGroup("Not Default Either", 800); 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(new_other_group, factory_trial->group()); 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FieldTrialTest, SetForced) { 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start by setting a trial for which we ensure a winner... 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int default_group_number = -1; 6641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FieldTrial> forced_trial = 665d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch CreateFieldTrial("Use the", 1, "default", &default_group_number); 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(forced_trial, forced_trial); 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int forced_group = forced_trial->AppendGroup("Force", 1); 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(forced_group, forced_trial->group()); 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now force it. 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) forced_trial->SetForced(); 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now try to set it up differently as a hard coded registration would. 6751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FieldTrial> hard_coded_trial = 676d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch CreateFieldTrial("Use the", 1, "default", &default_group_number); 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(hard_coded_trial, forced_trial); 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int would_lose_group = hard_coded_trial->AppendGroup("Force", 0); 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(forced_group, hard_coded_trial->group()); 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(forced_group, would_lose_group); 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Same thing if we would have done it to win again. 6841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FieldTrial> other_hard_coded_trial = 685d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch CreateFieldTrial("Use the", 1, "default", &default_group_number); 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(other_hard_coded_trial, forced_trial); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int would_win_group = other_hard_coded_trial->AppendGroup("Force", 1); 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(forced_group, other_hard_coded_trial->group()); 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(forced_group, would_win_group); 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(FieldTrialTest, SetForcedDefaultOnly) { 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char kTrialName[] = "SetForcedDefaultOnly"; 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(FieldTrialList::TrialExists(kTrialName)); 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int default_group = -1; 6981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FieldTrial> trial = 699d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch CreateFieldTrial(kTrialName, 100, kDefaultGroupName, &default_group); 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) trial->SetForced(); 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 702d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch trial = CreateFieldTrial(kTrialName, 100, kDefaultGroupName, NULL); 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(default_group, trial->group()); 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kDefaultGroupName, trial->group_name()); 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(FieldTrialTest, SetForcedDefaultWithExtraGroup) { 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char kTrialName[] = "SetForcedDefaultWithExtraGroup"; 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(FieldTrialList::TrialExists(kTrialName)); 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int default_group = -1; 7121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FieldTrial> trial = 713d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch CreateFieldTrial(kTrialName, 100, kDefaultGroupName, &default_group); 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) trial->SetForced(); 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 716d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch trial = CreateFieldTrial(kTrialName, 100, kDefaultGroupName, NULL); 7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int extra_group = trial->AppendGroup("Extra", 100); 7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(default_group, trial->group()); 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(extra_group, trial->group()); 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kDefaultGroupName, trial->group_name()); 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(FieldTrialTest, SetForcedTurnFeatureOn) { 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char kTrialName[] = "SetForcedTurnFeatureOn"; 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char kExtraGroupName[] = "Extra"; 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(FieldTrialList::TrialExists(kTrialName)); 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Simulate a server-side (forced) config that turns the feature on when the 7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // original hard-coded config had it disabled. 7301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FieldTrial> forced_trial = 731d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch CreateFieldTrial(kTrialName, 100, kDefaultGroupName, NULL); 7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) forced_trial->AppendGroup(kExtraGroupName, 100); 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) forced_trial->SetForced(); 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int default_group = -1; 7361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FieldTrial> client_trial = 737d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch CreateFieldTrial(kTrialName, 100, kDefaultGroupName, &default_group); 7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int extra_group = client_trial->AppendGroup(kExtraGroupName, 0); 7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(default_group, extra_group); 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(client_trial->group_reported_); 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(extra_group, client_trial->group()); 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(client_trial->group_reported_); 7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kExtraGroupName, client_trial->group_name()); 7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(FieldTrialTest, SetForcedTurnFeatureOff) { 7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char kTrialName[] = "SetForcedTurnFeatureOff"; 7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char kExtraGroupName[] = "Extra"; 7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(FieldTrialList::TrialExists(kTrialName)); 7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Simulate a server-side (forced) config that turns the feature off when the 7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // original hard-coded config had it enabled. 7541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FieldTrial> forced_trial = 755d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch CreateFieldTrial(kTrialName, 100, kDefaultGroupName, NULL); 7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) forced_trial->AppendGroup(kExtraGroupName, 0); 7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) forced_trial->SetForced(); 7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int default_group = -1; 7601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FieldTrial> client_trial = 761d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch CreateFieldTrial(kTrialName, 100, kDefaultGroupName, &default_group); 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int extra_group = client_trial->AppendGroup(kExtraGroupName, 100); 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(default_group, extra_group); 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(client_trial->group_reported_); 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(default_group, client_trial->group()); 7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(client_trial->group_reported_); 7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kDefaultGroupName, client_trial->group_name()); 7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(FieldTrialTest, SetForcedChangeDefault_Default) { 7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char kTrialName[] = "SetForcedDefaultGroupChange"; 7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char kGroupAName[] = "A"; 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char kGroupBName[] = "B"; 7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(FieldTrialList::TrialExists(kTrialName)); 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Simulate a server-side (forced) config that switches which group is default 7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // and ensures that the non-forced code receives the correct group numbers. 7791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FieldTrial> forced_trial = 780d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch CreateFieldTrial(kTrialName, 100, kGroupAName, NULL); 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) forced_trial->AppendGroup(kGroupBName, 100); 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) forced_trial->SetForced(); 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int default_group = -1; 7851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FieldTrial> client_trial = 786d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch CreateFieldTrial(kTrialName, 100, kGroupBName, &default_group); 7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int extra_group = client_trial->AppendGroup(kGroupAName, 50); 7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(default_group, extra_group); 7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(client_trial->group_reported_); 7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(default_group, client_trial->group()); 7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(client_trial->group_reported_); 7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kGroupBName, client_trial->group_name()); 7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(FieldTrialTest, SetForcedChangeDefault_NonDefault) { 7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char kTrialName[] = "SetForcedDefaultGroupChange"; 7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char kGroupAName[] = "A"; 7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char kGroupBName[] = "B"; 8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(FieldTrialList::TrialExists(kTrialName)); 8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Simulate a server-side (forced) config that switches which group is default 8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // and ensures that the non-forced code receives the correct group numbers. 8041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FieldTrial> forced_trial = 805d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch CreateFieldTrial(kTrialName, 100, kGroupAName, NULL); 8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) forced_trial->AppendGroup(kGroupBName, 0); 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) forced_trial->SetForced(); 8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int default_group = -1; 8101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FieldTrial> client_trial = 811d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch CreateFieldTrial(kTrialName, 100, kGroupBName, &default_group); 8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int extra_group = client_trial->AppendGroup(kGroupAName, 50); 8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(default_group, extra_group); 8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(client_trial->group_reported_); 8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(extra_group, client_trial->group()); 8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(client_trial->group_reported_); 8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kGroupAName, client_trial->group_name()); 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FieldTrialTest, Observe) { 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kTrialName[] = "TrialToObserve1"; 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kSecondaryGroupName[] = "SecondaryGroup"; 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestFieldTrialObserver observer; 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int default_group = -1; 8271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FieldTrial> trial = 828d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch CreateFieldTrial(kTrialName, 100, kDefaultGroupName, &default_group); 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int secondary_group = trial->AppendGroup(kSecondaryGroupName, 50); 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int chosen_group = trial->group(); 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(chosen_group == default_group || chosen_group == secondary_group); 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunLoop().RunUntilIdle(); 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kTrialName, observer.trial_name()); 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (chosen_group == default_group) 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kDefaultGroupName, observer.group_name()); 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSecondaryGroupName, observer.group_name()); 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FieldTrialTest, ObserveDisabled) { 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kTrialName[] = "TrialToObserve2"; 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestFieldTrialObserver observer; 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int default_group = -1; 8461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FieldTrial> trial = 847d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch CreateFieldTrial(kTrialName, 100, kDefaultGroupName, &default_group); 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial->AppendGroup("A", 25); 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial->AppendGroup("B", 25); 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial->AppendGroup("C", 25); 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial->Disable(); 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Observer shouldn't be notified of a disabled trial. 8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunLoop().RunUntilIdle(); 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(observer.trial_name().empty()); 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(observer.group_name().empty()); 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Observer shouldn't be notified even after a |group()| call. 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(default_group, trial->group()); 8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunLoop().RunUntilIdle(); 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(observer.trial_name().empty()); 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(observer.group_name().empty()); 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FieldTrialTest, ObserveForcedDisabled) { 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kTrialName[] = "TrialToObserve3"; 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestFieldTrialObserver observer; 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int default_group = -1; 8701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FieldTrial> trial = 871d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch CreateFieldTrial(kTrialName, 100, kDefaultGroupName, &default_group); 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial->AppendGroup("A", 25); 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial->AppendGroup("B", 25); 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial->AppendGroup("C", 25); 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial->SetForced(); 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial->Disable(); 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Observer shouldn't be notified of a disabled trial, even when forced. 8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunLoop().RunUntilIdle(); 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(observer.trial_name().empty()); 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(observer.group_name().empty()); 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Observer shouldn't be notified even after a |group()| call. 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(default_group, trial->group()); 8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunLoop().RunUntilIdle(); 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(observer.trial_name().empty()); 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(observer.group_name().empty()); 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FieldTrialTest, DisabledTrialNotActive) { 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kTrialName[] = "DisabledTrial"; 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(FieldTrialList::TrialExists(kTrialName)); 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FieldTrial> trial = 895d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch CreateFieldTrial(kTrialName, 100, kDefaultGroupName, NULL); 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial->AppendGroup("X", 50); 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial->Disable(); 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure the trial is not listed as active. 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrial::ActiveGroups active_groups; 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrialList::GetActiveFieldTrialGroups(&active_groups); 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(active_groups.empty()); 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure the trial is not listed in the |StatesToString()| result. 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string states; 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrialList::StatesToString(&states); 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(states.empty()); 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(FieldTrialTest, ExpirationYearNotExpired) { 9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char kTrialName[] = "NotExpired"; 9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char kGroupName[] = "Group2"; 9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int kProbability = 100; 9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(FieldTrialList::TrialExists(kTrialName)); 9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FieldTrial> trial = 917d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch CreateFieldTrial(kTrialName, kProbability, kDefaultGroupName, NULL); 9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) trial->AppendGroup(kGroupName, kProbability); 9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kGroupName, trial->group_name()); 9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 922d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TEST_F(FieldTrialTest, FloatBoundariesGiveEqualGroupSizes) { 923d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const int kBucketCount = 100; 924d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 925d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Try each boundary value |i / 100.0| as the entropy value. 926d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) for (int i = 0; i < kBucketCount; ++i) { 927d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const double entropy = i / static_cast<double>(kBucketCount); 928d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 929d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_refptr<base::FieldTrial> trial( 930d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) new base::FieldTrial("test", kBucketCount, "default", entropy)); 931d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) for (int j = 0; j < kBucketCount; ++j) 932d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) trial->AppendGroup(base::StringPrintf("%d", j), 1); 933d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 934d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(base::StringPrintf("%d", i), trial->group_name()); 935d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 936d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 937d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 938d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TEST_F(FieldTrialTest, DoesNotSurpassTotalProbability) { 939d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const double kEntropyValue = 1.0 - 1e-9; 940d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ASSERT_LT(kEntropyValue, 1.0); 941d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 942d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_refptr<base::FieldTrial> trial( 943d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) new base::FieldTrial("test", 2, "default", kEntropyValue)); 944d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) trial->AppendGroup("1", 1); 945d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) trial->AppendGroup("2", 1); 946d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 947d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ("2", trial->group_name()); 948d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 949d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 9501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(FieldTrialTest, CreateSimulatedFieldTrial) { 9511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const char kTrialName[] = "CreateSimulatedFieldTrial"; 9521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ASSERT_FALSE(FieldTrialList::TrialExists(kTrialName)); 9531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 9541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Different cases to test, e.g. default vs. non default group being chosen. 9551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) struct { 9561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) double entropy_value; 9571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const char* expected_group; 9581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } test_cases[] = { 9591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) { 0.4, "A" }, 9601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) { 0.85, "B" }, 9611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) { 0.95, kDefaultGroupName }, 9621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) }; 9631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 9641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) { 9651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) TestFieldTrialObserver observer; 9661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_refptr<FieldTrial> trial( 9671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) FieldTrial::CreateSimulatedFieldTrial(kTrialName, 100, kDefaultGroupName, 9681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) test_cases[i].entropy_value)); 9691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) trial->AppendGroup("A", 80); 9701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) trial->AppendGroup("B", 10); 9711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(test_cases[i].expected_group, trial->group_name()); 9721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 9731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Field trial shouldn't have been registered with the list. 9741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_FALSE(FieldTrialList::TrialExists(kTrialName)); 9751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(0u, FieldTrialList::GetFieldTrialCount()); 9761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 9771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Observer shouldn't have been notified. 9781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) RunLoop().RunUntilIdle(); 9791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_TRUE(observer.trial_name().empty()); 9801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 9811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // The trial shouldn't be in the active set of trials. 9821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) FieldTrial::ActiveGroups active_groups; 9831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) FieldTrialList::GetActiveFieldTrialGroups(&active_groups); 9841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_TRUE(active_groups.empty()); 9851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 9861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // The trial shouldn't be listed in the |StatesToString()| result. 9871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::string states; 9881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) FieldTrialList::StatesToString(&states); 9891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_TRUE(states.empty()); 9901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 9911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 9921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base 994