OLD | NEW |
---|---|
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 "components/variations/service/variations_service.h" | 5 #include "components/variations/service/variations_service.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/base64.h" | 9 #include "base/base64.h" |
10 #include "base/feature_list.h" | 10 #include "base/feature_list.h" |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
76 TestVariationsService( | 76 TestVariationsService( |
77 scoped_ptr<web_resource::TestRequestAllowedNotifier> test_notifier, | 77 scoped_ptr<web_resource::TestRequestAllowedNotifier> test_notifier, |
78 PrefService* local_state) | 78 PrefService* local_state) |
79 : VariationsService(make_scoped_ptr(new TestVariationsServiceClient()), | 79 : VariationsService(make_scoped_ptr(new TestVariationsServiceClient()), |
80 test_notifier.Pass(), | 80 test_notifier.Pass(), |
81 local_state, | 81 local_state, |
82 NULL, | 82 NULL, |
83 UIStringOverrider()), | 83 UIStringOverrider()), |
84 intercepts_fetch_(true), | 84 intercepts_fetch_(true), |
85 fetch_attempted_(false), | 85 fetch_attempted_(false), |
86 seed_stored_(false) { | 86 seed_stored_(false), |
87 delta_compressed_seed_(false), | |
88 gzip_compressed_seed_(false) { | |
87 // Set this so StartRepeatedVariationsSeedFetch can be called in tests. | 89 // Set this so StartRepeatedVariationsSeedFetch can be called in tests. |
88 SetCreateTrialsFromSeedCalledForTesting(true); | 90 SetCreateTrialsFromSeedCalledForTesting(true); |
89 } | 91 } |
90 | 92 |
91 ~TestVariationsService() override {} | 93 ~TestVariationsService() override {} |
92 | 94 |
93 void set_intercepts_fetch(bool value) { | 95 void set_intercepts_fetch(bool value) { |
94 intercepts_fetch_ = value; | 96 intercepts_fetch_ = value; |
95 } | 97 } |
96 | 98 |
97 bool fetch_attempted() const { return fetch_attempted_; } | 99 bool fetch_attempted() const { return fetch_attempted_; } |
98 bool seed_stored() const { return seed_stored_; } | 100 bool seed_stored() const { return seed_stored_; } |
99 const std::string& stored_country() const { return stored_country_; } | 101 const std::string& stored_country() const { return stored_country_; } |
102 bool delta_compressed_seed() const { return delta_compressed_seed_; } | |
103 bool gzip_compressed_seed() const { return gzip_compressed_seed_; } | |
100 | 104 |
101 void DoActualFetch() override { | 105 void DoActualFetch() override { |
102 if (intercepts_fetch_) { | 106 if (intercepts_fetch_) { |
103 fetch_attempted_ = true; | 107 fetch_attempted_ = true; |
104 return; | 108 return; |
105 } | 109 } |
106 | 110 |
107 VariationsService::DoActualFetch(); | 111 VariationsService::DoActualFetch(); |
108 } | 112 } |
109 | 113 |
110 bool StoreSeed(const std::string& seed_data, | 114 bool StoreSeed(const std::string& seed_data, |
111 const std::string& seed_signature, | 115 const std::string& seed_signature, |
112 const std::string& country_code, | 116 const std::string& country_code, |
113 const base::Time& date_fetched, | 117 const base::Time& date_fetched, |
114 bool is_delta_compressed) override { | 118 bool is_delta_compressed, |
119 bool is_gzip_compressed) override { | |
115 seed_stored_ = true; | 120 seed_stored_ = true; |
116 stored_seed_data_ = seed_data; | 121 stored_seed_data_ = seed_data; |
117 stored_country_ = country_code; | 122 stored_country_ = country_code; |
123 delta_compressed_seed_ = is_delta_compressed; | |
124 gzip_compressed_seed_ = is_gzip_compressed; | |
118 return true; | 125 return true; |
119 } | 126 } |
120 | 127 |
121 private: | 128 private: |
122 bool LoadSeed(VariationsSeed* seed) override { | 129 bool LoadSeed(VariationsSeed* seed) override { |
123 if (!seed_stored_) | 130 if (!seed_stored_) |
124 return false; | 131 return false; |
125 return seed->ParseFromString(stored_seed_data_); | 132 return seed->ParseFromString(stored_seed_data_); |
126 } | 133 } |
127 | 134 |
128 bool intercepts_fetch_; | 135 bool intercepts_fetch_; |
129 bool fetch_attempted_; | 136 bool fetch_attempted_; |
130 bool seed_stored_; | 137 bool seed_stored_; |
131 std::string stored_seed_data_; | 138 std::string stored_seed_data_; |
132 std::string stored_country_; | 139 std::string stored_country_; |
140 bool delta_compressed_seed_; | |
141 bool gzip_compressed_seed_; | |
133 | 142 |
134 DISALLOW_COPY_AND_ASSIGN(TestVariationsService); | 143 DISALLOW_COPY_AND_ASSIGN(TestVariationsService); |
135 }; | 144 }; |
136 | 145 |
137 class TestVariationsServiceObserver : public VariationsService::Observer { | 146 class TestVariationsServiceObserver : public VariationsService::Observer { |
138 public: | 147 public: |
139 TestVariationsServiceObserver() | 148 TestVariationsServiceObserver() |
140 : best_effort_changes_notified_(0), | 149 : best_effort_changes_notified_(0), |
141 crticial_changes_notified_(0) { | 150 crticial_changes_notified_(0) { |
142 } | 151 } |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
194 } | 203 } |
195 | 204 |
196 // Serializes |seed| to protobuf binary format. | 205 // Serializes |seed| to protobuf binary format. |
197 std::string SerializeSeed(const variations::VariationsSeed& seed) { | 206 std::string SerializeSeed(const variations::VariationsSeed& seed) { |
198 std::string serialized_seed; | 207 std::string serialized_seed; |
199 seed.SerializeToString(&serialized_seed); | 208 seed.SerializeToString(&serialized_seed); |
200 return serialized_seed; | 209 return serialized_seed; |
201 } | 210 } |
202 | 211 |
203 // Simulates a variations service response by setting a date header and the | 212 // Simulates a variations service response by setting a date header and the |
204 // specified HTTP |response_code| on |fetcher|. | 213 // specified HTTP |response_code| on |fetcher|. Sets additional header |header| |
214 // if it is not NULL. | |
Alexei Svitkine (slow)
2015/10/15 20:30:26
Nit: For new code, in code use "nullptr", and in c
veranika
2015/10/15 22:10:38
Done.
| |
205 scoped_refptr<net::HttpResponseHeaders> SimulateServerResponse( | 215 scoped_refptr<net::HttpResponseHeaders> SimulateServerResponse( |
206 int response_code, | 216 int response_code, |
207 net::TestURLFetcher* fetcher) { | 217 net::TestURLFetcher* fetcher, |
218 const std::string* header = NULL) { | |
208 EXPECT_TRUE(fetcher); | 219 EXPECT_TRUE(fetcher); |
209 scoped_refptr<net::HttpResponseHeaders> headers( | 220 scoped_refptr<net::HttpResponseHeaders> headers( |
210 new net::HttpResponseHeaders("date:Wed, 13 Feb 2013 00:25:24 GMT\0\0")); | 221 new net::HttpResponseHeaders("date:Wed, 13 Feb 2013 00:25:24 GMT\0\0")); |
222 if (header) | |
223 headers->AddHeader(*header); | |
211 fetcher->set_response_headers(headers); | 224 fetcher->set_response_headers(headers); |
212 fetcher->set_response_code(response_code); | 225 fetcher->set_response_code(response_code); |
213 return headers; | 226 return headers; |
214 } | 227 } |
215 | 228 |
216 // Converts |list_value| to a string, to make it easier for debugging. | 229 // Converts |list_value| to a string, to make it easier for debugging. |
217 std::string ListValueToString(const base::ListValue& list_value) { | 230 std::string ListValueToString(const base::ListValue& list_value) { |
218 std::string json; | 231 std::string json; |
219 JSONStringValueSerializer serializer(&json); | 232 JSONStringValueSerializer serializer(&json); |
220 serializer.set_pretty_print(true); | 233 serializer.set_pretty_print(true); |
(...skipping 25 matching lines...) Expand all Loading... | |
246 // this test. | 259 // this test. |
247 base::FieldTrialList field_trial_list(nullptr); | 260 base::FieldTrialList field_trial_list(nullptr); |
248 | 261 |
249 // Create a variations service. | 262 // Create a variations service. |
250 TestVariationsService service( | 263 TestVariationsService service( |
251 make_scoped_ptr(new web_resource::TestRequestAllowedNotifier(&prefs)), | 264 make_scoped_ptr(new web_resource::TestRequestAllowedNotifier(&prefs)), |
252 &prefs); | 265 &prefs); |
253 | 266 |
254 // Store a seed. | 267 // Store a seed. |
255 service.StoreSeed(SerializeSeed(CreateTestSeed()), std::string(), | 268 service.StoreSeed(SerializeSeed(CreateTestSeed()), std::string(), |
256 std::string(), base::Time::Now(), false); | 269 std::string(), base::Time::Now(), false, false); |
257 prefs.SetInt64(prefs::kVariationsLastFetchTime, | 270 prefs.SetInt64(prefs::kVariationsLastFetchTime, |
258 base::Time::Now().ToInternalValue()); | 271 base::Time::Now().ToInternalValue()); |
259 | 272 |
260 // Check that field trials are created from the seed. Since the test study has | 273 // Check that field trials are created from the seed. Since the test study has |
261 // only 1 experiment with 100% probability weight, we must be part of it. | 274 // only 1 experiment with 100% probability weight, we must be part of it. |
262 EXPECT_TRUE(service.CreateTrialsFromSeed(base::FeatureList::GetInstance())); | 275 EXPECT_TRUE(service.CreateTrialsFromSeed(base::FeatureList::GetInstance())); |
263 EXPECT_EQ(base::FieldTrialList::FindFullName(kTestSeedStudyName), | 276 EXPECT_EQ(base::FieldTrialList::FindFullName(kTestSeedStudyName), |
264 kTestSeedExperimentName); | 277 kTestSeedExperimentName); |
265 } | 278 } |
266 | 279 |
(...skipping 10 matching lines...) Expand all Loading... | |
277 base::FieldTrialList field_trial_list(nullptr); | 290 base::FieldTrialList field_trial_list(nullptr); |
278 | 291 |
279 // Create a variations service | 292 // Create a variations service |
280 TestVariationsService service( | 293 TestVariationsService service( |
281 make_scoped_ptr(new web_resource::TestRequestAllowedNotifier(&prefs)), | 294 make_scoped_ptr(new web_resource::TestRequestAllowedNotifier(&prefs)), |
282 &prefs); | 295 &prefs); |
283 | 296 |
284 // Store a seed. To simulate a first run, |prefs::kVariationsLastFetchTime| | 297 // Store a seed. To simulate a first run, |prefs::kVariationsLastFetchTime| |
285 // is left empty. | 298 // is left empty. |
286 service.StoreSeed(SerializeSeed(CreateTestSeed()), std::string(), | 299 service.StoreSeed(SerializeSeed(CreateTestSeed()), std::string(), |
287 std::string(), base::Time::Now(), false); | 300 std::string(), base::Time::Now(), false, false); |
288 EXPECT_EQ(0, prefs.GetInt64(prefs::kVariationsLastFetchTime)); | 301 EXPECT_EQ(0, prefs.GetInt64(prefs::kVariationsLastFetchTime)); |
289 | 302 |
290 // Check that field trials are created from the seed. Since the test study has | 303 // Check that field trials are created from the seed. Since the test study has |
291 // only 1 experiment with 100% probability weight, we must be part of it. | 304 // only 1 experiment with 100% probability weight, we must be part of it. |
292 EXPECT_TRUE(service.CreateTrialsFromSeed(base::FeatureList::GetInstance())); | 305 EXPECT_TRUE(service.CreateTrialsFromSeed(base::FeatureList::GetInstance())); |
293 EXPECT_EQ(base::FieldTrialList::FindFullName(kTestSeedStudyName), | 306 EXPECT_EQ(base::FieldTrialList::FindFullName(kTestSeedStudyName), |
294 kTestSeedExperimentName); | 307 kTestSeedExperimentName); |
295 } | 308 } |
296 | 309 |
297 TEST_F(VariationsServiceTest, CreateTrialsFromOutdatedSeed) { | 310 TEST_F(VariationsServiceTest, CreateTrialsFromOutdatedSeed) { |
(...skipping 10 matching lines...) Expand all Loading... | |
308 | 321 |
309 // Create a variations service. | 322 // Create a variations service. |
310 TestVariationsService service( | 323 TestVariationsService service( |
311 make_scoped_ptr(new web_resource::TestRequestAllowedNotifier(&prefs)), | 324 make_scoped_ptr(new web_resource::TestRequestAllowedNotifier(&prefs)), |
312 &prefs); | 325 &prefs); |
313 | 326 |
314 // Store a seed, with a fetch time 31 days in the past. | 327 // Store a seed, with a fetch time 31 days in the past. |
315 const base::Time seed_date = | 328 const base::Time seed_date = |
316 base::Time::Now() - base::TimeDelta::FromDays(31); | 329 base::Time::Now() - base::TimeDelta::FromDays(31); |
317 service.StoreSeed(SerializeSeed(CreateTestSeed()), std::string(), | 330 service.StoreSeed(SerializeSeed(CreateTestSeed()), std::string(), |
318 std::string(), seed_date, false); | 331 std::string(), seed_date, false, false); |
319 prefs.SetInt64(prefs::kVariationsLastFetchTime, seed_date.ToInternalValue()); | 332 prefs.SetInt64(prefs::kVariationsLastFetchTime, seed_date.ToInternalValue()); |
320 | 333 |
321 // Check that field trials are not created from the seed. | 334 // Check that field trials are not created from the seed. |
322 EXPECT_FALSE(service.CreateTrialsFromSeed(base::FeatureList::GetInstance())); | 335 EXPECT_FALSE(service.CreateTrialsFromSeed(base::FeatureList::GetInstance())); |
323 EXPECT_TRUE(base::FieldTrialList::FindFullName(kTestSeedStudyName).empty()); | 336 EXPECT_TRUE(base::FieldTrialList::FindFullName(kTestSeedStudyName).empty()); |
324 } | 337 } |
325 | 338 |
326 TEST_F(VariationsServiceTest, GetVariationsServerURL) { | 339 TEST_F(VariationsServiceTest, GetVariationsServerURL) { |
327 TestingPrefServiceSimple prefs; | 340 TestingPrefServiceSimple prefs; |
328 VariationsService::RegisterPrefs(prefs.registry()); | 341 VariationsService::RegisterPrefs(prefs.registry()); |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
462 EXPECT_TRUE(prefs.FindPreference(prefs::kVariationsSeed)->IsDefaultValue()); | 475 EXPECT_TRUE(prefs.FindPreference(prefs::kVariationsSeed)->IsDefaultValue()); |
463 | 476 |
464 net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); | 477 net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); |
465 SimulateServerResponse(non_ok_status_codes[i], fetcher); | 478 SimulateServerResponse(non_ok_status_codes[i], fetcher); |
466 service.OnURLFetchComplete(fetcher); | 479 service.OnURLFetchComplete(fetcher); |
467 | 480 |
468 EXPECT_TRUE(prefs.FindPreference(prefs::kVariationsSeed)->IsDefaultValue()); | 481 EXPECT_TRUE(prefs.FindPreference(prefs::kVariationsSeed)->IsDefaultValue()); |
469 } | 482 } |
470 } | 483 } |
471 | 484 |
485 TEST_F(VariationsServiceTest, RequestGzipCompressedSeed) { | |
486 TestingPrefServiceSimple prefs; | |
487 VariationsService::RegisterPrefs(prefs.registry()); | |
488 net::TestURLFetcherFactory factory; | |
489 | |
490 TestVariationsService service( | |
491 make_scoped_ptr(new web_resource::TestRequestAllowedNotifier(&prefs)), | |
492 &prefs); | |
493 service.variations_server_url_ = | |
494 service.GetVariationsServerURL(&prefs, std::string()); | |
495 service.set_intercepts_fetch(false); | |
496 service.DoActualFetch(); | |
497 | |
498 net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); | |
499 net::HttpRequestHeaders headers; | |
500 fetcher->GetExtraRequestHeaders(&headers); | |
501 std::string field; | |
502 ASSERT_TRUE(headers.GetHeader("A-IM", &field)); | |
503 EXPECT_EQ("gzip", field); | |
504 } | |
505 | |
506 TEST_F(VariationsServiceTest, InstanceManipulations) { | |
507 struct { | |
508 std::string im; | |
509 bool delta_compressed; | |
510 bool gzip_compressed; | |
511 bool seed_stored; | |
512 } cases[] = { | |
513 {"", false, false, true}, | |
514 {"IM:gzip", false, true, true}, | |
515 {"IM:x-bm", true, false, true}, | |
516 {"IM:x-bm,gzip", true, true, true}, | |
517 {"IM: x-bm, gzip", true, true, true}, | |
518 {"IM:gzip,x-bm", false, false, false}, | |
519 {"IM:deflate,x-bm,gzip", false, false, false}, | |
520 }; | |
521 | |
522 TestingPrefServiceSimple prefs; | |
523 VariationsService::RegisterPrefs(prefs.registry()); | |
524 std::string serialized_seed = SerializeSeed(CreateTestSeed()); | |
525 net::TestURLFetcherFactory factory; | |
526 | |
527 for (size_t i = 0; i < arraysize(cases); ++i) { | |
528 TestVariationsService service( | |
529 make_scoped_ptr(new web_resource::TestRequestAllowedNotifier(&prefs)), | |
530 &prefs); | |
531 service.variations_server_url_ = | |
532 service.GetVariationsServerURL(&prefs, std::string()); | |
533 service.set_intercepts_fetch(false); | |
534 service.DoActualFetch(); | |
535 net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); | |
536 | |
537 if (cases[i].im.empty()) | |
538 SimulateServerResponse(net::HTTP_OK, fetcher); | |
539 else | |
540 SimulateServerResponse(net::HTTP_OK, fetcher, &cases[i].im); | |
541 fetcher->SetResponseString(serialized_seed); | |
542 service.OnURLFetchComplete(fetcher); | |
543 | |
544 EXPECT_EQ(cases[i].seed_stored, service.seed_stored()); | |
545 EXPECT_EQ(cases[i].delta_compressed, service.delta_compressed_seed()); | |
546 EXPECT_EQ(cases[i].gzip_compressed, service.gzip_compressed_seed()); | |
547 } | |
548 } | |
549 | |
472 TEST_F(VariationsServiceTest, CountryHeader) { | 550 TEST_F(VariationsServiceTest, CountryHeader) { |
473 TestingPrefServiceSimple prefs; | 551 TestingPrefServiceSimple prefs; |
474 VariationsService::RegisterPrefs(prefs.registry()); | 552 VariationsService::RegisterPrefs(prefs.registry()); |
475 | 553 |
476 TestVariationsService service( | 554 TestVariationsService service( |
477 make_scoped_ptr(new web_resource::TestRequestAllowedNotifier(&prefs)), | 555 make_scoped_ptr(new web_resource::TestRequestAllowedNotifier(&prefs)), |
478 &prefs); | 556 &prefs); |
479 service.variations_server_url_ = | 557 service.variations_server_url_ = |
480 service.GetVariationsServerURL(&prefs, std::string()); | 558 service.GetVariationsServerURL(&prefs, std::string()); |
481 service.set_intercepts_fetch(false); | 559 service.set_intercepts_fetch(false); |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
638 << test.pref_value_before << ", " << test.version << ", " | 716 << test.pref_value_before << ", " << test.version << ", " |
639 << test.latest_country_code; | 717 << test.latest_country_code; |
640 | 718 |
641 histogram_tester.ExpectUniqueSample( | 719 histogram_tester.ExpectUniqueSample( |
642 "Variations.LoadPermanentConsistencyCountryResult", | 720 "Variations.LoadPermanentConsistencyCountryResult", |
643 test.expected_result, 1); | 721 test.expected_result, 1); |
644 } | 722 } |
645 } | 723 } |
646 | 724 |
647 } // namespace variations | 725 } // namespace variations |
OLD | NEW |