Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(61)

Side by Side Diff: components/variations/variations_seed_processor.cc

Issue 71753004: Allow variation id with forcing flag for special setup & unit tests. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address code review comments Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/variations/variations_seed_processor.h" 5 #include "components/variations/variations_seed_processor.h"
6 6
7 #include <map> 7 #include <map>
8 #include <set> 8 #include <set>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 const Study_Experiment& experiment) { 49 const Study_Experiment& experiment) {
50 std::map<std::string, std::string> params; 50 std::map<std::string, std::string> params;
51 for (int i = 0; i < experiment.param_size(); ++i) { 51 for (int i = 0; i < experiment.param_size(); ++i) {
52 if (experiment.param(i).has_name() && experiment.param(i).has_value()) 52 if (experiment.param(i).has_name() && experiment.param(i).has_value())
53 params[experiment.param(i).name()] = experiment.param(i).value(); 53 params[experiment.param(i).name()] = experiment.param(i).value();
54 } 54 }
55 if (!params.empty()) 55 if (!params.empty())
56 AssociateVariationParams(study.name(), experiment.name(), params); 56 AssociateVariationParams(study.name(), experiment.name(), params);
57 } 57 }
58 58
59 // If if there is variation id associated with |experiment|, register the
60 // variation id.
61 void RegisterVariationIds(const Study_Experiment& experiment,
62 const std::string& trial_name) {
Alexei Svitkine (slow) 2013/11/14 22:34:33 Nit: Remove extra space before trial_name
yao 2013/11/14 23:41:15 Done.
63 if (experiment.has_google_web_experiment_id()) {
64 const VariationID variation_id =
65 static_cast<VariationID>(experiment.google_web_experiment_id());
66 AssociateGoogleVariationIDForce(GOOGLE_WEB_PROPERTIES,
67 trial_name,
68 experiment.name(),
69 variation_id);
70 }
71 if (experiment.has_google_update_experiment_id()) {
72 const VariationID variation_id =
73 static_cast<VariationID>(experiment.google_update_experiment_id());
74 AssociateGoogleVariationIDForce(GOOGLE_UPDATE_SERVICE,
75 trial_name,
76 experiment.name(),
77 variation_id);
78 }
79 }
80
59 } // namespace 81 } // namespace
60 82
61 VariationsSeedProcessor::VariationsSeedProcessor() { 83 VariationsSeedProcessor::VariationsSeedProcessor() {
62 } 84 }
63 85
64 VariationsSeedProcessor::~VariationsSeedProcessor() { 86 VariationsSeedProcessor::~VariationsSeedProcessor() {
65 } 87 }
66 88
89 bool VariationsSeedProcessor::AllowVariationIdWithForcingFlag(
90 const Study& study) {
91 if (!study.has_filter())
92 return false;
93 Study_Filter filter = study.filter();
Alexei Svitkine (slow) 2013/11/14 22:34:33 This does a copy. Use a reference (const Study_Fil
yao 2013/11/14 23:41:15 Done.
94 if (filter.platform_size() == 0 || filter.channel_size() == 0)
95 return false;
96 for (int i = 0; i < filter.platform_size(); ++i) {
97 if (filter.platform(i) != Study_Platform_PLATFORM_ANDROID &&
98 filter.platform(i) != Study_Platform_PLATFORM_IOS) {
99 return false;
100 }
101 }
102 for (int i = 0; i < filter.channel_size(); ++i) {
103 if (filter.channel(i) != Study_Channel_CANARY &&
104 filter.channel(i) != Study_Channel_DEV) {
105 return false;
106 }
107 }
108 return true;
109 }
110
67 void VariationsSeedProcessor::CreateTrialsFromSeed( 111 void VariationsSeedProcessor::CreateTrialsFromSeed(
68 const VariationsSeed& seed, 112 const VariationsSeed& seed,
69 const std::string& locale, 113 const std::string& locale,
70 const base::Time& reference_date, 114 const base::Time& reference_date,
71 const base::Version& version, 115 const base::Version& version,
72 Study_Channel channel, 116 Study_Channel channel,
73 Study_FormFactor form_factor) { 117 Study_FormFactor form_factor) {
74 std::vector<ProcessedStudy> filtered_studies; 118 std::vector<ProcessedStudy> filtered_studies;
75 FilterAndValidateStudies(seed, locale, reference_date, version, channel, 119 FilterAndValidateStudies(seed, locale, reference_date, version, channel,
76 form_factor, &filtered_studies); 120 form_factor, &filtered_studies);
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
218 // flag. Force the first experiment with an existing flag. 262 // flag. Force the first experiment with an existing flag.
219 CommandLine* command_line = CommandLine::ForCurrentProcess(); 263 CommandLine* command_line = CommandLine::ForCurrentProcess();
220 for (int i = 0; i < study.experiment_size(); ++i) { 264 for (int i = 0; i < study.experiment_size(); ++i) {
221 const Study_Experiment& experiment = study.experiment(i); 265 const Study_Experiment& experiment = study.experiment(i);
222 if (experiment.has_forcing_flag() && 266 if (experiment.has_forcing_flag() &&
223 command_line->HasSwitch(experiment.forcing_flag())) { 267 command_line->HasSwitch(experiment.forcing_flag())) {
224 base::FieldTrialList::CreateFieldTrial(study.name(), experiment.name()); 268 base::FieldTrialList::CreateFieldTrial(study.name(), experiment.name());
225 RegisterExperimentParams(study, experiment); 269 RegisterExperimentParams(study, experiment);
226 DVLOG(1) << "Trial " << study.name() << " forced by flag: " 270 DVLOG(1) << "Trial " << study.name() << " forced by flag: "
227 << experiment.forcing_flag(); 271 << experiment.forcing_flag();
272 if (AllowVariationIdWithForcingFlag(study)) {
Alexei Svitkine (slow) 2013/11/14 22:34:33 No need for {}'s.
yao 2013/11/14 23:41:15 Done.
273 RegisterVariationIds(experiment, study.name());
274 }
228 return; 275 return;
229 } 276 }
230 } 277 }
231 278
232 uint32 randomization_seed = 0; 279 uint32 randomization_seed = 0;
233 base::FieldTrial::RandomizationType randomization_type = 280 base::FieldTrial::RandomizationType randomization_type =
234 base::FieldTrial::SESSION_RANDOMIZED; 281 base::FieldTrial::SESSION_RANDOMIZED;
235 if (study.has_consistency() && 282 if (study.has_consistency() &&
236 study.consistency() == Study_Consistency_PERMANENT) { 283 study.consistency() == Study_Consistency_PERMANENT) {
237 randomization_type = base::FieldTrial::ONE_TIME_RANDOMIZED; 284 randomization_type = base::FieldTrial::ONE_TIME_RANDOMIZED;
238 if (study.has_randomization_seed()) 285 if (study.has_randomization_seed())
239 randomization_seed = study.randomization_seed(); 286 randomization_seed = study.randomization_seed();
240 } 287 }
241 288
242 // The trial is created without specifying an expiration date because the 289 // The trial is created without specifying an expiration date because the
243 // expiration check in field_trial.cc is based on the build date. Instead, 290 // expiration check in field_trial.cc is based on the build date. Instead,
244 // the expiration check using |reference_date| is done explicitly below. 291 // the expiration check using |reference_date| is done explicitly below.
245 scoped_refptr<base::FieldTrial> trial( 292 scoped_refptr<base::FieldTrial> trial(
246 base::FieldTrialList::FactoryGetFieldTrialWithRandomizationSeed( 293 base::FieldTrialList::FactoryGetFieldTrialWithRandomizationSeed(
247 study.name(), processed_study.total_probability, 294 study.name(), processed_study.total_probability,
248 study.default_experiment_name(), 295 study.default_experiment_name(),
249 base::FieldTrialList::kNoExpirationYear, 1, 1, randomization_type, 296 base::FieldTrialList::kNoExpirationYear, 1, 1, randomization_type,
250 randomization_seed, NULL)); 297 randomization_seed, NULL));
251 298
252 for (int i = 0; i < study.experiment_size(); ++i) { 299 for (int i = 0; i < study.experiment_size(); ++i) {
253 const Study_Experiment& experiment = study.experiment(i); 300 const Study_Experiment& experiment = study.experiment(i);
254 RegisterExperimentParams(study, experiment); 301 RegisterExperimentParams(study, experiment);
255 302
256 // Groups with flags can't be selected randomly, so we don't add them to 303 // Groups with forcing flags have probability 0 and will never be selected.
257 // the field trial. 304 // Therefore, there's no need to add them to the field trial.
258 if (experiment.has_forcing_flag()) 305 if (experiment.has_forcing_flag())
259 continue; 306 continue;
260 307
261 if (experiment.name() != study.default_experiment_name()) 308 if (experiment.name() != study.default_experiment_name())
262 trial->AppendGroup(experiment.name(), experiment.probability_weight()); 309 trial->AppendGroup(experiment.name(), experiment.probability_weight());
263 310
264 if (experiment.has_google_web_experiment_id()) { 311 RegisterVariationIds(experiment, study.name());
265 const VariationID variation_id =
266 static_cast<VariationID>(experiment.google_web_experiment_id());
267 AssociateGoogleVariationIDForce(GOOGLE_WEB_PROPERTIES,
268 study.name(),
269 experiment.name(),
270 variation_id);
271 }
272 if (experiment.has_google_update_experiment_id()) {
273 const VariationID variation_id =
274 static_cast<VariationID>(experiment.google_update_experiment_id());
275 AssociateGoogleVariationIDForce(GOOGLE_UPDATE_SERVICE,
276 study.name(),
277 experiment.name(),
278 variation_id);
279 }
280 } 312 }
281 313
282 trial->SetForced(); 314 trial->SetForced();
283 if (processed_study.is_expired) 315 if (processed_study.is_expired)
284 trial->Disable(); 316 trial->Disable();
285 else if (study.activation_type() == Study_ActivationType_ACTIVATION_AUTO) 317 else if (study.activation_type() == Study_ActivationType_ACTIVATION_AUTO)
286 trial->group(); 318 trial->group();
287 } 319 }
288 320
289 bool VariationsSeedProcessor::IsStudyExpired(const Study& study, 321 bool VariationsSeedProcessor::IsStudyExpired(const Study& study,
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
391 // The default group was not found in the list of groups. This study is not 423 // The default group was not found in the list of groups. This study is not
392 // valid. 424 // valid.
393 return false; 425 return false;
394 } 426 }
395 427
396 *total_probability = divisor; 428 *total_probability = divisor;
397 return true; 429 return true;
398 } 430 }
399 431
400 } // namespace chrome_variations 432 } // namespace chrome_variations
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698