15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chrome/browser/metrics/variations/variations_service.h" 6558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector> 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base64.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/testing_pref_service.h" 117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/sha1.h" 127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/strings/string_number_conversions.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/web_resource/resource_request_allowed_notifier_test_util.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h" 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/test/base/testing_pref_service_syncable.h" 18424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "components/variations/proto/study.pb.h" 1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "components/variations/proto/variations_seed.pb.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h" 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/base/url_util.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/http/http_response_headers.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/http/http_status_code.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/url_request/test_url_fetcher_factory.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS) 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h" 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/device_settings_service.h" 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/stub_cros_settings_provider.h" 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chrome_variations { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A test class used to validate expected functionality in VariationsService. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestVariationsService : public VariationsService { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestVariationsService(TestRequestAllowedNotifier* test_notifier, 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PrefService* local_state) 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : VariationsService(test_notifier, local_state, NULL), 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) intercepts_fetch_(true), 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) fetch_attempted_(false), 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) seed_stored_(false) { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set this so StartRepeatedVariationsSeedFetch can be called in tests. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetCreateTrialsFromSeedCalledForTesting(true); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestVariationsService() { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void set_intercepts_fetch(bool value) { 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) intercepts_fetch_ = value; 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool fetch_attempted() const { return fetch_attempted_; } 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool seed_stored() const { return seed_stored_; } 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DoActualFetch() OVERRIDE { 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (intercepts_fetch_) { 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) fetch_attempted_ = true; 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) VariationsService::DoActualFetch(); 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) protected: 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void StoreSeed(const std::string& seed_data, 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& seed_signature, 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::Time& date_fetched) OVERRIDE { 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) seed_stored_ = true; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool intercepts_fetch_; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool fetch_attempted_; 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool seed_stored_; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestVariationsService); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass TestVariationsServiceObserver : public VariationsService::Observer { 86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public: 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TestVariationsServiceObserver() 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : best_effort_changes_notified_(0), 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch crticial_changes_notified_(0) { 90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual ~TestVariationsServiceObserver() { 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void OnExperimentChangesDetected(Severity severity) OVERRIDE { 95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch switch (severity) { 96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case BEST_EFFORT: 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ++best_effort_changes_notified_; 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case CRITICAL: 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ++crticial_changes_notified_; 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int best_effort_changes_notified() const { 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return best_effort_changes_notified_; 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int crticial_changes_notified() const { 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return crticial_changes_notified_; 111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private: 114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Number of notification received with BEST_EFFORT severity. 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int best_effort_changes_notified_; 116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Number of notification received with CRITICAL severity. 118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int crticial_changes_notified_; 119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DISALLOW_COPY_AND_ASSIGN(TestVariationsServiceObserver); 121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}; 122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Populates |seed| with simple test data. The resulting seed will contain one 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// study called "test", which contains one experiment called "abc" with 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// probability weight 100. |seed|'s study field will be cleared before adding 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the new study. 1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)variations::VariationsSeed CreateTestSeed() { 1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) variations::VariationsSeed seed; 1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) variations::Study* study = seed.add_study(); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) study->set_name("test"); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) study->set_default_experiment_name("abc"); 1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) variations::Study_Experiment* experiment = study->add_experiment(); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) experiment->set_name("abc"); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) experiment->set_probability_weight(100); 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) seed.set_serial_number("123"); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return seed; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Serializes |seed| to protobuf binary format. 1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)std::string SerializeSeed(const variations::VariationsSeed& seed) { 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string serialized_seed; 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) seed.SerializeToString(&serialized_seed); 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return serialized_seed; 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Simulates a variations service response by setting a date header and the 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// specified HTTP |response_code| on |fetcher|. 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SimulateServerResponse(int response_code, net::TestURLFetcher* fetcher) { 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(fetcher); 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<net::HttpResponseHeaders> headers( 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new net::HttpResponseHeaders("date:Wed, 13 Feb 2013 00:25:24 GMT\0\0")); 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->set_response_headers(headers); 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->set_response_code(response_code); 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass VariationsServiceTest : public ::testing::Test { 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VariationsServiceTest() {} 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS) 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Not used directly. Initializes CrosSettings for testing. 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::ScopedTestDeviceSettingsService test_device_settings_service_; 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::ScopedTestCrosSettings test_cros_settings_; 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(VariationsServiceTest); 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(OS_CHROMEOS) 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(VariationsServiceTest, VariationsURLIsValid) { 1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_ANDROID) 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Android uses profile prefs as the PrefService to generate the URL. 1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestingPrefServiceSyncable prefs; 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VariationsService::RegisterProfilePrefs(prefs.registry()); 1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestingPrefServiceSimple prefs; 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VariationsService::RegisterPrefs(prefs.registry()); 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string default_variations_url = 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VariationsService::GetDefaultVariationsServerURLForTesting(); 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string value; 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL url = VariationsService::GetVariationsServerURL(&prefs); 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(StartsWithASCII(url.spec(), default_variations_url, true)); 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(net::GetValueForKeyInQuery(url, "restrict", &value)); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs.SetString(prefs::kVariationsRestrictParameter, "restricted"); 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) url = VariationsService::GetVariationsServerURL(&prefs); 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(StartsWithASCII(url.spec(), default_variations_url, true)); 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(net::GetValueForKeyInQuery(url, "restrict", &value)); 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("restricted", value); 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class VariationsServiceTestChromeOS : public VariationsServiceTest { 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VariationsServiceTestChromeOS() {} 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetUp() OVERRIDE { 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cros_settings_ = chromeos::CrosSettings::Get(); 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(cros_settings_ != NULL); 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Remove the real DeviceSettingsProvider and replace it with a stub that 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // allows modifications in a test. 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) device_settings_provider_ = cros_settings_->GetProvider( 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::kReportDeviceVersionInfo); 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(device_settings_provider_ != NULL); 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(cros_settings_->RemoveSettingsProvider( 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) device_settings_provider_)); 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cros_settings_->AddSettingsProvider(&stub_settings_provider_); 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void TearDown() OVERRIDE { 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Restore the real DeviceSettingsProvider. 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE( 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cros_settings_->RemoveSettingsProvider(&stub_settings_provider_)); 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cros_settings_->AddSettingsProvider(device_settings_provider_); 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetVariationsRestrictParameterPolicyValue(std::string value) { 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cros_settings_->SetString(chromeos::kVariationsRestrictParameter, value); 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::CrosSettings* cros_settings_; 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::StubCrosSettingsProvider stub_settings_provider_; 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::CrosSettingsProvider* device_settings_provider_; 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(VariationsServiceTestChromeOS); 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(VariationsServiceTestChromeOS, VariationsURLIsValid) { 234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestingPrefServiceSimple prefs; 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VariationsService::RegisterPrefs(prefs.registry()); 236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string default_variations_url = 237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VariationsService::GetDefaultVariationsServerURLForTesting(); 238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string value; 240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL url = VariationsService::GetVariationsServerURL(&prefs); 241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(StartsWithASCII(url.spec(), default_variations_url, true)); 242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(net::GetValueForKeyInQuery(url, "restrict", &value)); 243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetVariationsRestrictParameterPolicyValue("restricted"); 245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) url = VariationsService::GetVariationsServerURL(&prefs); 246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(StartsWithASCII(url.spec(), default_variations_url, true)); 247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(net::GetValueForKeyInQuery(url, "restrict", &value)); 248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("restricted", value); 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(VariationsServiceTest, VariationsURLHasOSNameParam) { 253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestingPrefServiceSimple prefs; 254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VariationsService::RegisterPrefs(prefs.registry()); 255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const GURL url = VariationsService::GetVariationsServerURL(&prefs); 256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string value; 258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(net::GetValueForKeyInQuery(url, "osname", &value)); 259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(value.empty()); 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(VariationsServiceTest, RequestsInitiallyNotAllowed) { 26390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoopForUI message_loop; 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread ui_thread(content::BrowserThread::UI, 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &message_loop); 266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestingPrefServiceSimple prefs; 267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VariationsService::RegisterPrefs(prefs.registry()); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pass ownership to TestVariationsService, but keep a weak pointer to 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // manipulate it for this test. 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestRequestAllowedNotifier* test_notifier = new TestRequestAllowedNotifier; 272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestVariationsService test_service(test_notifier, &prefs); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force the notifier to initially disallow requests. 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_notifier->SetRequestsAllowedOverride(false); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_service.StartRepeatedVariationsSeedFetch(); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(test_service.fetch_attempted()); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_notifier->NotifyObserver(); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(test_service.fetch_attempted()); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(VariationsServiceTest, RequestsInitiallyAllowed) { 28490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoopForUI message_loop; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread ui_thread(content::BrowserThread::UI, 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &message_loop); 287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestingPrefServiceSimple prefs; 288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VariationsService::RegisterPrefs(prefs.registry()); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pass ownership to TestVariationsService, but keep a weak pointer to 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // manipulate it for this test. 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestRequestAllowedNotifier* test_notifier = new TestRequestAllowedNotifier; 293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestVariationsService test_service(test_notifier, &prefs); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_notifier->SetRequestsAllowedOverride(true); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_service.StartRepeatedVariationsSeedFetch(); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(test_service.fetch_attempted()); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(VariationsServiceTest, SeedStoredWhenOKStatus) { 30190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop message_loop; 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::TestBrowserThread io_thread(content::BrowserThread::IO, 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &message_loop); 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestingPrefServiceSimple prefs; 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VariationsService::RegisterPrefs(prefs.registry()); 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 307a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TestVariationsService service(new TestRequestAllowedNotifier, &prefs); 308a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) service.set_intercepts_fetch(false); 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::TestURLFetcherFactory factory; 311a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) service.DoActualFetch(); 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SimulateServerResponse(net::HTTP_OK, fetcher); 315a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) fetcher->SetResponseString(SerializeSeed(CreateTestSeed())); 316a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 317a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(service.seed_stored()); 318a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) service.OnURLFetchComplete(fetcher); 319a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(service.seed_stored()); 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(VariationsServiceTest, SeedNotStoredWhenNonOKStatus) { 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int non_ok_status_codes[] = { 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::HTTP_NO_CONTENT, 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::HTTP_NOT_MODIFIED, 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::HTTP_NOT_FOUND, 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::HTTP_INTERNAL_SERVER_ERROR, 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::HTTP_SERVICE_UNAVAILABLE, 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 33190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop message_loop; 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::TestBrowserThread io_thread(content::BrowserThread::IO, 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &message_loop); 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestingPrefServiceSimple prefs; 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VariationsService::RegisterPrefs(prefs.registry()); 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 337cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) VariationsService service(new TestRequestAllowedNotifier, &prefs, NULL); 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < arraysize(non_ok_status_codes); ++i) { 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::TestURLFetcherFactory factory; 340cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) service.DoActualFetch(); 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(prefs.FindPreference(prefs::kVariationsSeed)->IsDefaultValue()); 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SimulateServerResponse(non_ok_status_codes[i], fetcher); 345cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) service.OnURLFetchComplete(fetcher); 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(prefs.FindPreference(prefs::kVariationsSeed)->IsDefaultValue()); 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 351f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(VariationsServiceTest, SeedDateUpdatedOn304Status) { 352f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::MessageLoop message_loop; 353f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::TestBrowserThread io_thread(content::BrowserThread::IO, 354f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) &message_loop); 355f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TestingPrefServiceSimple prefs; 356f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) VariationsService::RegisterPrefs(prefs.registry()); 357f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 358cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) VariationsService service(new TestRequestAllowedNotifier, &prefs, NULL); 359f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::TestURLFetcherFactory factory; 360cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) service.DoActualFetch(); 361f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE( 362f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) prefs.FindPreference(prefs::kVariationsSeedDate)->IsDefaultValue()); 363f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 364f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); 365f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SimulateServerResponse(net::HTTP_NOT_MODIFIED, fetcher); 366cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) service.OnURLFetchComplete(fetcher); 367f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE( 368f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) prefs.FindPreference(prefs::kVariationsSeedDate)->IsDefaultValue()); 369f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 370f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 371116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(VariationsServiceTest, Observer) { 372116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TestingPrefServiceSimple prefs; 373116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch VariationsService::RegisterPrefs(prefs.registry()); 374116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch VariationsService service(new TestRequestAllowedNotifier, &prefs, NULL); 375116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 376116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch struct { 377116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int normal_count; 378116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int best_effort_count; 379116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int critical_count; 380116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int expected_best_effort_notifications; 381116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int expected_crtical_notifications; 382116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } cases[] = { 383116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch {0, 0, 0, 0, 0}, 384116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch {1, 0, 0, 0, 0}, 385116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch {10, 0, 0, 0, 0}, 386116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch {0, 1, 0, 1, 0}, 387116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch {0, 10, 0, 1, 0}, 388116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch {0, 0, 1, 0, 1}, 389116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch {0, 0, 10, 0, 1}, 390116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch {0, 1, 1, 0, 1}, 391116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch {1, 1, 1, 0, 1}, 392116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch {1, 1, 0, 1, 0}, 393116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch {1, 0, 1, 0, 1}, 394116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch }; 395116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 396116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) { 397116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TestVariationsServiceObserver observer; 398116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch service.AddObserver(&observer); 399116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 4005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) variations::VariationsSeedSimulator::Result result; 401116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch result.normal_group_change_count = cases[i].normal_count; 402116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch result.kill_best_effort_group_change_count = cases[i].best_effort_count; 403116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch result.kill_critical_group_change_count = cases[i].critical_count; 404116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch service.NotifyObservers(result); 405116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 406116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(cases[i].expected_best_effort_notifications, 407116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch observer.best_effort_changes_notified()) << i; 408116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(cases[i].expected_crtical_notifications, 409116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch observer.crticial_changes_notified()) << i; 410116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 411116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch service.RemoveObserver(&observer); 412116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 413116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 414116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chrome_variations 416