component_updater_service_unittest.cc revision 010d83a9304c5a91596085d917d248abff47903a
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::_;
29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)using ::testing::AnyNumber;
30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using ::testing::InSequence;
31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using ::testing::Mock;
32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace component_updater {
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define POST_INTERCEPT_SCHEME "https"
36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define POST_INTERCEPT_HOSTNAME "localhost2"
37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define POST_INTERCEPT_PATH "/update2"
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuMockServiceObserver::MockServiceObserver() {
40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuMockServiceObserver::~MockServiceObserver() {
43a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool PartialMatch::Match(const std::string& actual) const {
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return actual.find(expected_) != std::string::npos;
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTestConfigurator::TestConfigurator()
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    : initial_time_(0),
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      times_(1),
52ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      recheck_time_(0),
53ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      ondemand_time_(0),
54ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      cus_(NULL),
55ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      context_(new net::TestURLRequestContextGetter(
56ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO))) {
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTestConfigurator::~TestConfigurator() {
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)int TestConfigurator::InitialDelay() {
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return initial_time_;
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint TestConfigurator::NextCheckDelay() {
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // This is called when a new full cycle of checking for updates is going
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // to happen. In test we normally only test one cycle so it is a good
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // time to break from the test messageloop Run() method so the test can
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // finish.
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (--times_ <= 0) {
724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    quit_closure_.Run();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return 1;
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint TestConfigurator::StepDelay() {
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return 0;
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)int TestConfigurator::StepDelayMedium() {
833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return NextCheckDelay();
843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint TestConfigurator::MinimumReCheckWait() {
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return recheck_time_;
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint TestConfigurator::OnDemandDelay() {
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return ondemand_time_;
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochGURL TestConfigurator::UpdateUrl() {
95010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return GURL(POST_INTERCEPT_SCHEME
96010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              "://" POST_INTERCEPT_HOSTNAME POST_INTERCEPT_PATH);
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
99ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochGURL TestConfigurator::PingUrl() {
100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return UpdateUrl();
101ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
102ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)std::string TestConfigurator::ExtraRequestParams() {
104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return "extra=\"foo\"";
105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)size_t TestConfigurator::UrlSizeLimit() {
108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return 256;
109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnet::URLRequestContextGetter* TestConfigurator::RequestContext() {
112ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return context_.get();
113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Don't use the utility process to run code out-of-process.
116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool TestConfigurator::InProcess() {
117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return true;
118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool TestConfigurator::DeltasEnabled() const {
121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return true;
122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool TestConfigurator::UseBackgroundDownloader() const {
125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return false;
126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Set how many update checks are called, the default value is just once.
129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void TestConfigurator::SetLoopCount(int times) {
130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  times_ = times;
131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid TestConfigurator::SetRecheckTime(int seconds) {
134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  recheck_time_ = seconds;
135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid TestConfigurator::SetOnDemandTime(int seconds) {
138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ondemand_time_ = seconds;
139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid TestConfigurator::SetComponentUpdateService(ComponentUpdateService* cus) {
142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  cus_ = cus;
143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void TestConfigurator::SetQuitClosure(const base::Closure& quit_closure) {
1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  quit_closure_ = quit_closure;
1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void TestConfigurator::SetInitialDelay(int seconds) {
150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  initial_time_ = seconds;
151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)InterceptorFactory::InterceptorFactory()
154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    : URLRequestPostInterceptorFactory(POST_INTERCEPT_SCHEME,
155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                       POST_INTERCEPT_HOSTNAME) {
156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)InterceptorFactory::~InterceptorFactory() {
159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)URLRequestPostInterceptor* InterceptorFactory::CreateInterceptor() {
162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return URLRequestPostInterceptorFactory::CreateInterceptor(
163010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::FilePath::FromUTF8Unsafe(POST_INTERCEPT_PATH));
164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
166ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochComponentUpdaterTest::ComponentUpdaterTest()
167ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    : test_config_(NULL),
1684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP) {
169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // The component updater instance under test.
170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test_config_ = new TestConfigurator;
171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  component_updater_.reset(ComponentUpdateServiceFactory(test_config_));
172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test_config_->SetComponentUpdateService(component_updater_.get());
173ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // The test directory is chrome/test/data/components.
175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir_);
176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test_data_dir_ = test_data_dir_.AppendASCII("components");
177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  net::URLFetcher::SetEnableInterceptionForTests(true);
179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochComponentUpdaterTest::~ComponentUpdaterTest() {
182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  net::URLFetcher::SetEnableInterceptionForTests(false);
183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ComponentUpdaterTest::SetUp() {
186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_.reset(new GetInterceptor);
187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  interceptor_factory_.reset(new InterceptorFactory);
188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  post_interceptor_ = interceptor_factory_->CreateInterceptor();
189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_);
190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
191f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ComponentUpdaterTest::TearDown() {
193f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  interceptor_factory_.reset();
194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_.reset();
195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  xmlCleanupGlobals();
196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochComponentUpdateService* ComponentUpdaterTest::component_updater() {
199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return component_updater_.get();
200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Makes the full path to a component updater test file.
203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst base::FilePath ComponentUpdaterTest::test_file(const char* file) {
204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return test_data_dir_.AppendASCII(file);
205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTestConfigurator* ComponentUpdaterTest::test_configurator() {
208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return test_config_;
209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochComponentUpdateService::Status ComponentUpdaterTest::RegisterComponent(
212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    CrxComponent* com,
213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    TestComponents component,
214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const Version& version,
215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    TestInstaller* installer) {
216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (component == kTestComponent_abag) {
217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    com->name = "test_abag";
218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    com->pk_hash.assign(abag_hash, abag_hash + arraysize(abag_hash));
219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  } else if (component == kTestComponent_jebg) {
220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    com->name = "test_jebg";
221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    com->pk_hash.assign(jebg_hash, jebg_hash + arraysize(jebg_hash));
222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  } else {
223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    com->name = "test_ihfo";
224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    com->pk_hash.assign(ihfo_hash, ihfo_hash + arraysize(ihfo_hash));
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  com->version = version;
227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  com->installer = installer;
228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return component_updater_->RegisterComponent(*com);
229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void ComponentUpdaterTest::RunThreads() {
2324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::RunLoop runloop;
2334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  test_configurator()->SetQuitClosure(runloop.QuitClosure());
2344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  runloop.Run();
235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Since some tests need to drain currently enqueued tasks such as network
237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // intercepts on the IO thread, run the threads until they are
238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // idle. The component updater service won't loop again until the loop count
239f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // is set and the service is started.
240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RunThreadsUntilIdle();
2414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void ComponentUpdaterTest::RunThreadsUntilIdle() {
2444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
2454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)ComponentUpdateService::Status OnDemandTester::OnDemand(
248010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ComponentUpdateService* cus,
249010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const std::string& component_id) {
2501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return cus->OnDemandUpdate(component_id);
2511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that our test fixture work and the component updater can
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// be created and destroyed with no side effects.
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, VerifyFixture) {
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(component_updater() != NULL);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that the component updater can be caught in a quick
260ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// start-shutdown situation. Failure of this test will be a crash.
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, StartStop) {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Start();
2634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreadsUntilIdle();
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Stop();
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that when the server has no updates, we go back to sleep and
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the COMPONENT_UPDATER_STARTED and COMPONENT_UPDATER_SLEEPING notifications
269f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// are generated. No pings are sent.
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, CheckCrxSleep) {
2715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  MockServiceObserver observer;
272a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(observer,
2745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu              OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, ""))
275010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(1);
276f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(observer,
2775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu              OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, ""))
278010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(2);
279f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(observer,
2805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu              OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
2815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      "abagagagagagagagagagagagagagagag"))
282010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(2);
283f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
284010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
285010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml")));
286010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
287010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml")));
288f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
289eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrxComponent com;
2915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  component_updater()->AddObserver(&observer);
292010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(
293010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ComponentUpdateService::kOk,
294010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      RegisterComponent(&com, kTestComponent_abag, Version("1.1"), &installer));
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We loop twice, but there are no updates so we expect two sleep messages.
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_configurator()->SetLoopCount(2);
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Start();
2994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count());
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Expect to see the two update check requests and no other requests,
305f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // including pings.
306f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, post_interceptor_->GetHitCount())
307f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
308f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, post_interceptor_->GetCount())
309f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
310010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
311010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
312010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[0].find(
313010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"abagagagagagagagagagagagagagagag\" version=\"1.1\">"
314010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /></app>"))
315f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
316010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
317010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
318010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[1].find(
319010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"abagagagagagagagagagagagagagagag\" version=\"1.1\">"
320010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /></app>"))
321f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
322f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Stop();
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Loop twice again but this case we simulate a server error by returning
326f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // an empty file. Expect the behavior of the service to be the same as before.
327010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(observer, OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, ""))
328010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(1);
329a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_CALL(observer,
3305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu              OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, ""))
331010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(2);
3321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_CALL(observer,
3335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu              OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
3345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      "abagagagagagagagagagagagagagagag"))
335010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(2);
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
337f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  post_interceptor_->Reset();
338010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
339010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"), test_file("updatecheck_reply_empty")));
340010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
341010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"), test_file("updatecheck_reply_empty")));
342f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
343f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  test_configurator()->SetLoopCount(2);
344f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  component_updater()->Start();
345f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RunThreads();
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count());
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
350f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, post_interceptor_->GetHitCount())
351f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
352f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, post_interceptor_->GetCount())
353f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
354010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
355010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
356010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[0].find(
357010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"abagagagagagagagagagagagagagagag\" version=\"1.1\">"
358010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /></app>"))
359f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
360010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
361010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
362010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[1].find(
363010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"abagagagagagagagagagagagagagagag\" version=\"1.1\">"
364010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /></app>"))
365f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
366f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Stop();
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we can check for updates and install one component. Besides
371ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// the notifications above COMPONENT_UPDATE_FOUND and COMPONENT_UPDATE_READY
372ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// should have been fired. We do two loops so the second time around there
373ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// should be nothing left to do.
374f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// We also check that the following network requests are issued:
375f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// 1- update check
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2- download crx
377f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// 3- ping
378f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// 4- second update check.
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, InstallCrx) {
3805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  MockServiceObserver observer;
381a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
382a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
3835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
3845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, ""))
385010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
3865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
3875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATE_FOUND,
3885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "jebgalgnebhfojomionfpkfelancnnkf"))
389010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
3905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
3915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
3925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "abagagagagagagagagagagagagagagag"))
393010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
394010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(observer,
395010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                OnEvent(ServiceObserver::COMPONENT_UPDATE_DOWNLOADING,
396010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        "jebgalgnebhfojomionfpkfelancnnkf"))
397010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                .Times(AnyNumber());
3985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
3995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATE_READY,
4005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "jebgalgnebhfojomionfpkfelancnnkf"))
401010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
4025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
4035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATED,
4045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "jebgalgnebhfojomionfpkfelancnnkf"))
405010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
4065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
4075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, ""))
408010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
4095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
4105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
4115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "jebgalgnebhfojomionfpkfelancnnkf"))
412010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
4135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
4145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
4155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "abagagagagagagagagagagagagagagag"))
416010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
4175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
4185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, ""))
419010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
420a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
421a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
422010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
423010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml")));
424f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
425010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
426010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml")));
427f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
428f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
429f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL(expected_crx_url),
430f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
431f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  component_updater()->AddObserver(&observer);
4335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
434eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer1;
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrxComponent com1;
436eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com1, kTestComponent_jebg, Version("0.9"), &installer1);
437eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer2;
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrxComponent com2;
439eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com2, kTestComponent_abag, Version("2.2"), &installer2);
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_configurator()->SetLoopCount(2);
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Start();
4434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error());
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, static_cast<TestInstaller*>(com1.installer)->install_count());
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error());
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->install_count());
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
450f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Expect three request in total: two update checks and one ping.
451f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(3, post_interceptor_->GetHitCount())
452f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
453f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(3, post_interceptor_->GetCount())
454f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
455f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
456f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Expect one component download.
457f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, get_interceptor_->GetHitCount());
458f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
459010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
460010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
461010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[0].find(
462010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"0.9\">"
463010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /></app>"))
464f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
465010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
466010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
467010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[0].find(
468010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"abagagagagagagagagagagagagagagag\" version=\"2.2\">"
469010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /></app>"))
470f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
471f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
472010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
473010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
474010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[1].find(
475010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" "
476010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "version=\"0.9\" nextversion=\"1.0\">"
477010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<event eventtype=\"3\" eventresult=\"1\"/>"))
478f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
479f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
480010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
481010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
482010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[2].find(
483010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"1.0\">"
484010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /></app>"));
485010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
486010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
487010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[2].find(
488010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"abagagagagagagagagagagagagagagag\" version=\"2.2\">"
489010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /></app>"))
490f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Test the protocol version is correct and the extra request attributes
4935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // are included in the request.
494010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
495010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
496010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[0].find(
497010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "request protocol=\"3.0\" extra=\"foo\""))
4985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
4995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Tokenize the request string to look for specific attributes, which
5015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // are important for backward compatibility with the version v2 of the update
5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // protocol. In this case, inspect the <request>, which is the first element
5035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // after the xml declaration of the update request body.
5045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Expect to find the |os|, |arch|, |prodchannel|, and |prodversion|
5055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // attributes:
5065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // <?xml version="1.0" encoding="UTF-8"?>
5075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // <request... os=... arch=... prodchannel=... prodversion=...>
5085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // ...
5095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // </request>
5105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const std::string update_request(post_interceptor_->GetRequests()[0]);
5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::vector<base::StringPiece> elements;
5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Tokenize(update_request, "<>", &elements);
5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_NE(string::npos, elements[1].find(" os="));
5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_NE(string::npos, elements[1].find(" arch="));
5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_NE(string::npos, elements[1].find(" prodchannel="));
5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_NE(string::npos, elements[1].find(" prodversion="));
5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Look for additional attributes of the request, such as |version|,
5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // |requestid|, |lang|, and |nacl_arch|.
5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_NE(string::npos, elements[1].find(" version="));
5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_NE(string::npos, elements[1].find(" requestid="));
5225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_NE(string::npos, elements[1].find(" lang="));
5235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_NE(string::npos, elements[1].find(" nacl_arch="));
5245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  component_updater()->Stop();
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test checks that the "prodversionmin" value is handled correctly. In
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// particular there should not be an install because the minimum product
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// version is much higher than of chrome.
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, ProdVersionCheck) {
532010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
533010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"), test_file("updatecheck_reply_2.xml")));
534f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
535f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
536f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL(expected_crx_url),
537f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
539eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer;
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrxComponent com;
541eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com, kTestComponent_jebg, Version("0.9"), &installer);
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_configurator()->SetLoopCount(1);
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Start();
5454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
547f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Expect one update check and no ping.
548f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetHitCount())
549f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
550f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetCount())
551f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
552f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
553f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Expect no download to occur.
554f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0, get_interceptor_->GetHitCount());
555f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count());
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Stop();
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
562f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Test that a update check due to an on demand call can cause installs.
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Here is the timeline:
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//  - First loop: we return a reply that indicates no update, so
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//    nothing happens.
566f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)//  - We make an on demand call.
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//  - This triggers a second loop, which has a reply that triggers an install.
5681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(ComponentUpdaterTest, OnDemandUpdate) {
5695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  MockServiceObserver observer;
570a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
571a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
5725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
5735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, ""))
574010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
5755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
5765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
5775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "abagagagagagagagagagagagagagagag"))
578010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
5795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
5805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
5815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "jebgalgnebhfojomionfpkfelancnnkf"))
582010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
5835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
5845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, ""))
585010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
5865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
5875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, ""))
588010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
5895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
5905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATE_FOUND,
5915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "jebgalgnebhfojomionfpkfelancnnkf"))
592010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
5935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
5945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
5955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "abagagagagagagagagagagagagagagag"))
596010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
597010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(observer,
598010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                OnEvent(ServiceObserver::COMPONENT_UPDATE_DOWNLOADING,
599010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        "jebgalgnebhfojomionfpkfelancnnkf"))
600010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                .Times(AnyNumber());
6015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
6025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATE_READY,
6035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "jebgalgnebhfojomionfpkfelancnnkf"))
604010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
6055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
6065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATED,
6075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "jebgalgnebhfojomionfpkfelancnnkf"))
608010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
6095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
6105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, ""))
611010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
612a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
613a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
614010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
615010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"), test_file("updatecheck_reply_empty")));
616f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
617f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
618f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL(expected_crx_url),
619f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
620f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
6215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  component_updater()->AddObserver(&observer);
6225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
623eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer1;
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CrxComponent com1;
625eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com1, kTestComponent_abag, Version("2.2"), &installer1);
626eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer2;
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CrxComponent com2;
628eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com2, kTestComponent_jebg, Version("0.9"), &installer2);
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // No update normally.
6311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  test_configurator()->SetLoopCount(1);
6321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  component_updater()->Start();
6331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RunThreads();
6341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  component_updater()->Stop();
6351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
636f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetHitCount())
637f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
638f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetCount())
639f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
640f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
641f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0, get_interceptor_->GetHitCount());
642f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
6431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Update after an on-demand check is issued.
644f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  post_interceptor_->Reset();
645010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
646010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml")));
647f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
648f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
649010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(
650010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ComponentUpdateService::kOk,
651010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      OnDemandTester::OnDemand(component_updater(), GetCrxComponentID(com2)));
6521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  test_configurator()->SetLoopCount(1);
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  component_updater()->Start();
6544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error());
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->install_count());
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error());
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, static_cast<TestInstaller*>(com2.installer)->install_count());
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
661f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, post_interceptor_->GetHitCount())
662f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
663f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, post_interceptor_->GetCount())
664f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
665f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
666f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, get_interceptor_->GetHitCount());
667f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
668f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Expect the update check to contain an "ondemand" request for the
669f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // second component (com2) and a normal request for the other component.
670010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
671010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
672010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[0].find(
673010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"abagagagagagagagagagagagagagagag\" "
674010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "version=\"2.2\"><updatecheck /></app>"))
675f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
676010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
677010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
678010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[0].find(
679010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" "
680010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "version=\"0.9\" installsource=\"ondemand\"><updatecheck /></app>"))
681f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
682010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
683010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
684010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[1].find(
685010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" "
686010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "version=\"0.9\" nextversion=\"1.0\">"
687010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<event eventtype=\"3\" eventresult=\"1\"/>"))
688f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Also check what happens if previous check too soon.
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_configurator()->SetOnDemandTime(60 * 60);
692010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(
693010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ComponentUpdateService::kError,
694010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      OnDemandTester::OnDemand(component_updater(), GetCrxComponentID(com2)));
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Okay, now reset to 0 for the other tests.
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_configurator()->SetOnDemandTime(0);
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  component_updater()->Stop();
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Test a few error cases. NOTE: We don't have callbacks for
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // when the updates failed yet.
7015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer));
702a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
703a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
7045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
7055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, ""))
706010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
7075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
7085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
7095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "abagagagagagagagagagagagagagagag"))
710010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
7115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
7125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
7135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "jebgalgnebhfojomionfpkfelancnnkf"))
714010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
7155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
7165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, ""))
717010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
718a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
719a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // No update: error from no server response
721f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  post_interceptor_->Reset();
722010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
723010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"), test_file("updatecheck_reply_empty")));
724f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_configurator()->SetLoopCount(1);
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  component_updater()->Start();
727010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(
728010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ComponentUpdateService::kOk,
729010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      OnDemandTester::OnDemand(component_updater(), GetCrxComponentID(com2)));
7304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  component_updater()->Stop();
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
733f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetHitCount())
734f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
735f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetCount())
736f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
737f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // No update: already updated to 1.0 so nothing new
7395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer));
740a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
741a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
7425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
7435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, ""))
744010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
7455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
7465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
7475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "jebgalgnebhfojomionfpkfelancnnkf"))
748010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
7495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
7505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
7515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "abagagagagagagagagagagagagagagag"))
752010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
7535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
7545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, ""))
755010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
756a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
757a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
758f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  post_interceptor_->Reset();
759010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
760010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml")));
761f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_configurator()->SetLoopCount(1);
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  component_updater()->Start();
764010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(
765010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ComponentUpdateService::kOk,
766010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      OnDemandTester::OnDemand(component_updater(), GetCrxComponentID(com2)));
7674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
769f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetHitCount())
770f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
771f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetCount())
772f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
773ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  component_updater()->Stop();
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
776c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Verify that a previously registered component can get re-registered
778c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// with a different version.
779c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ComponentUpdaterTest, CheckReRegistration) {
7805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  MockServiceObserver observer;
781a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
782a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
7835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
7845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, ""))
785010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
7865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
7875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATE_FOUND,
7885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "jebgalgnebhfojomionfpkfelancnnkf"))
789010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
7905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
7915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
7925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "abagagagagagagagagagagagagagagag"))
793010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
794010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(observer,
795010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                OnEvent(ServiceObserver::COMPONENT_UPDATE_DOWNLOADING,
796010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        "jebgalgnebhfojomionfpkfelancnnkf"))
797010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                .Times(AnyNumber());
7985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
7995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATE_READY,
8005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "jebgalgnebhfojomionfpkfelancnnkf"))
801010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
8025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
8035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATED,
8045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "jebgalgnebhfojomionfpkfelancnnkf"))
805010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
8065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
8075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, ""))
808010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
8095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
8105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
8115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "jebgalgnebhfojomionfpkfelancnnkf"))
812010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
8135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
8145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
8155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "abagagagagagagagagagagagagagagag"))
816010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
8175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
8185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, ""))
819010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
820a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
821a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
822010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
823010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml")));
824f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
825010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
826010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml")));
827f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
828f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
829f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL(expected_crx_url),
830f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
831f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
8325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  component_updater()->AddObserver(&observer);
8335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
834eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer1;
835c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CrxComponent com1;
836eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com1, kTestComponent_jebg, Version("0.9"), &installer1);
837eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer2;
838c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CrxComponent com2;
839eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com2, kTestComponent_abag, Version("2.2"), &installer2);
840c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
841f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Loop twice to issue two checks: (1) with original 0.9 version, update to
842f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // 1.0, and do the second check (2) with the updated 1.0 version.
843c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test_configurator()->SetLoopCount(2);
844c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  component_updater()->Start();
8454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
846c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
847c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error());
848c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(1, static_cast<TestInstaller*>(com1.installer)->install_count());
849c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error());
850c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->install_count());
851c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
852f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(3, post_interceptor_->GetHitCount())
853010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
854f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, get_interceptor_->GetHitCount());
855f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
856010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
857010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
858010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[0].find(
859010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"0.9\">"
860010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /></app>"))
861f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
862010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
863010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
864010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[1].find(
865010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" "
866010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "version=\"0.9\" nextversion=\"1.0\">"
867010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<event eventtype=\"3\" eventresult=\"1\"/>"))
868f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
869010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
870010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
871010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[2].find(
872010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"1.0\">"
873010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /></app>"))
874f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
875c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
876a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  component_updater()->Stop();
877a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
878c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Now re-register, pretending to be an even newer version (2.2)
8795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer));
880a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
881a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
8825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
8835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, ""))
884010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
8855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
8865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
8875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "jebgalgnebhfojomionfpkfelancnnkf"))
888010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
8895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
8905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
8915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "abagagagagagagagagagagagagagagag"))
892010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
8935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
8945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, ""))
895010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
896a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
897a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
898f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  post_interceptor_->Reset();
899010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
900010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml")));
901f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
902eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer3;
903c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(ComponentUpdateService::kReplaced,
904010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            RegisterComponent(
905010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                &com1, kTestComponent_jebg, Version("2.2"), &installer3));
906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Loop once just to notice the check happening with the re-register version.
908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test_configurator()->SetLoopCount(1);
909c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  component_updater()->Start();
9104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
912eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // We created a new installer, so the counts go back to 0.
913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error());
914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->install_count());
915c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error());
916c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->install_count());
917c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
918f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // One update check and no additional pings are expected.
919f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetHitCount())
920010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
921f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetCount())
922010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
923f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
924010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
925010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
926010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[0].find(
927010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"2.2\">"
928010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /></app>"));
929f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
930c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  component_updater()->Stop();
931c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
932eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
933ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Verify that we can download and install a component and a differential
934ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// update to that component. We do three loops; the final loop should do
935ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// nothing.
936ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// We also check that exactly 5 non-ping network requests are issued:
937ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// 1- update check (response: v1 available)
938ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// 2- download crx (v1)
939ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// 3- update check (response: v2 available)
940ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// 4- download differential crx (v1 to v2)
941ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// 5- update check (response: no further update available)
942ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// There should be two pings, one for each update. The second will bear a
943ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// diffresult=1, while the first will not.
944ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochTEST_F(ComponentUpdaterTest, DifferentialUpdate) {
945010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
946010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"),
947010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      test_file("updatecheck_diff_reply_1.xml")));
948f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
949010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
950010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"),
951010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      test_file("updatecheck_diff_reply_2.xml")));
952f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
953010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
954010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"),
955010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      test_file("updatecheck_diff_reply_3.xml")));
956f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
957f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
958f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL("http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"),
959f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"));
960f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
961f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL("http://localhost/download/"
962f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)           "ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx"),
963f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx"));
964ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
965ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  VersionedTestInstaller installer;
966ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  CrxComponent com;
967ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  RegisterComponent(&com, kTestComponent_ihfo, Version("0.0"), &installer);
968ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
969ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  test_configurator()->SetLoopCount(3);
970ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  component_updater()->Start();
9714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
972ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
973ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
974ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(2, static_cast<TestInstaller*>(com.installer)->install_count());
975ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
976f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(5, post_interceptor_->GetHitCount())
977f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
978f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(5, post_interceptor_->GetCount())
979f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
980f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, get_interceptor_->GetHitCount());
981f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
982010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
983010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
984010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[0].find(
985010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"0.0\">"
986010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /></app>"))
987f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
988010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
989010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
990010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[1].find(
991010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" "
992010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "version=\"0.0\" nextversion=\"1.0\">"
993010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<event eventtype=\"3\" eventresult=\"1\" nextfp=\"1\"/>"))
994f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
995010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
996010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
997010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[2].find(
998010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"1.0\">"
999010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /><packages><package fp=\"1\"/></packages></app>"))
1000f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1001010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
1002010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
1003010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[3].find(
1004010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" "
1005010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "version=\"1.0\" nextversion=\"2.0\">"
1006010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<event eventtype=\"3\" eventresult=\"1\" diffresult=\"1\" "
1007010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "previousfp=\"1\" nextfp=\"22\"/>"))
1008f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1009010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
1010010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
1011010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[4].find(
1012010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"2.0\">"
1013010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /><packages><package fp=\"22\"/></packages></app>"))
1014f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1015ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  component_updater()->Stop();
1016ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
1017ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1018eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Verify that component installation falls back to downloading and installing
1019eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// a full update if the differential update fails (in this case, because the
1020eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// installer does not know about the existing files). We do two loops; the final
1021eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// loop should do nothing.
1022ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// We also check that exactly 4 non-ping network requests are issued:
1023eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 1- update check (loop 1)
1024eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 2- download differential crx
1025eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 3- download full crx
1026eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 4- update check (loop 2 - no update available)
1027ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// There should be one ping for the first attempted update.
10280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// This test is flaky on Android. crbug.com/329883
10290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#if defined(OS_ANDROID)
10300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#define MAYBE_DifferentialUpdateFails DISABLED_DifferentialUpdateFails
10310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#else
10320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#define MAYBE_DifferentialUpdateFails DifferentialUpdateFails
10330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#endif
10340529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(ComponentUpdaterTest, MAYBE_DifferentialUpdateFails) {
1035010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
1036010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"),
1037010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      test_file("updatecheck_diff_reply_2.xml")));
1038f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
1039010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
1040010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"),
1041010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      test_file("updatecheck_diff_reply_3.xml")));
1042f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1043f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
1044f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL("http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"),
1045f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"));
1046f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
1047f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL("http://localhost/download/"
1048010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx"),
1049f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx"));
1050f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
1051f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL("http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_2.crx"),
1052f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("ihfokbkgjpifnbbojhneepfflplebdkc_2.crx"));
1053eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1054eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer;
1055eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CrxComponent com;
1056eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com, kTestComponent_ihfo, Version("1.0"), &installer);
1057eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1058eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test_configurator()->SetLoopCount(2);
1059eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  component_updater()->Start();
10604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
1061eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1062eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // A failed differential update does not count as a failed install.
1063eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
1064eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(1, static_cast<TestInstaller*>(com.installer)->install_count());
1065eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1066f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(3, post_interceptor_->GetHitCount())
1067f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1068f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(3, post_interceptor_->GetCount())
1069f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1070f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, get_interceptor_->GetHitCount());
1071f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1072010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
1073010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
1074010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[0].find(
1075010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"1.0\">"
1076010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /></app>"))
1077f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1078010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
1079010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
1080010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[1].find(
1081010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" "
1082010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "version=\"1.0\" nextversion=\"2.0\">"
1083010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<event eventtype=\"3\" eventresult=\"1\" diffresult=\"0\" "
1084010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "differrorcat=\"2\" differrorcode=\"16\" nextfp=\"22\"/>"))
1085f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1086010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
1087010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
1088010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[2].find(
1089010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"2.0\">"
1090010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /><packages><package fp=\"22\"/></packages></app>"))
1091f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1092eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1093eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  component_updater()->Stop();
1094eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1095eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
10965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Test is flakey on Android bots. See crbug.com/331420.
10975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_ANDROID)
10985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define MAYBE_CheckFailedInstallPing DISABLED_CheckFailedInstallPing
10995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else
11005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define MAYBE_CheckFailedInstallPing CheckFailedInstallPing
11015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
1102ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Verify that a failed installation causes an install failure ping.
1103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(ComponentUpdaterTest, MAYBE_CheckFailedInstallPing) {
1104ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // This test installer reports installation failure.
1105ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  class : public TestInstaller {
1106ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    virtual bool Install(const base::DictionaryValue& manifest,
1107ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                         const base::FilePath& unpack_path) OVERRIDE {
1108ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      ++install_count_;
1109ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      base::DeleteFile(unpack_path, true);
1110ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      return false;
1111ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    }
1112ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  } installer;
1113ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
1115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml")));
1116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
1117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
1118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml")));
1119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
1120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
1121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL(expected_crx_url),
1122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
1123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Start with 0.9, and attempt update to 1.0.
1125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Loop twice to issue two checks: (1) with original 0.9 version
1126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // and (2), which should retry with 0.9.
1127ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  CrxComponent com;
1128ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  RegisterComponent(&com, kTestComponent_jebg, Version("0.9"), &installer);
1129ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1130ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  test_configurator()->SetLoopCount(2);
1131ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  component_updater()->Start();
11324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
1133ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(4, post_interceptor_->GetHitCount())
1135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, get_interceptor_->GetHitCount());
1137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
1139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
1140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[0].find(
1141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"0.9\">"
1142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /></app>"))
1143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
1145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
1146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[1].find(
1147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" "
1148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "version=\"0.9\" nextversion=\"1.0\">"
1149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<event eventtype=\"3\" eventresult=\"0\" "
1150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "errorcat=\"3\" errorcode=\"9\"/>"))
1151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
1153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
1154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[2].find(
1155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"0.9\">"
1156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /></app>"))
1157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
1159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
1160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[3].find(
1161010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" "
1162010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "version=\"0.9\" nextversion=\"1.0\">"
1163010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<event eventtype=\"3\" eventresult=\"0\" "
1164010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "errorcat=\"3\" errorcode=\"9\"/>"))
1165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1167ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Loop once more, but expect no ping because a noupdate response is issued.
1168ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // This is necessary to clear out the fire-and-forget ping from the previous
1169ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // iteration.
1170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  post_interceptor_->Reset();
1171010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
1172010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"),
1173010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      test_file("updatecheck_reply_noupdate.xml")));
1174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1175ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  test_configurator()->SetLoopCount(1);
1176ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  component_updater()->Start();
11774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
1178ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1179ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
1180ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(2, static_cast<TestInstaller*>(com.installer)->install_count());
1181ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetHitCount())
1183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetCount())
1185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1187010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
1188010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
1189010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[0].find(
1190010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"0.9\">"
1191010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /></app>"))
1192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1193ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1194ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  component_updater()->Stop();
1195ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
1196ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Verify that we successfully propagate a patcher error.
1198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// ihfokbkgjpifnbbojhneepfflplebdkc_1to2_bad.crx contains an incorrect
1199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// patching instruction that should fail.
1200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(ComponentUpdaterTest, DifferentialUpdateFailErrorcode) {
1201010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
1202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"),
1203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      test_file("updatecheck_diff_reply_1.xml")));
1204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
1205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
1206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"),
1207010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      test_file("updatecheck_diff_reply_2.xml")));
1208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
1209010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
1210010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"),
1211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      test_file("updatecheck_diff_reply_3.xml")));
1212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
1214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL("http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"),
1215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"));
1216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // This intercept returns a different file than what is specified in the
1217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // update check response and requested in the download. The file that is
1218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // actually dowloaded contains a patching error, an therefore, an error
1219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // is injected at the time of patching.
1220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
1221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL("http://localhost/download/"
1222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)           "ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx"),
1223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1to2_bad.crx"));
1224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
1225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL("http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_2.crx"),
1226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("ihfokbkgjpifnbbojhneepfflplebdkc_2.crx"));
1227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  VersionedTestInstaller installer;
1229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CrxComponent com;
1230eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com, kTestComponent_ihfo, Version("0.0"), &installer);
1231eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1232f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  test_configurator()->SetLoopCount(3);
1233eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  component_updater()->Start();
12344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
12354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  component_updater()->Stop();
1236eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
1238eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(2, static_cast<TestInstaller*>(com.installer)->install_count());
1239eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(5, post_interceptor_->GetHitCount())
1241f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1242f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(5, post_interceptor_->GetCount())
1243f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(3, get_interceptor_->GetHitCount());
1245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1246010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
1247010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
1248010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[0].find(
1249010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"0.0\">"
1250010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /></app>"))
1251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1252010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
1253010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
1254010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[1].find(
1255010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" "
1256010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "version=\"0.0\" nextversion=\"1.0\">"
1257010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<event eventtype=\"3\" eventresult=\"1\" nextfp=\"1\"/>"))
1258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1259010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
1260010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
1261010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[2].find(
1262010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"1.0\">"
1263010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /><packages><package fp=\"1\"/></packages></app>"))
1264f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1265010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
1266010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
1267010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[3].find(
1268010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" "
1269010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "version=\"1.0\" nextversion=\"2.0\">"
1270010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<event eventtype=\"3\" eventresult=\"1\" "
1271010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "diffresult=\"0\" differrorcat=\"2\" "
1272010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "differrorcode=\"14\" diffextracode1=\"305\" "
1273010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "previousfp=\"1\" nextfp=\"22\"/>"))
1274f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1275010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
1276010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
1277010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[4].find(
1278010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"2.0\">"
1279010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /><packages><package fp=\"22\"/></packages></app>"))
1280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1281eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1282f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
12835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class TestResourceController : public content::ResourceController {
12845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
12855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SetThrottle(content::ResourceThrottle* throttle) {}
12865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
12875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
12885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)content::ResourceThrottle* RequestTestResourceThrottle(
12895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ComponentUpdateService* cus,
12905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    TestResourceController* controller,
12915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const char* crx_id) {
12925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  net::TestURLRequestContext context;
1293010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  net::TestURLRequest url_request(GURL("http://foo.example.com/thing.bin"),
1294010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                  net::DEFAULT_PRIORITY,
1295010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                  NULL,
1296010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                  &context);
12975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
12985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::ResourceThrottle* rt =
12995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      cus->GetOnDemandResourceThrottle(&url_request, crx_id);
13005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  rt->set_controller_for_testing(controller);
13015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  controller->SetThrottle(rt);
13025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return rt;
13035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
13045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1305010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void RequestAndDeleteResourceThrottle(ComponentUpdateService* cus,
1306010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                      const char* crx_id) {
1307f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // By requesting a throttle and deleting it immediately we ensure that we
1308f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // hit the case where the component updater tries to use the weak
1309f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // pointer to a dead Resource throttle.
1310010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  class NoCallResourceController : public TestResourceController {
1311f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   public:
1312f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual ~NoCallResourceController() {}
1313f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual void Cancel() OVERRIDE { CHECK(false); }
1314f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual void CancelAndIgnore() OVERRIDE { CHECK(false); }
1315f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual void CancelWithError(int error_code) OVERRIDE { CHECK(false); }
1316f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual void Resume() OVERRIDE { CHECK(false); }
13175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } controller;
1318f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
13195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  delete RequestTestResourceThrottle(cus, &controller, crx_id);
1320f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1321f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
13225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ComponentUpdaterTest, ResourceThrottleDeletedNoUpdate) {
13235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  MockServiceObserver observer;
13245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  {
13255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    InSequence seq;
13265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
13275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, ""))
1328010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
13295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
13305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
13315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "abagagagagagagagagagagagagagagag"))
1332010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
13335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
13345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, ""))
1335010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
13365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
1337f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1338010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
1339010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml")));
13405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1341f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TestInstaller installer;
1342f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CrxComponent com;
13435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  component_updater()->AddObserver(&observer);
1344010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(
1345010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ComponentUpdateService::kOk,
1346010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      RegisterComponent(&com, kTestComponent_abag, Version("1.1"), &installer));
1347f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The following two calls ensure that we don't do an update check via the
1348f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // timer, so the only update check should be the on-demand one.
1349f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  test_configurator()->SetInitialDelay(1000000);
1350f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  test_configurator()->SetRecheckTime(1000000);
1351f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  test_configurator()->SetLoopCount(1);
1352f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  component_updater()->Start();
1353f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1354f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RunThreadsUntilIdle();
1355f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1356f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0, post_interceptor_->GetHitCount());
1357f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1358010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BrowserThread::PostTask(BrowserThread::IO,
1359010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          FROM_HERE,
1360010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          base::Bind(&RequestAndDeleteResourceThrottle,
1361010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                     component_updater(),
1362010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                     "abagagagagagagagagagagagagagagag"));
13635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RunThreads();
13655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetHitCount());
13675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
13685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count());
13695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  component_updater()->Stop();
13715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
13725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1373010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class CancelResourceController : public TestResourceController {
1374010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public:
13755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CancelResourceController() : throttle_(NULL), resume_called_(0) {}
13765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~CancelResourceController() {
13775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Check that the throttle has been resumed by the time we
13785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // exit the test.
1379010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    CHECK_EQ(1, resume_called_);
13805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    delete throttle_;
13815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
13825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void Cancel() OVERRIDE { CHECK(false); }
13835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void CancelAndIgnore() OVERRIDE { CHECK(false); }
13845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void CancelWithError(int error_code) OVERRIDE { CHECK(false); }
13855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void Resume() OVERRIDE {
1386010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    BrowserThread::PostTask(BrowserThread::IO,
1387010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            FROM_HERE,
1388010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            base::Bind(&CancelResourceController::ResumeCalled,
1389010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                       base::Unretained(this)));
13905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
13915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SetThrottle(content::ResourceThrottle* throttle) OVERRIDE {
13925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    throttle_ = throttle;
13935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool defer = false;
13945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Initially the throttle is blocked. The CUS needs to run a
13955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // task on the UI thread to  decide if it should unblock.
13965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    throttle_->WillStartRequest(&defer);
13975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CHECK(defer);
13985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
13995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1400010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private:
14015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void ResumeCalled() { ++resume_called_; }
14025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
14035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::ResourceThrottle* throttle_;
14045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int resume_called_;
14055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
14065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
14075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ComponentUpdaterTest, ResourceThrottleLiveNoUpdate) {
14085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  MockServiceObserver observer;
14095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  {
14105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    InSequence seq;
14115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
14125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, ""))
1413010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
14145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
14155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
14165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "abagagagagagagagagagagagagagagag"))
1417010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
14185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
14195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, ""))
1420010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
14215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
14225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1423010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
1424010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml")));
1425f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
14265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TestInstaller installer;
14275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CrxComponent com;
14285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  component_updater()->AddObserver(&observer);
1429010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(
1430010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ComponentUpdateService::kOk,
1431010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      RegisterComponent(&com, kTestComponent_abag, Version("1.1"), &installer));
14325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The following two calls ensure that we don't do an update check via the
14335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // timer, so the only update check should be the on-demand one.
14345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  test_configurator()->SetInitialDelay(1000000);
14355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  test_configurator()->SetRecheckTime(1000000);
14365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  test_configurator()->SetLoopCount(1);
14375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  component_updater()->Start();
14385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
14395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RunThreadsUntilIdle();
14405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
14415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, post_interceptor_->GetHitCount());
14425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
14435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CancelResourceController controller;
14445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1445f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  BrowserThread::PostTask(
1446f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      BrowserThread::IO,
1447f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      FROM_HERE,
14485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(base::IgnoreResult(&RequestTestResourceThrottle),
1449f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 component_updater(),
14505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 &controller,
1451f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 "abagagagagagagagagagagagagagagag"));
1452f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1453f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RunThreads();
1454f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1455f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetHitCount());
1456f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
1457f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count());
1458f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1459f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  component_updater()->Stop();
1460f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1461f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
14625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Tests adding and removing observers.
14635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(ComponentUpdaterTest, Observer) {
14645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  MockServiceObserver observer1, observer2;
14655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
14665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Expect that two observers see the events.
14675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  {
14685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    InSequence seq;
14695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer1,
14705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, ""))
1471010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
14725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer2,
14735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, ""))
1474010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
14755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer1,
14765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
14775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "abagagagagagagagagagagagagagagag"))
1478010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
14795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer2,
14805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
14815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "abagagagagagagagagagagagagagagag"))
1482010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
14835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer1,
14845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, ""))
1485010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
14865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer2,
14875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, ""))
1488010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
14895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
14905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1491010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
1492010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml")));
14935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
14945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  component_updater()->AddObserver(&observer1);
14955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  component_updater()->AddObserver(&observer2);
14965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
14975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  TestInstaller installer;
14985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  CrxComponent com;
1499010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(
1500010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ComponentUpdateService::kOk,
1501010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      RegisterComponent(&com, kTestComponent_abag, Version("1.1"), &installer));
15025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  test_configurator()->SetLoopCount(1);
15035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  component_updater()->Start();
15045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  RunThreads();
15055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
15065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // After removing the first observer, it's only the second observer that
15075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // gets the events.
15085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer1));
15095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer2));
15105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  {
15115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    InSequence seq;
15125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer2,
15135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, ""))
1514010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
15155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer2,
15165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
15175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "abagagagagagagagagagagagagagagag"))
1518010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
15195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer2,
15205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, ""))
1521010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
15225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
15235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
15245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  component_updater()->RemoveObserver(&observer1);
15255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
15265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  test_configurator()->SetLoopCount(1);
15275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  component_updater()->Start();
15285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  RunThreads();
1529f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
15305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Both observers are removed and no one gets the events.
15315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer1));
15325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer2));
15335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  component_updater()->RemoveObserver(&observer2);
15345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
15355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  test_configurator()->SetLoopCount(1);
15365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  component_updater()->Start();
15375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  RunThreads();
15385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
15395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  component_updater()->Stop();
15405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
15415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
15425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}  // namespace component_updater
1543