| // 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 |