component_updater_service_unittest.cc revision 6e8cce623b6e4fe0c9e4af605d675dd9d0338c38
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)
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <vector>
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/component_updater/test/component_updater_service_unittest.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/run_loop.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/string_number_conversions.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/string_util.h"
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/stringprintf.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/component_updater/component_updater_resource_throttle.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/component_updater/component_updater_utils.h"
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/component_updater/test/test_configurator.h"
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/component_updater/test/test_installer.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/browser/browser_thread.h"
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/resource_controller.h"
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/resource_request_info.h"
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/resource_throttle.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "libxml/globals.h"
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/base/upload_bytes_element_reader.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_fetcher.h"
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "net/url_request/url_request_test_util.h"
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using ::testing::_;
33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)using ::testing::AnyNumber;
34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using ::testing::InSequence;
35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using ::testing::Mock;
36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace component_updater {
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)
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)InterceptorFactory::InterceptorFactory()
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    : URLRequestPostInterceptorFactory(POST_INTERCEPT_SCHEME,
51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                       POST_INTERCEPT_HOSTNAME) {
52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)InterceptorFactory::~InterceptorFactory() {
55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)URLRequestPostInterceptor* InterceptorFactory::CreateInterceptor() {
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return URLRequestPostInterceptorFactory::CreateInterceptor(
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::FilePath::FromUTF8Unsafe(POST_INTERCEPT_PATH));
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
62ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochComponentUpdaterTest::ComponentUpdaterTest()
63ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    : test_config_(NULL),
644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP) {
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // The component updater instance under test.
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test_config_ = new TestConfigurator;
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  component_updater_.reset(ComponentUpdateServiceFactory(test_config_));
68ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // The test directory is chrome/test/data/components.
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir_);
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test_data_dir_ = test_data_dir_.AppendASCII("components");
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  net::URLFetcher::SetEnableInterceptionForTests(true);
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochComponentUpdaterTest::~ComponentUpdaterTest() {
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  net::URLFetcher::SetEnableInterceptionForTests(false);
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ComponentUpdaterTest::SetUp() {
81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_.reset(new GetInterceptor);
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  interceptor_factory_.reset(new InterceptorFactory);
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  post_interceptor_ = interceptor_factory_->CreateInterceptor();
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_);
85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ComponentUpdaterTest::TearDown() {
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  interceptor_factory_.reset();
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_.reset();
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  xmlCleanupGlobals();
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochComponentUpdateService* ComponentUpdaterTest::component_updater() {
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return component_updater_.get();
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
97010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Makes the full path to a component updater test file.
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst base::FilePath ComponentUpdaterTest::test_file(const char* file) {
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return test_data_dir_.AppendASCII(file);
100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTestConfigurator* ComponentUpdaterTest::test_configurator() {
103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return test_config_;
104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochComponentUpdateService::Status ComponentUpdaterTest::RegisterComponent(
107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    CrxComponent* com,
108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    TestComponents component,
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const Version& version,
110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    TestInstaller* installer) {
111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (component == kTestComponent_abag) {
112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    com->name = "test_abag";
113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    com->pk_hash.assign(abag_hash, abag_hash + arraysize(abag_hash));
114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  } else if (component == kTestComponent_jebg) {
115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    com->name = "test_jebg";
116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    com->pk_hash.assign(jebg_hash, jebg_hash + arraysize(jebg_hash));
117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  } else {
118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    com->name = "test_ihfo";
119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    com->pk_hash.assign(ihfo_hash, ihfo_hash + arraysize(ihfo_hash));
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  com->version = version;
122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  com->installer = installer;
123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return component_updater_->RegisterComponent(*com);
124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void ComponentUpdaterTest::RunThreads() {
1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::RunLoop runloop;
1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  test_configurator()->SetQuitClosure(runloop.QuitClosure());
1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  runloop.Run();
130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Since some tests need to drain currently enqueued tasks such as network
132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // intercepts on the IO thread, run the threads until they are
133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // idle. The component updater service won't loop again until the loop count
134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // is set and the service is started.
135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RunThreadsUntilIdle();
1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void ComponentUpdaterTest::RunThreadsUntilIdle() {
1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)ComponentUpdateService::Status OnDemandTester::OnDemand(
143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ComponentUpdateService* cus,
144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const std::string& component_id) {
145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return cus->GetOnDemandUpdater().OnDemandUpdate(component_id);
1461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that our test fixture work and the component updater can
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// be created and destroyed with no side effects.
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, VerifyFixture) {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(component_updater() != NULL);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that the component updater can be caught in a quick
155ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// start-shutdown situation. Failure of this test will be a crash.
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, StartStop) {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Start();
1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreadsUntilIdle();
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Stop();
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that when the server has no updates, we go back to sleep and
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the COMPONENT_UPDATER_STARTED and COMPONENT_UPDATER_SLEEPING notifications
164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// are generated. No pings are sent.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, CheckCrxSleep) {
1665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  MockServiceObserver observer;
167a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(observer,
1695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu              OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, ""))
170010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(1);
171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(observer,
1725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu              OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, ""))
173010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(2);
174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(observer,
1755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu              OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
1765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      "abagagagagagagagagagagagagagagag"))
177010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(2);
178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
179010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml")));
181010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
182010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml")));
183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrxComponent com;
1865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  component_updater()->AddObserver(&observer);
187010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(
188010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ComponentUpdateService::kOk,
189010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      RegisterComponent(&com, kTestComponent_abag, Version("1.1"), &installer));
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We loop twice, but there are no updates so we expect two sleep messages.
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_configurator()->SetLoopCount(2);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Start();
1944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count());
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Expect to see the two update check requests and no other requests,
200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // including pings.
201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, post_interceptor_->GetHitCount())
202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, post_interceptor_->GetCount())
204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
207010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[0].find(
208010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"abagagagagagagagagagagagagagagag\" version=\"1.1\">"
209010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /></app>"))
210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
212010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
213010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[1].find(
214010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"abagagagagagagagagagagagagagagag\" version=\"1.1\">"
215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /></app>"))
216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Stop();
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Loop twice again but this case we simulate a server error by returning
221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // an empty file. Expect the behavior of the service to be the same as before.
222010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(observer, OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, ""))
223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(1);
224a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_CALL(observer,
2255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu              OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, ""))
226010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(2);
2271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_CALL(observer,
2285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu              OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
2295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      "abagagagagagagagagagagagagagagag"))
230010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(2);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
232f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  post_interceptor_->Reset();
233010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
234010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"), test_file("updatecheck_reply_empty")));
235010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
236010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"), test_file("updatecheck_reply_empty")));
237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  test_configurator()->SetLoopCount(2);
239f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  component_updater()->Start();
240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RunThreads();
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count());
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, post_interceptor_->GetHitCount())
246f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, post_interceptor_->GetCount())
248f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
249010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
250010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
251010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[0].find(
252010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"abagagagagagagagagagagagagagagag\" version=\"1.1\">"
253010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /></app>"))
254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
255010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
256010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
257010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[1].find(
258010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"abagagagagagagagagagagagagagagag\" version=\"1.1\">"
259010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /></app>"))
260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Stop();
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we can check for updates and install one component. Besides
266ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// the notifications above COMPONENT_UPDATE_FOUND and COMPONENT_UPDATE_READY
267ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// should have been fired. We do two loops so the second time around there
268ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// should be nothing left to do.
269f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// We also check that the following network requests are issued:
270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// 1- update check
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2- download crx
272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// 3- ping
273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// 4- second update check.
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, InstallCrx) {
2755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  MockServiceObserver observer;
276a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
277a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
2785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
2795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, ""))
280010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
2815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
2825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATE_FOUND,
2835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "jebgalgnebhfojomionfpkfelancnnkf"))
284010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
2855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
2865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
2875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "abagagagagagagagagagagagagagagag"))
288010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
289010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(observer,
290010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                OnEvent(ServiceObserver::COMPONENT_UPDATE_DOWNLOADING,
291010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        "jebgalgnebhfojomionfpkfelancnnkf"))
292010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                .Times(AnyNumber());
2935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
2945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATE_READY,
2955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "jebgalgnebhfojomionfpkfelancnnkf"))
296010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
2975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
2985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATED,
2995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "jebgalgnebhfojomionfpkfelancnnkf"))
300010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
3015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
3025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, ""))
303010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
3045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
3055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
3065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "jebgalgnebhfojomionfpkfelancnnkf"))
307010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
3085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
3095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
3105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "abagagagagagagagagagagagagagagag"))
311010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
3125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
3135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, ""))
314010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
315a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
316a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
317010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
318010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml")));
319f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
320010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
321010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml")));
322f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
323f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
324f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL(expected_crx_url),
325f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
326f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  component_updater()->AddObserver(&observer);
3285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
329eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer1;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrxComponent com1;
331eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com1, kTestComponent_jebg, Version("0.9"), &installer1);
332eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer2;
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrxComponent com2;
334eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com2, kTestComponent_abag, Version("2.2"), &installer2);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_configurator()->SetLoopCount(2);
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Start();
3384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error());
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, static_cast<TestInstaller*>(com1.installer)->install_count());
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error());
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->install_count());
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
345f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Expect three request in total: two update checks and one ping.
346f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(3, post_interceptor_->GetHitCount())
347f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
348f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(3, post_interceptor_->GetCount())
349f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
350f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
351f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Expect one component download.
352f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, get_interceptor_->GetHitCount());
353f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
354010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
355010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
356010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[0].find(
357010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"0.9\">"
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()[0].find(
363010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"abagagagagagagagagagagagagagagag\" version=\"2.2\">"
364010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /></app>"))
365f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
366f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
367010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
368010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
369010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[1].find(
370010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" "
371010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "version=\"0.9\" nextversion=\"1.0\">"
372010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<event eventtype=\"3\" eventresult=\"1\"/>"))
373f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
374f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
375010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
376010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
377010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[2].find(
378010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"1.0\">"
379010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /></app>"));
380010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
381010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
382010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[2].find(
383010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"abagagagagagagagagagagagagagagag\" version=\"2.2\">"
384010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /></app>"))
385f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Test the protocol version is correct and the extra request attributes
3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // are included in the request.
389010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
390010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
391010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[0].find(
392010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "request protocol=\"3.0\" extra=\"foo\""))
3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Tokenize the request string to look for specific attributes, which
3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // are important for backward compatibility with the version v2 of the update
3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // protocol. In this case, inspect the <request>, which is the first element
3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // after the xml declaration of the update request body.
3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Expect to find the |os|, |arch|, |prodchannel|, and |prodversion|
4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // attributes:
4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // <?xml version="1.0" encoding="UTF-8"?>
4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // <request... os=... arch=... prodchannel=... prodversion=...>
4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // ...
4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // </request>
4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const std::string update_request(post_interceptor_->GetRequests()[0]);
4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::vector<base::StringPiece> elements;
4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Tokenize(update_request, "<>", &elements);
4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_NE(string::npos, elements[1].find(" os="));
4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_NE(string::npos, elements[1].find(" arch="));
4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_NE(string::npos, elements[1].find(" prodchannel="));
4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_NE(string::npos, elements[1].find(" prodversion="));
4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Look for additional attributes of the request, such as |version|,
4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // |requestid|, |lang|, and |nacl_arch|.
4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_NE(string::npos, elements[1].find(" version="));
4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_NE(string::npos, elements[1].find(" requestid="));
4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_NE(string::npos, elements[1].find(" lang="));
4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_NE(string::npos, elements[1].find(" nacl_arch="));
4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  component_updater()->Stop();
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test checks that the "prodversionmin" value is handled correctly. In
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// particular there should not be an install because the minimum product
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// version is much higher than of chrome.
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, ProdVersionCheck) {
427010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
428010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"), test_file("updatecheck_reply_2.xml")));
429f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
430f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
431f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL(expected_crx_url),
432f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
434eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer;
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrxComponent com;
436eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com, kTestComponent_jebg, Version("0.9"), &installer);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_configurator()->SetLoopCount(1);
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Start();
4404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
442f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Expect one update check and no ping.
443f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetHitCount())
444f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
445f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetCount())
446f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
447f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
448f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Expect no download to occur.
449f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0, get_interceptor_->GetHitCount());
450f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count());
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Stop();
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
457f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Test that a update check due to an on demand call can cause installs.
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Here is the timeline:
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//  - First loop: we return a reply that indicates no update, so
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//    nothing happens.
461f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)//  - We make an on demand call.
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//  - This triggers a second loop, which has a reply that triggers an install.
4636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#if defined(OS_LINUX)
4646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// http://crbug.com/396488
4656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define MAYBE_OnDemandUpdate DISABLED_OnDemandUpdate
4666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#else
4676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define MAYBE_OnDemandUpdate OnDemandUpdate
4686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif
4696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(ComponentUpdaterTest, MAYBE_OnDemandUpdate) {
4705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  MockServiceObserver observer;
471a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
472a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
4735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
4745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, ""))
475010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
4765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
4775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
4785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "abagagagagagagagagagagagagagagag"))
479010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
4805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
4815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
4825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "jebgalgnebhfojomionfpkfelancnnkf"))
483010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
4845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
4855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, ""))
486010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
4875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
4885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, ""))
489010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
4905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
4915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATE_FOUND,
4925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "jebgalgnebhfojomionfpkfelancnnkf"))
493010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
4945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
4955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
4965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "abagagagagagagagagagagagagagagag"))
497010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
498010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(observer,
499010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                OnEvent(ServiceObserver::COMPONENT_UPDATE_DOWNLOADING,
500010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        "jebgalgnebhfojomionfpkfelancnnkf"))
501010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                .Times(AnyNumber());
5025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
5035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATE_READY,
5045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "jebgalgnebhfojomionfpkfelancnnkf"))
505010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
5065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
5075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATED,
5085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "jebgalgnebhfojomionfpkfelancnnkf"))
509010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
5105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
5115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, ""))
512010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
513a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
514a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
515010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
516010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"), test_file("updatecheck_reply_empty")));
517f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
518f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
519f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL(expected_crx_url),
520f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
521f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  component_updater()->AddObserver(&observer);
5235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
524eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer1;
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CrxComponent com1;
526eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com1, kTestComponent_abag, Version("2.2"), &installer1);
527eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer2;
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CrxComponent com2;
529eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com2, kTestComponent_jebg, Version("0.9"), &installer2);
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // No update normally.
5321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  test_configurator()->SetLoopCount(1);
5331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  component_updater()->Start();
5341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RunThreads();
5351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  component_updater()->Stop();
5361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
537f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetHitCount())
538f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
539f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetCount())
540f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
541f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
542f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0, get_interceptor_->GetHitCount());
543f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Update after an on-demand check is issued.
545f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  post_interceptor_->Reset();
546010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
547010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml")));
548f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
549f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
550010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(
551010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ComponentUpdateService::kOk,
552010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      OnDemandTester::OnDemand(component_updater(), GetCrxComponentID(com2)));
5531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  test_configurator()->SetLoopCount(1);
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  component_updater()->Start();
5554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error());
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->install_count());
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error());
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, static_cast<TestInstaller*>(com2.installer)->install_count());
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
562f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, post_interceptor_->GetHitCount())
563f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
564f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, post_interceptor_->GetCount())
565f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
566f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
567f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, get_interceptor_->GetHitCount());
568f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
569f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Expect the update check to contain an "ondemand" request for the
570f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // second component (com2) and a normal request for the other component.
571010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
572010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
573010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[0].find(
574010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"abagagagagagagagagagagagagagagag\" "
575010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "version=\"2.2\"><updatecheck /></app>"))
576f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
577010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
578010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
579010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[0].find(
580010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" "
581010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "version=\"0.9\" installsource=\"ondemand\"><updatecheck /></app>"))
582f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
583010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
584010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
585010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[1].find(
586010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" "
587010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "version=\"0.9\" nextversion=\"1.0\">"
588010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<event eventtype=\"3\" eventresult=\"1\"/>"))
589f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
59146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Also check what happens if previous check too soon. It works, since this
59246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // direct OnDemand call does not implement a cooldown.
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_configurator()->SetOnDemandTime(60 * 60);
594010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(
59546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ComponentUpdateService::kOk,
596010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      OnDemandTester::OnDemand(component_updater(), GetCrxComponentID(com2)));
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Okay, now reset to 0 for the other tests.
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_configurator()->SetOnDemandTime(0);
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  component_updater()->Stop();
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Test a few error cases. NOTE: We don't have callbacks for
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // when the updates failed yet.
6035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer));
604a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
605a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
6065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
6075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, ""))
608010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
6095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
6105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
6115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "abagagagagagagagagagagagagagagag"))
612010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
6135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
6145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
6155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "jebgalgnebhfojomionfpkfelancnnkf"))
616010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
6175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
6185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, ""))
619010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
620a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
621a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // No update: error from no server response
623f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  post_interceptor_->Reset();
624010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
625010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"), test_file("updatecheck_reply_empty")));
626f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_configurator()->SetLoopCount(1);
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  component_updater()->Start();
629010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(
630010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ComponentUpdateService::kOk,
631010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      OnDemandTester::OnDemand(component_updater(), GetCrxComponentID(com2)));
6324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  component_updater()->Stop();
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
635f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetHitCount())
636f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
637f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetCount())
638f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
639f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // No update: already updated to 1.0 so nothing new
6415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer));
642a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
643a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
6445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
6455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, ""))
646010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
6475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
6485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
6495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "jebgalgnebhfojomionfpkfelancnnkf"))
650010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
6515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
6525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
6535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "abagagagagagagagagagagagagagagag"))
654010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
6555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
6565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, ""))
657010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
658a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
659a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
660f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  post_interceptor_->Reset();
661010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
662010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml")));
663f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_configurator()->SetLoopCount(1);
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  component_updater()->Start();
666010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(
667010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ComponentUpdateService::kOk,
668010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      OnDemandTester::OnDemand(component_updater(), GetCrxComponentID(com2)));
6694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
671f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetHitCount())
672f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
673f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetCount())
674f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
675ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  component_updater()->Stop();
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Verify that a previously registered component can get re-registered
680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// with a different version.
681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ComponentUpdaterTest, CheckReRegistration) {
6825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  MockServiceObserver observer;
683a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
684a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
6855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
6865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, ""))
687010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
6885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
6895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATE_FOUND,
6905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "jebgalgnebhfojomionfpkfelancnnkf"))
691010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
6925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
6935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
6945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "abagagagagagagagagagagagagagagag"))
695010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
696010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(observer,
697010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                OnEvent(ServiceObserver::COMPONENT_UPDATE_DOWNLOADING,
698010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        "jebgalgnebhfojomionfpkfelancnnkf"))
699010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                .Times(AnyNumber());
7005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
7015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATE_READY,
7025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "jebgalgnebhfojomionfpkfelancnnkf"))
703010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
7045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
7055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATED,
7065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "jebgalgnebhfojomionfpkfelancnnkf"))
707010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
7085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
7095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, ""))
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_NOT_UPDATED,
7175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "abagagagagagagagagagagagagagagag"))
718010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
7195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
7205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, ""))
721010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
722a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
723a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
724010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
725010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml")));
726f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
727010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
728010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml")));
729f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
730f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
731f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL(expected_crx_url),
732f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
733f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  component_updater()->AddObserver(&observer);
7355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
736eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer1;
737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CrxComponent com1;
738eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com1, kTestComponent_jebg, Version("0.9"), &installer1);
739eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer2;
740c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CrxComponent com2;
741eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com2, kTestComponent_abag, Version("2.2"), &installer2);
742c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
743f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Loop twice to issue two checks: (1) with original 0.9 version, update to
744f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // 1.0, and do the second check (2) with the updated 1.0 version.
745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test_configurator()->SetLoopCount(2);
746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  component_updater()->Start();
7474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
748c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
749c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error());
750c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(1, static_cast<TestInstaller*>(com1.installer)->install_count());
751c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error());
752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->install_count());
753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
754f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(3, post_interceptor_->GetHitCount())
755010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
756f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, get_interceptor_->GetHitCount());
757f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
758010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
759010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
760010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[0].find(
761010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"0.9\">"
762010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /></app>"))
763f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
764010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
765010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
766010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[1].find(
767010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" "
768010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "version=\"0.9\" nextversion=\"1.0\">"
769010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<event eventtype=\"3\" eventresult=\"1\"/>"))
770f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
771010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
772010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
773010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[2].find(
774010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"1.0\">"
775010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /></app>"))
776f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
778a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  component_updater()->Stop();
779a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Now re-register, pretending to be an even newer version (2.2)
7815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer));
782a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
783a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    InSequence seq;
7845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
7855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, ""))
786010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
7875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
7885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
7895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "jebgalgnebhfojomionfpkfelancnnkf"))
790010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
7915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
7925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
7935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "abagagagagagagagagagagagagagagag"))
794010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
7955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
7965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, ""))
797010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
798a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
799a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
800f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  post_interceptor_->Reset();
801010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
802010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml")));
803f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
804eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer3;
805c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(ComponentUpdateService::kReplaced,
806010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            RegisterComponent(
807010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                &com1, kTestComponent_jebg, Version("2.2"), &installer3));
808c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
809c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Loop once just to notice the check happening with the re-register version.
810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test_configurator()->SetLoopCount(1);
811c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  component_updater()->Start();
8124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
814eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // We created a new installer, so the counts go back to 0.
815c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error());
816c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->install_count());
817c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error());
818c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->install_count());
819c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
820f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // One update check and no additional pings are expected.
821f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetHitCount())
822010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
823f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetCount())
824010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
825f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
826010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
827010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
828010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[0].find(
829010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"2.2\">"
830010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /></app>"));
831f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
832c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  component_updater()->Stop();
833c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
834eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
835ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Verify that we can download and install a component and a differential
836ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// update to that component. We do three loops; the final loop should do
837ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// nothing.
838ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// We also check that exactly 5 non-ping network requests are issued:
839ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// 1- update check (response: v1 available)
840ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// 2- download crx (v1)
841ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// 3- update check (response: v2 available)
842ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// 4- download differential crx (v1 to v2)
843ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// 5- update check (response: no further update available)
844ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// There should be two pings, one for each update. The second will bear a
845ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// diffresult=1, while the first will not.
846ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochTEST_F(ComponentUpdaterTest, DifferentialUpdate) {
847010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
848010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"),
849010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      test_file("updatecheck_diff_reply_1.xml")));
850f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
851010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
852010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"),
853010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      test_file("updatecheck_diff_reply_2.xml")));
854f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
855010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
856010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"),
857010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      test_file("updatecheck_diff_reply_3.xml")));
858f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
859f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
860f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL("http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"),
861f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"));
862f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
863f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL("http://localhost/download/"
864f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)           "ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx"),
865f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx"));
866ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
867ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  VersionedTestInstaller installer;
868ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  CrxComponent com;
869ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  RegisterComponent(&com, kTestComponent_ihfo, Version("0.0"), &installer);
870ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
871ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  test_configurator()->SetLoopCount(3);
872ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  component_updater()->Start();
8734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
874ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
875ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
876ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(2, static_cast<TestInstaller*>(com.installer)->install_count());
877ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
878f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(5, post_interceptor_->GetHitCount())
879f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
880f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(5, post_interceptor_->GetCount())
881f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
882f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, get_interceptor_->GetHitCount());
883f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
884010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
885010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
886010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[0].find(
887010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"0.0\">"
888010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /></app>"))
889f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
890010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
891010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
892010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[1].find(
893010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" "
894010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "version=\"0.0\" nextversion=\"1.0\">"
895010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<event eventtype=\"3\" eventresult=\"1\" nextfp=\"1\"/>"))
896f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
897010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
898010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
899010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[2].find(
900010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"1.0\">"
901010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /><packages><package fp=\"1\"/></packages></app>"))
902f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
903010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
904010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
905010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[3].find(
906010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" "
907010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "version=\"1.0\" nextversion=\"2.0\">"
908010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<event eventtype=\"3\" eventresult=\"1\" diffresult=\"1\" "
909010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "previousfp=\"1\" nextfp=\"22\"/>"))
910f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
911010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
912010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
913010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[4].find(
914010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"2.0\">"
915010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /><packages><package fp=\"22\"/></packages></app>"))
916f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
917ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  component_updater()->Stop();
918ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
919ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
920eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Verify that component installation falls back to downloading and installing
921eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// a full update if the differential update fails (in this case, because the
922eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// installer does not know about the existing files). We do two loops; the final
923eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// loop should do nothing.
924ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// We also check that exactly 4 non-ping network requests are issued:
925eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 1- update check (loop 1)
926eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 2- download differential crx
927eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 3- download full crx
928eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 4- update check (loop 2 - no update available)
929ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// There should be one ping for the first attempted update.
9300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// This test is flaky on Android. crbug.com/329883
9310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#if defined(OS_ANDROID)
9320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#define MAYBE_DifferentialUpdateFails DISABLED_DifferentialUpdateFails
9330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#else
9340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#define MAYBE_DifferentialUpdateFails DifferentialUpdateFails
9350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#endif
9360529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(ComponentUpdaterTest, MAYBE_DifferentialUpdateFails) {
937010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
938010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"),
939010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      test_file("updatecheck_diff_reply_2.xml")));
940f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
941010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
942010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"),
943010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      test_file("updatecheck_diff_reply_3.xml")));
944f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
945f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
946f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL("http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"),
947f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"));
948f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
949f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL("http://localhost/download/"
950010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx"),
951f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx"));
952f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
953f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL("http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_2.crx"),
954f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("ihfokbkgjpifnbbojhneepfflplebdkc_2.crx"));
955eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
956eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestInstaller installer;
957eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CrxComponent com;
958eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com, kTestComponent_ihfo, Version("1.0"), &installer);
959eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
960eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test_configurator()->SetLoopCount(2);
961eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  component_updater()->Start();
9624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
963eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
964eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // A failed differential update does not count as a failed install.
965eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
966eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(1, static_cast<TestInstaller*>(com.installer)->install_count());
967eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
968f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(3, post_interceptor_->GetHitCount())
969f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
970f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(3, post_interceptor_->GetCount())
971f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
972f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, get_interceptor_->GetHitCount());
973f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
974010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
975010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
976010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[0].find(
977010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"1.0\">"
978010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /></app>"))
979f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
980010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
981010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
982010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[1].find(
983010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" "
984010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "version=\"1.0\" nextversion=\"2.0\">"
985010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<event eventtype=\"3\" eventresult=\"1\" diffresult=\"0\" "
986010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "differrorcat=\"2\" differrorcode=\"16\" nextfp=\"22\"/>"))
987f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
988010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
989010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
990010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[2].find(
991010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"2.0\">"
992010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /><packages><package fp=\"22\"/></packages></app>"))
993f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
994eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
995eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  component_updater()->Stop();
996eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
997eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
9985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Test is flakey on Android bots. See crbug.com/331420.
9995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_ANDROID)
10005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define MAYBE_CheckFailedInstallPing DISABLED_CheckFailedInstallPing
10015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else
10025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define MAYBE_CheckFailedInstallPing CheckFailedInstallPing
10035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
1004ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Verify that a failed installation causes an install failure ping.
1005010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(ComponentUpdaterTest, MAYBE_CheckFailedInstallPing) {
1006ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // This test installer reports installation failure.
1007ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  class : public TestInstaller {
1008ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    virtual bool Install(const base::DictionaryValue& manifest,
1009ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                         const base::FilePath& unpack_path) OVERRIDE {
1010ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      ++install_count_;
1011ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      base::DeleteFile(unpack_path, true);
1012ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      return false;
1013ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    }
1014ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  } installer;
1015ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1016010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
1017010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml")));
1018f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
1019010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
1020010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml")));
1021f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
1022f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
1023f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL(expected_crx_url),
1024f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
1025f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1026f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Start with 0.9, and attempt update to 1.0.
1027f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Loop twice to issue two checks: (1) with original 0.9 version
1028f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // and (2), which should retry with 0.9.
1029ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  CrxComponent com;
1030ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  RegisterComponent(&com, kTestComponent_jebg, Version("0.9"), &installer);
1031ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1032ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  test_configurator()->SetLoopCount(2);
1033ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  component_updater()->Start();
10344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
1035ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1036f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(4, post_interceptor_->GetHitCount())
1037f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1038f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, get_interceptor_->GetHitCount());
1039f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1040010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
1041010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
1042010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[0].find(
1043010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"0.9\">"
1044010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /></app>"))
1045f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1046010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
1047010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
1048010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[1].find(
1049010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" "
1050010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "version=\"0.9\" nextversion=\"1.0\">"
1051010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<event eventtype=\"3\" eventresult=\"0\" "
1052010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "errorcat=\"3\" errorcode=\"9\"/>"))
1053f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1054010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
1055010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
1056010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[2].find(
1057010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"0.9\">"
1058010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /></app>"))
1059f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1060010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
1061010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
1062010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[3].find(
1063010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" "
1064010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "version=\"0.9\" nextversion=\"1.0\">"
1065010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<event eventtype=\"3\" eventresult=\"0\" "
1066010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "errorcat=\"3\" errorcode=\"9\"/>"))
1067f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1068f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1069ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Loop once more, but expect no ping because a noupdate response is issued.
1070ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // This is necessary to clear out the fire-and-forget ping from the previous
1071ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // iteration.
1072f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  post_interceptor_->Reset();
1073010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
1074010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"),
1075010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      test_file("updatecheck_reply_noupdate.xml")));
1076f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1077ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  test_configurator()->SetLoopCount(1);
1078ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  component_updater()->Start();
10794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
1080ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1081ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
1082ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(2, static_cast<TestInstaller*>(com.installer)->install_count());
1083ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1084f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetHitCount())
1085f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1086f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetCount())
1087f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1088f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1089010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
1090010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
1091010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[0].find(
1092010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"0.9\">"
1093010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /></app>"))
1094f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1095ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1096ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  component_updater()->Stop();
1097ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
1098ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1099eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Verify that we successfully propagate a patcher error.
1100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// ihfokbkgjpifnbbojhneepfflplebdkc_1to2_bad.crx contains an incorrect
1101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// patching instruction that should fail.
1102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(ComponentUpdaterTest, DifferentialUpdateFailErrorcode) {
1103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
1104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"),
1105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      test_file("updatecheck_diff_reply_1.xml")));
1106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
1107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
1108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"),
1109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      test_file("updatecheck_diff_reply_2.xml")));
1110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
1111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
1112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"),
1113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      test_file("updatecheck_diff_reply_3.xml")));
1114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
1116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL("http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"),
1117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"));
1118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // This intercept returns a different file than what is specified in the
1119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // update check response and requested in the download. The file that is
1120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // actually dowloaded contains a patching error, an therefore, an error
1121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // is injected at the time of patching.
1122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
1123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL("http://localhost/download/"
1124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)           "ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx"),
1125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1to2_bad.crx"));
1126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get_interceptor_->SetResponse(
1127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL("http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_2.crx"),
1128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_file("ihfokbkgjpifnbbojhneepfflplebdkc_2.crx"));
1129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  VersionedTestInstaller installer;
1131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CrxComponent com;
1132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RegisterComponent(&com, kTestComponent_ihfo, Version("0.0"), &installer);
1133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  test_configurator()->SetLoopCount(3);
1135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  component_updater()->Start();
11364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunThreads();
11374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  component_updater()->Stop();
1138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
1140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(2, static_cast<TestInstaller*>(com.installer)->install_count());
1141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(5, post_interceptor_->GetHitCount())
1143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(5, post_interceptor_->GetCount())
1145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(3, get_interceptor_->GetHitCount());
1147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
1149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
1150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[0].find(
1151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"0.0\">"
1152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /></app>"))
1153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
1155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
1156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[1].find(
1157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" "
1158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "version=\"0.0\" nextversion=\"1.0\">"
1159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<event eventtype=\"3\" eventresult=\"1\" nextfp=\"1\"/>"))
1160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1161010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
1162010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
1163010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[2].find(
1164010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"1.0\">"
1165010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /><packages><package fp=\"1\"/></packages></app>"))
1166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1167010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
1168010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
1169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[3].find(
1170010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" "
1171010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "version=\"1.0\" nextversion=\"2.0\">"
1172010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<event eventtype=\"3\" eventresult=\"1\" "
1173010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "diffresult=\"0\" differrorcat=\"2\" "
1174010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "differrorcode=\"14\" diffextracode1=\"305\" "
1175010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "previousfp=\"1\" nextfp=\"22\"/>"))
1176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1177010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(
1178010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      string::npos,
1179010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      post_interceptor_->GetRequests()[4].find(
1180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"2.0\">"
1181010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "<updatecheck /><packages><package fp=\"22\"/></packages></app>"))
1182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << post_interceptor_->GetRequestsAsString();
1183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
11855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class TestResourceController : public content::ResourceController {
11865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
11875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SetThrottle(content::ResourceThrottle* throttle) {}
11885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
11895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)content::ResourceThrottle* RequestTestResourceThrottle(
11915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ComponentUpdateService* cus,
11925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    TestResourceController* controller,
11935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const char* crx_id) {
11945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  net::TestURLRequestContext context;
1195010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  net::TestURLRequest url_request(GURL("http://foo.example.com/thing.bin"),
1196010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                  net::DEFAULT_PRIORITY,
1197010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                  NULL,
1198010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                  &context);
11995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
12006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  content::ResourceThrottle* rt = GetOnDemandResourceThrottle(cus, crx_id);
12015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  rt->set_controller_for_testing(controller);
12025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  controller->SetThrottle(rt);
12035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return rt;
12045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
12055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void RequestAndDeleteResourceThrottle(ComponentUpdateService* cus,
1207010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                      const char* crx_id) {
1208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // By requesting a throttle and deleting it immediately we ensure that we
1209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // hit the case where the component updater tries to use the weak
1210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // pointer to a dead Resource throttle.
1211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  class NoCallResourceController : public TestResourceController {
1212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   public:
1213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual ~NoCallResourceController() {}
1214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual void Cancel() OVERRIDE { CHECK(false); }
1215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual void CancelAndIgnore() OVERRIDE { CHECK(false); }
1216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual void CancelWithError(int error_code) OVERRIDE { CHECK(false); }
1217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual void Resume() OVERRIDE { CHECK(false); }
12185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } controller;
1219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
12205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  delete RequestTestResourceThrottle(cus, &controller, crx_id);
1221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
12235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ComponentUpdaterTest, ResourceThrottleDeletedNoUpdate) {
12245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  MockServiceObserver observer;
12255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  {
12265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    InSequence seq;
12275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
12285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, ""))
1229010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
12305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
12315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
12325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "abagagagagagagagagagagagagagagag"))
1233010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
12345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
12355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, ""))
1236010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
12375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
1238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1239010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
1240010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml")));
12415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1242f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TestInstaller installer;
1243f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CrxComponent com;
12445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  component_updater()->AddObserver(&observer);
1245010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(
1246010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ComponentUpdateService::kOk,
1247010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      RegisterComponent(&com, kTestComponent_abag, Version("1.1"), &installer));
1248f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The following two calls ensure that we don't do an update check via the
1249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // timer, so the only update check should be the on-demand one.
1250f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  test_configurator()->SetInitialDelay(1000000);
1251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  test_configurator()->SetRecheckTime(1000000);
1252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  test_configurator()->SetLoopCount(1);
1253f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  component_updater()->Start();
1254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RunThreadsUntilIdle();
1256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0, post_interceptor_->GetHitCount());
1258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1259010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BrowserThread::PostTask(BrowserThread::IO,
1260010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          FROM_HERE,
1261010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          base::Bind(&RequestAndDeleteResourceThrottle,
1262010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                     component_updater(),
1263010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                     "abagagagagagagagagagagagagagagag"));
12645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
12655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RunThreads();
12665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
12675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, post_interceptor_->GetHitCount());
12685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
12695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count());
12705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
12715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  component_updater()->Stop();
12725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
12735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1274010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class CancelResourceController : public TestResourceController {
1275010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public:
12765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CancelResourceController() : throttle_(NULL), resume_called_(0) {}
12775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~CancelResourceController() {
12785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Check that the throttle has been resumed by the time we
12795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // exit the test.
1280010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    CHECK_EQ(1, resume_called_);
12815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    delete throttle_;
12825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
12835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void Cancel() OVERRIDE { CHECK(false); }
12845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void CancelAndIgnore() OVERRIDE { CHECK(false); }
12855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void CancelWithError(int error_code) OVERRIDE { CHECK(false); }
12865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void Resume() OVERRIDE {
1287010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    BrowserThread::PostTask(BrowserThread::IO,
1288010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            FROM_HERE,
1289010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            base::Bind(&CancelResourceController::ResumeCalled,
1290010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                       base::Unretained(this)));
12915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
12925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SetThrottle(content::ResourceThrottle* throttle) OVERRIDE {
12935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    throttle_ = throttle;
12945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool defer = false;
12955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Initially the throttle is blocked. The CUS needs to run a
12965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // task on the UI thread to  decide if it should unblock.
12975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    throttle_->WillStartRequest(&defer);
12985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CHECK(defer);
12995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
13005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1301010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private:
13025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void ResumeCalled() { ++resume_called_; }
13035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::ResourceThrottle* throttle_;
13055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int resume_called_;
13065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
13075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
130846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Tests the on-demand update with resource throttle, including the
130946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// cooldown interval between calls.
13105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ComponentUpdaterTest, ResourceThrottleLiveNoUpdate) {
13115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  MockServiceObserver observer;
13125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  {
13135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    InSequence seq;
13145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
13155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, ""))
1316010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
13175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
13185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
13195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "abagagagagagagagagagagagagagagag"))
1320010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
13215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer,
13225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, ""))
1323010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
132446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    EXPECT_CALL(observer,
132546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, ""))
132646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        .Times(1);
132746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    EXPECT_CALL(observer,
132846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
132946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                        "abagagagagagagagagagagagagagagag"))
133046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        .Times(1);
133146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    EXPECT_CALL(observer,
133246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, ""))
133346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        .Times(1);
133446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    EXPECT_CALL(observer,
133546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, ""))
133646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        .Times(1);
13375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
13385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1339010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
1340010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml")));
1341f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
13425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TestInstaller installer;
13435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CrxComponent com;
13445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  component_updater()->AddObserver(&observer);
1345010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(
1346010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ComponentUpdateService::kOk,
1347010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      RegisterComponent(&com, kTestComponent_abag, Version("1.1"), &installer));
13485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The following two calls ensure that we don't do an update check via the
13495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // timer, so the only update check should be the on-demand one.
13505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  test_configurator()->SetInitialDelay(1000000);
13515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  test_configurator()->SetRecheckTime(1000000);
13525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  test_configurator()->SetLoopCount(1);
13535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  component_updater()->Start();
13545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RunThreadsUntilIdle();
13565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, post_interceptor_->GetHitCount());
13585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
135946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  {
136046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // First on-demand update check is expected to succeeded.
136146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    CancelResourceController controller;
13625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
136346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    BrowserThread::PostTask(
136446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        BrowserThread::IO,
136546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        FROM_HERE,
136646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        base::Bind(base::IgnoreResult(&RequestTestResourceThrottle),
136746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                   component_updater(),
136846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                   &controller,
136946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                   "abagagagagagagagagagagagagagagag"));
1370f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
137146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    RunThreads();
1372f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
137346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    EXPECT_EQ(1, post_interceptor_->GetHitCount());
137446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
137546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count());
1376f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
137746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    component_updater()->Stop();
137846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
137946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
138046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  {
138146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // Second on-demand update check is expected to succeed as well, since there
138246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // is no cooldown interval between calls, due to calling SetOnDemandTime.
138346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    test_configurator()->SetOnDemandTime(0);
138446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    test_configurator()->SetLoopCount(1);
138546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    component_updater()->Start();
138646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
138746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    CancelResourceController controller;
138846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
138946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    BrowserThread::PostTask(
139046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        BrowserThread::IO,
139146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        FROM_HERE,
139246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        base::Bind(base::IgnoreResult(&RequestTestResourceThrottle),
139346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                   component_updater(),
139446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                   &controller,
139546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                   "abagagagagagagagagagagagagagagag"));
139646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
139746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    RunThreads();
139846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
139946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    EXPECT_EQ(1, post_interceptor_->GetHitCount());
140046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
140146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count());
140246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
140346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    component_updater()->Stop();
140446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
140546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
140646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  {
140746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // This on-demand call is expected not to trigger a component update check.
140846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    test_configurator()->SetOnDemandTime(1000000);
140946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    component_updater()->Start();
141046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
141146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    CancelResourceController controller;
141246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
141346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    BrowserThread::PostTask(
141446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        BrowserThread::IO,
141546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        FROM_HERE,
141646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        base::Bind(base::IgnoreResult(&RequestTestResourceThrottle),
141746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                   component_updater(),
141846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                   &controller,
141946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                   "abagagagagagagagagagagagagagagag"));
142046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    RunThreadsUntilIdle();
142146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
1422f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1423f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
14245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Tests adding and removing observers.
14255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(ComponentUpdaterTest, Observer) {
14265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  MockServiceObserver observer1, observer2;
14275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
14285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Expect that two observers see the events.
14295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  {
14305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    InSequence seq;
14315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer1,
14325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, ""))
1433010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
14345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer2,
14355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, ""))
1436010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
14375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer1,
14385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
14395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "abagagagagagagagagagagagagagagag"))
1440010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
14415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer2,
14425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
14435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "abagagagagagagagagagagagagagagag"))
1444010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
14455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer1,
14465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, ""))
1447010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
14485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer2,
14495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, ""))
1450010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
14515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
14525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1453010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(post_interceptor_->ExpectRequest(
1454010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml")));
14555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
14565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  component_updater()->AddObserver(&observer1);
14575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  component_updater()->AddObserver(&observer2);
14585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
14595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  TestInstaller installer;
14605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  CrxComponent com;
1461010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(
1462010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ComponentUpdateService::kOk,
1463010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      RegisterComponent(&com, kTestComponent_abag, Version("1.1"), &installer));
14645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  test_configurator()->SetLoopCount(1);
14655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  component_updater()->Start();
14665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  RunThreads();
14675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
14685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // After removing the first observer, it's only the second observer that
14695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // gets the events.
14705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer1));
14715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer2));
14725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  {
14735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    InSequence seq;
14745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer2,
14755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, ""))
1476010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
14775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer2,
14785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED,
14795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        "abagagagagagagagagagagagagagagag"))
1480010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
14815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(observer2,
14825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, ""))
1483010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1);
14845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
14855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
14865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  component_updater()->RemoveObserver(&observer1);
14875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
14885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  test_configurator()->SetLoopCount(1);
14895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  component_updater()->Start();
14905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  RunThreads();
1491f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
14925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Both observers are removed and no one gets the events.
14935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer1));
14945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer2));
14955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  component_updater()->RemoveObserver(&observer2);
14965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
14975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  test_configurator()->SetLoopCount(1);
14985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  component_updater()->Start();
14995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  RunThreads();
15005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
15015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  component_updater()->Stop();
15025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
15035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
15045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}  // namespace component_updater
1505