1 // Copyright 2016 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/metrics/field_trial_param_associator.h"
6
7 #include "base/containers/contains.h"
8 #include "base/logging.h"
9 #include "base/metrics/field_trial.h"
10
11 namespace base {
12
13 FieldTrialParamAssociator::FieldTrialParamAssociator() = default;
14 FieldTrialParamAssociator::~FieldTrialParamAssociator() = default;
15
16 // static
GetInstance()17 FieldTrialParamAssociator* FieldTrialParamAssociator::GetInstance() {
18 return Singleton<FieldTrialParamAssociator,
19 LeakySingletonTraits<FieldTrialParamAssociator>>::get();
20 }
21
AssociateFieldTrialParams(const std::string & trial_name,const std::string & group_name,const FieldTrialParams & params)22 bool FieldTrialParamAssociator::AssociateFieldTrialParams(
23 const std::string& trial_name,
24 const std::string& group_name,
25 const FieldTrialParams& params) {
26 if (FieldTrialList::IsTrialActive(trial_name)) {
27 DLOG(ERROR) << "Field trial " << trial_name << " is already active.";
28 return false;
29 }
30
31 AutoLock scoped_lock(lock_);
32 const FieldTrialKey key(trial_name, group_name);
33 if (Contains(field_trial_params_, key)) {
34 DLOG(ERROR) << "You can't override the existing params for field trial: "
35 << trial_name << "." << group_name;
36 return false;
37 }
38
39 field_trial_params_[key] = params;
40 return true;
41 }
42
GetFieldTrialParams(FieldTrial * field_trial,FieldTrialParams * params)43 bool FieldTrialParamAssociator::GetFieldTrialParams(FieldTrial* field_trial,
44 FieldTrialParams* params) {
45 if (!field_trial)
46 return false;
47 // First try the local map, falling back to getting it from shared memory.
48 if (GetFieldTrialParamsWithoutFallback(field_trial->trial_name(),
49 field_trial->group_name(), params)) {
50 return true;
51 }
52
53 // TODO(lawrencewu): add the params to field_trial_params_ for next time.
54 return FieldTrialList::GetParamsFromSharedMemory(field_trial, params);
55 }
56
GetFieldTrialParamsWithoutFallback(const std::string & trial_name,const std::string & group_name,FieldTrialParams * params)57 bool FieldTrialParamAssociator::GetFieldTrialParamsWithoutFallback(
58 const std::string& trial_name,
59 const std::string& group_name,
60 FieldTrialParams* params) {
61 AutoLock scoped_lock(lock_);
62
63 const FieldTrialRefKey key(trial_name, group_name);
64 auto it = field_trial_params_.find(key);
65 if (it == field_trial_params_.end())
66 return false;
67
68 *params = it->second;
69 return true;
70 }
71
ClearAllParamsForTesting()72 void FieldTrialParamAssociator::ClearAllParamsForTesting() {
73 {
74 AutoLock scoped_lock(lock_);
75 field_trial_params_.clear();
76 }
77 FieldTrialList::ClearParamsFromSharedMemoryForTesting();
78 }
79
ClearParamsForTesting(const std::string & trial_name,const std::string & group_name)80 void FieldTrialParamAssociator::ClearParamsForTesting(
81 const std::string& trial_name,
82 const std::string& group_name) {
83 AutoLock scoped_lock(lock_);
84 const FieldTrialRefKey key(trial_name, group_name);
85 field_trial_params_.erase(key);
86 }
87
ClearAllCachedParamsForTesting()88 void FieldTrialParamAssociator::ClearAllCachedParamsForTesting() {
89 AutoLock scoped_lock(lock_);
90 field_trial_params_.clear();
91 }
92
ClearAllCachedParams(PassKey<AppShimController>)93 void FieldTrialParamAssociator::ClearAllCachedParams(
94 PassKey<AppShimController>) {
95 AutoLock scoped_lock(lock_);
96 field_trial_params_.clear();
97 }
98
99 } // namespace base
100