WebRTC-DeprecateGlobalFieldTrialString/Enabled/ - part 18/inf

This cl/ creates a constructor for a FieldTrials object that is
not backed by the global string. Use with care!

Bug: webrtc:10335
Change-Id: I8c48d1e8bb52fef78524d890cc90473355be617f
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/264461
Commit-Queue: Jonas Oreland <jonaso@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#37057}
This commit is contained in:
Jonas Oreland 2022-05-31 11:15:19 +02:00 committed by WebRTC LUCI CQ
parent 61dbcd115a
commit f096e74157
3 changed files with 57 additions and 4 deletions

View file

@ -63,7 +63,8 @@ std::atomic<bool> instance_created_{false};
namespace webrtc {
FieldTrials::FieldTrials(const std::string& s)
: field_trial_string_(s),
: uses_global_(true),
field_trial_string_(s),
previous_field_trial_string_(webrtc::field_trial::GetFieldTrialString()),
key_value_map_(InsertIntoMap(s)) {
// TODO(bugs.webrtc.org/10335): Remove the global string!
@ -72,10 +73,21 @@ FieldTrials::FieldTrials(const std::string& s)
<< "Only one instance may be instanciated at any given time!";
}
std::unique_ptr<FieldTrials> FieldTrials::CreateNoGlobal(const std::string& s) {
return std::unique_ptr<FieldTrials>(new FieldTrials(s, true));
}
FieldTrials::FieldTrials(const std::string& s, bool)
: uses_global_(false),
previous_field_trial_string_(nullptr),
key_value_map_(InsertIntoMap(s)) {}
FieldTrials::~FieldTrials() {
// TODO(bugs.webrtc.org/10335): Remove the global string!
field_trial::InitFieldTrialsFromString(previous_field_trial_string_);
RTC_CHECK(instance_created_.exchange(false));
if (uses_global_) {
field_trial::InitFieldTrialsFromString(previous_field_trial_string_);
RTC_CHECK(instance_created_.exchange(false));
}
}
std::string FieldTrials::Lookup(absl::string_view key) const {
@ -86,7 +98,10 @@ std::string FieldTrials::Lookup(absl::string_view key) const {
// Check the global string so that programs using
// a mix between FieldTrials and the global string continue to work
// TODO(bugs.webrtc.org/10335): Remove the global string!
return field_trial::FindFullName(std::string(key));
if (uses_global_) {
return field_trial::FindFullName(std::string(key));
}
return "";
}
} // namespace webrtc

View file

@ -11,6 +11,7 @@
#ifndef API_FIELD_TRIALS_H_
#define API_FIELD_TRIALS_H_
#include <memory>
#include <string>
#include "absl/strings/string_view.h"
@ -32,14 +33,21 @@ namespace webrtc {
//
// NOTE: Creating multiple FieldTrials-object is currently prohibited
// until we remove the global string (TODO(bugs.webrtc.org/10335))
// (unless using CreateNoGlobal):
class FieldTrials : public FieldTrialsView {
public:
explicit FieldTrials(const std::string& s);
~FieldTrials();
// Create a FieldTrials object that is not reading/writing from
// global variable (i.e can not be used for all parts of webrtc).
static std::unique_ptr<FieldTrials> CreateNoGlobal(const std::string& s);
std::string Lookup(absl::string_view key) const override;
private:
explicit FieldTrials(const std::string& s, bool);
const bool uses_global_;
const std::string field_trial_string_;
const char* const previous_field_trial_string_;
const flat_map<std::string, std::string> key_value_map_;

View file

@ -70,4 +70,34 @@ TEST(FieldTrials, SequentialInstances) {
{ FieldTrials f("SomeOtherString/Enabled/"); }
}
TEST(FieldTrials, NoGlobals) {
auto f1 = FieldTrials::CreateNoGlobal("SomeString/Enabled/");
EXPECT_TRUE(f1);
}
TEST(FieldTrials, SeveralNoGlobals) {
auto f1 = FieldTrials::CreateNoGlobal("SomeString/Enabled/");
auto f2 = FieldTrials::CreateNoGlobal("SomeOtherString/Enabled/");
ASSERT_TRUE(f1);
ASSERT_TRUE(f2);
EXPECT_TRUE(f1->IsEnabled("SomeString"));
EXPECT_FALSE(f1->IsEnabled("SomeOtherString"));
EXPECT_FALSE(f2->IsEnabled("SomeString"));
EXPECT_TRUE(f2->IsEnabled("SomeOtherString"));
}
TEST(FieldTrials, GlobalAndNoGlobals) {
FieldTrials f0("SomeString/Enabled/");
auto f1 = FieldTrials::CreateNoGlobal("SomeOtherString/Enabled/");
ASSERT_TRUE(f1);
EXPECT_TRUE(f0.IsEnabled("SomeString"));
EXPECT_FALSE(f0.IsEnabled("SomeOtherString"));
EXPECT_FALSE(f1->IsEnabled("SomeString"));
EXPECT_TRUE(f1->IsEnabled("SomeOtherString"));
}
} // namespace webrtc