Adds FieldTrialConstrained class.

Bug: webrtc:9346
Change-Id: I8ac232f012cae1d1bd9d862a572aba82bb8ca031
Reviewed-on: https://webrtc-review.googlesource.com/c/111255
Commit-Queue: Sebastian Jansson <srte@webrtc.org>
Reviewed-by: Christoffer Rodbro <crodbro@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#25700}
This commit is contained in:
Sebastian Jansson 2018-11-19 17:44:33 +01:00 committed by Commit Bot
parent 76f575074d
commit b22f077a60
6 changed files with 84 additions and 0 deletions

View File

@ -169,6 +169,9 @@ template class FieldTrialParameter<double>;
template class FieldTrialParameter<int>;
template class FieldTrialParameter<std::string>;
template class FieldTrialConstrained<double>;
template class FieldTrialConstrained<int>;
template class FieldTrialOptional<double>;
template class FieldTrialOptional<int>;
template class FieldTrialOptional<bool>;

View File

@ -92,6 +92,43 @@ class FieldTrialParameter : public FieldTrialParameterInterface {
T value_;
};
// This class uses the ParseTypedParameter function to implement a parameter
// implementation with an enforced default value and a range constraint. Values
// outside the configured range will be ignored.
template <typename T>
class FieldTrialConstrained : public FieldTrialParameterInterface {
public:
FieldTrialConstrained(std::string key,
T default_value,
absl::optional<T> lower_limit,
absl::optional<T> upper_limit)
: FieldTrialParameterInterface(key),
value_(default_value),
lower_limit_(lower_limit),
upper_limit_(upper_limit) {}
T Get() const { return value_; }
operator T() const { return Get(); }
const T* operator->() const { return &value_; }
protected:
bool Parse(absl::optional<std::string> str_value) override {
if (str_value) {
absl::optional<T> value = ParseTypedParameter<T>(*str_value);
if (value && (!lower_limit_ || *value >= *lower_limit_) &&
(!upper_limit_ || *value <= *upper_limit_)) {
value_ = *value;
return true;
}
}
return false;
}
private:
T value_;
absl::optional<T> lower_limit_;
absl::optional<T> upper_limit_;
};
class AbstractFieldTrialEnum : public FieldTrialParameterInterface {
public:
AbstractFieldTrialEnum(std::string key,
@ -191,6 +228,9 @@ extern template class FieldTrialParameter<int>;
// Using the given value as is.
extern template class FieldTrialParameter<std::string>;
extern template class FieldTrialConstrained<double>;
extern template class FieldTrialConstrained<int>;
extern template class FieldTrialOptional<double>;
extern template class FieldTrialOptional<int>;
extern template class FieldTrialOptional<bool>;

View File

@ -99,6 +99,19 @@ TEST(FieldTrialParserTest, IgnoresInvalid) {
EXPECT_EQ(exp.ping.Get(), false);
EXPECT_EQ(exp.hash.Get(), "a80");
}
TEST(FieldTrialParserTest, IgnoresOutOfRange) {
FieldTrialConstrained<double> low("low", 10, absl::nullopt, 100);
FieldTrialConstrained<double> high("high", 10, 5, absl::nullopt);
ParseFieldTrial({&low, &high}, "low:1000,high:0");
EXPECT_EQ(low.Get(), 10);
EXPECT_EQ(high.Get(), 10);
ParseFieldTrial({&low, &high}, "low:inf,high:nan");
EXPECT_EQ(low.Get(), 10);
EXPECT_EQ(high.Get(), 10);
ParseFieldTrial({&low, &high}, "low:20,high:20");
EXPECT_EQ(low.Get(), 20);
EXPECT_EQ(high.Get(), 20);
}
TEST(FieldTrialParserTest, ParsesOptionalParameters) {
FieldTrialOptional<int> max_count("c", absl::nullopt);
ParseFieldTrial({&max_count}, "");

View File

@ -87,6 +87,10 @@ template class FieldTrialParameter<DataRate>;
template class FieldTrialParameter<DataSize>;
template class FieldTrialParameter<TimeDelta>;
template class FieldTrialConstrained<DataRate>;
template class FieldTrialConstrained<DataSize>;
template class FieldTrialConstrained<TimeDelta>;
template class FieldTrialOptional<DataRate>;
template class FieldTrialOptional<DataSize>;
template class FieldTrialOptional<TimeDelta>;

View File

@ -21,6 +21,10 @@ extern template class FieldTrialParameter<DataRate>;
extern template class FieldTrialParameter<DataSize>;
extern template class FieldTrialParameter<TimeDelta>;
extern template class FieldTrialConstrained<DataRate>;
extern template class FieldTrialConstrained<DataSize>;
extern template class FieldTrialConstrained<TimeDelta>;
extern template class FieldTrialOptional<DataRate>;
extern template class FieldTrialOptional<DataSize>;
extern template class FieldTrialOptional<TimeDelta>;

View File

@ -58,5 +58,25 @@ TEST(FieldTrialParserUnitsTest, ParsesOtherUnitParameters) {
EXPECT_EQ(*exp.max_buffer.GetOptional(), DataSize::bytes(8));
EXPECT_EQ(exp.period.Get(), TimeDelta::ms(300));
}
TEST(FieldTrialParserUnitsTest, IgnoresOutOfRange) {
FieldTrialConstrained<DataRate> rate("r", DataRate::kbps(30),
DataRate::kbps(10), DataRate::kbps(100));
FieldTrialConstrained<TimeDelta> delta("d", TimeDelta::ms(30),
TimeDelta::ms(10), TimeDelta::ms(100));
FieldTrialConstrained<DataSize> size(
"s", DataSize::bytes(30), DataSize::bytes(10), DataSize::bytes(100));
ParseFieldTrial({&rate, &delta, &size}, "r:0,d:0,s:0");
EXPECT_EQ(rate->kbps(), 30);
EXPECT_EQ(delta->ms(), 30);
EXPECT_EQ(size->bytes(), 30);
ParseFieldTrial({&rate, &delta, &size}, "r:300,d:300,s:300");
EXPECT_EQ(rate->kbps(), 30);
EXPECT_EQ(delta->ms(), 30);
EXPECT_EQ(size->bytes(), 30);
ParseFieldTrial({&rate, &delta, &size}, "r:50,d:50,s:50");
EXPECT_EQ(rate->kbps(), 50);
EXPECT_EQ(delta->ms(), 50);
EXPECT_EQ(size->bytes(), 50);
}
} // namespace webrtc