Chromium Code Reviews| Index: chrome/common/metrics/variations/experiment_labels_win.cc |
| diff --git a/chrome/common/metrics/variations/variations_util.cc b/chrome/common/metrics/variations/experiment_labels_win.cc |
| similarity index 43% |
| copy from chrome/common/metrics/variations/variations_util.cc |
| copy to chrome/common/metrics/variations/experiment_labels_win.cc |
| index f6e0399fb43fcb0b2a08cf22462fbd32049c24d9..d8e00bcba8659230d448c498c35a0780ee631341 100644 |
| --- a/chrome/common/metrics/variations/variations_util.cc |
| +++ b/chrome/common/metrics/variations/experiment_labels_win.cc |
| @@ -1,161 +1,102 @@ |
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| -// Use of this source code is governed by a BSD-style license that can be |
| -// found in the LICENSE file. |
| - |
| -#include "chrome/common/metrics/variations/variations_util.h" |
| - |
| -#include <vector> |
| - |
| -#include "base/strings/string16.h" |
| -#include "base/strings/string_number_conversions.h" |
| -#include "base/strings/string_split.h" |
| -#include "base/strings/string_util.h" |
| -#include "base/strings/stringprintf.h" |
| -#include "base/strings/utf_string_conversions.h" |
| -#include "chrome/common/child_process_logging.h" |
| -#include "chrome/common/crash_keys.h" |
| -#include "chrome/installer/util/google_update_experiment_util.h" |
| - |
| -namespace chrome_variations { |
| - |
| -namespace { |
| - |
| -const char kVariationPrefix[] = "CrVar"; |
| -const char kExperimentLabelSep[] = ";"; |
| - |
| -// Populates |name_group_ids| based on |active_groups|. |
| -void GetFieldTrialActiveGroupIdsForActiveGroups( |
| - const base::FieldTrial::ActiveGroups& active_groups, |
| - std::vector<ActiveGroupId>* name_group_ids) { |
| - DCHECK(name_group_ids->empty()); |
| - for (base::FieldTrial::ActiveGroups::const_iterator it = |
| - active_groups.begin(); it != active_groups.end(); ++it) { |
| - name_group_ids->push_back(MakeActiveGroupId(it->trial_name, |
| - it->group_name)); |
| - } |
| -} |
| - |
| -// This method builds a single experiment label for a Chrome Variation, |
| -// including a timestamp that is a year in the future from now. Since multiple |
| -// headers can be transmitted, |count| is a number that is appended after the |
| -// label key to differentiate the labels. |
| -string16 CreateSingleExperimentLabel(int count, VariationID id) { |
| - // Build the parts separately so they can be validated. |
| - const string16 key = |
| - ASCIIToUTF16(kVariationPrefix) + base::IntToString16(count); |
| - DCHECK_LE(key.size(), 8U); |
| - const string16 value = base::IntToString16(id); |
| - DCHECK_LE(value.size(), 8U); |
| - string16 label(key); |
| - label += ASCIIToUTF16("="); |
| - label += value; |
| - label += ASCIIToUTF16("|"); |
| - label += installer::BuildExperimentDateString(); |
| - return label; |
| -} |
| - |
| -} // namespace |
| - |
| -void GetFieldTrialActiveGroupIds( |
| - std::vector<ActiveGroupId>* name_group_ids) { |
| - DCHECK(name_group_ids->empty()); |
| - // A note on thread safety: Since GetActiveFieldTrialGroups() is thread |
| - // safe, and we operate on a separate list of that data, this function is |
| - // technically thread safe as well, with respect to the FieldTrialList data. |
| - base::FieldTrial::ActiveGroups active_groups; |
| - base::FieldTrialList::GetActiveFieldTrialGroups(&active_groups); |
| - GetFieldTrialActiveGroupIdsForActiveGroups(active_groups, |
| - name_group_ids); |
| -} |
| - |
| -void GetFieldTrialActiveGroupIdsAsStrings( |
| - std::vector<std::string>* output) { |
| - DCHECK(output->empty()); |
| - std::vector<ActiveGroupId> name_group_ids; |
| - GetFieldTrialActiveGroupIds(&name_group_ids); |
| - for (size_t i = 0; i < name_group_ids.size(); ++i) { |
| - output->push_back(base::StringPrintf( |
| - "%x-%x", name_group_ids[i].name, name_group_ids[i].group)); |
| - } |
| -} |
| - |
| -void SetChildProcessLoggingVariationList() { |
| - std::vector<std::string> experiment_strings; |
| - GetFieldTrialActiveGroupIdsAsStrings(&experiment_strings); |
| - crash_keys::SetVariationsList(experiment_strings); |
| -} |
| - |
| -string16 BuildGoogleUpdateExperimentLabel( |
| - const base::FieldTrial::ActiveGroups& active_groups) { |
| - string16 experiment_labels; |
| - int counter = 0; |
| - |
| - // Find all currently active VariationIDs associated with Google Update. |
| - for (base::FieldTrial::ActiveGroups::const_iterator it = |
| - active_groups.begin(); it != active_groups.end(); ++it) { |
| - const VariationID id = GetGoogleVariationID(GOOGLE_UPDATE_SERVICE, |
| - it->trial_name, it->group_name); |
| - |
| - if (id == EMPTY_ID) |
| - continue; |
| - |
| - if (!experiment_labels.empty()) |
| - experiment_labels += ASCIIToUTF16(kExperimentLabelSep); |
| - experiment_labels += CreateSingleExperimentLabel(++counter, id); |
| - } |
| - |
| - return experiment_labels; |
| -} |
| - |
| -string16 ExtractNonVariationLabels(const string16& labels) { |
| - const string16 separator = ASCIIToUTF16(kExperimentLabelSep); |
| - string16 non_variation_labels; |
| - |
| - // First, split everything by the label separator. |
| - std::vector<string16> entries; |
| - base::SplitStringUsingSubstr(labels, separator, &entries); |
| - |
| - // For each label, keep the ones that do not look like a Variations label. |
| - for (std::vector<string16>::const_iterator it = entries.begin(); |
| - it != entries.end(); ++it) { |
| - if (it->empty() || StartsWith(*it, ASCIIToUTF16(kVariationPrefix), false)) |
| - continue; |
| - |
| - // Dump the whole thing, including the timestamp. |
| - if (!non_variation_labels.empty()) |
| - non_variation_labels += separator; |
| - non_variation_labels += *it; |
| - } |
| - |
| - return non_variation_labels; |
| -} |
| - |
| -string16 CombineExperimentLabels(const string16& variation_labels, |
| - const string16& other_labels) { |
| - const string16 separator = ASCIIToUTF16(kExperimentLabelSep); |
| - DCHECK(!StartsWith(variation_labels, separator, false)); |
| - DCHECK(!EndsWith(variation_labels, separator, false)); |
| - DCHECK(!StartsWith(other_labels, separator, false)); |
| - DCHECK(!EndsWith(other_labels, separator, false)); |
| - // Note that if either label is empty, a separator is not necessary. |
| - string16 combined_labels = other_labels; |
| - if (!other_labels.empty() && !variation_labels.empty()) |
| - combined_labels += separator; |
| - combined_labels += variation_labels; |
| - return combined_labels; |
| -} |
| - |
| -// Functions below are exposed for testing explicitly behind this namespace. |
| -// They simply wrap existing functions in this file. |
| -namespace testing { |
| - |
| -void TestGetFieldTrialActiveGroupIds( |
| - const base::FieldTrial::ActiveGroups& active_groups, |
| - std::vector<ActiveGroupId>* name_group_ids) { |
| - GetFieldTrialActiveGroupIdsForActiveGroups(active_groups, |
| - name_group_ids); |
| -} |
| - |
| -} // namespace testing |
| - |
| -} // namespace chrome_variations |
| +// Copyright 2013 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "chrome/common/metrics/variations/experiment_labels_win.h" |
| + |
| +#include "base/logging.h" |
| +#include "base/strings/string_number_conversions.h" |
| +#include "base/strings/string_split.h" |
| +#include "base/strings/string_util.h" |
| +#include "chrome/installer/util/google_update_constants.h" |
| +#include "chrome/installer/util/google_update_experiment_util.h" |
| +#include "components/variations/variations_associated_data.h" |
| + |
| +namespace chrome_variations { |
| + |
| +namespace { |
| + |
| +const wchar_t kVariationPrefix[] = L"CrVar"; |
| + |
| +// This method builds a single experiment label for a Chrome Variation, |
| +// including a timestamp that is a year in the future from now. Since multiple |
| +// headers can be transmitted, |count| is a number that is appended after the |
| +// label key to differentiate the labels. |
| +string16 CreateSingleExperimentLabel(int count, VariationID id) { |
| + // Build the parts separately so they can be validated. |
| + const string16 key = kVariationPrefix + base::IntToString16(count); |
| + DCHECK_LE(key.size(), 8U); |
| + const string16 value = base::IntToString16(id); |
| + DCHECK_LE(value.size(), 8U); |
| + string16 label(key); |
| + label += L'='; |
| + label += value; |
| + label += L'|'; |
| + label += installer::BuildExperimentDateString(base::Time::Now()); |
|
Alexei Svitkine (slow)
2013/11/05 23:05:23
Can you make CreateSingleExperimentLabel() take a
gab
2013/11/06 16:39:10
Done.
|
| + return label; |
| +} |
| + |
| +} // namespace |
| + |
| +string16 BuildGoogleUpdateExperimentLabel( |
| + const base::FieldTrial::ActiveGroups& active_groups) { |
| + string16 experiment_labels; |
| + int counter = 0; |
| + |
| + // Find all currently active VariationIDs associated with Google Update. |
| + for (base::FieldTrial::ActiveGroups::const_iterator it = |
| + active_groups.begin(); it != active_groups.end(); ++it) { |
| + const VariationID id = GetGoogleVariationID(GOOGLE_UPDATE_SERVICE, |
| + it->trial_name, it->group_name); |
| + |
| + if (id == EMPTY_ID) |
| + continue; |
| + |
| + if (!experiment_labels.empty()) |
| + experiment_labels += google_update::kExperimentLabelSep; |
| + experiment_labels += CreateSingleExperimentLabel(++counter, id); |
| + } |
| + |
| + return experiment_labels; |
| +} |
| + |
| +string16 ExtractNonVariationLabels(const string16& labels) { |
| + string16 non_variation_labels; |
| + |
| + // First, split everything by the label separator. |
| + std::vector<string16> entries; |
| + base::SplitStringUsingSubstr(labels, google_update::kExperimentLabelSep, |
| + &entries); |
| + |
| + // For each label, keep the ones that do not look like a Variations label. |
| + for (std::vector<string16>::const_iterator it = entries.begin(); |
| + it != entries.end(); ++it) { |
| + if (it->empty() || StartsWith(*it, kVariationPrefix, false)) |
| + continue; |
| + |
| + // Dump the whole thing, including the timestamp. |
| + if (!non_variation_labels.empty()) |
| + non_variation_labels += google_update::kExperimentLabelSep; |
| + non_variation_labels += *it; |
| + } |
| + |
| + return non_variation_labels; |
| +} |
| + |
| +string16 CombineExperimentLabels(const string16& variation_labels, |
| + const string16& other_labels) { |
| + DCHECK(!StartsWith(variation_labels, google_update::kExperimentLabelSep, |
| + false)); |
| + DCHECK(!EndsWith(variation_labels, google_update::kExperimentLabelSep, |
| + false)); |
| + DCHECK(!StartsWith(other_labels, google_update::kExperimentLabelSep, false)); |
| + DCHECK(!EndsWith(other_labels, google_update::kExperimentLabelSep, false)); |
| + // Note that if either label is empty, a separator is not necessary. |
| + string16 combined_labels = other_labels; |
| + if (!other_labels.empty() && !variation_labels.empty()) |
| + combined_labels += google_update::kExperimentLabelSep; |
| + combined_labels += variation_labels; |
| + return combined_labels; |
| +} |
| + |
| +} // namespace chrome_variations |