blob: 813c90408907d2962cd1fc0c4665b3ffb3bc63ca [file] [log] [blame]
// Copyright 2020 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.
#include "media/base/tuneable.h"
#include "base/strings/string_number_conversions.h"
#include "base/test/scoped_feature_list.h"
#include "media/base/media_switches.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace media {
class TuneableTest : public ::testing::Test {
public:
TuneableTest() = default;
void SetUp() override {
// Note that we might need to call value() to cache `tuneable_cached_` here.
// We don't currently, since it's not needed.
// Set everything else to non-default values. We do this because we can't
// do it in the tests without it doing odd things.
// params[kTuneableIntSetToNot123] = "124"; // Not 123.
// params[kTuneableInt0] = "0";
// params[kTuneableInt5] = "5";
// params[kTuneableInt10] = "10";
// Set some tuneables to fixed values.
SetFinchParameters(kTuneableIntSetToNot123, 124);
SetFinchParameters(kTuneableInt0, 0);
SetFinchParameters(kTuneableInt5, 5);
SetFinchParameters(kTuneableInt10, 100);
// TimeDelta should be given in milliseconds.
SetFinchParameters(kTuneableTimeDeltaFiveSeconds, 5000);
scoped_feature_list_.InitAndEnableFeatureWithParameters(kMediaOptimizer,
params_);
}
// Set the finch-chosen parameters for tuneable `name`.
void SetFinchParameters(const char* name, int value) {
params_[name] = base::NumberToString(value);
}
// Return the tuneable name for the `x`-th numbered tuneable.
std::string GetNameForNumberedTuneable(const char* basename, int x) {
std::string name(basename);
name[0] = "0123456789ABCDEF"[x & 15];
name[1] = "0123456789ABCDEF"[(x >> 4) & 15];
return name;
}
base::test::ScopedFeatureList scoped_feature_list_;
base::FieldTrialParams params_;
// Params will set this to not 123. We default it to 123 before Setup runs,
// so we make sure that it uses the hardcoded defaults properly.
static constexpr const char* kTuneableIntSetToNot123 = "t_int_not_123";
Tuneable<int> tuneable_cached_{kTuneableIntSetToNot123, 0, 123, 200};
static constexpr const char* kTuneableIntUnset = "t_int_unset";
static constexpr const char* kTuneableInt0 = "t_int_0";
static constexpr const char* kTuneableInt5 = "t_int_5";
static constexpr const char* kTuneableInt10 = "t_int_10";
static constexpr const char* kTuneableTimeDeltaFiveSeconds = "t_time_5s";
DISALLOW_COPY_AND_ASSIGN(TuneableTest);
};
TEST_F(TuneableTest, IntTuneableCached) {
// Verify that `tuneable_cached_` is, in fact, 123 even though the params try
// to set it to something else. This kind of, sort of, guarantees that it's
// cached properly.
EXPECT_EQ(tuneable_cached_.value(), 123);
}
TEST_F(TuneableTest, IntTuneableFromDefaultWithClamps) {
// The default value should be used, and correctly clamped.
constexpr int min_value = 0;
constexpr int default_value = 4;
constexpr int max_value = 10;
Tuneable<int> t_min(kTuneableIntUnset, min_value, min_value - 1, max_value);
EXPECT_EQ(t_min.value(), min_value);
Tuneable<int> t_default(kTuneableIntUnset, min_value, default_value,
max_value);
EXPECT_EQ(t_default.value(), default_value);
Tuneable<int> t_max(kTuneableIntUnset, min_value, max_value + 1, max_value);
EXPECT_EQ(t_max.value(), max_value);
}
TEST_F(TuneableTest, IntTuneableFromParams) {
// Verify that params override the defaults, and are clamped correctly.
constexpr int min_value = 1;
constexpr int default_value = 4; // That's not the same as the param.
constexpr int max_value = 9;
Tuneable<int> t_min(kTuneableInt0, min_value, default_value, max_value);
EXPECT_EQ(t_min.value(), min_value);
Tuneable<int> t_param(kTuneableInt5, min_value, default_value, max_value);
EXPECT_EQ(t_param.value(), 5);
Tuneable<int> t_max(kTuneableInt10, min_value, default_value, max_value);
EXPECT_EQ(t_max.value(), max_value);
}
TEST_F(TuneableTest, OtherSpecializationsCompile) {
// Since it's all templated, just be happy if it compiles and does something
// somewhat sane.
constexpr base::TimeDelta min_value = base::Seconds(0);
constexpr base::TimeDelta default_value = base::Seconds(5);
constexpr base::TimeDelta max_value = base::Seconds(10);
Tuneable<base::TimeDelta> time_delta_tuneable("whatever", min_value,
default_value, max_value);
// Since the tuneable is not provided in the finch parameters, it should
// equal the default.
EXPECT_EQ(time_delta_tuneable.value(), default_value);
Tuneable<size_t> size_t_tuneable("whatever_else", 0u, 100u, 500u);
EXPECT_EQ(size_t_tuneable.value(), 100u);
}
TEST_F(TuneableTest, TimeDeltaIsSpecifiedInMilliseconds) {
// Since the finch params are constructed with the assumption that the value
// will be interpreted as milliseconds, make sure that the Tuneable actually
// does interpret it that way.
constexpr base::TimeDelta min_value = base::Seconds(0);
constexpr base::TimeDelta max_value = base::Seconds(100);
Tuneable<base::TimeDelta> t(kTuneableTimeDeltaFiveSeconds, min_value,
min_value, max_value);
EXPECT_EQ(t.value(), base::Seconds(5));
}
} // namespace media