blob: 2b4f1a9173580cff59a7ec68f00fe0dffd69d0b3 [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/miracle_parameter/common/public/miracle_parameter.h"
#include "base/command_line.h"
#include "base/feature_list.h"
#include "base/metrics/field_trial.h"
#include "base/metrics/field_trial_param_associator.h"
#include "base/test/mock_entropy_provider.h"
#include "base/test/scoped_amount_of_physical_memory_override.h"
#include "base/test/scoped_feature_list.h"
#include "base/time/time.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace miracle_parameter {
namespace {
// Call FieldTrialList::FactoryGetFieldTrial().
scoped_refptr<base::FieldTrial> CreateFieldTrial(
const std::string& trial_name,
int total_probability,
const std::string& default_group_name) {
base::MockEntropyProvider entropy_provider(0.9);
return base::FieldTrialList::FactoryGetFieldTrial(
trial_name, total_probability, default_group_name, entropy_provider);
}
const std::string BoolToString(bool value) {
return value ? "true" : "false";
}
class ScopedNullCommandLineOverride {
public:
ScopedNullCommandLineOverride()
: process_args_(base::CommandLine::ForCurrentProcess()->GetArgs()) {
base::CommandLine::Reset();
}
ScopedNullCommandLineOverride(const ScopedNullCommandLineOverride&) = delete;
ScopedNullCommandLineOverride& operator=(
const ScopedNullCommandLineOverride&) = delete;
~ScopedNullCommandLineOverride() {
base::CommandLine::Init(0, nullptr);
base::CommandLine::ForCurrentProcess()->InitFromArgv(process_args_);
}
private:
const base::CommandLine::StringVector process_args_;
};
} // namespace
class MiracleParameterTest : public ::testing::Test {
public:
MiracleParameterTest() = default;
MiracleParameterTest(const MiracleParameterTest&) = delete;
MiracleParameterTest& operator=(const MiracleParameterTest&) = delete;
~MiracleParameterTest() override {
// Ensure that the maps are cleared between tests, since they are stored as
// process singletons.
base::FieldTrialParamAssociator::GetInstance()->ClearAllParamsForTesting();
}
void CreateFeatureWithTrial(const base::Feature& feature,
base::FeatureList::OverrideState override_state,
base::FieldTrial* trial) {
auto feature_list = std::make_unique<base::FeatureList>();
feature_list->RegisterFieldTrialOverride(feature.name, override_state,
trial);
scoped_feature_list_.InitWithFeatureList(std::move(feature_list));
}
private:
base::test::ScopedFeatureList scoped_feature_list_;
};
TEST_F(MiracleParameterTest, MiracleParameterForString) {
const char kAForLessThan512MB[] = "a-value-for-less-than-512mb";
const char kAFor512MBTo1GB[] = "a-value-for-512mb-to-1gb";
const char kAFor1GBTo2GB[] = "a-value-for-1gb-to-2gb";
const char kAFor2GBTo4GB[] = "a-value-for-2gb-to-4gb";
const char kAFor4GBTo8GB[] = "a-value-for-4gb-to-8gb";
const char kAFor8GBTo16GB[] = "a-value-for-8gb-to-16gb";
const char kAFor16GBAndAbove[] = "a-value-for-16gb-and-above";
const char kAParamValue[] = "a-param-value";
const char kCParamValue[] = "c-param-value";
const char kADefault[] = "default-for-a";
const char kBDefault[] = "default-for-b";
const char kCDefault[] = "default-for-c";
// Set up the field trial params.
const std::string kTrialName = "TrialName";
std::map<std::string, std::string> params;
params["aForLessThan512MB"] = kAForLessThan512MB;
params["aFor512MBTo1GB"] = kAFor512MBTo1GB;
params["aFor1GBTo2GB"] = kAFor1GBTo2GB;
params["aFor2GBTo4GB"] = kAFor2GBTo4GB;
params["aFor4GBTo8GB"] = kAFor4GBTo8GB;
params["aFor8GBTo16GB"] = kAFor8GBTo16GB;
params["aFor16GBAndAbove"] = kAFor16GBAndAbove;
params["a"] = kAParamValue;
params["c"] = kCParamValue;
base::AssociateFieldTrialParams(kTrialName, "A", params);
scoped_refptr<base::FieldTrial> trial(CreateFieldTrial(
kTrialName, /*total_probability=*/100, /*default_group_name=*/"A"));
static BASE_FEATURE(kFeature, "TestFeature",
base::FEATURE_ENABLED_BY_DEFAULT);
CreateFeatureWithTrial(kFeature, base::FeatureList::OVERRIDE_ENABLE_FEATURE,
trial.get());
auto GetParamA = [&]() {
return GetMiracleParameterAsString(kFeature, "a", kADefault);
};
auto GetParamB = [&]() {
return GetMiracleParameterAsString(kFeature, "b", kBDefault);
};
auto GetParamC = [&]() {
return GetMiracleParameterAsString(kFeature, "c", kCDefault);
};
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory512MB - 1);
EXPECT_EQ(kAForLessThan512MB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory512MB);
EXPECT_EQ(kAFor512MBTo1GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory1GB - 1);
EXPECT_EQ(kAFor512MBTo1GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory1GB);
EXPECT_EQ(kAFor1GBTo2GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory2GB - 1);
EXPECT_EQ(kAFor1GBTo2GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory2GB);
EXPECT_EQ(kAFor2GBTo4GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory4GB - 1);
EXPECT_EQ(kAFor2GBTo4GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory4GB);
EXPECT_EQ(kAFor4GBTo8GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory8GB - 1);
EXPECT_EQ(kAFor4GBTo8GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory8GB);
EXPECT_EQ(kAFor8GBTo16GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory16GB - 1);
EXPECT_EQ(kAFor8GBTo16GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory16GB);
EXPECT_EQ(kAFor16GBAndAbove, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
ScopedNullCommandLineOverride null_command_line_override;
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory16GB);
EXPECT_EQ(kAParamValue, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
}
TEST_F(MiracleParameterTest, MiracleParameterForDouble) {
const double kAForLessThan512MB = 0.1;
const double kAFor512MBTo1GB = 0.2;
const double kAFor1GBTo2GB = 0.3;
const double kAFor2GBTo4GB = 0.4;
const double kAFor4GBTo8GB = 0.5;
const double kAFor8GBTo16GB = 0.6;
const double kAFor16GBAndAbove = 0.7;
const double kAParamValue = 0.8;
const double kCParamValue = 0.9;
const double kADefault = 1.0;
const double kBDefault = 1.1;
const double kCDefault = 1.2;
// Set up the field trial params.
const std::string kTrialName = "TrialName";
std::map<std::string, std::string> params;
params["aForLessThan512MB"] = base::ToString(kAForLessThan512MB);
params["aFor512MBTo1GB"] = base::ToString(kAFor512MBTo1GB);
params["aFor1GBTo2GB"] = base::ToString(kAFor1GBTo2GB);
params["aFor2GBTo4GB"] = base::ToString(kAFor2GBTo4GB);
params["aFor4GBTo8GB"] = base::ToString(kAFor4GBTo8GB);
params["aFor8GBTo16GB"] = base::ToString(kAFor8GBTo16GB);
params["aFor16GBAndAbove"] = base::ToString(kAFor16GBAndAbove);
params["a"] = base::ToString(kAParamValue);
params["c"] = base::ToString(kCParamValue);
base::AssociateFieldTrialParams(kTrialName, "A", params);
scoped_refptr<base::FieldTrial> trial(CreateFieldTrial(
kTrialName, /*total_probability=*/100, /*default_group_name=*/"A"));
static BASE_FEATURE(kFeature, "TestFeature",
base::FEATURE_ENABLED_BY_DEFAULT);
CreateFeatureWithTrial(kFeature, base::FeatureList::OVERRIDE_ENABLE_FEATURE,
trial.get());
auto GetParamA = [&]() {
return GetMiracleParameterAsDouble(kFeature, "a", kADefault);
};
auto GetParamB = [&]() {
return GetMiracleParameterAsDouble(kFeature, "b", kBDefault);
};
auto GetParamC = [&]() {
return GetMiracleParameterAsDouble(kFeature, "c", kCDefault);
};
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory512MB - 1);
EXPECT_EQ(kAForLessThan512MB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory512MB);
EXPECT_EQ(kAFor512MBTo1GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory1GB - 1);
EXPECT_EQ(kAFor512MBTo1GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory1GB);
EXPECT_EQ(kAFor1GBTo2GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory2GB - 1);
EXPECT_EQ(kAFor1GBTo2GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory2GB);
EXPECT_EQ(kAFor2GBTo4GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory4GB - 1);
EXPECT_EQ(kAFor2GBTo4GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory4GB);
EXPECT_EQ(kAFor4GBTo8GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory8GB - 1);
EXPECT_EQ(kAFor4GBTo8GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory8GB);
EXPECT_EQ(kAFor8GBTo16GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory16GB - 1);
EXPECT_EQ(kAFor8GBTo16GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory16GB);
EXPECT_EQ(kAFor16GBAndAbove, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
ScopedNullCommandLineOverride null_command_line_override;
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory16GB);
EXPECT_EQ(kAParamValue, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
}
TEST_F(MiracleParameterTest, MiracleParameterForInt) {
const int kAForLessThan512MB = 1;
const int kAFor512MBTo1GB = 2;
const int kAFor1GBTo2GB = 3;
const int kAFor2GBTo4GB = 4;
const int kAFor4GBTo8GB = 5;
const int kAFor8GBTo16GB = 6;
const int kAFor16GBAndAbove = 7;
const int kAParamValue = 8;
const int kCParamValue = 9;
const int kADefault = 10;
const int kBDefault = 11;
const int kCDefault = 12;
// Set up the field trial params.
const std::string kTrialName = "TrialName";
std::map<std::string, std::string> params;
params["aForLessThan512MB"] = base::ToString(kAForLessThan512MB);
params["aFor512MBTo1GB"] = base::ToString(kAFor512MBTo1GB);
params["aFor1GBTo2GB"] = base::ToString(kAFor1GBTo2GB);
params["aFor2GBTo4GB"] = base::ToString(kAFor2GBTo4GB);
params["aFor4GBTo8GB"] = base::ToString(kAFor4GBTo8GB);
params["aFor8GBTo16GB"] = base::ToString(kAFor8GBTo16GB);
params["aFor16GBAndAbove"] = base::ToString(kAFor16GBAndAbove);
params["a"] = base::ToString(kAParamValue);
params["c"] = base::ToString(kCParamValue);
base::AssociateFieldTrialParams(kTrialName, "A", params);
scoped_refptr<base::FieldTrial> trial(CreateFieldTrial(
kTrialName, /*total_probability=*/100, /*default_group_name=*/"A"));
static BASE_FEATURE(kFeature, "TestFeature",
base::FEATURE_ENABLED_BY_DEFAULT);
CreateFeatureWithTrial(kFeature, base::FeatureList::OVERRIDE_ENABLE_FEATURE,
trial.get());
auto GetParamA = [&]() {
return GetMiracleParameterAsInt(kFeature, "a", kADefault);
};
auto GetParamB = [&]() {
return GetMiracleParameterAsInt(kFeature, "b", kBDefault);
};
auto GetParamC = [&]() {
return GetMiracleParameterAsInt(kFeature, "c", kCDefault);
};
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory512MB - 1);
EXPECT_EQ(kAForLessThan512MB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory512MB);
EXPECT_EQ(kAFor512MBTo1GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory1GB - 1);
EXPECT_EQ(kAFor512MBTo1GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory1GB);
EXPECT_EQ(kAFor1GBTo2GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory2GB - 1);
EXPECT_EQ(kAFor1GBTo2GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory2GB);
EXPECT_EQ(kAFor2GBTo4GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory4GB - 1);
EXPECT_EQ(kAFor2GBTo4GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory4GB);
EXPECT_EQ(kAFor4GBTo8GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory8GB - 1);
EXPECT_EQ(kAFor4GBTo8GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory8GB);
EXPECT_EQ(kAFor8GBTo16GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory16GB - 1);
EXPECT_EQ(kAFor8GBTo16GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory16GB);
EXPECT_EQ(kAFor16GBAndAbove, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
ScopedNullCommandLineOverride null_command_line_override;
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory16GB);
EXPECT_EQ(kAParamValue, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
}
TEST_F(MiracleParameterTest, MiracleParameterForBool) {
const bool kAForLessThan512MB = true;
const bool kAFor512MBTo1GB = false;
const bool kAFor1GBTo2GB = true;
const bool kAFor2GBTo4GB = false;
const bool kAFor4GBTo8GB = true;
const bool kAFor8GBTo16GB = false;
const bool kAFor16GBAndAbove = true;
const bool kAParamValue = false;
const bool kCParamValue = true;
const bool kADefault = false;
const bool kBDefault = true;
const bool kCDefault = false;
// Set up the field trial params.
const std::string kTrialName = "TrialName";
std::map<std::string, std::string> params;
params["aForLessThan512MB"] = BoolToString(kAForLessThan512MB);
params["aFor512MBTo1GB"] = BoolToString(kAFor512MBTo1GB);
params["aFor1GBTo2GB"] = BoolToString(kAFor1GBTo2GB);
params["aFor2GBTo4GB"] = BoolToString(kAFor2GBTo4GB);
params["aFor4GBTo8GB"] = BoolToString(kAFor4GBTo8GB);
params["aFor8GBTo16GB"] = BoolToString(kAFor8GBTo16GB);
params["aFor16GBAndAbove"] = BoolToString(kAFor16GBAndAbove);
params["a"] = BoolToString(kAParamValue);
params["c"] = BoolToString(kCParamValue);
base::AssociateFieldTrialParams(kTrialName, "A", params);
scoped_refptr<base::FieldTrial> trial(CreateFieldTrial(
kTrialName, /*total_probability=*/100, /*default_group_name=*/"A"));
static BASE_FEATURE(kFeature, "TestFeature",
base::FEATURE_ENABLED_BY_DEFAULT);
CreateFeatureWithTrial(kFeature, base::FeatureList::OVERRIDE_ENABLE_FEATURE,
trial.get());
auto GetParamA = [&]() {
return GetMiracleParameterAsBool(kFeature, "a", kADefault);
};
auto GetParamB = [&]() {
return GetMiracleParameterAsBool(kFeature, "b", kBDefault);
};
auto GetParamC = [&]() {
return GetMiracleParameterAsBool(kFeature, "c", kCDefault);
};
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory512MB - 1);
EXPECT_EQ(kAForLessThan512MB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory512MB);
EXPECT_EQ(kAFor512MBTo1GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory1GB - 1);
EXPECT_EQ(kAFor512MBTo1GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory1GB);
EXPECT_EQ(kAFor1GBTo2GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory2GB - 1);
EXPECT_EQ(kAFor1GBTo2GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory2GB);
EXPECT_EQ(kAFor2GBTo4GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory4GB - 1);
EXPECT_EQ(kAFor2GBTo4GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory4GB);
EXPECT_EQ(kAFor4GBTo8GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory8GB - 1);
EXPECT_EQ(kAFor4GBTo8GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory8GB);
EXPECT_EQ(kAFor8GBTo16GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory16GB - 1);
EXPECT_EQ(kAFor8GBTo16GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory16GB);
EXPECT_EQ(kAFor16GBAndAbove, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
ScopedNullCommandLineOverride null_command_line_override;
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory16GB);
EXPECT_EQ(kAParamValue, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
}
TEST_F(MiracleParameterTest, MiracleParameterForTimeDelta) {
const base::TimeDelta kAForLessThan512MB = base::Seconds(1);
const base::TimeDelta kAFor512MBTo1GB = base::Seconds(2);
const base::TimeDelta kAFor1GBTo2GB = base::Seconds(3);
const base::TimeDelta kAFor2GBTo4GB = base::Seconds(4);
const base::TimeDelta kAFor4GBTo8GB = base::Seconds(5);
const base::TimeDelta kAFor8GBTo16GB = base::Seconds(6);
const base::TimeDelta kAFor16GBAndAbove = base::Seconds(7);
const base::TimeDelta kAParamValue = base::Seconds(8);
const base::TimeDelta kCParamValue = base::Seconds(9);
const base::TimeDelta kADefault = base::Seconds(10);
const base::TimeDelta kBDefault = base::Seconds(11);
const base::TimeDelta kCDefault = base::Seconds(12);
// Set up the field trial params.
const std::string kTrialName = "TrialName";
std::map<std::string, std::string> params;
params["aForLessThan512MB"] = "1s";
params["aFor512MBTo1GB"] = "2s";
params["aFor1GBTo2GB"] = "3s";
params["aFor2GBTo4GB"] = "4s";
params["aFor4GBTo8GB"] = "5s";
params["aFor8GBTo16GB"] = "6s";
params["aFor16GBAndAbove"] = "7s";
params["a"] = "8s";
params["c"] = "9s";
base::AssociateFieldTrialParams(kTrialName, "A", params);
scoped_refptr<base::FieldTrial> trial(CreateFieldTrial(
kTrialName, /*total_probability=*/100, /*default_group_name=*/"A"));
static BASE_FEATURE(kFeature, "TestFeature",
base::FEATURE_ENABLED_BY_DEFAULT);
CreateFeatureWithTrial(kFeature, base::FeatureList::OVERRIDE_ENABLE_FEATURE,
trial.get());
auto GetParamA = [&]() {
return GetMiracleParameterAsTimeDelta(kFeature, "a", kADefault);
};
auto GetParamB = [&]() {
return GetMiracleParameterAsTimeDelta(kFeature, "b", kBDefault);
};
auto GetParamC = [&]() {
return GetMiracleParameterAsTimeDelta(kFeature, "c", kCDefault);
};
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory512MB - 1);
EXPECT_EQ(kAForLessThan512MB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory512MB);
EXPECT_EQ(kAFor512MBTo1GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory1GB - 1);
EXPECT_EQ(kAFor512MBTo1GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory1GB);
EXPECT_EQ(kAFor1GBTo2GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory2GB - 1);
EXPECT_EQ(kAFor1GBTo2GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory2GB);
EXPECT_EQ(kAFor2GBTo4GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory4GB - 1);
EXPECT_EQ(kAFor2GBTo4GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory4GB);
EXPECT_EQ(kAFor4GBTo8GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory8GB - 1);
EXPECT_EQ(kAFor4GBTo8GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory8GB);
EXPECT_EQ(kAFor8GBTo16GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory16GB - 1);
EXPECT_EQ(kAFor8GBTo16GB, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory16GB);
EXPECT_EQ(kAFor16GBAndAbove, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
{
ScopedNullCommandLineOverride null_command_line_override;
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory16GB);
EXPECT_EQ(kAParamValue, GetParamA());
EXPECT_EQ(kBDefault, GetParamB());
EXPECT_EQ(kCParamValue, GetParamC());
}
}
TEST_F(MiracleParameterTest, MiracleParameterForEnum) {
enum class ParamEnum {
kAForLessThan512MB,
kAFor512MBTo1GB,
kAFor1GBTo2GB,
kAFor2GBTo4GB,
kAFor4GBTo8GB,
kAFor8GBTo16GB,
kAFor16GBAndAbove,
kAParamValue,
kCParamValue,
kADefault,
kBDefault,
kCDefault,
};
static const base::FeatureParam<ParamEnum>::Option param_enums[] = {
{ParamEnum::kAForLessThan512MB, "a-value-for-less-than-512mb"},
{ParamEnum::kAFor512MBTo1GB, "a-value-for-512mb-to-1gb"},
{ParamEnum::kAFor1GBTo2GB, "a-value-for-1gb-to-2gb"},
{ParamEnum::kAFor2GBTo4GB, "a-value-for-2gb-to-4gb"},
{ParamEnum::kAFor4GBTo8GB, "a-value-for-4gb-to-8gb"},
{ParamEnum::kAFor8GBTo16GB, "a-value-for-8gb-to-16gb"},
{ParamEnum::kAFor16GBAndAbove, "a-value-for-16gb-and-above"},
{ParamEnum::kAParamValue, "a-param-value"},
{ParamEnum::kCParamValue, "c-param-value"},
{ParamEnum::kADefault, "default-for-a"},
{ParamEnum::kBDefault, "default-for-b"},
{ParamEnum::kCDefault, "default-for-c"},
};
// Set up the field trial params.
const std::string kTrialName = "TrialName";
std::map<std::string, std::string> params;
params["aForLessThan512MB"] = "a-value-for-less-than-512mb";
params["aFor512MBTo1GB"] = "a-value-for-512mb-to-1gb";
params["aFor1GBTo2GB"] = "a-value-for-1gb-to-2gb";
params["aFor2GBTo4GB"] = "a-value-for-2gb-to-4gb";
params["aFor4GBTo8GB"] = "a-value-for-4gb-to-8gb";
params["aFor8GBTo16GB"] = "a-value-for-8gb-to-16gb";
params["aFor16GBAndAbove"] = "a-value-for-16gb-and-above";
params["a"] = "a-param-value";
params["c"] = "c-param-value";
base::AssociateFieldTrialParams(kTrialName, "A", params);
scoped_refptr<base::FieldTrial> trial(CreateFieldTrial(
kTrialName, /*total_probability=*/100, /*default_group_name=*/"A"));
static BASE_FEATURE(kFeature, "TestFeature",
base::FEATURE_ENABLED_BY_DEFAULT);
CreateFeatureWithTrial(kFeature, base::FeatureList::OVERRIDE_ENABLE_FEATURE,
trial.get());
auto GetParamA = [&]() {
return GetMiracleParameterAsEnum(kFeature, "a", ParamEnum::kADefault,
base::make_span(param_enums));
};
auto GetParamB = [&]() {
return GetMiracleParameterAsEnum(kFeature, "b", ParamEnum::kBDefault,
base::make_span(param_enums));
};
auto GetParamC = [&]() {
return GetMiracleParameterAsEnum(kFeature, "c", ParamEnum::kCDefault,
base::make_span(param_enums));
};
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory512MB - 1);
EXPECT_EQ(ParamEnum::kAForLessThan512MB, GetParamA());
EXPECT_EQ(ParamEnum::kBDefault, GetParamB());
EXPECT_EQ(ParamEnum::kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory512MB);
EXPECT_EQ(ParamEnum::kAFor512MBTo1GB, GetParamA());
EXPECT_EQ(ParamEnum::kBDefault, GetParamB());
EXPECT_EQ(ParamEnum::kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory1GB - 1);
EXPECT_EQ(ParamEnum::kAFor512MBTo1GB, GetParamA());
EXPECT_EQ(ParamEnum::kBDefault, GetParamB());
EXPECT_EQ(ParamEnum::kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory1GB);
EXPECT_EQ(ParamEnum::kAFor1GBTo2GB, GetParamA());
EXPECT_EQ(ParamEnum::kBDefault, GetParamB());
EXPECT_EQ(ParamEnum::kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory2GB - 1);
EXPECT_EQ(ParamEnum::kAFor1GBTo2GB, GetParamA());
EXPECT_EQ(ParamEnum::kBDefault, GetParamB());
EXPECT_EQ(ParamEnum::kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory2GB);
EXPECT_EQ(ParamEnum::kAFor2GBTo4GB, GetParamA());
EXPECT_EQ(ParamEnum::kBDefault, GetParamB());
EXPECT_EQ(ParamEnum::kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory4GB - 1);
EXPECT_EQ(ParamEnum::kAFor2GBTo4GB, GetParamA());
EXPECT_EQ(ParamEnum::kBDefault, GetParamB());
EXPECT_EQ(ParamEnum::kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory4GB);
EXPECT_EQ(ParamEnum::kAFor4GBTo8GB, GetParamA());
EXPECT_EQ(ParamEnum::kBDefault, GetParamB());
EXPECT_EQ(ParamEnum::kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory8GB - 1);
EXPECT_EQ(ParamEnum::kAFor4GBTo8GB, GetParamA());
EXPECT_EQ(ParamEnum::kBDefault, GetParamB());
EXPECT_EQ(ParamEnum::kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory8GB);
EXPECT_EQ(ParamEnum::kAFor8GBTo16GB, GetParamA());
EXPECT_EQ(ParamEnum::kBDefault, GetParamB());
EXPECT_EQ(ParamEnum::kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory16GB - 1);
EXPECT_EQ(ParamEnum::kAFor8GBTo16GB, GetParamA());
EXPECT_EQ(ParamEnum::kBDefault, GetParamB());
EXPECT_EQ(ParamEnum::kCParamValue, GetParamC());
}
{
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory16GB);
EXPECT_EQ(ParamEnum::kAFor16GBAndAbove, GetParamA());
EXPECT_EQ(ParamEnum::kBDefault, GetParamB());
EXPECT_EQ(ParamEnum::kCParamValue, GetParamC());
}
{
ScopedNullCommandLineOverride null_command_line_override;
base::test::ScopedAmountOfPhysicalMemoryOverride memory_override(
kMiracleParameterMemory16GB);
EXPECT_EQ(ParamEnum::kAParamValue, GetParamA());
EXPECT_EQ(ParamEnum::kBDefault, GetParamB());
EXPECT_EQ(ParamEnum::kCParamValue, GetParamC());
}
}
} // namespace miracle_parameter