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