blob: 3d8c0e264f5a7fee66a2e043888be3e9ed48d21e [file] [log] [blame]
// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Test of FieldTrial class
#include "base/field_trial.h"
#include "base/logging.h"
#include "testing/gtest/include/gtest/gtest.h"
class FieldTrialTest : public testing::Test {
public:
FieldTrialTest() : trial_list_() { }
~FieldTrialTest() { FieldTrialList::ResetConstructorCountForTestingOnly(); }
private:
FieldTrialList trial_list_;
};
// Test registration, and also check that destructors are called for trials
// (and that Purify doesn't catch us leaking).
TEST_F(FieldTrialTest, Registration) {
const wchar_t* name1 = L"name 1 test";
const wchar_t* name2 = L"name 2 test";
EXPECT_FALSE(FieldTrialList::Find(name1));
EXPECT_FALSE(FieldTrialList::Find(name2));
FieldTrial* trial1 = new FieldTrial(name1, 0.7);
EXPECT_EQ(trial1, FieldTrialList::Find(name1));
EXPECT_FALSE(FieldTrialList::Find(name2));
FieldTrial* trial2 = new FieldTrial(name2, 0.7);
EXPECT_EQ(trial1, FieldTrialList::Find(name1));
EXPECT_EQ(trial2, FieldTrialList::Find(name2));
// Note: FieldTrialList should delete the objects at shutdown.
}
TEST_F(FieldTrialTest, AbsoluteProbabilities) {
wchar_t always_true[] = L" always true";
wchar_t always_false[] = L" always false";
for (int i = 1; i < 250; ++i) {
// Try lots of names, by changing the first character of the name.
always_true[0] = i;
always_false[0] = i;
FieldTrial* trial_true = new FieldTrial(always_true, 1.0);
EXPECT_TRUE(trial_true->boolean_value());
FieldTrial* trial_false = new FieldTrial(always_false, 0.0);
EXPECT_FALSE(trial_false->boolean_value());
}
}
TEST_F(FieldTrialTest, MiddleProbabalities) {
wchar_t name[] = L" same name";
bool false_event_seen = false;
bool true_event_seen = false;
for (int i = 1; i < 250; ++i) {
name[0] = i;
FieldTrial* trial = new FieldTrial(name, 0.5);
if (trial->boolean_value()) {
true_event_seen = true;
} else {
false_event_seen = true;
}
if (false_event_seen && true_event_seen)
return; // Successful test!!!
}
// Very surprising to get here. Probability should be around 1 in 2 ** 250.
// One of the following will fail.
EXPECT_TRUE(false_event_seen);
EXPECT_TRUE(true_event_seen);
}