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