component_updater_service_unittest.cc revision f2477e01787aa58f445919b809d89e252beef54f
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"
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/resource_controller.h"
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/resource_request_info.h"
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/resource_throttle.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "libxml/globals.h"
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/base/upload_bytes_element_reader.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_fetcher.h"
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "net/url_request/url_request_test_util.h"
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using ::testing::_;
27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using ::testing::InSequence;
28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using ::testing::Mock;
29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace component_updater {
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define POST_INTERCEPT_SCHEME    "http"
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define POST_INTERCEPT_HOSTNAME  "localhost2"
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define POST_INTERCEPT_PATH      "/update2"
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)MockComponentObserver::MockComponentObserver() {
37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)MockComponentObserver::~MockComponentObserver() {
40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTestConfigurator::TestConfigurator()
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    : initial_time_(0),
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      times_(1),
45ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      recheck_time_(0),
46ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      ondemand_time_(0),
47ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      cus_(NULL),
48ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      context_(new net::TestURLRequestContextGetter(
49ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO))) {
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTestConfigurator::~TestConfigurator() {
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)int TestConfigurator::InitialDelay() { return initial_time_; }
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint TestConfigurator::NextCheckDelay() {
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // This is called when a new full cycle of checking for updates is going
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // to happen. In test we normally only test one cycle so it is a good
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // time to break from the test messageloop Run() method so the test can
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // finish.
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (--times_ <= 0) {
634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    quit_closure_.Run();
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return 1;
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint TestConfigurator::StepDelay() {
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return 0;
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)int TestConfigurator::StepDelayMedium() {
743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return NextCheckDelay();
753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint TestConfigurator::MinimumReCheckWait() {
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return recheck_time_;
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint TestConfigurator::OnDemandDelay() {
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return ondemand_time_;
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochGURL TestConfigurator::UpdateUrl() {
86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return GURL(POST_INTERCEPT_SCHEME "://"
87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              POST_INTERCEPT_HOSTNAME POST_INTERCEPT_PATH);
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
90ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochGURL TestConfigurator::PingUrl() {
91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return UpdateUrl();
92ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
93ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst char* TestConfigurator::ExtraRequestParams() { return "extra=foo"; }
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochsize_t TestConfigurator::UrlSizeLimit() { return 256; }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnet::URLRequestContextGetter* TestConfigurator::RequestContext() {
99ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return context_.get();
100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Don't use the utility process to run code out-of-process.
103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool TestConfigurator::InProcess() { return true; }
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochComponentPatcher* TestConfigurator::CreateComponentPatcher() {
106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return new MockComponentPatcher();
107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool TestConfigurator::DeltasEnabled() const {
110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return true;
111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Set how many update checks are called, the default value is just once.
114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid TestConfigurator::SetLoopCount(int times) { times_ = times; }
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid TestConfigurator::SetRecheckTime(int seconds) {
117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  recheck_time_ = seconds;
118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid TestConfigurator::SetOnDemandTime(int seconds) {
121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ondemand_time_ = seconds;
122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid TestConfigurator::SetComponentUpdateService(ComponentUpdateService* cus) {
125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  cus_ = cus;
126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void TestConfigurator::SetQuitClosure(const base::Closure& quit_closure) {
1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  quit_closure_ = quit_closure;
1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void TestConfigurator::SetInitialDelay(int seconds) {
133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  initial_time_ = seconds;
134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)InterceptorFactory::InterceptorFactory()
137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    : URLRequestPostInterceptorFactory(POST_INTERCEPT_SCHEME,
138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                       POST_INTERCEPT_HOSTNAME) {}
139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)InterceptorFactory::~InterceptorFactory() {}
141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)URLRequestPostInterceptor* InterceptorFactory::CreateInterceptor() {
143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return URLRequestPostInterceptorFactory::CreateInterceptor(
144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::FilePath::FromUTF8Unsafe(POST_INTERCEPT_PATH));
145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class PartialMatch : public URLRequestPostInterceptor::RequestMatcher {
148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public:
149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  explicit PartialMatch(const std::string& expected) : expected_(expected) {}
150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual bool Match(const std::string& actual) const OVERRIDE {
151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return actual.find(expected_) != std::string::npos;
152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private:
155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const std::string expected_;
156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PartialMatch);
158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
160ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochComponentUpdaterTest::ComponentUpdaterTest()
161ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    : test_config_(NULL),
1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP) {
163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // The component updater instance under test.
164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test_config_ = new TestConfigurator;
165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  component_updater_.reset(ComponentUpdateServiceFactory(test_config_));
166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test_config_->SetComponentUpdateService(component_updater_.get());
167ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // The test directory is chrome/test/data/components.
169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir_);
170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test_data_dir_ = test_data_dir_.AppendASCII("components");
171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  net::URLFetcher::SetEnableInterceptionForTests(true);
173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochComponentUpdaterTest::~ComponentUpdaterTest() {
176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  net::URLFetcher::SetEnableInterceptionForTests(false);
177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ComponentUpdaterTest::SetUp() {
180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_.reset(new GetInterceptor);
181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  interceptor_factory_.reset(new InterceptorFactory);
182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  post_interceptor_ = interceptor_factory_->CreateInterceptor();
183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_);
184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ComponentUpdaterTest::TearDown() {
187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  interceptor_factory_.reset();
188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_.reset();
189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  xmlCleanupGlobals();
190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochComponentUpdateService* ComponentUpdaterTest::component_updater() {
193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return component_updater_.get();
194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Makes the full path to a component updater test file.
197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst base::FilePath ComponentUpdaterTest::test_file(const char* file) {
198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return test_data_dir_.AppendASCII(file);
199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTestConfigurator* ComponentUpdaterTest::test_configurator() {
202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return test_config_;
203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochComponentUpdateService::Status ComponentUpdaterTest::RegisterComponent(
206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    CrxComponent* com,
207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    TestComponents component,
208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const Version& version,
209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    TestInstaller* installer) {
210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (component == kTestComponent_abag) {
211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    com->name = "test_abag";
212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    com->pk_hash.assign(abag_hash, abag_hash + arraysize(abag_hash));
213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  } else if (component == kTestComponent_jebg) {
214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    com->name = "test_jebg";
215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    com->pk_hash.assign(jebg_hash, jebg_hash + arraysize(jebg_hash));
216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  } else {
217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    com->name = "test_ihfo";
218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    com->pk_hash.assign(ihfo_hash, ihfo_hash + arraysize(ihfo_hash));
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  com->version = version;
221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  com->installer = installer;
222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return component_updater_->RegisterComponent(*com);
223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void ComponentUpdaterTest::RunThreads() {
2264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::RunLoop runloop;
2274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  test_configurator()->SetQuitClosure(runloop.QuitClosure());
2284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  runloop.Run();
229f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Since some tests need to drain currently enqueued tasks such as network
231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // intercepts on the IO thread, run the threads until they are
232f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // idle. The component updater service won't loop again until the loop count
233f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // is set and the service is started.
234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RunThreadsUntilIdle();
2354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void ComponentUpdaterTest::RunThreadsUntilIdle() {
2384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
2394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)ComponentUpdateService::Status OnDemandTester::OnDemand(
2421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    ComponentUpdateService* cus, const std::string& component_id) {
2431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return cus->OnDemandUpdate(component_id);
2441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that our test fixture work and the component updater can
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// be created and destroyed with no side effects.
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, VerifyFixture) {
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(component_updater() != NULL);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that the component updater can be caught in a quick
253ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// start-shutdown situation. Failure of this test will be a crash.
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, StartStop) {
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Start();
2564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreadsUntilIdle();
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Stop();
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that when the server has no updates, we go back to sleep and
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the COMPONENT_UPDATER_STARTED and COMPONENT_UPDATER_SLEEPING notifications
262f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// are generated. No pings are sent.
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, CheckCrxSleep) {
264a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  MockComponentObserver observer;
265a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
266f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(observer,
267f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
268f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              .Times(1);
269f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(observer,
270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
271f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              .Times(2);
272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(observer,
273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
274f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              .Times(2);
275f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
276f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
277f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_reply_1.xml")));
278f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
279f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_reply_1.xml")));
280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
281eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer;
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrxComponent com;
283a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  com.observer = &observer;
284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(ComponentUpdateService::kOk,
285eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            RegisterComponent(&com,
286eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              kTestComponent_abag,
287eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              Version("1.1"),
288eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              &installer));
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We loop twice, but there are no updates so we expect two sleep messages.
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_configurator()->SetLoopCount(2);
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Start();
2934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count());
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
298f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Expect to see the two update check requests and no other requests,
299f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // including pings.
300f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, post_interceptor_->GetHitCount())
301f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
302f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, post_interceptor_->GetCount())
303f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
305f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"abagagagagagagagagagagagagagagag\" version=\"1.1\">"
306f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /></app>"))
307f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
308f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[1].find(
309f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"abagagagagagagagagagagagagagagag\" version=\"1.1\">"
310f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /></app>"))
311f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
312f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Stop();
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Loop twice again but this case we simulate a server error by returning
316f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // an empty file. Expect the behavior of the service to be the same as before.
317a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_CALL(observer,
318a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)              OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
319a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)              .Times(1);
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);
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
327f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  post_interceptor_->Reset();
328f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
329f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_reply_empty")));
330f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
331f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_reply_empty")));
332f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
333f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  test_configurator()->SetLoopCount(2);
334f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  component_updater()->Start();
335f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RunThreads();
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count());
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
340f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, post_interceptor_->GetHitCount())
341f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
342f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, post_interceptor_->GetCount())
343f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
344f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
345f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"abagagagagagagagagagagagagagagag\" version=\"1.1\">"
346f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /></app>"))
347f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
348f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[1].find(
349f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"abagagagagagagagagagagagagagagag\" version=\"1.1\">"
350f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /></app>"))
351f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
352f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Stop();
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we can check for updates and install one component. Besides
357ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// the notifications above COMPONENT_UPDATE_FOUND and COMPONENT_UPDATE_READY
358ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// should have been fired. We do two loops so the second time around there
359ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// should be nothing left to do.
360f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// We also check that the following network requests are issued:
361f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// 1- update check
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2- download crx
363f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// 3- ping
364f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// 4- second update check.
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, InstallCrx) {
366a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  MockComponentObserver observer1;
367a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
368a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
369a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
370a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
371a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
372a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
373a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATE_FOUND, 0))
374a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
375a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
376a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATE_READY, 0))
377a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
378a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
3791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATED, 0))
3801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
3811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer1,
382a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
3831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
3841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer1,
3851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
3861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
3871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer1,
3881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
3891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
390a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
391a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
392a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  MockComponentObserver observer2;
393a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
394a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
395a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
396a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
397a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
398a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
3991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
4001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
4011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer2,
4021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
4031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
4041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer2,
4051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
4061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
4071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer2,
408a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
4091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
410a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
411a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
412f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
413f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_reply_1.xml")));
414f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
415f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
416f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_reply_1.xml")));
417f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
418f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
419f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL(expected_crx_url),
420f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
421f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
422eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer1;
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrxComponent com1;
424a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  com1.observer = &observer1;
425eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com1, kTestComponent_jebg, Version("0.9"), &installer1);
426eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer2;
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrxComponent com2;
428a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  com2.observer = &observer2;
429eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com2, kTestComponent_abag, Version("2.2"), &installer2);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_configurator()->SetLoopCount(2);
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Start();
4334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error());
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, static_cast<TestInstaller*>(com1.installer)->install_count());
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error());
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->install_count());
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
440f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Expect three request in total: two update checks and one ping.
441f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(3, post_interceptor_->GetHitCount())
442f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
443f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(3, post_interceptor_->GetCount())
444f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
445f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
446f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Expect one component download.
447f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, get_interceptor_->GetHitCount());
448f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
449f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
450f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"0.9\">"
451f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /></app>"))
452f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
453f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
454f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"abagagagagagagagagagagagagagagag\" version=\"2.2\">"
455f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /></app>"))
456f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
457f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
458f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[1].find(
459f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" "
460f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "version=\"0.9\" nextversion=\"1.0\">"
461f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<event eventtype=\"3\" eventresult=\"1\"/></app>"))
462f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
463f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
464f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[2].find(
465f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"1.0\">"
466f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /></app>"));
467f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[2].find(
468f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"abagagagagagagagagagagagagagagag\" version=\"2.2\">"
469f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /></app>"))
470f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  component_updater()->Stop();
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test checks that the "prodversionmin" value is handled correctly. In
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// particular there should not be an install because the minimum product
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// version is much higher than of chrome.
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, ProdVersionCheck) {
479f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
480f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_reply_2.xml")));
481f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
482f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
483f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL(expected_crx_url),
484f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
486eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer;
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrxComponent com;
488eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com, kTestComponent_jebg, Version("0.9"), &installer);
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_configurator()->SetLoopCount(1);
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Start();
4924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
494f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Expect one update check and no ping.
495f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetHitCount())
496f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
497f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetCount())
498f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
499f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
500f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Expect no download to occur.
501f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0, get_interceptor_->GetHitCount());
502f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count());
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Stop();
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
509f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Test that a update check due to an on demand call can cause installs.
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Here is the timeline:
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//  - First loop: we return a reply that indicates no update, so
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//    nothing happens.
513f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)//  - We make an on demand call.
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//  - This triggers a second loop, which has a reply that triggers an install.
5151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(ComponentUpdaterTest, OnDemandUpdate) {
516a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  MockComponentObserver observer1;
517a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
518a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
519a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
520a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
521a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
522a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
5231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
5241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
5251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer1,
526a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
527a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
528a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
5291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
5301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
5311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer1,
5321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
5331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
5341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer1,
535a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
536a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
537a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
538a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
539a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  MockComponentObserver observer2;
540a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
541a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
542a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
543a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
544a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
545a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
5461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
5471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
5481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer2,
549a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
550a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
551a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
5521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
5531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
5541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer2,
555a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATE_FOUND, 0))
556a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
557a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
558a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATE_READY, 0))
559a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
560a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
5611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATED, 0))
5621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
5631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer2,
564a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
565a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
566a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
567a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
568f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
569f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_reply_empty")));
570f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
571f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
572f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL(expected_crx_url),
573f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
574f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
575eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer1;
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CrxComponent com1;
577a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  com1.observer = &observer1;
578eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com1, kTestComponent_abag, Version("2.2"), &installer1);
579eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer2;
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CrxComponent com2;
581a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  com2.observer = &observer2;
582eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com2, kTestComponent_jebg, Version("0.9"), &installer2);
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // No update normally.
5851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  test_configurator()->SetLoopCount(1);
5861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  component_updater()->Start();
5871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RunThreads();
5881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  component_updater()->Stop();
5891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
590f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetHitCount())
591f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
592f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetCount())
593f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
594f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
595f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0, get_interceptor_->GetHitCount());
596f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Update after an on-demand check is issued.
598f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  post_interceptor_->Reset();
599f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
600f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_reply_1.xml")));
601f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
602f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
6031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(ComponentUpdateService::kOk,
6041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            OnDemandTester::OnDemand(component_updater(),
6051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                     GetCrxComponentID(com2)));
6061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  test_configurator()->SetLoopCount(1);
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  component_updater()->Start();
6084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error());
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->install_count());
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error());
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, static_cast<TestInstaller*>(com2.installer)->install_count());
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
615f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, post_interceptor_->GetHitCount())
616f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
617f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, post_interceptor_->GetCount())
618f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
619f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
620f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, get_interceptor_->GetHitCount());
621f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
622f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Expect the update check to contain an "ondemand" request for the
623f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // second component (com2) and a normal request for the other component.
624f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
625f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"abagagagagagagagagagagagagagagag\" "
626f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "version=\"2.2\"><updatecheck /></app>"))
627f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
628f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
629f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" "
630f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "version=\"0.9\" installsource=\"ondemand\"><updatecheck /></app>"))
631f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
632f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[1].find(
633f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" "
634f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "version=\"0.9\" nextversion=\"1.0\">"
635f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<event eventtype=\"3\" eventresult=\"1\"/></app>"))
636f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Also check what happens if previous check too soon.
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_configurator()->SetOnDemandTime(60 * 60);
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ComponentUpdateService::kError,
6411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            OnDemandTester::OnDemand(component_updater(),
6421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                     GetCrxComponentID(com2)));
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Okay, now reset to 0 for the other tests.
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_configurator()->SetOnDemandTime(0);
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  component_updater()->Stop();
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Test a few error cases. NOTE: We don't have callbacks for
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // when the updates failed yet.
649a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer1));
650a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
651a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
652a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
653a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
654a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
655a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
6561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
6571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
6581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer1,
659a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
660a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
661a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
662a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer2));
663a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
664a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
665a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
666a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
667a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
668a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
6691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
6701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
6711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer2,
672a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
673a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
674a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
675a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // No update: error from no server response
677f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  post_interceptor_->Reset();
678f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
679f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_reply_empty")));
680f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
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)));
6864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  component_updater()->Stop();
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
689f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetHitCount())
690f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
691f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetCount())
692f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
693f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // No update: already updated to 1.0 so nothing new
695a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer1));
696a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
697a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
698a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
699a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
700a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
701a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
7021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
7031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
7041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer1,
705a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
706a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
707a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
708a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer2));
709a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
710a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
711a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
712a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
713a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
714a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
7151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
7161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
7171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer2,
718a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
719a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
720a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
721a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
722f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  post_interceptor_->Reset();
723f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
724f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_reply_1.xml")));
725f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_configurator()->SetLoopCount(1);
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  component_updater()->Start();
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ComponentUpdateService::kOk,
7291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            OnDemandTester::OnDemand(component_updater(),
7301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                     GetCrxComponentID(com2)));
7314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
733f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetHitCount())
734f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
735f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetCount())
736f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
737ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  component_updater()->Stop();
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
740c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Verify that a previously registered component can get re-registered
742c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// with a different version.
743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ComponentUpdaterTest, CheckReRegistration) {
744a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  MockComponentObserver observer1;
745a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
746a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
747a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
748a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
749a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
750a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
751a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATE_FOUND, 0))
752a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
753a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
754a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATE_READY, 0))
755a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
756a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
7571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATED, 0))
7581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
7591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer1,
760a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
761a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
762a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
7631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
7641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
7651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer1,
766a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
767a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
768a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
769a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
770a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  MockComponentObserver observer2;
771a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
772a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
773a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
774a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
775a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
776a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
7771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
7781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
7791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer2,
780a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
781a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
782a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
7831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
7841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
7851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer2,
786a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
787a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
788a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
789a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
790f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
791f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_reply_1.xml")));
792f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
793f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
794f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_reply_1.xml")));
795f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
796f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
797f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL(expected_crx_url),
798f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
799f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
800eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer1;
801c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CrxComponent com1;
802a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  com1.observer = &observer1;
803eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com1, kTestComponent_jebg, Version("0.9"), &installer1);
804eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer2;
805c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CrxComponent com2;
806a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  com2.observer = &observer2;
807eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com2, kTestComponent_abag, Version("2.2"), &installer2);
808c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
809f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Loop twice to issue two checks: (1) with original 0.9 version, update to
810f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // 1.0, and do the second check (2) with the updated 1.0 version.
811c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test_configurator()->SetLoopCount(2);
812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  component_updater()->Start();
8134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
815c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error());
816c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(1, static_cast<TestInstaller*>(com1.installer)->install_count());
817c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error());
818c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->install_count());
819c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
820f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(3, post_interceptor_->GetHitCount())
821f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        << post_interceptor_->GetRequestsAsString();
822f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, get_interceptor_->GetHitCount());
823f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
824f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
825f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"0.9\">"
826f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /></app>"))
827f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
828f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[1].find(
829f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" "
830f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "version=\"0.9\" nextversion=\"1.0\">"
831f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<event eventtype=\"3\" eventresult=\"1\"/></app>"))
832f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
833f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[2].find(
834f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"1.0\">"
835f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /></app>"))
836f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
837c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
838a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  component_updater()->Stop();
839a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
840c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Now re-register, pretending to be an even newer version (2.2)
841a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer1));
842a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
843a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
844a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
845a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
846a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
847a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
8481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
8491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
8501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer1,
851a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
852a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
853a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
854a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
855a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer2));
856a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
857a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
858a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
859a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
860a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
861a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
8621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
8631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
8641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer2,
865a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
866a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
867a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
868a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
869f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  post_interceptor_->Reset();
870f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
871f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_reply_1.xml")));
872f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
873eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer3;
874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(ComponentUpdateService::kReplaced,
875eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            RegisterComponent(&com1,
876eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              kTestComponent_jebg,
877eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              Version("2.2"),
878eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              &installer3));
879c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Loop once just to notice the check happening with the re-register version.
881c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test_configurator()->SetLoopCount(1);
882c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  component_updater()->Start();
8834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
884c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
885eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // We created a new installer, so the counts go back to 0.
886c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error());
887c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->install_count());
888c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error());
889c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->install_count());
890c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
891f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // One update check and no additional pings are expected.
892f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetHitCount())
893f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        << post_interceptor_->GetRequestsAsString();
894f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetCount())
895f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        << post_interceptor_->GetRequestsAsString();
896f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
897f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
898f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"2.2\">"
899f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /></app>"));
900f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  component_updater()->Stop();
902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
903eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
904ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Verify that we can download and install a component and a differential
905ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// update to that component. We do three loops; the final loop should do
906ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// nothing.
907ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// We also check that exactly 5 non-ping network requests are issued:
908ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// 1- update check (response: v1 available)
909ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// 2- download crx (v1)
910ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// 3- update check (response: v2 available)
911ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// 4- download differential crx (v1 to v2)
912ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// 5- update check (response: no further update available)
913ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// There should be two pings, one for each update. The second will bear a
914ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// diffresult=1, while the first will not.
915ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochTEST_F(ComponentUpdaterTest, DifferentialUpdate) {
916f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
917f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_diff_reply_1.xml")));
918f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
919f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
920f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_diff_reply_2.xml")));
921f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
922f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
923f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_diff_reply_3.xml")));
924f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
925f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
926f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL("http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"),
927f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"));
928f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
929f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL("http://localhost/download/"
930f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)           "ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx"),
931f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx"));
932ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
933ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  VersionedTestInstaller installer;
934ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  CrxComponent com;
935ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  RegisterComponent(&com, kTestComponent_ihfo, Version("0.0"), &installer);
936ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
937ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  test_configurator()->SetLoopCount(3);
938ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  component_updater()->Start();
9394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
940ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
941ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
942ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(2, static_cast<TestInstaller*>(com.installer)->install_count());
943ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
944f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(5, post_interceptor_->GetHitCount())
945f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
946f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(5, post_interceptor_->GetCount())
947f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
948f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, get_interceptor_->GetHitCount());
949f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
950f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
951f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"0.0\">"
952f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /></app>"))
953f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
954f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[1].find(
955f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" "
956f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "version=\"0.0\" nextversion=\"1.0\">"
957f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<event eventtype=\"3\" eventresult=\"1\" nextfp=\"1\"/></app>"))
958f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
959f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[2].find(
960f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"1.0\">"
961f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /><packages><package fp=\"1\"/></packages></app>"))
962f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
963f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[3].find(
964f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" "
965f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "version=\"1.0\" nextversion=\"2.0\">"
966f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<event eventtype=\"3\" eventresult=\"1\" diffresult=\"1\" "
967f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "previousfp=\"1\" nextfp=\"22\"/></app>"))
968f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
969f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[4].find(
970f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"2.0\">"
971f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /><packages><package fp=\"22\"/></packages></app>"))
972f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
973ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  component_updater()->Stop();
974ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
975ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
976eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Verify that component installation falls back to downloading and installing
977eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// a full update if the differential update fails (in this case, because the
978eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// installer does not know about the existing files). We do two loops; the final
979eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// loop should do nothing.
980ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// We also check that exactly 4 non-ping network requests are issued:
981eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 1- update check (loop 1)
982eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 2- download differential crx
983eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 3- download full crx
984eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 4- update check (loop 2 - no update available)
985ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// There should be one ping for the first attempted update.
986a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(ComponentUpdaterTest, DifferentialUpdateFails) {
987f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
988f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_diff_reply_2.xml")));
989f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
990f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
991f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_diff_reply_3.xml")));
992f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
993f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
994f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL("http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"),
995f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"));
996f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
997f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL("http://localhost/download/"
998f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)           "ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx"),
999f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx"));
1000f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
1001f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL("http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_2.crx"),
1002f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("ihfokbkgjpifnbbojhneepfflplebdkc_2.crx"));
1003eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1004eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer;
1005eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CrxComponent com;
1006eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com, kTestComponent_ihfo, Version("1.0"), &installer);
1007eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1008eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test_configurator()->SetLoopCount(2);
1009eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  component_updater()->Start();
10104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
1011eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1012eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // A failed differential update does not count as a failed install.
1013eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
1014eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(1, static_cast<TestInstaller*>(com.installer)->install_count());
1015eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1016f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(3, post_interceptor_->GetHitCount())
1017f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1018f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(3, post_interceptor_->GetCount())
1019f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1020f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, get_interceptor_->GetHitCount());
1021f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1022f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
1023f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"1.0\">"
1024f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /></app>"))
1025f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1026f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[1].find(
1027f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" "
1028f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "version=\"1.0\" nextversion=\"2.0\">"
1029f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<event eventtype=\"3\" eventresult=\"1\" diffresult=\"0\" "
1030f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "differrorcat=\"2\" differrorcode=\"16\" nextfp=\"22\"/></app>"))
1031f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1032f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[2].find(
1033f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"2.0\">"
1034f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /><packages><package fp=\"22\"/></packages></app>"))
1035f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1036eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1037eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  component_updater()->Stop();
1038eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1039eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1040ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Verify that a failed installation causes an install failure ping.
1041ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochTEST_F(ComponentUpdaterTest, CheckFailedInstallPing) {
1042ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // This test installer reports installation failure.
1043ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  class : public TestInstaller {
1044ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    virtual bool Install(const base::DictionaryValue& manifest,
1045ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                         const base::FilePath& unpack_path) OVERRIDE {
1046ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      ++install_count_;
1047ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      base::DeleteFile(unpack_path, true);
1048ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      return false;
1049ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    }
1050ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  } installer;
1051ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1052f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
1053f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_reply_1.xml")));
1054f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
1055f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
1056f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_reply_1.xml")));
1057f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
1058f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
1059f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL(expected_crx_url),
1060f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
1061f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1062f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Start with 0.9, and attempt update to 1.0.
1063f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Loop twice to issue two checks: (1) with original 0.9 version
1064f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // and (2), which should retry with 0.9.
1065ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  CrxComponent com;
1066ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  RegisterComponent(&com, kTestComponent_jebg, Version("0.9"), &installer);
1067ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1068ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  test_configurator()->SetLoopCount(2);
1069ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  component_updater()->Start();
10704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
1071ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1072f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(4, post_interceptor_->GetHitCount())
1073f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1074f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, get_interceptor_->GetHitCount());
1075f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1076f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
1077f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"0.9\">"
1078f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /></app>"))
1079f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1080f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[1].find(
1081f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" "
1082f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "version=\"0.9\" nextversion=\"1.0\">"
1083f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<event eventtype=\"3\" eventresult=\"0\" "
1084f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "errorcat=\"3\" errorcode=\"9\"/></app>"))
1085f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1086f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[2].find(
1087f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"0.9\">"
1088f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /></app>"))
1089f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1090f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[3].find(
1091f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" "
1092f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "version=\"0.9\" nextversion=\"1.0\">"
1093f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<event eventtype=\"3\" eventresult=\"0\" "
1094f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "errorcat=\"3\" errorcode=\"9\"/></app>"))
1095f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1096f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1097ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Loop once more, but expect no ping because a noupdate response is issued.
1098ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // This is necessary to clear out the fire-and-forget ping from the previous
1099ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // iteration.
1100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  post_interceptor_->Reset();
1101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
1102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_reply_noupdate.xml")));
1103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1104ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  test_configurator()->SetLoopCount(1);
1105ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  component_updater()->Start();
11064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
1107ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1108ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
1109ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(2, static_cast<TestInstaller*>(com.installer)->install_count());
1110ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetHitCount())
1112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetCount())
1114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
1117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"0.9\">"
1118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /></app>"))
1119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1120ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1121ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  component_updater()->Stop();
1122ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
1123ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Verify that we successfully propagate a patcher error.
1125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// ihfokbkgjpifnbbojhneepfflplebdkc_1to2_bad.crx contains an incorrect
1126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// patching instruction that should fail.
1127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(ComponentUpdaterTest, DifferentialUpdateFailErrorcode) {
1128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
1129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_diff_reply_1.xml")));
1130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
1131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
1132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_diff_reply_2.xml")));
1133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
1134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
1135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_diff_reply_3.xml")));
1136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
1138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL("http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"),
1139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"));
1140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // This intercept returns a different file than what is specified in the
1141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // update check response and requested in the download. The file that is
1142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // actually dowloaded contains a patching error, an therefore, an error
1143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // is injected at the time of patching.
1144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
1145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL("http://localhost/download/"
1146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)           "ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx"),
1147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1to2_bad.crx"));
1148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
1149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL("http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_2.crx"),
1150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("ihfokbkgjpifnbbojhneepfflplebdkc_2.crx"));
1151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  VersionedTestInstaller installer;
1153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CrxComponent com;
1154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com, kTestComponent_ihfo, Version("0.0"), &installer);
1155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  test_configurator()->SetLoopCount(3);
1157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  component_updater()->Start();
11584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
11594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  component_updater()->Stop();
1160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
1162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(2, static_cast<TestInstaller*>(com.installer)->install_count());
1163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(5, post_interceptor_->GetHitCount())
1165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(5, post_interceptor_->GetCount())
1167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(3, get_interceptor_->GetHitCount());
1169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
1171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"0.0\">"
1172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /></app>"))
1173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[1].find(
1175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" "
1176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "version=\"0.0\" nextversion=\"1.0\">"
1177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<event eventtype=\"3\" eventresult=\"1\" nextfp=\"1\"/></app>"))
1178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[2].find(
1180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"1.0\">"
1181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /><packages><package fp=\"1\"/></packages></app>"))
1182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[3].find(
1184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" "
1185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "version=\"1.0\" nextversion=\"2.0\">"
1186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<event eventtype=\"3\" eventresult=\"1\" "
1187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "diffresult=\"0\" differrorcat=\"2\" "
1188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "differrorcode=\"14\" diffextracode1=\"305\" "
1189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "previousfp=\"1\" nextfp=\"22\"/></app>"))
1190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1191f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[4].find(
1192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"2.0\">"
1193f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /><packages><package fp=\"22\"/></packages></app>"))
1194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1197f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RequestAndDeleteResourceThrottle(
1198f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ComponentUpdateService* cus, const char* crx_id) {
1199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // By requesting a throttle and deleting it immediately we ensure that we
1200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // hit the case where the component updater tries to use the weak
1201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // pointer to a dead Resource throttle.
1202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  class  NoCallResourceController : public content::ResourceController {
1203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   public:
1204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual ~NoCallResourceController() {}
1205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual void Cancel() OVERRIDE { CHECK(false); }
1206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual void CancelAndIgnore() OVERRIDE { CHECK(false); }
1207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual void CancelWithError(int error_code) OVERRIDE { CHECK(false); }
1208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual void Resume() OVERRIDE { CHECK(false); }
1209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  };
1210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  net::TestURLRequestContext context;
1212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  net::TestURLRequest url_request(
1213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL("http://foo.example.com/thing.bin"),
1214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      net::DEFAULT_PRIORITY,
1215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      NULL,
1216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      &context);
1217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  content::ResourceThrottle* rt =
1219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      cus->GetOnDemandResourceThrottle(&url_request, crx_id);
1220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  NoCallResourceController controller;
1221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  rt->set_controller_for_testing(&controller);
1222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  delete rt;
1223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(ComponentUpdaterTest, ResourceThrottleNoUpdate) {
1226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  MockComponentObserver observer;
1227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(observer,
1228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
1229f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              .Times(1);
1230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(observer,
1231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
1232f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              .Times(1);
1233f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(observer,
1235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
1236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              .Times(1);
1237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TestInstaller installer;
1239f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CrxComponent com;
1240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  com.observer = &observer;
1241f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(ComponentUpdateService::kOk,
1242f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            RegisterComponent(&com,
1243f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                              kTestComponent_abag,
1244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                              Version("1.1"),
1245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                              &installer));
1246f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const GURL expected_update_url(
1248f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "http://localhost/upd?extra=foo"
1249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "&x=id%3Dabagagagagagagagagagagagagagagag%26v%3D1.1%26fp%3D%26uc"
1250f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "%26installsource%3Dondemand");
1251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The following two calls ensure that we don't do an update check via the
1252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // timer, so the only update check should be the on-demand one.
1253f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  test_configurator()->SetInitialDelay(1000000);
1254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  test_configurator()->SetRecheckTime(1000000);
1255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  test_configurator()->SetLoopCount(1);
1256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  component_updater()->Start();
1257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RunThreadsUntilIdle();
1259f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0, post_interceptor_->GetHitCount());
1261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1262f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
1263f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_reply_1.xml")));
1264f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1265f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  BrowserThread::PostTask(
1266f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      BrowserThread::IO,
1267f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      FROM_HERE,
1268f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&RequestAndDeleteResourceThrottle,
1269f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 component_updater(),
1270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 "abagagagagagagagagagagagagagagag"));
1271f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RunThreads();
1273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1274f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetHitCount());
1275f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
1276f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count());
1277f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1278f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  component_updater()->Stop();
1279f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace component_updater
1282f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1283