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

Side by Side Diff: chrome/browser/metrics/variations_service_unittest.cc

Issue 10576003: VariationsService now supports wildcard in min/max version (Closed) Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: addressed brettw's comment Created 8 years, 5 months 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 | Annotate | Revision Log
« no previous file with comments | « chrome/browser/metrics/variations_service.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "chrome/browser/metrics/proto/study.pb.h" 5 #include "chrome/browser/metrics/proto/study.pb.h"
6 #include "chrome/browser/metrics/variations_service.h" 6 #include "chrome/browser/metrics/variations_service.h"
7 #include "chrome/common/chrome_version_info.h" 7 #include "chrome/common/chrome_version_info.h"
8 #include "testing/gtest/include/gtest/gtest.h" 8 #include "testing/gtest/include/gtest/gtest.h"
9 9
10 namespace { 10 namespace {
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
123 const char* min_version; 123 const char* min_version;
124 const char* version; 124 const char* version;
125 bool expected_result; 125 bool expected_result;
126 } min_test_cases[] = { 126 } min_test_cases[] = {
127 { "1.2.2", "1.2.3", true }, 127 { "1.2.2", "1.2.3", true },
128 { "1.2.3", "1.2.3", true }, 128 { "1.2.3", "1.2.3", true },
129 { "1.2.4", "1.2.3", false }, 129 { "1.2.4", "1.2.3", false },
130 { "1.3.2", "1.2.3", false }, 130 { "1.3.2", "1.2.3", false },
131 { "2.1.2", "1.2.3", false }, 131 { "2.1.2", "1.2.3", false },
132 { "0.3.4", "1.2.3", true }, 132 { "0.3.4", "1.2.3", true },
133 // Wildcards.
134 { "1.*", "1.2.3", true },
135 { "1.2.*", "1.2.3", true },
136 { "1.2.3.*", "1.2.3", true },
137 { "1.2.4.*", "1.2.3", false },
138 { "2.*", "1.2.3", false },
139 { "0.3.*", "1.2.3", true },
133 }; 140 };
134 141
135 const struct { 142 const struct {
136 const char* max_version; 143 const char* max_version;
137 const char* version; 144 const char* version;
138 bool expected_result; 145 bool expected_result;
139 } max_test_cases[] = { 146 } max_test_cases[] = {
140 { "1.2.2", "1.2.3", false }, 147 { "1.2.2", "1.2.3", false },
141 { "1.2.3", "1.2.3", true }, 148 { "1.2.3", "1.2.3", true },
142 { "1.2.4", "1.2.3", true }, 149 { "1.2.4", "1.2.3", true },
143 { "2.1.1", "1.2.3", true }, 150 { "2.1.1", "1.2.3", true },
144 { "2.1.1", "2.3.4", false }, 151 { "2.1.1", "2.3.4", false },
152 // Wildcards
153 { "2.1.*", "2.3.4", false },
154 { "2.*", "2.3.4", true },
155 { "2.3.*", "2.3.4", true },
156 { "2.3.4.*", "2.3.4", true },
157 { "2.3.4.0.*", "2.3.4", true },
158 { "2.4.*", "2.3.4", true },
159 { "1.3.*", "2.3.4", false },
160 { "1.*", "2.3.4", false },
145 }; 161 };
146 162
147 chrome_variations::Study_Filter filter; 163 chrome_variations::Study_Filter filter;
148 164
149 // Min/max version not set should result in true. 165 // Min/max version not set should result in true.
150 EXPECT_TRUE(VariationsService::CheckStudyVersion(filter, "1.2.3")); 166 EXPECT_TRUE(VariationsService::CheckStudyVersion(filter, "1.2.3"));
151 167
152 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(min_test_cases); ++i) { 168 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(min_test_cases); ++i) {
153 filter.set_min_version(min_test_cases[i].min_version); 169 filter.set_min_version(min_test_cases[i].min_version);
154 const bool result = 170 const bool result =
155 VariationsService::CheckStudyVersion(filter, min_test_cases[i].version); 171 VariationsService::CheckStudyVersion(filter, min_test_cases[i].version);
156 EXPECT_EQ(min_test_cases[i].expected_result, result) << 172 EXPECT_EQ(min_test_cases[i].expected_result, result) <<
157 "Case " << i << " failed!"; 173 "Min. version case " << i << " failed!";
158 } 174 }
159 filter.clear_min_version(); 175 filter.clear_min_version();
160 176
161 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(max_test_cases); ++i) { 177 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(max_test_cases); ++i) {
162 filter.set_max_version(max_test_cases[i].max_version); 178 filter.set_max_version(max_test_cases[i].max_version);
163 const bool result = 179 const bool result =
164 VariationsService::CheckStudyVersion(filter, max_test_cases[i].version); 180 VariationsService::CheckStudyVersion(filter, max_test_cases[i].version);
165 EXPECT_EQ(max_test_cases[i].expected_result, result) << 181 EXPECT_EQ(max_test_cases[i].expected_result, result) <<
166 "Case " << i << " failed!"; 182 "Max version case " << i << " failed!";
167 } 183 }
168 184
169 // Check intersection semantics. 185 // Check intersection semantics.
170 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(min_test_cases); ++i) { 186 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(min_test_cases); ++i) {
171 for (size_t j = 0; j < ARRAYSIZE_UNSAFE(max_test_cases); ++j) { 187 for (size_t j = 0; j < ARRAYSIZE_UNSAFE(max_test_cases); ++j) {
172 filter.set_min_version(min_test_cases[i].min_version); 188 filter.set_min_version(min_test_cases[i].min_version);
173 filter.set_max_version(max_test_cases[j].max_version); 189 filter.set_max_version(max_test_cases[j].max_version);
174 190
175 if (!min_test_cases[i].expected_result) { 191 if (!min_test_cases[i].expected_result) {
176 const bool result = 192 const bool result =
177 VariationsService::CheckStudyVersion(filter, 193 VariationsService::CheckStudyVersion(filter,
178 min_test_cases[i].version); 194 min_test_cases[i].version);
179 EXPECT_FALSE(result) << "Case " << i << "," << j << " failed!"; 195 EXPECT_FALSE(result) << "Case " << i << "," << j << " failed!";
180 } 196 }
181 197
182 if (!max_test_cases[j].expected_result) { 198 if (!max_test_cases[j].expected_result) {
183 const bool result = 199 const bool result =
184 VariationsService::CheckStudyVersion(filter, 200 VariationsService::CheckStudyVersion(filter,
185 max_test_cases[j].version); 201 max_test_cases[j].version);
186 EXPECT_FALSE(result) << "Case " << i << "," << j << " failed!"; 202 EXPECT_FALSE(result) << "Case " << i << "," << j << " failed!";
187 } 203 }
188 } 204 }
189 } 205 }
190 } 206 }
191 207
192 // The current client logic does not handle version number strings containing
193 // wildcards. Check that any such values received from the server result in the
194 // study being disqualified.
195 TEST(VariationsServiceTest, CheckStudyVersionWildcards) {
196 chrome_variations::Study_Filter filter;
197
198 filter.set_min_version("1.0.*");
199 EXPECT_FALSE(VariationsService::CheckStudyVersion(filter, "1.2.3"));
200
201 filter.clear_min_version();
202 filter.set_max_version("2.0.*");
203 EXPECT_FALSE(VariationsService::CheckStudyVersion(filter, "1.2.3"));
204 }
205
206 TEST(VariationsServiceTest, CheckStudyStartDate) { 208 TEST(VariationsServiceTest, CheckStudyStartDate) {
207 const base::Time now = base::Time::Now(); 209 const base::Time now = base::Time::Now();
208 const base::TimeDelta delta = base::TimeDelta::FromHours(1); 210 const base::TimeDelta delta = base::TimeDelta::FromHours(1);
209 const struct { 211 const struct {
210 const base::Time start_date; 212 const base::Time start_date;
211 bool expected_result; 213 bool expected_result;
212 } start_test_cases[] = { 214 } start_test_cases[] = {
213 { now - delta, true }, 215 { now - delta, true },
214 { now, true }, 216 { now, true },
215 { now + delta, false }, 217 { now + delta, false },
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
264 chrome_variations::Study_Experiment* default_group = study.add_experiment(); 266 chrome_variations::Study_Experiment* default_group = study.add_experiment();
265 default_group->set_name("def"); 267 default_group->set_name("def");
266 default_group->set_probability_weight(200); 268 default_group->set_probability_weight(200);
267 269
268 base::FieldTrial::Probability total_probability = 0; 270 base::FieldTrial::Probability total_probability = 0;
269 bool valid = VariationsService::ValidateStudyAndComputeTotalProbability( 271 bool valid = VariationsService::ValidateStudyAndComputeTotalProbability(
270 study, &total_probability); 272 study, &total_probability);
271 EXPECT_TRUE(valid); 273 EXPECT_TRUE(valid);
272 EXPECT_EQ(300, total_probability); 274 EXPECT_EQ(300, total_probability);
273 275
276 // Min version checks.
277 study.mutable_filter()->set_min_version("1.2.3.*");
278 valid = VariationsService::ValidateStudyAndComputeTotalProbability(
279 study, &total_probability);
280 EXPECT_TRUE(valid);
281 study.mutable_filter()->set_min_version("1.*.3");
282 valid = VariationsService::ValidateStudyAndComputeTotalProbability(
283 study, &total_probability);
284 EXPECT_FALSE(valid);
285 study.mutable_filter()->set_min_version("1.2.3");
286 valid = VariationsService::ValidateStudyAndComputeTotalProbability(
287 study, &total_probability);
288 EXPECT_TRUE(valid);
289
290 // Max version checks.
291 study.mutable_filter()->set_max_version("2.3.4.*");
292 valid = VariationsService::ValidateStudyAndComputeTotalProbability(
293 study, &total_probability);
294 EXPECT_TRUE(valid);
295 study.mutable_filter()->set_max_version("*.3");
296 valid = VariationsService::ValidateStudyAndComputeTotalProbability(
297 study, &total_probability);
298 EXPECT_FALSE(valid);
299 study.mutable_filter()->set_max_version("2.3.4");
300 valid = VariationsService::ValidateStudyAndComputeTotalProbability(
301 study, &total_probability);
302 EXPECT_TRUE(valid);
303
274 study.clear_default_experiment_name(); 304 study.clear_default_experiment_name();
275 valid = VariationsService::ValidateStudyAndComputeTotalProbability(study, 305 valid = VariationsService::ValidateStudyAndComputeTotalProbability(study,
276 &total_probability); 306 &total_probability);
277 EXPECT_FALSE(valid); 307 EXPECT_FALSE(valid);
278 308
279 study.set_default_experiment_name("xyz"); 309 study.set_default_experiment_name("xyz");
280 valid = VariationsService::ValidateStudyAndComputeTotalProbability(study, 310 valid = VariationsService::ValidateStudyAndComputeTotalProbability(study,
281 &total_probability); 311 &total_probability);
282 EXPECT_FALSE(valid); 312 EXPECT_FALSE(valid);
283 313
284 study.set_default_experiment_name("def"); 314 study.set_default_experiment_name("def");
285 default_group->clear_name(); 315 default_group->clear_name();
286 valid = VariationsService::ValidateStudyAndComputeTotalProbability(study, 316 valid = VariationsService::ValidateStudyAndComputeTotalProbability(study,
287 &total_probability); 317 &total_probability);
288 EXPECT_FALSE(valid); 318 EXPECT_FALSE(valid);
289 319
290 default_group->set_name("def"); 320 default_group->set_name("def");
291 valid = VariationsService::ValidateStudyAndComputeTotalProbability(study, 321 valid = VariationsService::ValidateStudyAndComputeTotalProbability(study,
292 &total_probability); 322 &total_probability);
293 ASSERT_TRUE(valid); 323 ASSERT_TRUE(valid);
294 chrome_variations::Study_Experiment* repeated_group = study.add_experiment(); 324 chrome_variations::Study_Experiment* repeated_group = study.add_experiment();
295 repeated_group->set_name("abc"); 325 repeated_group->set_name("abc");
296 repeated_group->set_probability_weight(1); 326 repeated_group->set_probability_weight(1);
297 valid = VariationsService::ValidateStudyAndComputeTotalProbability(study, 327 valid = VariationsService::ValidateStudyAndComputeTotalProbability(study,
298 &total_probability); 328 &total_probability);
299 EXPECT_FALSE(valid); 329 EXPECT_FALSE(valid);
300 } 330 }
OLDNEW
« no previous file with comments | « chrome/browser/metrics/variations_service.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698