blob: ac7131144aef2b9713500fc363fa49bc361759e3 [file] [log] [blame]
andresp@webrtc.orga36ad692014-05-14 12:24:04 +00001// Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
2//
3// Use of this source code is governed by a BSD-style license
4// that can be found in the LICENSE file in the root of the source
5// tree. An additional intellectual property rights grant can be found
6// in the file PATENTS. All contributing project authors may
7// be found in the AUTHORS file in the root of the source tree.
8//
9
Karl Wiberg79eb1d92017-11-08 12:26:07 +010010#include "system_wrappers/include/field_trial.h"
andresp@webrtc.orga36ad692014-05-14 12:24:04 +000011
Yves Gerey988cc082018-10-23 12:03:01 +020012#include <stddef.h>
glaznev@webrtc.org669bc7e2015-02-09 18:17:46 +000013#include <string>
14
15// Simple field trial implementation, which allows client to
16// specify desired flags in InitFieldTrialsFromString.
andresp@webrtc.orga36ad692014-05-14 12:24:04 +000017namespace webrtc {
18namespace field_trial {
19
Karl Wiberg79eb1d92017-11-08 12:26:07 +010020static const char* trials_init_string = NULL;
glaznev@webrtc.org669bc7e2015-02-09 18:17:46 +000021
Mirko Bonadei92e00382018-09-15 10:37:11 +020022#ifndef WEBRTC_EXCLUDE_FIELD_TRIAL_DEFAULT
andresp@webrtc.orga36ad692014-05-14 12:24:04 +000023std::string FindFullName(const std::string& name) {
glaznev@webrtc.org669bc7e2015-02-09 18:17:46 +000024 if (trials_init_string == NULL)
25 return std::string();
26
27 std::string trials_string(trials_init_string);
28 if (trials_string.empty())
29 return std::string();
30
31 static const char kPersistentStringSeparator = '/';
32 size_t next_item = 0;
33 while (next_item < trials_string.length()) {
glaznev@webrtc.org669bc7e2015-02-09 18:17:46 +000034 // Find next name/value pair in field trial configuration string.
Karl Wiberg79eb1d92017-11-08 12:26:07 +010035 size_t field_name_end =
36 trials_string.find(kPersistentStringSeparator, next_item);
glaznev@webrtc.org669bc7e2015-02-09 18:17:46 +000037 if (field_name_end == trials_string.npos || field_name_end == next_item)
38 break;
Karl Wiberg79eb1d92017-11-08 12:26:07 +010039 size_t field_value_end =
40 trials_string.find(kPersistentStringSeparator, field_name_end + 1);
glaznev@webrtc.org669bc7e2015-02-09 18:17:46 +000041 if (field_value_end == trials_string.npos ||
42 field_value_end == field_name_end + 1)
43 break;
44 std::string field_name(trials_string, next_item,
Karl Wiberg79eb1d92017-11-08 12:26:07 +010045 field_name_end - next_item);
glaznev@webrtc.org669bc7e2015-02-09 18:17:46 +000046 std::string field_value(trials_string, field_name_end + 1,
Karl Wiberg79eb1d92017-11-08 12:26:07 +010047 field_value_end - field_name_end - 1);
glaznev@webrtc.org669bc7e2015-02-09 18:17:46 +000048 next_item = field_value_end + 1;
49
50 if (name == field_name)
51 return field_value;
52 }
andresp@webrtc.orga36ad692014-05-14 12:24:04 +000053 return std::string();
54}
Mirko Bonadei92e00382018-09-15 10:37:11 +020055#endif // WEBRTC_EXCLUDE_FIELD_TRIAL_DEFAULT
andresp@webrtc.orga36ad692014-05-14 12:24:04 +000056
glaznev@webrtc.org669bc7e2015-02-09 18:17:46 +000057// Optionally initialize field trial from a string.
58void InitFieldTrialsFromString(const char* trials_string) {
59 trials_init_string = trials_string;
60}
61
phoglund37ebcf02016-01-08 05:04:57 -080062const char* GetFieldTrialString() {
63 return trials_init_string;
64}
65
andresp@webrtc.orga36ad692014-05-14 12:24:04 +000066} // namespace field_trial
67} // namespace webrtc