component_updater_service_unittest.cc revision 0529e5d033099cbfc42635f6f6183833b09dff6e
15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 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"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/string_util.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/stringprintf.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/component_updater/component_updater_utils.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/component_updater/test/test_installer.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/browser/browser_thread.h"
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/resource_controller.h"
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/resource_request_info.h"
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/resource_throttle.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "libxml/globals.h"
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/base/upload_bytes_element_reader.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_fetcher.h"
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "net/url_request/url_request_test_util.h"
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using ::testing::_;
29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using ::testing::InSequence;
30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using ::testing::Mock;
31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace component_updater {
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#define POST_INTERCEPT_SCHEME    "https"
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define POST_INTERCEPT_HOSTNAME  "localhost2"
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define POST_INTERCEPT_PATH      "/update2"
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)MockComponentObserver::MockComponentObserver() {
39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)MockComponentObserver::~MockComponentObserver() {
42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
43a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool PartialMatch::Match(const std::string& actual) const {
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return actual.find(expected_) != std::string::npos;
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTestConfigurator::TestConfigurator()
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    : initial_time_(0),
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      times_(1),
51ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      recheck_time_(0),
52ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      ondemand_time_(0),
53ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      cus_(NULL),
54ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      context_(new net::TestURLRequestContextGetter(
55ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO))) {
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTestConfigurator::~TestConfigurator() {
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)int TestConfigurator::InitialDelay() { return initial_time_; }
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint TestConfigurator::NextCheckDelay() {
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // This is called when a new full cycle of checking for updates is going
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // to happen. In test we normally only test one cycle so it is a good
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // time to break from the test messageloop Run() method so the test can
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // finish.
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (--times_ <= 0) {
694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    quit_closure_.Run();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return 1;
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint TestConfigurator::StepDelay() {
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return 0;
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)int TestConfigurator::StepDelayMedium() {
803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return NextCheckDelay();
813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint TestConfigurator::MinimumReCheckWait() {
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return recheck_time_;
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint TestConfigurator::OnDemandDelay() {
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return ondemand_time_;
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochGURL TestConfigurator::UpdateUrl() {
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return GURL(POST_INTERCEPT_SCHEME "://"
93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              POST_INTERCEPT_HOSTNAME POST_INTERCEPT_PATH);
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
96ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochGURL TestConfigurator::PingUrl() {
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return UpdateUrl();
98ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
99ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::string TestConfigurator::ExtraRequestParams() { return "extra=\"foo\""; }
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochsize_t TestConfigurator::UrlSizeLimit() { return 256; }
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnet::URLRequestContextGetter* TestConfigurator::RequestContext() {
105ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return context_.get();
106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Don't use the utility process to run code out-of-process.
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool TestConfigurator::InProcess() { return true; }
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool TestConfigurator::DeltasEnabled() const {
112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return true;
113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool TestConfigurator::UseBackgroundDownloader() const {
116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return false;
117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Set how many update checks are called, the default value is just once.
120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid TestConfigurator::SetLoopCount(int times) { times_ = times; }
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid TestConfigurator::SetRecheckTime(int seconds) {
123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  recheck_time_ = seconds;
124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid TestConfigurator::SetOnDemandTime(int seconds) {
127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ondemand_time_ = seconds;
128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid TestConfigurator::SetComponentUpdateService(ComponentUpdateService* cus) {
131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  cus_ = cus;
132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void TestConfigurator::SetQuitClosure(const base::Closure& quit_closure) {
1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  quit_closure_ = quit_closure;
1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void TestConfigurator::SetInitialDelay(int seconds) {
139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  initial_time_ = seconds;
140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)InterceptorFactory::InterceptorFactory()
143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    : URLRequestPostInterceptorFactory(POST_INTERCEPT_SCHEME,
144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                       POST_INTERCEPT_HOSTNAME) {}
145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)InterceptorFactory::~InterceptorFactory() {}
147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)URLRequestPostInterceptor* InterceptorFactory::CreateInterceptor() {
149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return URLRequestPostInterceptorFactory::CreateInterceptor(
150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::FilePath::FromUTF8Unsafe(POST_INTERCEPT_PATH));
151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
153ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochComponentUpdaterTest::ComponentUpdaterTest()
154ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    : test_config_(NULL),
1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP) {
156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // The component updater instance under test.
157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test_config_ = new TestConfigurator;
158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  component_updater_.reset(ComponentUpdateServiceFactory(test_config_));
159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test_config_->SetComponentUpdateService(component_updater_.get());
160ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // The test directory is chrome/test/data/components.
162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir_);
163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test_data_dir_ = test_data_dir_.AppendASCII("components");
164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  net::URLFetcher::SetEnableInterceptionForTests(true);
166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochComponentUpdaterTest::~ComponentUpdaterTest() {
169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  net::URLFetcher::SetEnableInterceptionForTests(false);
170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ComponentUpdaterTest::SetUp() {
173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_.reset(new GetInterceptor);
174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  interceptor_factory_.reset(new InterceptorFactory);
175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  post_interceptor_ = interceptor_factory_->CreateInterceptor();
176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_);
177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ComponentUpdaterTest::TearDown() {
180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  interceptor_factory_.reset();
181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_.reset();
182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  xmlCleanupGlobals();
183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochComponentUpdateService* ComponentUpdaterTest::component_updater() {
186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return component_updater_.get();
187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Makes the full path to a component updater test file.
190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst base::FilePath ComponentUpdaterTest::test_file(const char* file) {
191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return test_data_dir_.AppendASCII(file);
192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTestConfigurator* ComponentUpdaterTest::test_configurator() {
195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return test_config_;
196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochComponentUpdateService::Status ComponentUpdaterTest::RegisterComponent(
199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    CrxComponent* com,
200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    TestComponents component,
201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const Version& version,
202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    TestInstaller* installer) {
203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (component == kTestComponent_abag) {
204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    com->name = "test_abag";
205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    com->pk_hash.assign(abag_hash, abag_hash + arraysize(abag_hash));
206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  } else if (component == kTestComponent_jebg) {
207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    com->name = "test_jebg";
208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    com->pk_hash.assign(jebg_hash, jebg_hash + arraysize(jebg_hash));
209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  } else {
210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    com->name = "test_ihfo";
211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    com->pk_hash.assign(ihfo_hash, ihfo_hash + arraysize(ihfo_hash));
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  com->version = version;
214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  com->installer = installer;
215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return component_updater_->RegisterComponent(*com);
216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void ComponentUpdaterTest::RunThreads() {
2194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::RunLoop runloop;
2204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  test_configurator()->SetQuitClosure(runloop.QuitClosure());
2214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  runloop.Run();
222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Since some tests need to drain currently enqueued tasks such as network
224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // intercepts on the IO thread, run the threads until they are
225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // idle. The component updater service won't loop again until the loop count
226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // is set and the service is started.
227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RunThreadsUntilIdle();
2284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void ComponentUpdaterTest::RunThreadsUntilIdle() {
2314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
2324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)ComponentUpdateService::Status OnDemandTester::OnDemand(
2351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    ComponentUpdateService* cus, const std::string& component_id) {
2361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return cus->OnDemandUpdate(component_id);
2371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that our test fixture work and the component updater can
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// be created and destroyed with no side effects.
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, VerifyFixture) {
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(component_updater() != NULL);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that the component updater can be caught in a quick
246ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// start-shutdown situation. Failure of this test will be a crash.
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, StartStop) {
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Start();
2494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreadsUntilIdle();
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Stop();
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that when the server has no updates, we go back to sleep and
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the COMPONENT_UPDATER_STARTED and COMPONENT_UPDATER_SLEEPING notifications
255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// are generated. No pings are sent.
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, CheckCrxSleep) {
257a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  MockComponentObserver observer;
258a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
259f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(observer,
260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              .Times(1);
262f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(observer,
263f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
264f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              .Times(2);
265f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(observer,
266f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
267f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              .Times(2);
268f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
269f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_reply_1.xml")));
271f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_reply_1.xml")));
273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
274eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrxComponent com;
276a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  com.observer = &observer;
277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(ComponentUpdateService::kOk,
278eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            RegisterComponent(&com,
279eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              kTestComponent_abag,
280eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              Version("1.1"),
281eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              &installer));
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We loop twice, but there are no updates so we expect two sleep messages.
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_configurator()->SetLoopCount(2);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Start();
2864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count());
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
291f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Expect to see the two update check requests and no other requests,
292f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // including pings.
293f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, post_interceptor_->GetHitCount())
294f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
295f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, post_interceptor_->GetCount())
296f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
297f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
298f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"abagagagagagagagagagagagagagagag\" version=\"1.1\">"
299f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /></app>"))
300f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
301f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[1].find(
302f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"abagagagagagagagagagagagagagagag\" version=\"1.1\">"
303f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /></app>"))
304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
305f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Stop();
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Loop twice again but this case we simulate a server error by returning
309f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // an empty file. Expect the behavior of the service to be the same as before.
310a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_CALL(observer,
311a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)              OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
312a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)              .Times(1);
313a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_CALL(observer,
314a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)              OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
315a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)              .Times(2);
3161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_CALL(observer,
3171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)              OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
3181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)              .Times(2);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
320f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  post_interceptor_->Reset();
321f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
322f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_reply_empty")));
323f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
324f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_reply_empty")));
325f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
326f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  test_configurator()->SetLoopCount(2);
327f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  component_updater()->Start();
328f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RunThreads();
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count());
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
333f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, post_interceptor_->GetHitCount())
334f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
335f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, post_interceptor_->GetCount())
336f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
337f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
338f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"abagagagagagagagagagagagagagagag\" version=\"1.1\">"
339f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /></app>"))
340f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
341f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[1].find(
342f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"abagagagagagagagagagagagagagagag\" version=\"1.1\">"
343f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /></app>"))
344f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
345f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Stop();
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we can check for updates and install one component. Besides
350ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// the notifications above COMPONENT_UPDATE_FOUND and COMPONENT_UPDATE_READY
351ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// should have been fired. We do two loops so the second time around there
352ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// should be nothing left to do.
353f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// We also check that the following network requests are issued:
354f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// 1- update check
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2- download crx
356f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// 3- ping
357f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// 4- second update check.
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, InstallCrx) {
359a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  MockComponentObserver observer1;
360a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
361a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
362a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
363a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
364a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
365a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
366a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATE_FOUND, 0))
367a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
368a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
369a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATE_READY, 0))
370a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
371a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
3721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATED, 0))
3731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
3741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer1,
375a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
3761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
3771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer1,
3781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
3791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
3801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer1,
3811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
3821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
383a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
384a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
385a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  MockComponentObserver observer2;
386a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
387a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
388a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
389a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
390a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
391a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
3921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
3931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
3941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer2,
3951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
3961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
3971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer2,
3981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
3991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
4001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer2,
401a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
4021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
403a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
404a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
405f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
406f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_reply_1.xml")));
407f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
408f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
409f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_reply_1.xml")));
410f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
411f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
412f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL(expected_crx_url),
413f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
414f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
415eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer1;
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrxComponent com1;
417a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  com1.observer = &observer1;
418eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com1, kTestComponent_jebg, Version("0.9"), &installer1);
419eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer2;
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrxComponent com2;
421a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  com2.observer = &observer2;
422eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com2, kTestComponent_abag, Version("2.2"), &installer2);
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_configurator()->SetLoopCount(2);
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Start();
4264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error());
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, static_cast<TestInstaller*>(com1.installer)->install_count());
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error());
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->install_count());
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
433f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Expect three request in total: two update checks and one ping.
434f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(3, post_interceptor_->GetHitCount())
435f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
436f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(3, post_interceptor_->GetCount())
437f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
438f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
439f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Expect one component download.
440f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, get_interceptor_->GetHitCount());
441f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
442f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
443f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"0.9\">"
444f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /></app>"))
445f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
446f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
447f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"abagagagagagagagagagagagagagagag\" version=\"2.2\">"
448f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /></app>"))
449f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
450f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
451f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[1].find(
452f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" "
453f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "version=\"0.9\" nextversion=\"1.0\">"
4545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "<event eventtype=\"3\" eventresult=\"1\"/>"))
455f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
456f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
457f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[2].find(
458f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"1.0\">"
459f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /></app>"));
460f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[2].find(
461f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"abagagagagagagagagagagagagagagag\" version=\"2.2\">"
462f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /></app>"))
463f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Test the protocol version is correct and the extra request attributes
4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // are included in the request.
4675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
4685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "request protocol=\"3.0\" extra=\"foo\""))
4695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Tokenize the request string to look for specific attributes, which
4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // are important for backward compatibility with the version v2 of the update
4735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // protocol. In this case, inspect the <request>, which is the first element
4745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // after the xml declaration of the update request body.
4755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Expect to find the |os|, |arch|, |prodchannel|, and |prodversion|
4765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // attributes:
4775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // <?xml version="1.0" encoding="UTF-8"?>
4785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // <request... os=... arch=... prodchannel=... prodversion=...>
4795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // ...
4805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // </request>
4815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const std::string update_request(post_interceptor_->GetRequests()[0]);
4825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::vector<base::StringPiece> elements;
4835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Tokenize(update_request, "<>", &elements);
4845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_NE(string::npos, elements[1].find(" os="));
4855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_NE(string::npos, elements[1].find(" arch="));
4865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_NE(string::npos, elements[1].find(" prodchannel="));
4875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_NE(string::npos, elements[1].find(" prodversion="));
4885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Look for additional attributes of the request, such as |version|,
4905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // |requestid|, |lang|, and |nacl_arch|.
4915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_NE(string::npos, elements[1].find(" version="));
4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_NE(string::npos, elements[1].find(" requestid="));
4935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_NE(string::npos, elements[1].find(" lang="));
4945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_NE(string::npos, elements[1].find(" nacl_arch="));
4955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  component_updater()->Stop();
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test checks that the "prodversionmin" value is handled correctly. In
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// particular there should not be an install because the minimum product
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// version is much higher than of chrome.
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, ProdVersionCheck) {
503f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
504f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_reply_2.xml")));
505f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
506f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
507f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL(expected_crx_url),
508f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
510eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer;
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrxComponent com;
512eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com, kTestComponent_jebg, Version("0.9"), &installer);
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_configurator()->SetLoopCount(1);
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Start();
5164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
518f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Expect one update check and no ping.
519f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetHitCount())
520f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
521f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetCount())
522f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
523f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
524f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Expect no download to occur.
525f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0, get_interceptor_->GetHitCount());
526f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count());
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Stop();
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
533f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Test that a update check due to an on demand call can cause installs.
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Here is the timeline:
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//  - First loop: we return a reply that indicates no update, so
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//    nothing happens.
537f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)//  - We make an on demand call.
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//  - This triggers a second loop, which has a reply that triggers an install.
5391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(ComponentUpdaterTest, OnDemandUpdate) {
540a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  MockComponentObserver observer1;
541a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
542a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
543a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
544a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
545a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
546a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
5471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
5481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
5491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer1,
550a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
551a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
552a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
5531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
5541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
5551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer1,
5561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
5571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
5581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer1,
559a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
560a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
561a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
562a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
563a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  MockComponentObserver observer2;
564a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
565a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
566a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
567a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
568a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
569a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
5701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
5711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
5721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer2,
573a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
574a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
575a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
5761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
5771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
5781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer2,
579a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATE_FOUND, 0))
580a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
581a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
582a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATE_READY, 0))
583a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
584a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
5851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATED, 0))
5861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
5871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer2,
588a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
589a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
590a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
591a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
592f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
593f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_reply_empty")));
594f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
595f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
596f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL(expected_crx_url),
597f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
598f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
599eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer1;
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CrxComponent com1;
601a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  com1.observer = &observer1;
602eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com1, kTestComponent_abag, Version("2.2"), &installer1);
603eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer2;
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CrxComponent com2;
605a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  com2.observer = &observer2;
606eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com2, kTestComponent_jebg, Version("0.9"), &installer2);
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // No update normally.
6091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  test_configurator()->SetLoopCount(1);
6101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  component_updater()->Start();
6111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RunThreads();
6121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  component_updater()->Stop();
6131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
614f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetHitCount())
615f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
616f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetCount())
617f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
618f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
619f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0, get_interceptor_->GetHitCount());
620f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
6211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Update after an on-demand check is issued.
622f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  post_interceptor_->Reset();
623f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
624f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_reply_1.xml")));
625f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
626f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
6271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(ComponentUpdateService::kOk,
6281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            OnDemandTester::OnDemand(component_updater(),
6291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                     GetCrxComponentID(com2)));
6301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  test_configurator()->SetLoopCount(1);
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  component_updater()->Start();
6324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error());
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->install_count());
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error());
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, static_cast<TestInstaller*>(com2.installer)->install_count());
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
639f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, post_interceptor_->GetHitCount())
640f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
641f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, post_interceptor_->GetCount())
642f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
643f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
644f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, get_interceptor_->GetHitCount());
645f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
646f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Expect the update check to contain an "ondemand" request for the
647f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // second component (com2) and a normal request for the other component.
648f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
649f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"abagagagagagagagagagagagagagagag\" "
650f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "version=\"2.2\"><updatecheck /></app>"))
651f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
652f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
653f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" "
654f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "version=\"0.9\" installsource=\"ondemand\"><updatecheck /></app>"))
655f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
656f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[1].find(
657f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" "
658f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "version=\"0.9\" nextversion=\"1.0\">"
6595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "<event eventtype=\"3\" eventresult=\"1\"/>"))
660f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Also check what happens if previous check too soon.
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_configurator()->SetOnDemandTime(60 * 60);
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ComponentUpdateService::kError,
6651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            OnDemandTester::OnDemand(component_updater(),
6661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                     GetCrxComponentID(com2)));
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Okay, now reset to 0 for the other tests.
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_configurator()->SetOnDemandTime(0);
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  component_updater()->Stop();
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Test a few error cases. NOTE: We don't have callbacks for
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // when the updates failed yet.
673a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer1));
674a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
675a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
676a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
677a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
678a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
679a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
6801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
6811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
6821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer1,
683a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
684a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
685a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
686a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer2));
687a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
688a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
689a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
690a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
691a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
692a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
6931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
6941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
6951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer2,
696a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
697a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
698a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
699a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // No update: error from no server response
701f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  post_interceptor_->Reset();
702f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
703f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_reply_empty")));
704f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_configurator()->SetLoopCount(1);
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  component_updater()->Start();
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ComponentUpdateService::kOk,
7081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            OnDemandTester::OnDemand(component_updater(),
7091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                     GetCrxComponentID(com2)));
7104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  component_updater()->Stop();
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
713f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetHitCount())
714f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
715f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetCount())
716f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
717f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // No update: already updated to 1.0 so nothing new
719a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer1));
720a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
721a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
722a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
723a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
724a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
725a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
7261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
7271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
7281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer1,
729a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
730a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
731a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
732a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer2));
733a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
734a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
735a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
736a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
737a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
738a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
7391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
7401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
7411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer2,
742a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
743a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
744a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
745a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
746f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  post_interceptor_->Reset();
747f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
748f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_reply_1.xml")));
749f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_configurator()->SetLoopCount(1);
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  component_updater()->Start();
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ComponentUpdateService::kOk,
7531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            OnDemandTester::OnDemand(component_updater(),
7541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                     GetCrxComponentID(com2)));
7554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
757f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetHitCount())
758f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
759f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetCount())
760f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
761ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  component_updater()->Stop();
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Verify that a previously registered component can get re-registered
766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// with a different version.
767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ComponentUpdaterTest, CheckReRegistration) {
768a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  MockComponentObserver observer1;
769a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
770a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
771a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
772a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
773a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
774a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
775a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATE_FOUND, 0))
776a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
777a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
778a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATE_READY, 0))
779a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
780a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
7811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATED, 0))
7821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
7831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer1,
784a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
785a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
786a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
7871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
7881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
7891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer1,
790a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
791a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
792a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
793a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
794a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  MockComponentObserver observer2;
795a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
796a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
797a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
798a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
799a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
800a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
8011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
8021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
8031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer2,
804a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
805a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
806a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
8071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
8081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
8091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer2,
810a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
811a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
812a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
813a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
814f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
815f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_reply_1.xml")));
816f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
817f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
818f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_reply_1.xml")));
819f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
820f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
821f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL(expected_crx_url),
822f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
823f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
824eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer1;
825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CrxComponent com1;
826a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  com1.observer = &observer1;
827eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com1, kTestComponent_jebg, Version("0.9"), &installer1);
828eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer2;
829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CrxComponent com2;
830a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  com2.observer = &observer2;
831eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com2, kTestComponent_abag, Version("2.2"), &installer2);
832c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
833f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Loop twice to issue two checks: (1) with original 0.9 version, update to
834f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // 1.0, and do the second check (2) with the updated 1.0 version.
835c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test_configurator()->SetLoopCount(2);
836c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  component_updater()->Start();
8374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
838c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
839c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error());
840c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(1, static_cast<TestInstaller*>(com1.installer)->install_count());
841c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error());
842c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->install_count());
843c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
844f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(3, post_interceptor_->GetHitCount())
845f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        << post_interceptor_->GetRequestsAsString();
846f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, get_interceptor_->GetHitCount());
847f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
848f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
849f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"0.9\">"
850f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /></app>"))
851f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
852f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[1].find(
853f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" "
854f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "version=\"0.9\" nextversion=\"1.0\">"
8555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "<event eventtype=\"3\" eventresult=\"1\"/>"))
856f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
857f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[2].find(
858f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"1.0\">"
859f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /></app>"))
860f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
862a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  component_updater()->Stop();
863a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
864c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Now re-register, pretending to be an even newer version (2.2)
865a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer1));
866a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
867a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
868a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
869a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
870a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
871a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer1,
8721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
8731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
8741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer1,
875a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
876a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
877a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
878a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
879a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer2));
880a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
881a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
882a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
883a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
884a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
885a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(observer2,
8861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
8871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                .Times(1);
8881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_CALL(observer2,
889a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
890a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                .Times(1);
891a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
892a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
893f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  post_interceptor_->Reset();
894f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
895f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_reply_1.xml")));
896f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
897eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer3;
898c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(ComponentUpdateService::kReplaced,
899eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            RegisterComponent(&com1,
900eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              kTestComponent_jebg,
901eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              Version("2.2"),
902eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              &installer3));
903c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Loop once just to notice the check happening with the re-register version.
905c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test_configurator()->SetLoopCount(1);
906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  component_updater()->Start();
9074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
909eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // We created a new installer, so the counts go back to 0.
910c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error());
911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->install_count());
912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error());
913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->install_count());
914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
915f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // One update check and no additional pings are expected.
916f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetHitCount())
917f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        << post_interceptor_->GetRequestsAsString();
918f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetCount())
919f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        << post_interceptor_->GetRequestsAsString();
920f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
921f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
922f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"2.2\">"
923f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /></app>"));
924f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
925c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  component_updater()->Stop();
926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
927eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
928ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Verify that we can download and install a component and a differential
929ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// update to that component. We do three loops; the final loop should do
930ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// nothing.
931ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// We also check that exactly 5 non-ping network requests are issued:
932ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// 1- update check (response: v1 available)
933ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// 2- download crx (v1)
934ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// 3- update check (response: v2 available)
935ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// 4- download differential crx (v1 to v2)
936ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// 5- update check (response: no further update available)
937ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// There should be two pings, one for each update. The second will bear a
938ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// diffresult=1, while the first will not.
939ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochTEST_F(ComponentUpdaterTest, DifferentialUpdate) {
940f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
941f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_diff_reply_1.xml")));
942f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
943f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
944f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_diff_reply_2.xml")));
945f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
946f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
947f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_diff_reply_3.xml")));
948f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
949f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
950f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL("http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"),
951f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"));
952f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
953f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL("http://localhost/download/"
954f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)           "ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx"),
955f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx"));
956ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
957ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  VersionedTestInstaller installer;
958ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  CrxComponent com;
959ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  RegisterComponent(&com, kTestComponent_ihfo, Version("0.0"), &installer);
960ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
961ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  test_configurator()->SetLoopCount(3);
962ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  component_updater()->Start();
9634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
964ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
965ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
966ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(2, static_cast<TestInstaller*>(com.installer)->install_count());
967ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
968f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(5, post_interceptor_->GetHitCount())
969f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
970f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(5, post_interceptor_->GetCount())
971f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
972f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, get_interceptor_->GetHitCount());
973f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
974f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
975f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"0.0\">"
976f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /></app>"))
977f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
978f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[1].find(
979f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" "
980f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "version=\"0.0\" nextversion=\"1.0\">"
9815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "<event eventtype=\"3\" eventresult=\"1\" nextfp=\"1\"/>"))
982f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
983f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[2].find(
984f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"1.0\">"
985f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /><packages><package fp=\"1\"/></packages></app>"))
986f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
987f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[3].find(
988f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" "
989f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "version=\"1.0\" nextversion=\"2.0\">"
990f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<event eventtype=\"3\" eventresult=\"1\" diffresult=\"1\" "
9915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "previousfp=\"1\" nextfp=\"22\"/>"))
992f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
993f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[4].find(
994f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"2.0\">"
995f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /><packages><package fp=\"22\"/></packages></app>"))
996f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
997ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  component_updater()->Stop();
998ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
999ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1000eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Verify that component installation falls back to downloading and installing
1001eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// a full update if the differential update fails (in this case, because the
1002eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// installer does not know about the existing files). We do two loops; the final
1003eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// loop should do nothing.
1004ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// We also check that exactly 4 non-ping network requests are issued:
1005eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 1- update check (loop 1)
1006eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 2- download differential crx
1007eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 3- download full crx
1008eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 4- update check (loop 2 - no update available)
1009ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// There should be one ping for the first attempted update.
10100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// This test is flaky on Android. crbug.com/329883
10110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#if defined(OS_ANDROID)
10120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#define MAYBE_DifferentialUpdateFails DISABLED_DifferentialUpdateFails
10130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#else
10140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#define MAYBE_DifferentialUpdateFails DifferentialUpdateFails
10150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#endif
10160529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(ComponentUpdaterTest, MAYBE_DifferentialUpdateFails) {
1017f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
1018f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_diff_reply_2.xml")));
1019f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
1020f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
1021f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_diff_reply_3.xml")));
1022f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1023f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
1024f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL("http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"),
1025f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"));
1026f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
1027f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL("http://localhost/download/"
1028f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)           "ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx"),
1029f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx"));
1030f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
1031f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL("http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_2.crx"),
1032f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("ihfokbkgjpifnbbojhneepfflplebdkc_2.crx"));
1033eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1034eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer;
1035eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CrxComponent com;
1036eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com, kTestComponent_ihfo, Version("1.0"), &installer);
1037eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1038eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test_configurator()->SetLoopCount(2);
1039eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  component_updater()->Start();
10404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
1041eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1042eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // A failed differential update does not count as a failed install.
1043eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
1044eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(1, static_cast<TestInstaller*>(com.installer)->install_count());
1045eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1046f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(3, post_interceptor_->GetHitCount())
1047f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1048f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(3, post_interceptor_->GetCount())
1049f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1050f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, get_interceptor_->GetHitCount());
1051f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1052f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
1053f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"1.0\">"
1054f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /></app>"))
1055f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1056f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[1].find(
1057f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" "
1058f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "version=\"1.0\" nextversion=\"2.0\">"
1059f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<event eventtype=\"3\" eventresult=\"1\" diffresult=\"0\" "
10605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "differrorcat=\"2\" differrorcode=\"16\" nextfp=\"22\"/>"))
1061f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1062f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[2].find(
1063f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"2.0\">"
1064f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /><packages><package fp=\"22\"/></packages></app>"))
1065f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1066eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1067eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  component_updater()->Stop();
1068eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1069eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
10705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Test is flakey on Android bots. See crbug.com/331420.
10715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_ANDROID)
10725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define MAYBE_CheckFailedInstallPing DISABLED_CheckFailedInstallPing
10735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else
10745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define MAYBE_CheckFailedInstallPing CheckFailedInstallPing
10755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
1076ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Verify that a failed installation causes an install failure ping.
10775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TEST_F(ComponentUpdaterTest, MAYBE_CheckFailedInstallPing) {
1078ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // This test installer reports installation failure.
1079ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  class : public TestInstaller {
1080ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    virtual bool Install(const base::DictionaryValue& manifest,
1081ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                         const base::FilePath& unpack_path) OVERRIDE {
1082ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      ++install_count_;
1083ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      base::DeleteFile(unpack_path, true);
1084ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      return false;
1085ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    }
1086ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  } installer;
1087ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1088f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
1089f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_reply_1.xml")));
1090f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
1091f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
1092f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_reply_1.xml")));
1093f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
1094f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
1095f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL(expected_crx_url),
1096f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
1097f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1098f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Start with 0.9, and attempt update to 1.0.
1099f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Loop twice to issue two checks: (1) with original 0.9 version
1100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // and (2), which should retry with 0.9.
1101ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  CrxComponent com;
1102ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  RegisterComponent(&com, kTestComponent_jebg, Version("0.9"), &installer);
1103ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1104ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  test_configurator()->SetLoopCount(2);
1105ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  component_updater()->Start();
11064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
1107ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(4, post_interceptor_->GetHitCount())
1109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, get_interceptor_->GetHitCount());
1111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
1113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"0.9\">"
1114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /></app>"))
1115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[1].find(
1117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" "
1118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "version=\"0.9\" nextversion=\"1.0\">"
1119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<event eventtype=\"3\" eventresult=\"0\" "
11205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "errorcat=\"3\" errorcode=\"9\"/>"))
1121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[2].find(
1123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"0.9\">"
1124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /></app>"))
1125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[3].find(
1127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" "
1128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "version=\"0.9\" nextversion=\"1.0\">"
1129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<event eventtype=\"3\" eventresult=\"0\" "
11305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "errorcat=\"3\" errorcode=\"9\"/>"))
1131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1133ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Loop once more, but expect no ping because a noupdate response is issued.
1134ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // This is necessary to clear out the fire-and-forget ping from the previous
1135ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // iteration.
1136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  post_interceptor_->Reset();
1137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
1138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_reply_noupdate.xml")));
1139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1140ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  test_configurator()->SetLoopCount(1);
1141ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  component_updater()->Start();
11424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
1143ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1144ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
1145ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(2, static_cast<TestInstaller*>(com.installer)->install_count());
1146ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetHitCount())
1148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetCount())
1150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
1153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"0.9\">"
1154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /></app>"))
1155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1156ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1157ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  component_updater()->Stop();
1158ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
1159ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Verify that we successfully propagate a patcher error.
1161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// ihfokbkgjpifnbbojhneepfflplebdkc_1to2_bad.crx contains an incorrect
1162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// patching instruction that should fail.
1163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(ComponentUpdaterTest, DifferentialUpdateFailErrorcode) {
1164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
1165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_diff_reply_1.xml")));
1166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
1167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
1168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_diff_reply_2.xml")));
1169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
1170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
1171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_diff_reply_3.xml")));
1172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
1174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL("http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"),
1175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"));
1176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // This intercept returns a different file than what is specified in the
1177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // update check response and requested in the download. The file that is
1178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // actually dowloaded contains a patching error, an therefore, an error
1179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // is injected at the time of patching.
1180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
1181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL("http://localhost/download/"
1182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)           "ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx"),
1183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1to2_bad.crx"));
1184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
1185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL("http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_2.crx"),
1186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("ihfokbkgjpifnbbojhneepfflplebdkc_2.crx"));
1187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  VersionedTestInstaller installer;
1189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CrxComponent com;
1190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com, kTestComponent_ihfo, Version("0.0"), &installer);
1191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  test_configurator()->SetLoopCount(3);
1193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  component_updater()->Start();
11944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
11954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  component_updater()->Stop();
1196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
1198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(2, static_cast<TestInstaller*>(com.installer)->install_count());
1199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(5, post_interceptor_->GetHitCount())
1201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(5, post_interceptor_->GetCount())
1203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(3, get_interceptor_->GetHitCount());
1205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
1207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"0.0\">"
1208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /></app>"))
1209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[1].find(
1211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" "
1212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "version=\"0.0\" nextversion=\"1.0\">"
12135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "<event eventtype=\"3\" eventresult=\"1\" nextfp=\"1\"/>"))
1214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[2].find(
1216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"1.0\">"
1217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /><packages><package fp=\"1\"/></packages></app>"))
1218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[3].find(
1220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" "
1221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "version=\"1.0\" nextversion=\"2.0\">"
1222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<event eventtype=\"3\" eventresult=\"1\" "
1223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "diffresult=\"0\" differrorcat=\"2\" "
1224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "differrorcode=\"14\" diffextracode1=\"305\" "
12255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "previousfp=\"1\" nextfp=\"22\"/>"))
1226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NE(string::npos, post_interceptor_->GetRequests()[4].find(
1228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"2.0\">"
1229f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<updatecheck /><packages><package fp=\"22\"/></packages></app>"))
1230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1231eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1232f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
12335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class TestResourceController : public content::ResourceController {
12345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
12355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SetThrottle(content::ResourceThrottle* throttle) {}
12365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
12375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
12385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)content::ResourceThrottle* RequestTestResourceThrottle(
12395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ComponentUpdateService* cus,
12405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    TestResourceController* controller,
12415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const char* crx_id) {
12425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
12435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  net::TestURLRequestContext context;
12445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  net::TestURLRequest url_request(
12455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      GURL("http://foo.example.com/thing.bin"),
12465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      net::DEFAULT_PRIORITY,
12475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      NULL,
12485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      &context);
12495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
12505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::ResourceThrottle* rt =
12515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      cus->GetOnDemandResourceThrottle(&url_request, crx_id);
12525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  rt->set_controller_for_testing(controller);
12535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  controller->SetThrottle(rt);
12545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return rt;
12555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
12565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RequestAndDeleteResourceThrottle(
1258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ComponentUpdateService* cus, const char* crx_id) {
1259f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // By requesting a throttle and deleting it immediately we ensure that we
1260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // hit the case where the component updater tries to use the weak
1261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // pointer to a dead Resource throttle.
12625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  class  NoCallResourceController : public TestResourceController {
1263f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   public:
1264f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual ~NoCallResourceController() {}
1265f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual void Cancel() OVERRIDE { CHECK(false); }
1266f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual void CancelAndIgnore() OVERRIDE { CHECK(false); }
1267f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual void CancelWithError(int error_code) OVERRIDE { CHECK(false); }
1268f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual void Resume() OVERRIDE { CHECK(false); }
12695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } controller;
1270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
12715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  delete RequestTestResourceThrottle(cus, &controller, crx_id);
1272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
12745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ComponentUpdaterTest, ResourceThrottleDeletedNoUpdate) {
1275f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  MockComponentObserver observer;
1276f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(observer,
1277f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
1278f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              .Times(1);
1279f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(observer,
1280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
1281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              .Times(1);
1282f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(observer,
1283f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
1284f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              .Times(1);
1285f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
12865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
12875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "updatecheck"), test_file("updatecheck_reply_1.xml")));
12885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1289f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TestInstaller installer;
1290f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CrxComponent com;
1291f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  com.observer = &observer;
1292f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(ComponentUpdateService::kOk,
1293f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            RegisterComponent(&com,
1294f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                              kTestComponent_abag,
1295f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                              Version("1.1"),
1296f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                              &installer));
1297f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The following two calls ensure that we don't do an update check via the
1298f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // timer, so the only update check should be the on-demand one.
1299f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  test_configurator()->SetInitialDelay(1000000);
1300f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  test_configurator()->SetRecheckTime(1000000);
1301f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  test_configurator()->SetLoopCount(1);
1302f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  component_updater()->Start();
1303f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RunThreadsUntilIdle();
1305f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1306f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0, post_interceptor_->GetHitCount());
1307f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
13085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BrowserThread::PostTask(
13095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      BrowserThread::IO,
13105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      FROM_HERE,
13115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(&RequestAndDeleteResourceThrottle,
13125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 component_updater(),
13135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 "abagagagagagagagagagagagagagagag"));
13145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RunThreads();
13165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetHitCount());
13185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
13195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count());
13205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  component_updater()->Stop();
13225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
13235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class  CancelResourceController: public TestResourceController {
13255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  public:
13265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CancelResourceController() : throttle_(NULL), resume_called_(0) {}
13275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~CancelResourceController() {
13285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Check that the throttle has been resumed by the time we
13295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // exit the test.
13305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CHECK(resume_called_ == 1);
13315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    delete throttle_;
13325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
13335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void Cancel() OVERRIDE { CHECK(false); }
13345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void CancelAndIgnore() OVERRIDE { CHECK(false); }
13355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void CancelWithError(int error_code) OVERRIDE { CHECK(false); }
13365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void Resume() OVERRIDE {
13375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    BrowserThread::PostTask(
13385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        BrowserThread::IO,
13395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        FROM_HERE,
13405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::Bind(&CancelResourceController::ResumeCalled,
13415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    base::Unretained(this)));
13425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
13435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SetThrottle(content::ResourceThrottle* throttle) OVERRIDE {
13445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    throttle_ = throttle;
13455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool defer = false;
13465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Initially the throttle is blocked. The CUS needs to run a
13475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // task on the UI thread to  decide if it should unblock.
13485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    throttle_->WillStartRequest(&defer);
13495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CHECK(defer);
13505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
13515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  private:
13535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void ResumeCalled() { ++resume_called_; }
13545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::ResourceThrottle* throttle_;
13565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int resume_called_;
13575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
13585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ComponentUpdaterTest, ResourceThrottleLiveNoUpdate) {
13605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MockComponentObserver observer;
13615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(observer,
13625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
13635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              .Times(1);
13645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(observer,
13655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
13665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              .Times(1);
13675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(observer,
13685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
13695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              .Times(1);
13705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1371f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
1372f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "updatecheck"), test_file("updatecheck_reply_1.xml")));
1373f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
13745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TestInstaller installer;
13755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CrxComponent com;
13765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  com.observer = &observer;
13775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ComponentUpdateService::kOk,
13785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            RegisterComponent(&com,
13795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              kTestComponent_abag,
13805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              Version("1.1"),
13815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              &installer));
13825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The following two calls ensure that we don't do an update check via the
13835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // timer, so the only update check should be the on-demand one.
13845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  test_configurator()->SetInitialDelay(1000000);
13855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  test_configurator()->SetRecheckTime(1000000);
13865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  test_configurator()->SetLoopCount(1);
13875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  component_updater()->Start();
13885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RunThreadsUntilIdle();
13905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, post_interceptor_->GetHitCount());
13925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CancelResourceController controller;
13945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1395f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  BrowserThread::PostTask(
1396f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      BrowserThread::IO,
1397f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      FROM_HERE,
13985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(base::IgnoreResult(&RequestTestResourceThrottle),
1399f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 component_updater(),
14005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 &controller,
1401f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 "abagagagagagagagagagagagagagagag"));
1402f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1403f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RunThreads();
1404f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1405f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetHitCount());
1406f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
1407f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count());
1408f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1409f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  component_updater()->Stop();
1410f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1411f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
14125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1413f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace component_updater
1414f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1415