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