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