OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "chrome/common/metrics/variations/experiment_labels.h" | |
6 | |
7 #include "base/logging.h" | |
8 #include "base/strings/string_number_conversions.h" | |
9 #include "base/strings/string_split.h" | |
10 #include "base/strings/string_util.h" | |
11 #include "base/strings/utf_string_conversions.h" | |
12 #include "chrome/installer/util/google_update_experiment_util.h" | |
13 #include "components/variations/variations_associated_data.h" | |
14 | |
15 namespace chrome_variations { | |
16 | |
17 namespace { | |
18 | |
19 const char kVariationPrefix[] = "CrVar"; | |
20 | |
21 // This method builds a single experiment label for a Chrome Variation, | |
22 // including a timestamp that is a year in the future from |current_time|. Since | |
23 // multiple headers can be transmitted, |count| is a number that is appended | |
24 // after the label key to differentiate the labels. | |
25 base::string16 CreateSingleExperimentLabel(int count, VariationID id, | |
26 const base::Time& current_time) { | |
27 // Build the parts separately so they can be validated. | |
28 const base::string16 key = | |
29 base::ASCIIToUTF16(kVariationPrefix) + base::IntToString16(count); | |
30 DCHECK_LE(key.size(), 8U); | |
31 const base::string16 value = base::IntToString16(id); | |
32 DCHECK_LE(value.size(), 8U); | |
33 base::string16 label(key); | |
34 label += base::ASCIIToUTF16("="); | |
35 label += value; | |
36 label += base::ASCIIToUTF16("|"); | |
37 label += installer::BuildExperimentDateString(current_time); | |
38 return label; | |
39 } | |
40 | |
41 } // namespace | |
42 | |
43 base::string16 BuildGoogleUpdateExperimentLabel( | |
44 const base::FieldTrial::ActiveGroups& active_groups) { | |
45 base::string16 experiment_labels; | |
46 int counter = 0; | |
47 | |
48 const base::Time current_time(base::Time::Now()); | |
49 | |
50 // Find all currently active VariationIDs associated with Google Update. | |
51 for (base::FieldTrial::ActiveGroups::const_iterator it = | |
52 active_groups.begin(); it != active_groups.end(); ++it) { | |
53 const VariationID id = GetGoogleVariationID(GOOGLE_UPDATE_SERVICE, | |
54 it->trial_name, it->group_name); | |
55 | |
56 if (id == EMPTY_ID) | |
57 continue; | |
58 | |
59 if (!experiment_labels.empty()) { | |
60 experiment_labels += | |
61 base::ASCIIToUTF16(google_update::kExperimentLabelSep); | |
62 } | |
63 experiment_labels += CreateSingleExperimentLabel(++counter, id, | |
64 current_time); | |
65 } | |
66 | |
67 return experiment_labels; | |
68 } | |
69 | |
70 base::string16 ExtractNonVariationLabels(const base::string16& labels) { | |
71 const base::string16 separator = | |
72 base::ASCIIToUTF16(google_update::kExperimentLabelSep); | |
73 base::string16 non_variation_labels; | |
74 | |
75 // First, split everything by the label separator. | |
76 std::vector<base::string16> entries; | |
77 base::SplitStringUsingSubstr(labels, separator, &entries); | |
78 | |
79 // For each label, keep the ones that do not look like a Variations label. | |
80 for (std::vector<base::string16>::const_iterator it = entries.begin(); | |
81 it != entries.end(); ++it) { | |
82 if (it->empty() || | |
83 StartsWith(*it, base::ASCIIToUTF16(kVariationPrefix), false)) { | |
84 continue; | |
85 } | |
86 | |
87 // Dump the whole thing, including the timestamp. | |
88 if (!non_variation_labels.empty()) | |
89 non_variation_labels += separator; | |
90 non_variation_labels += *it; | |
91 } | |
92 | |
93 return non_variation_labels; | |
94 } | |
95 | |
96 base::string16 CombineExperimentLabels(const base::string16& variation_labels, | |
97 const base::string16& other_labels) { | |
98 const base::string16 separator = | |
99 base::ASCIIToUTF16(google_update::kExperimentLabelSep); | |
100 DCHECK(!StartsWith(variation_labels, separator, false)); | |
101 DCHECK(!EndsWith(variation_labels, separator, false)); | |
102 DCHECK(!StartsWith(other_labels, separator, false)); | |
103 DCHECK(!EndsWith(other_labels, separator, false)); | |
104 // Note that if either label is empty, a separator is not necessary. | |
105 base::string16 combined_labels = other_labels; | |
106 if (!other_labels.empty() && !variation_labels.empty()) | |
107 combined_labels += separator; | |
108 combined_labels += variation_labels; | |
109 return combined_labels; | |
110 } | |
111 | |
112 } // namespace chrome_variations | |
OLD | NEW |