component_updater_service_unittest.cc revision 1e9bf3e0803691d0a228da41fc608347b6db4340
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)
5ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/component_updater/test/component_updater_service_unittest.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/run_loop.h"
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/string_number_conversions.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/stringprintf.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/component_updater/test/test_installer.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/browser/browser_thread.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/test/net/url_request_prepackaged_interceptor.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "libxml/globals.h"
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/base/upload_bytes_element_reader.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_fetcher.h"
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using ::testing::_;
24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using ::testing::InSequence;
25a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using ::testing::Mock;
26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)MockComponentObserver::MockComponentObserver() {
28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)MockComponentObserver::~MockComponentObserver() {
31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTestConfigurator::TestConfigurator()
34ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    : times_(1),
35ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      recheck_time_(0),
36ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      ondemand_time_(0),
37ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      cus_(NULL),
38ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      context_(new net::TestURLRequestContextGetter(
39ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO))) {
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTestConfigurator::~TestConfigurator() {
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint TestConfigurator::InitialDelay() { return 0; }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint TestConfigurator::NextCheckDelay() {
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // This is called when a new full cycle of checking for updates is going
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // to happen. In test we normally only test one cycle so it is a good
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // time to break from the test messageloop Run() method so the test can
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // finish.
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (--times_ <= 0) {
534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    quit_closure_.Run();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return 1;
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint TestConfigurator::StepDelay() {
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return 0;
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)int TestConfigurator::StepDelayMedium() {
643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return NextCheckDelay();
653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint TestConfigurator::MinimumReCheckWait() {
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return recheck_time_;
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint TestConfigurator::OnDemandDelay() {
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return ondemand_time_;
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochGURL TestConfigurator::UpdateUrl() {
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return GURL("http://localhost/upd");
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
79ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochGURL TestConfigurator::PingUrl() {
80ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return GURL("http://localhost2/ping");
81ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
82ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst char* TestConfigurator::ExtraRequestParams() { return "extra=foo"; }
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochsize_t TestConfigurator::UrlSizeLimit() { return 256; }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnet::URLRequestContextGetter* TestConfigurator::RequestContext() {
88ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return context_.get();
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Don't use the utility process to decode files.
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool TestConfigurator::InProcess() { return true; }
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochComponentPatcher* TestConfigurator::CreateComponentPatcher() {
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return new MockComponentPatcher();
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool TestConfigurator::DeltasEnabled() const {
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return true;
100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Set how many update checks are called, the default value is just once.
103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid TestConfigurator::SetLoopCount(int times) { times_ = times; }
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid TestConfigurator::SetRecheckTime(int seconds) {
106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  recheck_time_ = seconds;
107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid TestConfigurator::SetOnDemandTime(int seconds) {
110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ondemand_time_ = seconds;
111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid TestConfigurator::SetComponentUpdateService(ComponentUpdateService* cus) {
114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  cus_ = cus;
115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void TestConfigurator::SetQuitClosure(const base::Closure& quit_closure) {
1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  quit_closure_ = quit_closure;
1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
121ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochComponentUpdaterTest::ComponentUpdaterTest()
122ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    : test_config_(NULL),
1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP) {
124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // The component updater instance under test.
125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test_config_ = new TestConfigurator;
126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  component_updater_.reset(ComponentUpdateServiceFactory(test_config_));
127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test_config_->SetComponentUpdateService(component_updater_.get());
128ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // The test directory is chrome/test/data/components.
130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir_);
131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test_data_dir_ = test_data_dir_.AppendASCII("components");
132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  net::URLFetcher::SetEnableInterceptionForTests(true);
134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochComponentUpdaterTest::~ComponentUpdaterTest() {
137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  net::URLFetcher::SetEnableInterceptionForTests(false);
138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ComponentUpdaterTest::TearDown() {
141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  xmlCleanupGlobals();
142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochComponentUpdateService* ComponentUpdaterTest::component_updater() {
145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return component_updater_.get();
146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Makes the full path to a component updater test file.
149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst base::FilePath ComponentUpdaterTest::test_file(const char* file) {
150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return test_data_dir_.AppendASCII(file);
151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTestConfigurator* ComponentUpdaterTest::test_configurator() {
154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return test_config_;
155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochComponentUpdateService::Status ComponentUpdaterTest::RegisterComponent(
158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    CrxComponent* com,
159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    TestComponents component,
160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const Version& version,
161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    TestInstaller* installer) {
162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (component == kTestComponent_abag) {
163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    com->name = "test_abag";
164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    com->pk_hash.assign(abag_hash, abag_hash + arraysize(abag_hash));
165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  } else if (component == kTestComponent_jebg) {
166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    com->name = "test_jebg";
167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    com->pk_hash.assign(jebg_hash, jebg_hash + arraysize(jebg_hash));
168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  } else {
169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    com->name = "test_ihfo";
170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    com->pk_hash.assign(ihfo_hash, ihfo_hash + arraysize(ihfo_hash));
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  com->version = version;
173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  com->installer = installer;
174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return component_updater_->RegisterComponent(*com);
175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void ComponentUpdaterTest::RunThreads() {
1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::RunLoop runloop;
1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  test_configurator()->SetQuitClosure(runloop.QuitClosure());
1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  runloop.Run();
1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void ComponentUpdaterTest::RunThreadsUntilIdle() {
1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
187ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochPingChecker::PingChecker(const std::map<std::string, std::string>& attributes)
188ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    : num_hits_(0), num_misses_(0), attributes_(attributes) {
189ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
190ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
191ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochPingChecker::~PingChecker() {}
192ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
193ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid PingChecker::Trial(net::URLRequest* request) {
194ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (Test(request))
195ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    ++num_hits_;
196ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  else
197ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    ++num_misses_;
198ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
199ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
200ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochbool PingChecker::Test(net::URLRequest* request) {
201ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (request->has_upload()) {
202ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    const net::UploadDataStream* stream = request->get_upload();
203ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    const net::UploadBytesElementReader* reader =
204ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        stream->element_readers()[0]->AsBytesReader();
205ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    int size = reader->length();
206ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    scoped_refptr <net::IOBuffer> buffer = new net::IOBuffer(size);
207ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    std::string data(reader->bytes());
2083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    pings_.push_back(data);
209ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // For now, we assume that there is only one ping per POST.
210ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    std::string::size_type start = data.find("<o:event");
211ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    if (start != std::string::npos) {
212ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      std::string::size_type end = data.find(">", start);
213ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      if (end != std::string::npos) {
214ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        std::string ping = data.substr(start, end - start);
215ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        std::map<std::string, std::string>::const_iterator iter;
216ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        for (iter = attributes_.begin(); iter != attributes_.end(); ++iter) {
217ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          // does the ping contain the specified attribute/value?
218ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          if (ping.find(std::string(" ") + (iter->first) +
219ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch              std::string("=") + (iter->second)) == string::npos) {
220ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            return false;
221ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          }
222ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        }
223ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        return true;
224ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      }
225ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    }
226ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
227ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return false;
228ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
229ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
2303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)std::string PingChecker::GetPings() const {
2313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::string pings_str = "Pings are:";
2323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  int i = 0;
2333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  for (std::vector<std::string>::const_iterator it = pings_.begin();
2343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      it != pings_.end(); ++it) {
2353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    pings_str.append(base::StringPrintf("\n  (%d): %s", ++i, it->c_str()));
2363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
2373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return pings_str;
2383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
2393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)ComponentUpdateService::Status OnDemandTester::OnDemand(
2411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    ComponentUpdateService* cus, const std::string& component_id) {
2421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return cus->OnDemandUpdate(component_id);
2431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that our test fixture work and the component updater can
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// be created and destroyed with no side effects.
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, VerifyFixture) {
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(component_updater() != NULL);
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that the component updater can be caught in a quick
252ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// start-shutdown situation. Failure of this test will be a crash.
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, StartStop) {
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Start();
2554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreadsUntilIdle();
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Stop();
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that when the server has no updates, we go back to sleep and
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the COMPONENT_UPDATER_STARTED and COMPONENT_UPDATER_SLEEPING notifications
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// are generated.
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, CheckCrxSleep) {
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::URLLocalHostRequestPrepackagedInterceptor interceptor;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  MockComponentObserver observer;
266a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
267eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer;
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrxComponent com;
269a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  com.observer = &observer;
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(ComponentUpdateService::kOk,
271eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            RegisterComponent(&com,
272eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              kTestComponent_abag,
273eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              Version("1.1"),
274eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              &installer));
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const GURL expected_update_url(
277eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "http://localhost/upd?extra=foo"
278eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "&x=id%3Dabagagagagagagagagagagagagagagag%26v%3D1.1%26fp%3D%26uc");
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor.SetResponse(expected_update_url,
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          test_file("updatecheck_reply_1.xml"));
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We loop twice, but there are no updates so we expect two sleep messages.
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_configurator()->SetLoopCount(2);
285a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
286a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_CALL(observer,
287a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)              OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
288a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)              .Times(1);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Start();
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
291a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_CALL(observer,
292a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)              OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
293a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)              .Times(2);
2941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_CALL(observer,
2961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)              OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
2971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)              .Times(2);
2984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, interceptor.GetHitCount());
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count());
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Stop();
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Loop twice again but this case we simulate a server error by returning
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // an empty file.
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor.SetResponse(expected_update_url,
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          test_file("updatecheck_reply_empty"));
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_configurator()->SetLoopCount(2);
314a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
315a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_CALL(observer,
316a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)              OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
317a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)              .Times(1);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Start();
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
320a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_CALL(observer,
321a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)              OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
322a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)              .Times(2);
3231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_CALL(observer,
3241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)              OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
3251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)              .Times(2);
3264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(4, interceptor.GetHitCount());
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count());
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Stop();
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we can check for updates and install one component. Besides
337ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// the notifications above COMPONENT_UPDATE_FOUND and COMPONENT_UPDATE_READY
338ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// should have been fired. We do two loops so the second time around there
339ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// should be nothing left to do.
340ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// We also check that only 3 non-ping network requests are issued:
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1- manifest check
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2- download crx
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3- second manifest check.
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, InstallCrx) {
345ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  std::map<std::string, std::string> map;
346ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  map.insert(std::pair<std::string, std::string>("eventtype", "\"3\""));
347ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  map.insert(std::pair<std::string, std::string>("eventresult", "\"1\""));
348ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  map.insert(std::pair<std::string, std::string>("previousversion",
349ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                                 "\"0.9\""));
350ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  map.insert(std::pair<std::string, std::string>("nextversion", "\"1.0\""));
351ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  PingChecker ping_checker(map);
352ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  URLRequestPostInterceptor post_interceptor(&ping_checker);
353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::URLLocalHostRequestPrepackagedInterceptor interceptor;
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  MockComponentObserver observer1;
356a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
357a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
358a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
359a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
360a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
361a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
362a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATE_FOUND, 0))
363a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
364a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
365a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATE_READY, 0))
366a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
367a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
3681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATED, 0))
3691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
3701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer1,
371a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
3721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
3731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer1,
3741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
3751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
3761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer1,
3771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
3781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
379a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
380a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
381a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  MockComponentObserver observer2;
382a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
383a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
384a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
385a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
386a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
387a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
3881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
3891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
3901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer2,
3911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
3921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
3931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer2,
3941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
3951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
3961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer2,
397a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
3981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
399a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
400a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
401eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer1;
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrxComponent com1;
403a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  com1.observer = &observer1;
404eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com1, kTestComponent_jebg, Version("0.9"), &installer1);
405eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer2;
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrxComponent com2;
407a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  com2.observer = &observer2;
408eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com2, kTestComponent_abag, Version("2.2"), &installer2);
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const GURL expected_update_url_1(
411eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "http://localhost/upd?extra=foo"
412eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "&x=id%3Djebgalgnebhfojomionfpkfelancnnkf%26v%3D0.9%26fp%3D%26uc"
413eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "&x=id%3Dabagagagagagagagagagagagagagagag%26v%3D2.2%26fp%3D%26uc");
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const GURL expected_update_url_2(
416eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "http://localhost/upd?extra=foo"
417eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "&x=id%3Dabagagagagagagagagagagagagagagag%26v%3D2.2%26fp%3D%26uc"
418eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "&x=id%3Djebgalgnebhfojomionfpkfelancnnkf%26v%3D1.0%26fp%3D%26uc");
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor.SetResponse(expected_update_url_1,
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          test_file("updatecheck_reply_1.xml"));
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor.SetResponse(expected_update_url_2,
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          test_file("updatecheck_reply_1.xml"));
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor.SetResponse(GURL(expected_crx_url),
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_configurator()->SetLoopCount(2);
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Start();
4304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error());
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, static_cast<TestInstaller*>(com1.installer)->install_count());
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error());
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->install_count());
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3, interceptor.GetHitCount());
4383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(1, ping_checker.NumHits()) << ping_checker.GetPings();
4393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(0, ping_checker.NumMisses()) << ping_checker.GetPings();
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  component_updater()->Stop();
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test checks that the "prodversionmin" value is handled correctly. In
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// particular there should not be an install because the minimum product
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// version is much higher than of chrome.
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, ProdVersionCheck) {
448ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  std::map<std::string, std::string> map;
449ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  PingChecker ping_checker(map);
450ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  URLRequestPostInterceptor post_interceptor(&ping_checker);
451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::URLLocalHostRequestPrepackagedInterceptor interceptor;
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
453eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer;
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrxComponent com;
455eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com, kTestComponent_jebg, Version("0.9"), &installer);
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const GURL expected_update_url(
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://localhost/upd?extra=foo&x=id%3D"
459eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "jebgalgnebhfojomionfpkfelancnnkf%26v%3D0.9%26fp%3D%26uc");
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor.SetResponse(expected_update_url,
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          test_file("updatecheck_reply_2.xml"));
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor.SetResponse(GURL(expected_crx_url),
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_configurator()->SetLoopCount(1);
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Start();
4684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(0, ping_checker.NumHits()) << ping_checker.GetPings();
4713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(0, ping_checker.NumMisses()) << ping_checker.GetPings();
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, interceptor.GetHitCount());
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count());
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Stop();
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that a ping for an update check can cause installs.
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Here is the timeline:
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//  - First loop: we return a reply that indicates no update, so
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//    nothing happens.
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//  - We ping.
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//  - This triggers a second loop, which has a reply that triggers an install.
4851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(ComponentUpdaterTest, OnDemandUpdate) {
486ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  std::map<std::string, std::string> map;
487ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  map.insert(std::pair<std::string, std::string>("eventtype", "\"3\""));
488ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  map.insert(std::pair<std::string, std::string>("eventresult", "\"1\""));
489ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  map.insert(std::pair<std::string, std::string>("previousversion",
490ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                                 "\"0.9\""));
491ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  map.insert(std::pair<std::string, std::string>("nextversion", "\"1.0\""));
492ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  PingChecker ping_checker(map);
493ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  URLRequestPostInterceptor post_interceptor(&ping_checker);
494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::URLLocalHostRequestPrepackagedInterceptor interceptor;
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
496a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  MockComponentObserver observer1;
497a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
498a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
499a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
500a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
501a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
502a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
5031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
5041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
5051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer1,
506a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
507a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
508a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
5091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
5101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
5111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer1,
5121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
5131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
5141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer1,
515a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
516a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
517a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
518a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
519a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  MockComponentObserver observer2;
520a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
521a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
522a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
523a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
524a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
525a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
5261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
5271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
5281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer2,
529a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
530a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
531a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
5321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
5331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
5341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer2,
535a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATE_FOUND, 0))
536a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
537a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
538a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATE_READY, 0))
539a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
540a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
5411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATED, 0))
5421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
5431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer2,
544a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
545a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
546a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
547a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
548eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer1;
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CrxComponent com1;
550a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  com1.observer = &observer1;
551eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com1, kTestComponent_abag, Version("2.2"), &installer1);
552eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer2;
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CrxComponent com2;
554a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  com2.observer = &observer2;
555eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com2, kTestComponent_jebg, Version("0.9"), &installer2);
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const GURL expected_update_url_1(
558eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "http://localhost/upd?extra=foo"
559eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "&x=id%3Dabagagagagagagagagagagagagagagag%26v%3D2.2%26fp%3D%26uc"
560eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "&x=id%3Djebgalgnebhfojomionfpkfelancnnkf%26v%3D0.9%26fp%3D%26uc");
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const GURL expected_update_url_2(
563eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "http://localhost/upd?extra=foo"
564eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "&x=id%3Djebgalgnebhfojomionfpkfelancnnkf%26v%3D0.9%26fp%3D%26uc"
565eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "%26installsource%3Dondemand"
566eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "&x=id%3Dabagagagagagagagagagagagagagagag%26v%3D2.2%26fp%3D%26uc");
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor.SetResponse(expected_update_url_1,
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          test_file("updatecheck_reply_empty"));
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor.SetResponse(expected_update_url_2,
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          test_file("updatecheck_reply_1.xml"));
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor.SetResponse(GURL(expected_crx_url),
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
5741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // No update normally.
5751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  test_configurator()->SetLoopCount(1);
5761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  component_updater()->Start();
5771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RunThreads();
5781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  component_updater()->Stop();
5791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Update after an on-demand check is issued.
5811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(ComponentUpdateService::kOk,
5821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            OnDemandTester::OnDemand(component_updater(),
5831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                     GetCrxComponentID(com2)));
5841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  test_configurator()->SetLoopCount(1);
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  component_updater()->Start();
5864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error());
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->install_count());
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error());
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, static_cast<TestInstaller*>(com2.installer)->install_count());
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3, interceptor.GetHitCount());
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Also check what happens if previous check too soon.
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_configurator()->SetOnDemandTime(60 * 60);
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ComponentUpdateService::kError,
5981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            OnDemandTester::OnDemand(component_updater(),
5991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                     GetCrxComponentID(com2)));
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Okay, now reset to 0 for the other tests.
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_configurator()->SetOnDemandTime(0);
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  component_updater()->Stop();
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Test a few error cases. NOTE: We don't have callbacks for
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // when the updates failed yet.
606a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer1));
607a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
608a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
609a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
610a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
611a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
612a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
6131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
6141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
6151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer1,
616a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
617a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
618a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
619a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer2));
620a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
621a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
622a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
623a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
624a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
625a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
6261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
6271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
6281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer2,
629a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
630a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
631a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
632a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const GURL expected_update_url_3(
634eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "http://localhost/upd?extra=foo"
635eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "&x=id%3Djebgalgnebhfojomionfpkfelancnnkf%26v%3D1.0%26fp%3D%26uc"
636eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "&x=id%3Dabagagagagagagagagagagagagagagag%26v%3D2.2%26fp%3D%26uc");
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // No update: error from no server response
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor.SetResponse(expected_update_url_3,
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          test_file("updatecheck_reply_empty"));
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_configurator()->SetLoopCount(1);
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  component_updater()->Start();
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ComponentUpdateService::kOk,
6441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            OnDemandTester::OnDemand(component_updater(),
6451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                     GetCrxComponentID(com2)));
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  component_updater()->Stop();
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // No update: already updated to 1.0 so nothing new
652a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer1));
653a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
654a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
655a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
656a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
657a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
658a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
6591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
6601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
6611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer1,
662a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
663a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
664a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
665a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer2));
666a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
667a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
668a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
669a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
670a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
671a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
6721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
6731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
6741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer2,
675a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
676a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
677a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
678a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor.SetResponse(expected_update_url_3,
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          test_file("updatecheck_reply_1.xml"));
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_configurator()->SetLoopCount(1);
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  component_updater()->Start();
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ComponentUpdateService::kOk,
6841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            OnDemandTester::OnDemand(component_updater(),
6851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                     GetCrxComponentID(com2)));
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(1, ping_checker.NumHits()) << ping_checker.GetPings();
6903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(0, ping_checker.NumMisses()) << ping_checker.GetPings();
691ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  component_updater()->Stop();
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Verify that a previously registered component can get re-registered
696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// with a different version.
697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ComponentUpdaterTest, CheckReRegistration) {
698ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  std::map<std::string, std::string> map;
699ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  map.insert(std::pair<std::string, std::string>("eventtype", "\"3\""));
700ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  map.insert(std::pair<std::string, std::string>("eventresult", "\"1\""));
701ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  map.insert(std::pair<std::string, std::string>("previousversion",
702ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                                 "\"0.9\""));
703ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  map.insert(std::pair<std::string, std::string>("nextversion", "\"1.0\""));
704ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  PingChecker ping_checker(map);
705ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  URLRequestPostInterceptor post_interceptor(&ping_checker);
706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::URLLocalHostRequestPrepackagedInterceptor interceptor;
707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
708a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  MockComponentObserver observer1;
709a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
710a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
711a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
712a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
713a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
714a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
715a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATE_FOUND, 0))
716a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
717a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
718a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATE_READY, 0))
719a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
720a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
7211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATED, 0))
7221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
7231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer1,
724a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
725a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
726a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
7271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
7281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
7291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer1,
730a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
731a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
732a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
733a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
734a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  MockComponentObserver observer2;
735a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
736a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
737a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
738a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
739a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
740a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
7411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
7421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
7431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer2,
744a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
745a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
746a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
7471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
7481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
7491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer2,
750a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
751a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
752a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
753a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
754eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer1;
755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CrxComponent com1;
756a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  com1.observer = &observer1;
757eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com1, kTestComponent_jebg, Version("0.9"), &installer1);
758eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer2;
759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CrxComponent com2;
760a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  com2.observer = &observer2;
761eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com2, kTestComponent_abag, Version("2.2"), &installer2);
762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Start with 0.9, and update to 1.0
764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const GURL expected_update_url_1(
765eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "http://localhost/upd?extra=foo"
766eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "&x=id%3Djebgalgnebhfojomionfpkfelancnnkf%26v%3D0.9%26fp%3D%26uc"
767eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "&x=id%3Dabagagagagagagagagagagagagagagag%26v%3D2.2%26fp%3D%26uc");
768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const GURL expected_update_url_2(
770eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "http://localhost/upd?extra=foo"
771eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "&x=id%3Dabagagagagagagagagagagagagagagag%26v%3D2.2%26fp%3D%26uc"
772eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "&x=id%3Djebgalgnebhfojomionfpkfelancnnkf%26v%3D1.0%26fp%3D%26uc");
773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
774c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  interceptor.SetResponse(expected_update_url_1,
775c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          test_file("updatecheck_reply_1.xml"));
776c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  interceptor.SetResponse(expected_update_url_2,
777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          test_file("updatecheck_reply_1.xml"));
778c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  interceptor.SetResponse(GURL(expected_crx_url),
779c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
781c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Loop twice to issue two checks: (1) with original 0.9 version
782c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // and (2) with the updated 1.0 version.
783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test_configurator()->SetLoopCount(2);
784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
785c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  component_updater()->Start();
7864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
787c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
788c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error());
789c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(1, static_cast<TestInstaller*>(com1.installer)->install_count());
790c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error());
791c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->install_count());
792c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(1, ping_checker.NumHits()) << ping_checker.GetPings();
7943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(0, ping_checker.NumMisses()) << ping_checker.GetPings();
795c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(3, interceptor.GetHitCount());
796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
797a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  component_updater()->Stop();
798a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Now re-register, pretending to be an even newer version (2.2)
800a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer1));
801a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
802a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
803a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
804a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
805a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
806a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
8071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
8081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
8091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer1,
810a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
811a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
812a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
813a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
814a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer2));
815a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
816a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
817a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
818a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
819a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
820a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
8211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
8221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
8231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer2,
824a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
825a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
826a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
827a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
828eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer3;
829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(ComponentUpdateService::kReplaced,
830eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            RegisterComponent(&com1,
831eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              kTestComponent_jebg,
832eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              Version("2.2"),
833eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              &installer3));
834c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
835c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Check that we send out 2.2 as our version.
836c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Interceptor's hit count should go up by 1.
837c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const GURL expected_update_url_3(
838eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "http://localhost/upd?extra=foo"
839eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "&x=id%3Djebgalgnebhfojomionfpkfelancnnkf%26v%3D2.2%26fp%3D%26uc"
840eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "&x=id%3Dabagagagagagagagagagagagagagagag%26v%3D2.2%26fp%3D%26uc");
841c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
842c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  interceptor.SetResponse(expected_update_url_3,
843c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          test_file("updatecheck_reply_1.xml"));
844c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
845c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Loop once just to notice the check happening with the re-register version.
846c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test_configurator()->SetLoopCount(1);
847c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  component_updater()->Start();
8484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
849c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
850c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(4, interceptor.GetHitCount());
851c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
852eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // We created a new installer, so the counts go back to 0.
853c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error());
854c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->install_count());
855c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error());
856c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->install_count());
857c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
858c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  component_updater()->Stop();
859c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
860eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
861ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Verify that we can download and install a component and a differential
862ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// update to that component. We do three loops; the final loop should do
863ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// nothing.
864ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// We also check that exactly 5 non-ping network requests are issued:
865ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// 1- update check (response: v1 available)
866ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// 2- download crx (v1)
867ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// 3- update check (response: v2 available)
868ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// 4- download differential crx (v1 to v2)
869ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// 5- update check (response: no further update available)
870ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// There should be two pings, one for each update. The second will bear a
871ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// diffresult=1, while the first will not.
872ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochTEST_F(ComponentUpdaterTest, DifferentialUpdate) {
873ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  std::map<std::string, std::string> map;
874ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  map.insert(std::pair<std::string, std::string>("eventtype", "\"3\""));
875ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  map.insert(std::pair<std::string, std::string>("eventresult", "\"1\""));
876ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  map.insert(std::pair<std::string, std::string>("diffresult", "\"1\""));
877ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  PingChecker ping_checker(map);
878ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  URLRequestPostInterceptor post_interceptor(&ping_checker);
879ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  content::URLLocalHostRequestPrepackagedInterceptor interceptor;
880ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
881ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  VersionedTestInstaller installer;
882ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  CrxComponent com;
883ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  RegisterComponent(&com, kTestComponent_ihfo, Version("0.0"), &installer);
884ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
885ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  const GURL expected_update_url_0(
886ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      "http://localhost/upd?extra=foo"
887ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      "&x=id%3Dihfokbkgjpifnbbojhneepfflplebdkc%26v%3D0.0%26fp%3D%26uc");
888ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  const GURL expected_update_url_1(
889ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      "http://localhost/upd?extra=foo"
890ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      "&x=id%3Dihfokbkgjpifnbbojhneepfflplebdkc%26v%3D1.0%26fp%3D1%26uc");
891ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  const GURL expected_update_url_2(
892ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      "http://localhost/upd?extra=foo"
893ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      "&x=id%3Dihfokbkgjpifnbbojhneepfflplebdkc%26v%3D2.0%26fp%3Df22%26uc");
894ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  const GURL expected_crx_url_1(
895ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      "http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_1.crx");
896ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  const GURL expected_crx_url_1_diff_2(
897ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      "http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx");
898ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
899ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  interceptor.SetResponse(expected_update_url_0,
900ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                          test_file("updatecheck_diff_reply_1.xml"));
901ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  interceptor.SetResponse(expected_update_url_1,
902ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                          test_file("updatecheck_diff_reply_2.xml"));
903ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  interceptor.SetResponse(expected_update_url_2,
904ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                          test_file("updatecheck_diff_reply_3.xml"));
905ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  interceptor.SetResponse(expected_crx_url_1,
906ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                          test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"));
907ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  interceptor.SetResponse(
908ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      expected_crx_url_1_diff_2,
909ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx"));
910ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
911ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  test_configurator()->SetLoopCount(3);
912ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
913ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  component_updater()->Start();
9144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
915ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
916ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
917ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(2, static_cast<TestInstaller*>(com.installer)->install_count());
918ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
919ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // One ping has the diffresult=1, the other does not.
9203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(1, ping_checker.NumHits()) << ping_checker.GetPings();
9213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(1, ping_checker.NumMisses()) << ping_checker.GetPings();
922ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
923ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(5, interceptor.GetHitCount());
924ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
925ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  component_updater()->Stop();
926ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
927ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
928eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Verify that component installation falls back to downloading and installing
929eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// a full update if the differential update fails (in this case, because the
930eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// installer does not know about the existing files). We do two loops; the final
931eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// loop should do nothing.
932ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// We also check that exactly 4 non-ping network requests are issued:
933eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 1- update check (loop 1)
934eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 2- download differential crx
935eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 3- download full crx
936eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 4- update check (loop 2 - no update available)
937ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// There should be one ping for the first attempted update.
938a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
939a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(ComponentUpdaterTest, DifferentialUpdateFails) {
940ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  std::map<std::string, std::string> map;
941ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  map.insert(std::pair<std::string, std::string>("eventtype", "\"3\""));
942ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  map.insert(std::pair<std::string, std::string>("eventresult", "\"1\""));
943ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  map.insert(std::pair<std::string, std::string>("diffresult", "\"0\""));
944ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  map.insert(std::pair<std::string, std::string>("differrorcode", "\"16\""));
945ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  PingChecker ping_checker(map);
946ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  URLRequestPostInterceptor post_interceptor(&ping_checker);
947eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  content::URLLocalHostRequestPrepackagedInterceptor interceptor;
948eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
949eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer;
950eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CrxComponent com;
951eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com, kTestComponent_ihfo, Version("1.0"), &installer);
952eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
953eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const GURL expected_update_url_1(
954eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "http://localhost/upd?extra=foo"
955eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "&x=id%3Dihfokbkgjpifnbbojhneepfflplebdkc%26v%3D1.0%26fp%3D%26uc");
956eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const GURL expected_update_url_2(
957eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "http://localhost/upd?extra=foo"
958eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "&x=id%3Dihfokbkgjpifnbbojhneepfflplebdkc%26v%3D2.0%26fp%3Df22%26uc");
959eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const GURL expected_crx_url_1(
960eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_1.crx");
961eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const GURL expected_crx_url_1_diff_2(
962eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx");
963eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const GURL expected_crx_url_2(
964eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_2.crx");
965eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
966eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  interceptor.SetResponse(expected_update_url_1,
967eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                          test_file("updatecheck_diff_reply_2.xml"));
968eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  interceptor.SetResponse(expected_update_url_2,
969eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                          test_file("updatecheck_diff_reply_3.xml"));
970eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  interceptor.SetResponse(expected_crx_url_1,
971eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                          test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"));
972eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  interceptor.SetResponse(
973eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      expected_crx_url_1_diff_2,
974eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx"));
975eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  interceptor.SetResponse(expected_crx_url_2,
976eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                          test_file("ihfokbkgjpifnbbojhneepfflplebdkc_2.crx"));
977eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
978eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test_configurator()->SetLoopCount(2);
979eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
980eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  component_updater()->Start();
9814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
982eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
983eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // A failed differential update does not count as a failed install.
984eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
985eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(1, static_cast<TestInstaller*>(com.installer)->install_count());
986eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
9873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(1, ping_checker.NumHits()) << ping_checker.GetPings();
9883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(0, ping_checker.NumMisses()) << ping_checker.GetPings();
989eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(4, interceptor.GetHitCount());
990eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
991eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  component_updater()->Stop();
992eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
993eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
994ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Verify that a failed installation causes an install failure ping.
995ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochTEST_F(ComponentUpdaterTest, CheckFailedInstallPing) {
996ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  std::map<std::string, std::string> map;
997ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  map.insert(std::pair<std::string, std::string>("eventtype", "\"3\""));
998ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  map.insert(std::pair<std::string, std::string>("eventresult", "\"0\""));
999ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  map.insert(std::pair<std::string, std::string>("errorcode", "\"9\""));
1000ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  map.insert(std::pair<std::string, std::string>("previousversion",
1001ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                                 "\"0.9\""));
1002ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  map.insert(std::pair<std::string, std::string>("nextversion", "\"1.0\""));
1003ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  PingChecker ping_checker(map);
1004ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  URLRequestPostInterceptor post_interceptor(&ping_checker);
1005ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  content::URLLocalHostRequestPrepackagedInterceptor interceptor;
1006ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1007ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // This test installer reports installation failure.
1008ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  class : public TestInstaller {
1009ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    virtual bool Install(const base::DictionaryValue& manifest,
1010ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                         const base::FilePath& unpack_path) OVERRIDE {
1011ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      ++install_count_;
1012ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      base::DeleteFile(unpack_path, true);
1013ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      return false;
1014ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    }
1015ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  } installer;
1016ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1017ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  CrxComponent com;
1018ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  RegisterComponent(&com, kTestComponent_jebg, Version("0.9"), &installer);
1019ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1020ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Start with 0.9, and attempt update to 1.0
1021ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  const GURL expected_update_url_1(
1022ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      "http://localhost/upd?extra=foo"
1023ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      "&x=id%3Djebgalgnebhfojomionfpkfelancnnkf%26v%3D0.9%26fp%3D%26uc");
1024ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1025ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  interceptor.SetResponse(expected_update_url_1,
1026ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                          test_file("updatecheck_reply_1.xml"));
1027ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  interceptor.SetResponse(GURL(expected_crx_url),
1028ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                          test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
1029ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1030ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Loop twice to issue two checks: (1) with original 0.9 version
1031ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // and (2), which should retry with 0.9.
1032ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  test_configurator()->SetLoopCount(2);
1033ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  component_updater()->Start();
10344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
1035ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1036ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Loop once more, but expect no ping because a noupdate response is issued.
1037ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // This is necessary to clear out the fire-and-forget ping from the previous
1038ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // iteration.
1039ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  interceptor.SetResponse(expected_update_url_1,
1040ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                          test_file("updatecheck_reply_noupdate.xml"));
1041ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  test_configurator()->SetLoopCount(1);
1042ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  component_updater()->Start();
10434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
1044ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1045ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
1046ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(2, static_cast<TestInstaller*>(com.installer)->install_count());
1047ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
10483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(2, ping_checker.NumHits()) << ping_checker.GetPings();
10493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(0, ping_checker.NumMisses()) << ping_checker.GetPings();
1050ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(5, interceptor.GetHitCount());
1051ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1052ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  component_updater()->Stop();
1053ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
1054ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1055eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Verify that we successfully propagate a patcher error.
1056eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// ihfokbkgjpifnbbojhneepfflplebdkc_1to2_bad.crx contains an incorrect
1057eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// patching instruction that should fail.
1058eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(ComponentUpdaterTest, DifferentialUpdateFailErrorcode) {
1059ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  std::map<std::string, std::string> map;
1060ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  map.insert(std::pair<std::string, std::string>("eventtype", "\"3\""));
1061ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  map.insert(std::pair<std::string, std::string>("eventresult", "\"1\""));
1062ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  map.insert(std::pair<std::string, std::string>("diffresult", "\"0\""));
1063ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  map.insert(std::pair<std::string, std::string>("differrorcode", "\"14\""));
1064ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  map.insert(std::pair<std::string, std::string>("diffextracode1", "\"305\""));
1065ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  PingChecker ping_checker(map);
1066ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  URLRequestPostInterceptor post_interceptor(&ping_checker);
1067eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  content::URLLocalHostRequestPrepackagedInterceptor interceptor;
1068eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1069eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  VersionedTestInstaller installer;
1070eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CrxComponent com;
1071eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com, kTestComponent_ihfo, Version("0.0"), &installer);
1072eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1073eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const GURL expected_update_url_0(
1074eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "http://localhost/upd?extra=foo"
1075eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "&x=id%3Dihfokbkgjpifnbbojhneepfflplebdkc%26v%3D0.0%26fp%3D%26uc");
1076eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const GURL expected_update_url_1(
1077eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "http://localhost/upd?extra=foo"
1078eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "&x=id%3Dihfokbkgjpifnbbojhneepfflplebdkc%26v%3D1.0%26fp%3D1%26uc");
1079eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const GURL expected_update_url_2(
1080eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "http://localhost/upd?extra=foo"
1081eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "&x=id%3Dihfokbkgjpifnbbojhneepfflplebdkc%26v%3D2.0%26fp%3Df22%26uc");
1082eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const GURL expected_crx_url_1(
1083eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_1.crx");
1084eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const GURL expected_crx_url_1_diff_2(
1085eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx");
1086eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const GURL expected_crx_url_2(
1087eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_2.crx");
1088eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1089eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  interceptor.SetResponse(expected_update_url_0,
1090eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                          test_file("updatecheck_diff_reply_1.xml"));
1091eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  interceptor.SetResponse(expected_update_url_1,
1092eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                          test_file("updatecheck_diff_reply_2.xml"));
1093eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  interceptor.SetResponse(expected_update_url_2,
1094eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                          test_file("updatecheck_diff_reply_3.xml"));
1095eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  interceptor.SetResponse(expected_crx_url_1,
1096eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                          test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"));
1097eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  interceptor.SetResponse(
1098eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      expected_crx_url_1_diff_2,
1099eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1to2_bad.crx"));
1100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  interceptor.SetResponse(expected_crx_url_2,
1101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                          test_file("ihfokbkgjpifnbbojhneepfflplebdkc_2.crx"));
1102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
11034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  test_configurator()->SetLoopCount(2);
1104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  component_updater()->Start();
11064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
11074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  component_updater()->Stop();
11084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // There may still be pings in the queue.
11094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreadsUntilIdle();
1110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
1112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(2, static_cast<TestInstaller*>(com.installer)->install_count());
1113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
11143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(1, ping_checker.NumHits()) << ping_checker.GetPings();
11153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(1, ping_checker.NumMisses()) << ping_checker.GetPings();
11164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(5, interceptor.GetHitCount());
1117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1118