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