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:
parent
76f575074d
commit
b22f077a60
@ -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>;
|
||||
|
||||
@ -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>;
|
||||
|
||||
@ -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}, "");
|
||||
|
||||
@ -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>;
|
||||
|
||||
@ -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>;
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user