diff options
author | asvitkine@chromium.org <asvitkine@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-30 15:11:29 +0000 |
---|---|---|
committer | asvitkine@chromium.org <asvitkine@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-30 15:11:29 +0000 |
commit | ebcf69f02f4f02e508e77193e51dd6557e6c0085 (patch) | |
tree | 80f883eca03bd26b3a5211f9156ff2e860c909ff /chrome | |
parent | b554d462229e4498ba6576d7cd0c2336fb468175 (diff) | |
download | chromium_src-ebcf69f02f4f02e508e77193e51dd6557e6c0085.zip chromium_src-ebcf69f02f4f02e508e77193e51dd6557e6c0085.tar.gz chromium_src-ebcf69f02f4f02e508e77193e51dd6557e6c0085.tar.bz2 |
Make field trial randomization type a constructor param.
Changes the Field Trial API to require users to pass ONE_TIME_RANDOMIZED
or SESSION_RANDOMIZED at the time the field trial is created.
This removes a source of human errors, where developers would sometimes
previously forget to call UseOneTimeRandomization() in their CLs.
It's a small startup performance win, since one time randomized trials will
no longer call RandDouble() that will be then replaced by a value from the
entropy provider. (This was showing up in profiles when I was measuring
metrics startup perf on mobile.)
BUG=262971
TEST=Existing unit tests.
TBR=isherman@chromium.org, thakis@chromium.org
Review URL: https://codereview.chromium.org/20777005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@214352 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
17 files changed, 135 insertions, 143 deletions
diff --git a/chrome/browser/chrome_browser_field_trials_desktop.cc b/chrome/browser/chrome_browser_field_trials_desktop.cc index 339ee6b..92b6645 100644 --- a/chrome/browser/chrome_browser_field_trials_desktop.cc +++ b/chrome/browser/chrome_browser_field_trials_desktop.cc @@ -62,9 +62,9 @@ void SetupInfiniteCacheFieldTrial() { base::FieldTrial::Probability infinite_cache_probability = 0; scoped_refptr<base::FieldTrial> trial( - base::FieldTrialList::FactoryGetFieldTrial("InfiniteCache", kDivisor, - "No", 2013, 12, 31, NULL)); - trial->UseOneTimeRandomization(); + base::FieldTrialList::FactoryGetFieldTrial( + "InfiniteCache", kDivisor, "No", 2013, 12, 31, + base::FieldTrial::ONE_TIME_RANDOMIZED, NULL)); trial->AppendGroup("Yes", infinite_cache_probability); trial->AppendGroup("Control", infinite_cache_probability); } @@ -106,9 +106,9 @@ void SetupCacheSensitivityAnalysisFieldTrial() { #endif scoped_refptr<base::FieldTrial> trial( - base::FieldTrialList::FactoryGetFieldTrial("CacheSensitivityAnalysis", - kDivisor, "No", - 2013, 06, 15, NULL)); + base::FieldTrialList::FactoryGetFieldTrial( + "CacheSensitivityAnalysis", kDivisor, "No", 2013, 06, 15, + base::FieldTrial::SESSION_RANDOMIZED, NULL)); trial->AppendGroup("ControlA", sensitivity_analysis_probability); trial->AppendGroup("ControlB", sensitivity_analysis_probability); trial->AppendGroup("100A", sensitivity_analysis_probability); @@ -130,8 +130,9 @@ void WindowsOverlappedTCPReadsFieldTrial( const base::FieldTrial::Probability kDivisor = 2; // 1 in 2 chance const base::FieldTrial::Probability kOverlappedReadProbability = 1; scoped_refptr<base::FieldTrial> overlapped_reads_trial( - base::FieldTrialList::FactoryGetFieldTrial("OverlappedReadImpact", - kDivisor, "OverlappedReadEnabled", 2013, 6, 1, NULL)); + base::FieldTrialList::FactoryGetFieldTrial( + "OverlappedReadImpact", kDivisor, "OverlappedReadEnabled", + 2013, 6, 1, base::FieldTrial::SESSION_RANDOMIZED, NULL)); int overlapped_reads_disabled_group = overlapped_reads_trial->AppendGroup("OverlappedReadDisabled", kOverlappedReadProbability); @@ -145,8 +146,8 @@ void WindowsOverlappedTCPReadsFieldTrial( void SetupLowLatencyFlashAudioFieldTrial() { scoped_refptr<base::FieldTrial> trial( base::FieldTrialList::FactoryGetFieldTrial( - content::kLowLatencyFlashAudioFieldTrialName, - 100, "Standard", 2013, 9, 1, NULL)); + content::kLowLatencyFlashAudioFieldTrialName, 100, "Standard", + 2013, 9, 1, base::FieldTrial::SESSION_RANDOMIZED, NULL)); // Trial is enabled for dev / beta / canary users only. if (chrome::VersionInfo::GetChannel() != chrome::VersionInfo::CHANNEL_STABLE) diff --git a/chrome/browser/chrome_browser_field_trials_mobile.cc b/chrome/browser/chrome_browser_field_trials_mobile.cc index 5e17ca7..8d9140c 100644 --- a/chrome/browser/chrome_browser_field_trials_mobile.cc +++ b/chrome/browser/chrome_browser_field_trials_mobile.cc @@ -37,10 +37,8 @@ void DataCompressionProxyFieldTrial() { scoped_refptr<base::FieldTrial> trial( base::FieldTrialList::FactoryGetFieldTrial( kDataCompressionProxyFieldTrialName, kDataCompressionProxyDivisor, - kDisabled, 2015, 1, 1, NULL)); + kDisabled, 2015, 1, 1, base::FieldTrial::ONE_TIME_RANDOMIZED, NULL)); - // We want our trial results to be persistent. - trial->UseOneTimeRandomization(); // Non-stable channels will run with probability 1. const int kEnabledGroup = trial->AppendGroup( kEnabled, @@ -77,10 +75,8 @@ void NewTabButtonInToolbarFieldTrial(const CommandLine& parsed_command_line) { base::FieldTrialList::FactoryGetFieldTrial( kPhoneNewTabToolbarButtonFieldTrialName, kPhoneNewTabToolbarButtonDivisor, - kDisabled, 2015, 1, 1, NULL)); + kDisabled, 2015, 1, 1, base::FieldTrial::ONE_TIME_RANDOMIZED, NULL)); - // We want our trial results to be persistent. - trial->UseOneTimeRandomization(); const int kEnabledGroup = trial->AppendGroup( kEnabled, kIsStableChannel ? diff --git a/chrome/browser/chromeos/external_metrics.cc b/chrome/browser/chromeos/external_metrics.cc index cabac24..5c6b329 100644 --- a/chrome/browser/chromeos/external_metrics.cc +++ b/chrome/browser/chromeos/external_metrics.cc @@ -63,10 +63,10 @@ void SetupProgressiveScanFieldTrial() { const char path_to_group_file[] = "/home/chronos/.progressive_scan_variation"; const base::FieldTrial::Probability kDivisor = 1000; scoped_refptr<base::FieldTrial> trial = - base::FieldTrialList::FactoryGetFieldTrial(name_of_experiment, - kDivisor, - "Default", - 2013, 12, 31, NULL); + base::FieldTrialList::FactoryGetFieldTrial( + name_of_experiment, kDivisor, "Default", 2013, 12, 31, + base::FieldTrial::SESSION_RANDOMIZED, NULL); + // Announce the groups with 0 percentage; the actual percentages come from // the server configuration. std::map<int, std::string> group_to_char; @@ -113,10 +113,10 @@ void SetupSwapJankFieldTrial() { // All groups are either on or off. const base::FieldTrial::Probability kTotalProbability = 1; scoped_refptr<base::FieldTrial> trial = - base::FieldTrialList::FactoryGetFieldTrial(name_of_experiment, - kTotalProbability, - "default", - 2013, 12, 31, NULL); + base::FieldTrialList::FactoryGetFieldTrial( + name_of_experiment, kTotalProbability, "default", 2013, 12, 31, + base::FieldTrial::SESSION_RANDOMIZED, NULL); + // Assign probability of 1 to this Chrome's group. Assign 0 to all other // choices. trial->AppendGroup("kernel_64_chrome_64", diff --git a/chrome/browser/chromeos/login/default_pinned_apps_field_trial.cc b/chrome/browser/chromeos/login/default_pinned_apps_field_trial.cc index c75234a..f6de0e0 100644 --- a/chrome/browser/chromeos/login/default_pinned_apps_field_trial.cc +++ b/chrome/browser/chromeos/login/default_pinned_apps_field_trial.cc @@ -134,8 +134,8 @@ void SetupTrial() { const base::FieldTrial::Probability kDivisor = 100; scoped_refptr<base::FieldTrial> trial = base::FieldTrialList::FactoryGetFieldTrial( - kExperimentName, kDivisor, "Existing", 2013, 12, 31, NULL); - trial->UseOneTimeRandomization(); + kExperimentName, kDivisor, "Existing", 2013, 12, 31, + base::FieldTrial::ONE_TIME_RANDOMIZED, NULL); // Split 50/50 between "Control" and "Alternamte" group for new user. // Existing users already have their default pinned apps and have the trial diff --git a/chrome/browser/gpu/chrome_gpu_util.cc b/chrome/browser/gpu/chrome_gpu_util.cc index 441cebc..61da773 100644 --- a/chrome/browser/gpu/chrome_gpu_util.cc +++ b/chrome/browser/gpu/chrome_gpu_util.cc @@ -99,11 +99,8 @@ void InitializeCompositingFieldTrial() { const base::FieldTrial::Probability kDivisor = 3; scoped_refptr<base::FieldTrial> trial( base::FieldTrialList::FactoryGetFieldTrial( - content::kGpuCompositingFieldTrialName, kDivisor, - "disable", 2013, 12, 31, NULL)); - - // Produce the same result on every run of this client. - trial->UseOneTimeRandomization(); + content::kGpuCompositingFieldTrialName, kDivisor, "disable", + 2013, 12, 31, base::FieldTrial::ONE_TIME_RANDOMIZED, NULL)); base::FieldTrial::Probability force_compositing_mode_probability = 0; base::FieldTrial::Probability threaded_compositing_probability = 0; @@ -131,5 +128,5 @@ void InitializeCompositingFieldTrial() { UMA_HISTOGRAM_BOOLEAN("GPU.InCompositorThreadFieldTrial", thread); } -} // namespace gpu_util; +} // namespace gpu_util diff --git a/chrome/browser/metrics/gzipped_protobufs_field_trial.cc b/chrome/browser/metrics/gzipped_protobufs_field_trial.cc index cd105be..81c34f7 100644 --- a/chrome/browser/metrics/gzipped_protobufs_field_trial.cc +++ b/chrome/browser/metrics/gzipped_protobufs_field_trial.cc @@ -39,8 +39,8 @@ void CreateGzippedProtobufsFieldTrial() { 2013, 10, 1, + base::FieldTrial::ONE_TIME_RANDOMIZED, NULL); - gzipped_protobufs_trial->UseOneTimeRandomization(); int gzipped_protobufs_group = gzipped_protobufs_trial->AppendGroup( kGroupName, kTrialQuotient); diff --git a/chrome/browser/metrics/thread_watcher.cc b/chrome/browser/metrics/thread_watcher.cc index c8ee4cf..4a14015 100644 --- a/chrome/browser/metrics/thread_watcher.cc +++ b/chrome/browser/metrics/thread_watcher.cc @@ -569,7 +569,7 @@ void ThreadWatcherList::ParseCommandLine( scoped_refptr<base::FieldTrial> field_trial( base::FieldTrialList::FactoryGetFieldTrial( "ThreadWatcher", 100, "default_hung_threads", - 2013, 10, 30, NULL)); + 2013, 10, 30, base::FieldTrial::SESSION_RANDOMIZED, NULL)); int hung_thread_group = field_trial->AppendGroup("hung_thread", 100); if (field_trial->group() == hung_thread_group) { for (CrashOnHangThreadMap::iterator it = crash_on_hang_threads->begin(); diff --git a/chrome/browser/metrics/variations/variations_seed_processor.cc b/chrome/browser/metrics/variations/variations_seed_processor.cc index 58161f2..ef98d85 100644 --- a/chrome/browser/metrics/variations/variations_seed_processor.cc +++ b/chrome/browser/metrics/variations/variations_seed_processor.cc @@ -181,21 +181,24 @@ void VariationsSeedProcessor::CreateTrialFromStudy( } } + uint32 randomization_seed = 0; + base::FieldTrial::RandomizationType randomization_type = + base::FieldTrial::SESSION_RANDOMIZED; + if (study.has_consistency() && + study.consistency() == Study_Consistency_PERMANENT) { + randomization_type = base::FieldTrial::ONE_TIME_RANDOMIZED; + if (study.has_randomization_seed()) + randomization_seed = study.randomization_seed(); + } + // The trial is created without specifying an expiration date because the // expiration check in field_trial.cc is based on the build date. Instead, // the expiration check using |reference_date| is done explicitly below. scoped_refptr<base::FieldTrial> trial( - base::FieldTrialList::FactoryGetFieldTrial( + base::FieldTrialList::FactoryGetFieldTrialWithRandomizationSeed( study.name(), total_probability, study.default_experiment_name(), - base::FieldTrialList::kNoExpirationYear, 1, 1, NULL)); - - if (study.has_consistency() && - study.consistency() == Study_Consistency_PERMANENT) { - if (study.has_randomization_seed()) - trial->UseOneTimeRandomizationWithCustomSeed(study.randomization_seed()); - else - trial->UseOneTimeRandomization(); - } + base::FieldTrialList::kNoExpirationYear, 1, 1, randomization_type, + randomization_seed, NULL)); for (int i = 0; i < study.experiment_size(); ++i) { const Study_Experiment& experiment = study.experiment(i); diff --git a/chrome/browser/net/http_pipelining_compatibility_client.cc b/chrome/browser/net/http_pipelining_compatibility_client.cc index 042a5a2..e90fb03 100644 --- a/chrome/browser/net/http_pipelining_compatibility_client.cc +++ b/chrome/browser/net/http_pipelining_compatibility_client.cc @@ -465,7 +465,8 @@ void CollectPipeliningCapabilityStatsOnIOThread( } // After May 4, 2012, the trial will disable itself. trial = base::FieldTrialList::FactoryGetFieldTrial( - kTrialName, kDivisor, "disable_test", 2012, 5, 4, NULL); + kTrialName, kDivisor, "disable_test", 2012, 5, 4, + base::FieldTrial::SESSION_RANDOMIZED, NULL); chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); if (channel == chrome::VersionInfo::CHANNEL_CANARY) { diff --git a/chrome/browser/net/network_stats.cc b/chrome/browser/net/network_stats.cc index f9a4f2e..8a9fe1f 100644 --- a/chrome/browser/net/network_stats.cc +++ b/chrome/browser/net/network_stats.cc @@ -806,13 +806,9 @@ void CollectNetworkStats(const std::string& network_stats_server, // After July 31, 2014 builds, it will always be in default group // (disable_network_stats). - trial = base::FieldTrialList::FactoryGetFieldTrial("NetworkConnectivity", - kDivisor, - "disable_network_stats", - 2014, - 7, - 31, - NULL); + trial = base::FieldTrialList::FactoryGetFieldTrial( + "NetworkConnectivity", kDivisor, "disable_network_stats", + 2014, 7, 31, base::FieldTrial::SESSION_RANDOMIZED, NULL); // Add option to collect_stats for NetworkConnectivity. int collect_stats_group = diff --git a/chrome/browser/omnibox/omnibox_field_trial.cc b/chrome/browser/omnibox/omnibox_field_trial.cc index 0fbf10d..09c2d1a 100644 --- a/chrome/browser/omnibox/omnibox_field_trial.cc +++ b/chrome/browser/omnibox/omnibox_field_trial.cc @@ -87,9 +87,8 @@ void OmniboxFieldTrial::ActivateStaticTrials() { // Make it expire on March 1, 2013. scoped_refptr<base::FieldTrial> trial( base::FieldTrialList::FactoryGetFieldTrial( - kHUPCullRedirectsFieldTrialName, kHUPCullRedirectsFieldTrialDivisor, - "Standard", 2013, 3, 1, NULL)); - trial->UseOneTimeRandomization(); + kHUPCullRedirectsFieldTrialName, kHUPCullRedirectsFieldTrialDivisor, + "Standard", 2013, 3, 1, base::FieldTrial::ONE_TIME_RANDOMIZED, NULL)); hup_dont_cull_redirects_experiment_group = trial->AppendGroup("DontCullRedirects", kHUPCullRedirectsFieldTrialExperimentFraction); @@ -98,8 +97,8 @@ void OmniboxFieldTrial::ActivateStaticTrials() { // Make it expire on March 1, 2013. trial = base::FieldTrialList::FactoryGetFieldTrial( kHUPCreateShorterMatchFieldTrialName, - kHUPCreateShorterMatchFieldTrialDivisor, "Standard", 2013, 3, 1, NULL); - trial->UseOneTimeRandomization(); + kHUPCreateShorterMatchFieldTrialDivisor, "Standard", 2013, 3, 1, + base::FieldTrial::ONE_TIME_RANDOMIZED, NULL); hup_dont_create_shorter_match_experiment_group = trial->AppendGroup("DontCreateShorterMatch", kHUPCreateShorterMatchFieldTrialExperimentFraction); diff --git a/chrome/browser/password_manager/password_manager.cc b/chrome/browser/password_manager/password_manager.cc index e1390aa..dbeec6b 100644 --- a/chrome/browser/password_manager/password_manager.cc +++ b/chrome/browser/password_manager/password_manager.cc @@ -311,8 +311,8 @@ void PasswordManager::OnPasswordFormsRendered( if (provisional_save_manager_->HasGeneratedPassword()) UMA_HISTOGRAM_COUNTS("PasswordGeneration.Submitted", 1); - if(!CommandLine::ForCurrentProcess()->HasSwitch( - switches::kEnableSavePasswordBubble)){ + if (!CommandLine::ForCurrentProcess()->HasSwitch( + switches::kEnableSavePasswordBubble)) { if (ShouldShowSavePasswordInfoBar()) { delegate_->AddSavePasswordInfoBarIfPermitted( provisional_save_manager_.release()); @@ -344,8 +344,8 @@ void PasswordManager::PossiblyInitializeUsernamesExperiment( scoped_refptr<base::FieldTrial> trial( base::FieldTrialList::FactoryGetFieldTrial( kOtherPossibleUsernamesExperiment, - kDivisor, "Disabled", 2013, 12, 31, NULL)); - trial->UseOneTimeRandomization(); + kDivisor, "Disabled", 2013, 12, 31, + base::FieldTrial::ONE_TIME_RANDOMIZED, NULL)); base::FieldTrial::Probability enabled_probability = 0; switch (chrome::VersionInfo::GetChannel()) { diff --git a/chrome/browser/prerender/prerender_field_trial.cc b/chrome/browser/prerender/prerender_field_trial.cc index ca12522..4d04ff6 100644 --- a/chrome/browser/prerender/prerender_field_trial.cc +++ b/chrome/browser/prerender/prerender_field_trial.cc @@ -56,7 +56,7 @@ void SetupPrefetchFieldTrial() { scoped_refptr<FieldTrial> trial( FieldTrialList::FactoryGetFieldTrial( "Prefetch", divisor, "ContentPrefetchPrefetchOff", - 2013, 12, 31, NULL)); + 2013, 12, 31, FieldTrial::SESSION_RANDOMIZED, NULL)); const int kPrefetchOnGroup = trial->AppendGroup("ContentPrefetchPrefetchOn", prefetch_probability); PrerenderManager::SetIsPrefetchEnabled(trial->group() == kPrefetchOnGroup); @@ -118,7 +118,8 @@ void SetupPrerenderFieldTrial() { scoped_refptr<FieldTrial> trial( FieldTrialList::FactoryGetFieldTrial( "Prerender", divisor, "PrerenderEnabled", - 2013, 12, 31, &prerender_enabled_group)); + 2013, 12, 31, FieldTrial::SESSION_RANDOMIZED, + &prerender_enabled_group)); const int control_group = trial->AppendGroup("PrerenderControl", control_probability); @@ -229,7 +230,8 @@ void ConfigureOmniboxPrerender() { scoped_refptr<FieldTrial> omnibox_prerender_trial( FieldTrialList::FactoryGetFieldTrial( kOmniboxTrialName, kDivisor, "OmniboxPrerenderEnabled", - 2013, 12, 31, &g_omnibox_trial_default_group_number)); + 2013, 12, 31, FieldTrial::SESSION_RANDOMIZED, + &g_omnibox_trial_default_group_number)); omnibox_prerender_trial->AppendGroup("OmniboxPrerenderDisabled", kDisabledProbability); } @@ -242,7 +244,8 @@ void ConfigureLocalPredictor() { } scoped_refptr<FieldTrial> local_predictor_trial( FieldTrialList::FactoryGetFieldTrial( - kLocalPredictorTrialName, 100, kDisabledGroup, 2013, 12, 31, NULL)); + kLocalPredictorTrialName, 100, kDisabledGroup, 2013, 12, 31, + FieldTrial::SESSION_RANDOMIZED, NULL)); local_predictor_trial->AppendGroup(kEnabledGroup, 100); } diff --git a/chrome/browser/ui/bookmarks/bookmark_prompt_controller.cc b/chrome/browser/ui/bookmarks/bookmark_prompt_controller.cc index 9986383..6013a1b 100644 --- a/chrome/browser/ui/bookmarks/bookmark_prompt_controller.cc +++ b/chrome/browser/ui/bookmarks/bookmark_prompt_controller.cc @@ -229,8 +229,9 @@ bool BookmarkPromptController::IsEnabled() { kBookmarkPromptTrialName, 100, kBookmarkPromptDefaultGroup, date_range->expiration_date.year, date_range->expiration_date.month, - date_range->expiration_date.day_of_month, NULL)); - trial->UseOneTimeRandomization(); + date_range->expiration_date.day_of_month, + base::FieldTrial::ONE_TIME_RANDOMIZED, + NULL)); trial->AppendGroup(kBookmarkPromptControlGroup, 10); trial->AppendGroup(kBookmarkPromptExperimentGroup, 10); diff --git a/chrome/common/metrics/entropy_provider_unittest.cc b/chrome/common/metrics/entropy_provider_unittest.cc index e64a8eb..5c54128 100644 --- a/chrome/common/metrics/entropy_provider_unittest.cc +++ b/chrome/common/metrics/entropy_provider_unittest.cc @@ -193,15 +193,17 @@ TEST_F(EntropyProviderTest, UseOneTimeRandomizationSHA1) { // _might_ actually give the same result, but we know that given // the particular client_id we use for unit tests they won't. base::FieldTrialList field_trial_list(new SHA1EntropyProvider("client_id")); + const int kNoExpirationYear = base::FieldTrialList::kNoExpirationYear; scoped_refptr<base::FieldTrial> trials[] = { - base::FieldTrialList::FactoryGetFieldTrial("one", 100, "default", - base::FieldTrialList::kNoExpirationYear, 1, 1, NULL), - base::FieldTrialList::FactoryGetFieldTrial("two", 100, "default", - base::FieldTrialList::kNoExpirationYear, 1, 1, NULL) }; + base::FieldTrialList::FactoryGetFieldTrial( + "one", 100, "default", kNoExpirationYear, 1, 1, + base::FieldTrial::ONE_TIME_RANDOMIZED, NULL), + base::FieldTrialList::FactoryGetFieldTrial( + "two", 100, "default", kNoExpirationYear, 1, 1, + base::FieldTrial::ONE_TIME_RANDOMIZED, NULL), + }; for (size_t i = 0; i < arraysize(trials); ++i) { - trials[i]->UseOneTimeRandomization(); - for (int j = 0; j < 100; ++j) trials[i]->AppendGroup(std::string(), 1); } @@ -221,15 +223,17 @@ TEST_F(EntropyProviderTest, UseOneTimeRandomizationPermuted) { // the particular client_id we use for unit tests they won't. base::FieldTrialList field_trial_list( new PermutedEntropyProvider(1234, kMaxLowEntropySize)); + const int kNoExpirationYear = base::FieldTrialList::kNoExpirationYear; scoped_refptr<base::FieldTrial> trials[] = { - base::FieldTrialList::FactoryGetFieldTrial("one", 100, "default", - base::FieldTrialList::kNoExpirationYear, 1, 1, NULL), - base::FieldTrialList::FactoryGetFieldTrial("two", 100, "default", - base::FieldTrialList::kNoExpirationYear, 1, 1, NULL) }; + base::FieldTrialList::FactoryGetFieldTrial( + "one", 100, "default", kNoExpirationYear, 1, 1, + base::FieldTrial::ONE_TIME_RANDOMIZED, NULL), + base::FieldTrialList::FactoryGetFieldTrial( + "two", 100, "default", kNoExpirationYear, 1, 1, + base::FieldTrial::ONE_TIME_RANDOMIZED, NULL), + }; for (size_t i = 0; i < arraysize(trials); ++i) { - trials[i]->UseOneTimeRandomization(); - for (int j = 0; j < 100; ++j) trials[i]->AppendGroup(std::string(), 1); } @@ -245,16 +249,18 @@ TEST_F(EntropyProviderTest, UseOneTimeRandomizationWithCustomSeedPermuted) { // for one time randomization produce the same group assignments. base::FieldTrialList field_trial_list( new PermutedEntropyProvider(1234, kMaxLowEntropySize)); - scoped_refptr<base::FieldTrial> trials[] = { - base::FieldTrialList::FactoryGetFieldTrial("one", 100, "default", - base::FieldTrialList::kNoExpirationYear, 1, 1, NULL), - base::FieldTrialList::FactoryGetFieldTrial("two", 100, "default", - base::FieldTrialList::kNoExpirationYear, 1, 1, NULL) }; + const int kNoExpirationYear = base::FieldTrialList::kNoExpirationYear; const uint32 kCustomSeed = 9001; + scoped_refptr<base::FieldTrial> trials[] = { + base::FieldTrialList::FactoryGetFieldTrialWithRandomizationSeed( + "one", 100, "default", kNoExpirationYear, 1, 1, + base::FieldTrial::ONE_TIME_RANDOMIZED, kCustomSeed, NULL), + base::FieldTrialList::FactoryGetFieldTrialWithRandomizationSeed( + "two", 100, "default", kNoExpirationYear, 1, 1, + base::FieldTrial::ONE_TIME_RANDOMIZED, kCustomSeed, NULL), + }; for (size_t i = 0; i < arraysize(trials); ++i) { - trials[i]->UseOneTimeRandomizationWithCustomSeed(kCustomSeed); - for (int j = 0; j < 100; ++j) trials[i]->AppendGroup(std::string(), 1); } diff --git a/chrome/common/metrics/variations/uniformity_field_trials.cc b/chrome/common/metrics/variations/uniformity_field_trials.cc index 0ae53a5..a51da1e 100644 --- a/chrome/common/metrics/variations/uniformity_field_trials.cc +++ b/chrome/common/metrics/variations/uniformity_field_trials.cc @@ -9,6 +9,8 @@ #include "base/time/time.h" #include "chrome/common/metrics/variations/variations_util.h" +namespace chrome_variations { + namespace { // Set up a uniformity field trial. |one_time_randomized| indicates if the @@ -16,9 +18,9 @@ namespace { // must contain a "%d" since the percentage of the group will be inserted in // the trial name. |num_trial_groups| must be a divisor of 100 (e.g. 5, 20) void SetupSingleUniformityFieldTrial( - bool one_time_randomized, + base::FieldTrial::RandomizationType randomization_type, const std::string& trial_name_string, - const chrome_variations::VariationID trial_base_id, + const VariationID trial_base_id, int num_trial_groups) { // Probability per group remains constant for all uniformity trials, what // changes is the probability divisor. @@ -35,12 +37,10 @@ void SetupSingleUniformityFieldTrial( scoped_refptr<base::FieldTrial> trial( base::FieldTrialList::FactoryGetFieldTrial( - trial_name, divisor, kDefaultGroupName, 2015, 1, 1, NULL)); - if (one_time_randomized) - trial->UseOneTimeRandomization(); - chrome_variations::AssociateGoogleVariationID( - chrome_variations::GOOGLE_UPDATE_SERVICE, trial_name, kDefaultGroupName, - trial_base_id); + trial_name, divisor, kDefaultGroupName, 2015, 1, 1, + randomization_type, NULL)); + AssociateGoogleVariationID(GOOGLE_UPDATE_SERVICE, trial_name, + kDefaultGroupName, trial_base_id); // Loop starts with group 1 because the field trial automatically creates a // default group, which would be group 0. @@ -49,10 +49,9 @@ void SetupSingleUniformityFieldTrial( base::StringPrintf("group_%02d", group_number); DVLOG(1) << " Group name = " << group_name; trial->AppendGroup(group_name, kProbabilityPerGroup); - chrome_variations::AssociateGoogleVariationID( - chrome_variations::GOOGLE_UPDATE_SERVICE, trial_name, group_name, - static_cast<chrome_variations::VariationID>(trial_base_id + - group_number)); + AssociateGoogleVariationID( + GOOGLE_UPDATE_SERVICE, trial_name, group_name, + static_cast<VariationID>(trial_base_id + group_number)); } // Now that all groups have been appended, call group() on the trial to @@ -72,8 +71,7 @@ void SetupNewInstallUniformityTrial(const base::Time install_date) { scoped_refptr<base::FieldTrial> trial( base::FieldTrialList::FactoryGetFieldTrial( "UMA-New-Install-Uniformity-Trial", 100, "Disabled", - 2015, 1, 1, NULL)); - trial->UseOneTimeRandomization(); + 2015, 1, 1, base::FieldTrial::ONE_TIME_RANDOMIZED, NULL)); trial->AppendGroup("Control", 50); trial->AppendGroup("Experiment", 50); const base::Time start_date = base::Time::FromLocalExploded(kStartDate); @@ -85,8 +83,6 @@ void SetupNewInstallUniformityTrial(const base::Time install_date) { } // namespace -namespace chrome_variations { - void SetupUniformityFieldTrials(const base::Time install_date) { // One field trial will be created for each entry in this array. The i'th // field trial will have |trial_sizes[i]| groups in it, including the default @@ -96,26 +92,28 @@ void SetupUniformityFieldTrials(const base::Time install_date) { // Declare our variation ID bases along side this array so we can loop over it // and assign the IDs appropriately. So for example, the 1 percent experiments // should have a size of 100 (100/100 = 1). - const chrome_variations::VariationID trial_base_ids[] = { - chrome_variations::UNIFORMITY_1_PERCENT_BASE, - chrome_variations::UNIFORMITY_5_PERCENT_BASE, - chrome_variations::UNIFORMITY_10_PERCENT_BASE, - chrome_variations::UNIFORMITY_20_PERCENT_BASE, - chrome_variations::UNIFORMITY_50_PERCENT_BASE + const VariationID trial_base_ids[] = { + UNIFORMITY_1_PERCENT_BASE, + UNIFORMITY_5_PERCENT_BASE, + UNIFORMITY_10_PERCENT_BASE, + UNIFORMITY_20_PERCENT_BASE, + UNIFORMITY_50_PERCENT_BASE }; const std::string kOneTimeRandomizedTrialName = "UMA-Uniformity-Trial-%d-Percent"; for (size_t i = 0; i < arraysize(num_trial_groups); ++i) { - SetupSingleUniformityFieldTrial(true, kOneTimeRandomizedTrialName, + SetupSingleUniformityFieldTrial(base::FieldTrial::ONE_TIME_RANDOMIZED, + kOneTimeRandomizedTrialName, trial_base_ids[i], num_trial_groups[i]); } // Setup a 5% session-randomized uniformity trial. const std::string kSessionRandomizedTrialName = "UMA-Session-Randomized-Uniformity-Trial-%d-Percent"; - SetupSingleUniformityFieldTrial(false, kSessionRandomizedTrialName, - chrome_variations::UNIFORMITY_SESSION_RANDOMIZED_5_PERCENT_BASE, 20); + SetupSingleUniformityFieldTrial( + base::FieldTrial::SESSION_RANDOMIZED, kSessionRandomizedTrialName, + UNIFORMITY_SESSION_RANDOMIZED_5_PERCENT_BASE, 20); SetupNewInstallUniformityTrial(install_date); } diff --git a/chrome/common/metrics/variations/variations_util_unittest.cc b/chrome/common/metrics/variations/variations_util_unittest.cc index 6ad78db..173133a 100644 --- a/chrome/common/metrics/variations/variations_util_unittest.cc +++ b/chrome/common/metrics/variations/variations_util_unittest.cc @@ -39,6 +39,18 @@ bool IsFieldTrialActive(const std::string& trial_name) { return false; } +// Call FieldTrialList::FactoryGetFieldTrial() with a future expiry date. +scoped_refptr<base::FieldTrial> CreateFieldTrial( + const std::string& trial_name, + int total_probability, + const std::string& default_group_name, + int* default_group_number) { + return base::FieldTrialList::FactoryGetFieldTrial( + trial_name, total_probability, default_group_name, + base::FieldTrialList::kNoExpirationYear, 1, 1, + base::FieldTrial::SESSION_RANDOMIZED, default_group_number); +} + } // namespace class VariationsUtilTest : public ::testing::Test { @@ -49,22 +61,11 @@ class VariationsUtilTest : public ::testing::Test { ui_thread_.reset(new content::TestBrowserThread( content::BrowserThread::UI, &message_loop_)); - base::Time now = base::Time::NowFromSystemTime(); - base::TimeDelta one_year = base::TimeDelta::FromDays(365); - base::Time::Exploded exploded; - - base::Time next_year_time = now + one_year; - next_year_time.LocalExplode(&exploded); - next_year_ = exploded.year; - // Ensure that the maps are cleared between tests, since they are stored as // process singletons. testing::ClearAllVariationIDs(); } - protected: - int next_year_; - private: base::FieldTrialList field_trial_list_; base::MessageLoop message_loop_; @@ -115,10 +116,7 @@ TEST_F(VariationsUtilTest, GetFieldTrialActiveGroups) { TEST_F(VariationsUtilTest, DisableImmediately) { int default_group_number = -1; scoped_refptr<base::FieldTrial> trial( - base::FieldTrialList::FactoryGetFieldTrial("trial", 100, "default", - next_year_, 12, 12, - &default_group_number)); - trial->Disable(); + CreateFieldTrial("trial", 100, "default", &default_group_number)); ASSERT_EQ(default_group_number, trial->group()); ASSERT_EQ(EMPTY_ID, GetIDForTrial(GOOGLE_WEB_PROPERTIES, trial.get())); @@ -132,8 +130,8 @@ TEST_F(VariationsUtilTest, DisableAfterInitialization) { const std::string non_default_name = "non_default"; scoped_refptr<base::FieldTrial> trial( - base::FieldTrialList::FactoryGetFieldTrial("trial", 100, default_name, - next_year_, 12, 12, NULL)); + CreateFieldTrial("trial", 100, default_name, NULL)); + trial->AppendGroup(non_default_name, 100); AssociateGoogleVariationID(GOOGLE_WEB_PROPERTIES, trial->trial_name(), default_name, TEST_VALUE_A); @@ -148,8 +146,7 @@ TEST_F(VariationsUtilTest, DisableAfterInitialization) { TEST_F(VariationsUtilTest, AssociateGoogleVariationID) { const std::string default_name1 = "default"; scoped_refptr<base::FieldTrial> trial_true( - base::FieldTrialList::FactoryGetFieldTrial("d1", 10, default_name1, - next_year_, 12, 31, NULL)); + CreateFieldTrial("d1", 10, default_name1, NULL)); const std::string winner = "TheWinner"; int winner_group = trial_true->AppendGroup(winner, 10); @@ -166,8 +163,7 @@ TEST_F(VariationsUtilTest, AssociateGoogleVariationID) { const std::string default_name2 = "default2"; scoped_refptr<base::FieldTrial> trial_false( - base::FieldTrialList::FactoryGetFieldTrial("d2", 10, default_name2, - next_year_, 12, 31, NULL)); + CreateFieldTrial("d2", 10, default_name2, NULL)); const std::string loser = "ALoser"; const int loser_group = trial_false->AppendGroup(loser, 0); @@ -186,8 +182,8 @@ TEST_F(VariationsUtilTest, AssociateGoogleVariationID) { TEST_F(VariationsUtilTest, NoAssociation) { const std::string default_name = "default"; scoped_refptr<base::FieldTrial> no_id_trial( - base::FieldTrialList::FactoryGetFieldTrial("d3", 10, default_name, - next_year_, 12, 31, NULL)); + CreateFieldTrial("d3", 10, default_name, NULL)); + const std::string winner = "TheWinner"; const int winner_group = no_id_trial->AppendGroup(winner, 10); @@ -274,8 +270,7 @@ TEST_F(VariationsUtilTest, AssociateVariationParams_DoesntActivateTrial) { ASSERT_FALSE(IsFieldTrialActive(kTrialName)); scoped_refptr<base::FieldTrial> trial( - base::FieldTrialList::FactoryGetFieldTrial(kTrialName, 100, "A", - next_year_, 1, 1, NULL)); + CreateFieldTrial(kTrialName, 100, "A", NULL)); ASSERT_FALSE(IsFieldTrialActive(kTrialName)); std::map<std::string, std::string> params; @@ -309,8 +304,7 @@ TEST_F(VariationsUtilTest, GetVariationParams_ActivatesTrial) { ASSERT_FALSE(IsFieldTrialActive(kTrialName)); scoped_refptr<base::FieldTrial> trial( - base::FieldTrialList::FactoryGetFieldTrial(kTrialName, 100, "A", - next_year_, 1, 1, NULL)); + CreateFieldTrial(kTrialName, 100, "A", NULL)); ASSERT_FALSE(IsFieldTrialActive(kTrialName)); std::map<std::string, std::string> params; @@ -323,8 +317,7 @@ TEST_F(VariationsUtilTest, GetVariationParamValue_ActivatesTrial) { ASSERT_FALSE(IsFieldTrialActive(kTrialName)); scoped_refptr<base::FieldTrial> trial( - base::FieldTrialList::FactoryGetFieldTrial(kTrialName, 100, "A", - next_year_, 1, 1, NULL)); + CreateFieldTrial(kTrialName, 100, "A", NULL)); ASSERT_FALSE(IsFieldTrialActive(kTrialName)); std::map<std::string, std::string> params; @@ -391,9 +384,7 @@ TEST_F(VariationsUtilTest, CollectionsCoexist) { const std::string default_name = "default"; int default_group_number = -1; scoped_refptr<base::FieldTrial> trial_true( - base::FieldTrialList::FactoryGetFieldTrial("d1", 10, default_name, - next_year_, 12, 31, - &default_group_number)); + CreateFieldTrial("d1", 10, default_name, &default_group_number)); ASSERT_EQ(default_group_number, trial_true->group()); ASSERT_EQ(default_name, trial_true->group_name()); |