component_updater_service_unittest.cc revision 1e9bf3e0803691d0a228da41fc608347b6db4340
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/component_updater/test/component_updater_service_unittest.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/run_loop.h" 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/string_number_conversions.h" 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/stringprintf.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/component_updater/test/test_installer.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/browser/browser_thread.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/test/net/url_request_prepackaged_interceptor.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "libxml/globals.h" 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/base/upload_bytes_element_reader.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_fetcher.h" 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using ::testing::_; 24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using ::testing::InSequence; 25a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using ::testing::Mock; 26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)MockComponentObserver::MockComponentObserver() { 28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)MockComponentObserver::~MockComponentObserver() { 31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTestConfigurator::TestConfigurator() 34ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch : times_(1), 35ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch recheck_time_(0), 36ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ondemand_time_(0), 37ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch cus_(NULL), 38ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch context_(new net::TestURLRequestContextGetter( 39ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO))) { 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTestConfigurator::~TestConfigurator() { 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint TestConfigurator::InitialDelay() { return 0; } 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint TestConfigurator::NextCheckDelay() { 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // This is called when a new full cycle of checking for updates is going 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // to happen. In test we normally only test one cycle so it is a good 50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // time to break from the test messageloop Run() method so the test can 51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // finish. 52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (--times_ <= 0) { 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) quit_closure_.Run(); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return 1; 57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint TestConfigurator::StepDelay() { 60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return 0; 61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)int TestConfigurator::StepDelayMedium() { 643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return NextCheckDelay(); 653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint TestConfigurator::MinimumReCheckWait() { 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return recheck_time_; 69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint TestConfigurator::OnDemandDelay() { 72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return ondemand_time_; 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochGURL TestConfigurator::UpdateUrl() { 76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return GURL("http://localhost/upd"); 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 79ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochGURL TestConfigurator::PingUrl() { 80ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return GURL("http://localhost2/ping"); 81ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 82ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst char* TestConfigurator::ExtraRequestParams() { return "extra=foo"; } 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochsize_t TestConfigurator::UrlSizeLimit() { return 256; } 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnet::URLRequestContextGetter* TestConfigurator::RequestContext() { 88ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return context_.get(); 89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Don't use the utility process to decode files. 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool TestConfigurator::InProcess() { return true; } 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochComponentPatcher* TestConfigurator::CreateComponentPatcher() { 95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return new MockComponentPatcher(); 96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool TestConfigurator::DeltasEnabled() const { 99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Set how many update checks are called, the default value is just once. 103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid TestConfigurator::SetLoopCount(int times) { times_ = times; } 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid TestConfigurator::SetRecheckTime(int seconds) { 106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch recheck_time_ = seconds; 107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid TestConfigurator::SetOnDemandTime(int seconds) { 110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ondemand_time_ = seconds; 111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid TestConfigurator::SetComponentUpdateService(ComponentUpdateService* cus) { 114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch cus_ = cus; 115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void TestConfigurator::SetQuitClosure(const base::Closure& quit_closure) { 1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) quit_closure_ = quit_closure; 1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 121ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochComponentUpdaterTest::ComponentUpdaterTest() 122ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch : test_config_(NULL), 1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP) { 124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // The component updater instance under test. 125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch test_config_ = new TestConfigurator; 126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch component_updater_.reset(ComponentUpdateServiceFactory(test_config_)); 127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch test_config_->SetComponentUpdateService(component_updater_.get()); 128ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // The test directory is chrome/test/data/components. 130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir_); 131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch test_data_dir_ = test_data_dir_.AppendASCII("components"); 132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch net::URLFetcher::SetEnableInterceptionForTests(true); 134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochComponentUpdaterTest::~ComponentUpdaterTest() { 137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch net::URLFetcher::SetEnableInterceptionForTests(false); 138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ComponentUpdaterTest::TearDown() { 141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch xmlCleanupGlobals(); 142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochComponentUpdateService* ComponentUpdaterTest::component_updater() { 145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return component_updater_.get(); 146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Makes the full path to a component updater test file. 149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst base::FilePath ComponentUpdaterTest::test_file(const char* file) { 150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return test_data_dir_.AppendASCII(file); 151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTestConfigurator* ComponentUpdaterTest::test_configurator() { 154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return test_config_; 155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochComponentUpdateService::Status ComponentUpdaterTest::RegisterComponent( 158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CrxComponent* com, 159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestComponents component, 160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const Version& version, 161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestInstaller* installer) { 162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (component == kTestComponent_abag) { 163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch com->name = "test_abag"; 164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch com->pk_hash.assign(abag_hash, abag_hash + arraysize(abag_hash)); 165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else if (component == kTestComponent_jebg) { 166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch com->name = "test_jebg"; 167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch com->pk_hash.assign(jebg_hash, jebg_hash + arraysize(jebg_hash)); 168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else { 169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch com->name = "test_ihfo"; 170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch com->pk_hash.assign(ihfo_hash, ihfo_hash + arraysize(ihfo_hash)); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch com->version = version; 173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch com->installer = installer; 174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return component_updater_->RegisterComponent(*com); 175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void ComponentUpdaterTest::RunThreads() { 1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::RunLoop runloop; 1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) test_configurator()->SetQuitClosure(runloop.QuitClosure()); 1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) runloop.Run(); 1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void ComponentUpdaterTest::RunThreadsUntilIdle() { 1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 187ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochPingChecker::PingChecker(const std::map<std::string, std::string>& attributes) 188ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch : num_hits_(0), num_misses_(0), attributes_(attributes) { 189ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 190ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 191ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochPingChecker::~PingChecker() {} 192ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 193ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid PingChecker::Trial(net::URLRequest* request) { 194ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (Test(request)) 195ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ++num_hits_; 196ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch else 197ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ++num_misses_; 198ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 199ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 200ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochbool PingChecker::Test(net::URLRequest* request) { 201ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (request->has_upload()) { 202ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const net::UploadDataStream* stream = request->get_upload(); 203ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const net::UploadBytesElementReader* reader = 204ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch stream->element_readers()[0]->AsBytesReader(); 205ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int size = reader->length(); 206ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch scoped_refptr <net::IOBuffer> buffer = new net::IOBuffer(size); 207ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch std::string data(reader->bytes()); 2083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) pings_.push_back(data); 209ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // For now, we assume that there is only one ping per POST. 210ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch std::string::size_type start = data.find("<o:event"); 211ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (start != std::string::npos) { 212ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch std::string::size_type end = data.find(">", start); 213ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (end != std::string::npos) { 214ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch std::string ping = data.substr(start, end - start); 215ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch std::map<std::string, std::string>::const_iterator iter; 216ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch for (iter = attributes_.begin(); iter != attributes_.end(); ++iter) { 217ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // does the ping contain the specified attribute/value? 218ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (ping.find(std::string(" ") + (iter->first) + 219ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch std::string("=") + (iter->second)) == string::npos) { 220ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return false; 221ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 222ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 223ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return true; 224ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 225ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 226ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 227ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return false; 228ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 229ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 2303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)std::string PingChecker::GetPings() const { 2313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string pings_str = "Pings are:"; 2323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int i = 0; 2333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) for (std::vector<std::string>::const_iterator it = pings_.begin(); 2343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) it != pings_.end(); ++it) { 2353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) pings_str.append(base::StringPrintf("\n (%d): %s", ++i, it->c_str())); 2363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 2373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return pings_str; 2383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 2393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)ComponentUpdateService::Status OnDemandTester::OnDemand( 2411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ComponentUpdateService* cus, const std::string& component_id) { 2421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return cus->OnDemandUpdate(component_id); 2431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 2441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that our test fixture work and the component updater can 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// be created and destroyed with no side effects. 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, VerifyFixture) { 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(component_updater() != NULL); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that the component updater can be caught in a quick 252ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// start-shutdown situation. Failure of this test will be a crash. 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, StartStop) { 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater()->Start(); 2554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RunThreadsUntilIdle(); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater()->Stop(); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that when the server has no updates, we go back to sleep and 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the COMPONENT_UPDATER_STARTED and COMPONENT_UPDATER_SLEEPING notifications 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// are generated. 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, CheckCrxSleep) { 263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::URLLocalHostRequestPrepackagedInterceptor interceptor; 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) MockComponentObserver observer; 266a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 267eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestInstaller installer; 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrxComponent com; 269a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) com.observer = &observer; 270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(ComponentUpdateService::kOk, 271eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RegisterComponent(&com, 272eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch kTestComponent_abag, 273eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Version("1.1"), 274eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch &installer)); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL expected_update_url( 277eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "http://localhost/upd?extra=foo" 278eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "&x=id%3Dabagagagagagagagagagagagagagagag%26v%3D1.1%26fp%3D%26uc"); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) interceptor.SetResponse(expected_update_url, 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_file("updatecheck_reply_1.xml")); 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); 285a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 286a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer, 287a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0)) 288a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Times(1); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater()->Start(); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 291a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer, 292a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0)) 293a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Times(2); 2941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_CALL(observer, 2961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0)) 2971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) .Times(2); 2984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RunThreads(); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, interceptor.GetHitCount()); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error()); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count()); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater()->Stop(); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Loop twice again but this case we simulate a server error by returning 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // an empty file. 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) interceptor.SetResponse(expected_update_url, 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_file("updatecheck_reply_empty")); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_configurator()->SetLoopCount(2); 314a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 315a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer, 316a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0)) 317a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Times(1); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater()->Start(); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 320a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer, 321a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0)) 322a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Times(2); 3231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_CALL(observer, 3241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0)) 3251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) .Times(2); 3264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RunThreads(); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(4, interceptor.GetHitCount()); 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) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater()->Stop(); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we can check for updates and install one component. Besides 337ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// the notifications above COMPONENT_UPDATE_FOUND and COMPONENT_UPDATE_READY 338ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// should have been fired. We do two loops so the second time around there 339ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// should be nothing left to do. 340ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// We also check that only 3 non-ping network requests are issued: 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1- manifest check 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2- download crx 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3- second manifest check. 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, InstallCrx) { 345ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch std::map<std::string, std::string> map; 346ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch map.insert(std::pair<std::string, std::string>("eventtype", "\"3\"")); 347ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch map.insert(std::pair<std::string, std::string>("eventresult", "\"1\"")); 348ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch map.insert(std::pair<std::string, std::string>("previousversion", 349ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch "\"0.9\"")); 350ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch map.insert(std::pair<std::string, std::string>("nextversion", "\"1.0\"")); 351ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PingChecker ping_checker(map); 352ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch URLRequestPostInterceptor post_interceptor(&ping_checker); 353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::URLLocalHostRequestPrepackagedInterceptor interceptor; 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) MockComponentObserver observer1; 356a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) { 357a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) InSequence seq; 358a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer1, 359a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0)) 360a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Times(1); 361a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer1, 362a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATE_FOUND, 0)) 363a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Times(1); 364a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer1, 365a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATE_READY, 0)) 366a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Times(1); 367a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer1, 3681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATED, 0)) 3691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) .Times(1); 3701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_CALL(observer1, 371a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0)) 3721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) .Times(1); 3731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_CALL(observer1, 3741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0)) 3751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) .Times(1); 3761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_CALL(observer1, 3771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0)) 3781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) .Times(1); 379a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 380a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 381a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) MockComponentObserver observer2; 382a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) { 383a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) InSequence seq; 384a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer2, 385a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0)) 386a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Times(1); 387a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer2, 3881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0)) 3891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) .Times(1); 3901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_CALL(observer2, 3911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0)) 3921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) .Times(1); 3931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_CALL(observer2, 3941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0)) 3951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) .Times(1); 3961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_CALL(observer2, 397a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0)) 3981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) .Times(1); 399a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 400a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 401eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestInstaller installer1; 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrxComponent com1; 403a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) com1.observer = &observer1; 404eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RegisterComponent(&com1, kTestComponent_jebg, Version("0.9"), &installer1); 405eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestInstaller installer2; 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrxComponent com2; 407a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) com2.observer = &observer2; 408eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RegisterComponent(&com2, kTestComponent_abag, Version("2.2"), &installer2); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL expected_update_url_1( 411eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "http://localhost/upd?extra=foo" 412eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "&x=id%3Djebgalgnebhfojomionfpkfelancnnkf%26v%3D0.9%26fp%3D%26uc" 413eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "&x=id%3Dabagagagagagagagagagagagagagagag%26v%3D2.2%26fp%3D%26uc"); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL expected_update_url_2( 416eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "http://localhost/upd?extra=foo" 417eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "&x=id%3Dabagagagagagagagagagagagagagagag%26v%3D2.2%26fp%3D%26uc" 418eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "&x=id%3Djebgalgnebhfojomionfpkfelancnnkf%26v%3D1.0%26fp%3D%26uc"); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) interceptor.SetResponse(expected_update_url_1, 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_file("updatecheck_reply_1.xml")); 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) interceptor.SetResponse(expected_update_url_2, 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_file("updatecheck_reply_1.xml")); 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) interceptor.SetResponse(GURL(expected_crx_url), 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_file("jebgalgnebhfojomionfpkfelancnnkf.crx")); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_configurator()->SetLoopCount(2); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater()->Start(); 4304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RunThreads(); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error()); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, static_cast<TestInstaller*>(com1.installer)->install_count()); 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error()); 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->install_count()); 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(3, interceptor.GetHitCount()); 4383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(1, ping_checker.NumHits()) << ping_checker.GetPings(); 4393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(0, ping_checker.NumMisses()) << ping_checker.GetPings(); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) component_updater()->Stop(); 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test checks that the "prodversionmin" value is handled correctly. In 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// particular there should not be an install because the minimum product 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// version is much higher than of chrome. 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, ProdVersionCheck) { 448ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch std::map<std::string, std::string> map; 449ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PingChecker ping_checker(map); 450ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch URLRequestPostInterceptor post_interceptor(&ping_checker); 451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::URLLocalHostRequestPrepackagedInterceptor interceptor; 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 453eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestInstaller installer; 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrxComponent com; 455eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RegisterComponent(&com, kTestComponent_jebg, Version("0.9"), &installer); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL expected_update_url( 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://localhost/upd?extra=foo&x=id%3D" 459eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "jebgalgnebhfojomionfpkfelancnnkf%26v%3D0.9%26fp%3D%26uc"); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) interceptor.SetResponse(expected_update_url, 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_file("updatecheck_reply_2.xml")); 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) interceptor.SetResponse(GURL(expected_crx_url), 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_file("jebgalgnebhfojomionfpkfelancnnkf.crx")); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_configurator()->SetLoopCount(1); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater()->Start(); 4684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RunThreads(); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(0, ping_checker.NumHits()) << ping_checker.GetPings(); 4713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(0, ping_checker.NumMisses()) << ping_checker.GetPings(); 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, interceptor.GetHitCount()); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error()); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count()); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater()->Stop(); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that a ping for an update check can cause installs. 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Here is the timeline: 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - First loop: we return a reply that indicates no update, so 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// nothing happens. 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - We ping. 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - This triggers a second loop, which has a reply that triggers an install. 4851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(ComponentUpdaterTest, OnDemandUpdate) { 486ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch std::map<std::string, std::string> map; 487ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch map.insert(std::pair<std::string, std::string>("eventtype", "\"3\"")); 488ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch map.insert(std::pair<std::string, std::string>("eventresult", "\"1\"")); 489ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch map.insert(std::pair<std::string, std::string>("previousversion", 490ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch "\"0.9\"")); 491ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch map.insert(std::pair<std::string, std::string>("nextversion", "\"1.0\"")); 492ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PingChecker ping_checker(map); 493ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch URLRequestPostInterceptor post_interceptor(&ping_checker); 494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::URLLocalHostRequestPrepackagedInterceptor interceptor; 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 496a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) MockComponentObserver observer1; 497a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) { 498a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) InSequence seq; 499a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer1, 500a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0)) 501a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Times(1); 502a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer1, 5031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0)) 5041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) .Times(1); 5051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_CALL(observer1, 506a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0)) 507a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Times(1); 508a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer1, 5091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0)) 5101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) .Times(1); 5111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_CALL(observer1, 5121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0)) 5131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) .Times(1); 5141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_CALL(observer1, 515a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0)) 516a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Times(1); 517a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 518a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 519a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) MockComponentObserver observer2; 520a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) { 521a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) InSequence seq; 522a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer2, 523a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0)) 524a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Times(1); 525a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer2, 5261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0)) 5271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) .Times(1); 5281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_CALL(observer2, 529a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0)) 530a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Times(1); 531a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer2, 5321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0)) 5331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) .Times(1); 5341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_CALL(observer2, 535a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATE_FOUND, 0)) 536a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Times(1); 537a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer2, 538a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATE_READY, 0)) 539a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Times(1); 540a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer2, 5411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATED, 0)) 5421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) .Times(1); 5431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_CALL(observer2, 544a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0)) 545a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Times(1); 546a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 547a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 548eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestInstaller installer1; 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CrxComponent com1; 550a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) com1.observer = &observer1; 551eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RegisterComponent(&com1, kTestComponent_abag, Version("2.2"), &installer1); 552eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestInstaller installer2; 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CrxComponent com2; 554a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) com2.observer = &observer2; 555eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RegisterComponent(&com2, kTestComponent_jebg, Version("0.9"), &installer2); 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL expected_update_url_1( 558eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "http://localhost/upd?extra=foo" 559eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "&x=id%3Dabagagagagagagagagagagagagagagag%26v%3D2.2%26fp%3D%26uc" 560eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "&x=id%3Djebgalgnebhfojomionfpkfelancnnkf%26v%3D0.9%26fp%3D%26uc"); 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL expected_update_url_2( 563eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "http://localhost/upd?extra=foo" 564eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "&x=id%3Djebgalgnebhfojomionfpkfelancnnkf%26v%3D0.9%26fp%3D%26uc" 565eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "%26installsource%3Dondemand" 566eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "&x=id%3Dabagagagagagagagagagagagagagagag%26v%3D2.2%26fp%3D%26uc"); 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) interceptor.SetResponse(expected_update_url_1, 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_file("updatecheck_reply_empty")); 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) interceptor.SetResponse(expected_update_url_2, 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_file("updatecheck_reply_1.xml")); 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) interceptor.SetResponse(GURL(expected_crx_url), 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_file("jebgalgnebhfojomionfpkfelancnnkf.crx")); 5741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // No update normally. 5751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) test_configurator()->SetLoopCount(1); 5761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) component_updater()->Start(); 5771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) RunThreads(); 5781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) component_updater()->Stop(); 5791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Update after an on-demand check is issued. 5811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ComponentUpdateService::kOk, 5821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnDemandTester::OnDemand(component_updater(), 5831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) GetCrxComponentID(com2))); 5841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) test_configurator()->SetLoopCount(1); 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) component_updater()->Start(); 5864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RunThreads(); 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error()); 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->install_count()); 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error()); 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, static_cast<TestInstaller*>(com2.installer)->install_count()); 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(3, interceptor.GetHitCount()); 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Also check what happens if previous check too soon. 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_configurator()->SetOnDemandTime(60 * 60); 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ComponentUpdateService::kError, 5981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnDemandTester::OnDemand(component_updater(), 5991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) GetCrxComponentID(com2))); 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Okay, now reset to 0 for the other tests. 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_configurator()->SetOnDemandTime(0); 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) component_updater()->Stop(); 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Test a few error cases. NOTE: We don't have callbacks for 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // when the updates failed yet. 606a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer1)); 607a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) { 608a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) InSequence seq; 609a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer1, 610a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0)) 611a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Times(1); 612a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer1, 6131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0)) 6141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) .Times(1); 6151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_CALL(observer1, 616a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0)) 617a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Times(1); 618a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 619a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer2)); 620a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) { 621a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) InSequence seq; 622a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer2, 623a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0)) 624a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Times(1); 625a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer2, 6261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0)) 6271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) .Times(1); 6281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_CALL(observer2, 629a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0)) 630a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Times(1); 631a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 632a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL expected_update_url_3( 634eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "http://localhost/upd?extra=foo" 635eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "&x=id%3Djebgalgnebhfojomionfpkfelancnnkf%26v%3D1.0%26fp%3D%26uc" 636eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "&x=id%3Dabagagagagagagagagagagagagagagag%26v%3D2.2%26fp%3D%26uc"); 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No update: error from no server response 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) interceptor.SetResponse(expected_update_url_3, 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_file("updatecheck_reply_empty")); 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_configurator()->SetLoopCount(1); 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) component_updater()->Start(); 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ComponentUpdateService::kOk, 6441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnDemandTester::OnDemand(component_updater(), 6451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) GetCrxComponentID(com2))); 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RunThreads(); 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) component_updater()->Stop(); 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No update: already updated to 1.0 so nothing new 652a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer1)); 653a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) { 654a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) InSequence seq; 655a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer1, 656a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0)) 657a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Times(1); 658a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer1, 6591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0)) 6601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) .Times(1); 6611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_CALL(observer1, 662a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0)) 663a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Times(1); 664a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 665a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer2)); 666a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) { 667a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) InSequence seq; 668a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer2, 669a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0)) 670a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Times(1); 671a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer2, 6721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0)) 6731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) .Times(1); 6741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_CALL(observer2, 675a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0)) 676a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Times(1); 677a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 678a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) interceptor.SetResponse(expected_update_url_3, 6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_file("updatecheck_reply_1.xml")); 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_configurator()->SetLoopCount(1); 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) component_updater()->Start(); 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ComponentUpdateService::kOk, 6841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnDemandTester::OnDemand(component_updater(), 6851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) GetCrxComponentID(com2))); 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RunThreads(); 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(1, ping_checker.NumHits()) << ping_checker.GetPings(); 6903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(0, ping_checker.NumMisses()) << ping_checker.GetPings(); 691ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) component_updater()->Stop(); 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Verify that a previously registered component can get re-registered 696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// with a different version. 697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ComponentUpdaterTest, CheckReRegistration) { 698ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch std::map<std::string, std::string> map; 699ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch map.insert(std::pair<std::string, std::string>("eventtype", "\"3\"")); 700ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch map.insert(std::pair<std::string, std::string>("eventresult", "\"1\"")); 701ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch map.insert(std::pair<std::string, std::string>("previousversion", 702ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch "\"0.9\"")); 703ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch map.insert(std::pair<std::string, std::string>("nextversion", "\"1.0\"")); 704ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PingChecker ping_checker(map); 705ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch URLRequestPostInterceptor post_interceptor(&ping_checker); 706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::URLLocalHostRequestPrepackagedInterceptor interceptor; 707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 708a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) MockComponentObserver observer1; 709a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) { 710a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) InSequence seq; 711a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer1, 712a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0)) 713a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Times(1); 714a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer1, 715a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATE_FOUND, 0)) 716a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Times(1); 717a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer1, 718a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATE_READY, 0)) 719a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Times(1); 720a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer1, 7211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATED, 0)) 7221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) .Times(1); 7231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_CALL(observer1, 724a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0)) 725a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Times(1); 726a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer1, 7271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0)) 7281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) .Times(1); 7291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_CALL(observer1, 730a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0)) 731a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Times(1); 732a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 733a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 734a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) MockComponentObserver observer2; 735a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) { 736a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) InSequence seq; 737a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer2, 738a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0)) 739a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Times(1); 740a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer2, 7411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0)) 7421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) .Times(1); 7431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_CALL(observer2, 744a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0)) 745a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Times(1); 746a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer2, 7471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0)) 7481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) .Times(1); 7491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_CALL(observer2, 750a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0)) 751a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Times(1); 752a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 753a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 754eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestInstaller installer1; 755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CrxComponent com1; 756a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) com1.observer = &observer1; 757eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RegisterComponent(&com1, kTestComponent_jebg, Version("0.9"), &installer1); 758eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestInstaller installer2; 759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CrxComponent com2; 760a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) com2.observer = &observer2; 761eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RegisterComponent(&com2, kTestComponent_abag, Version("2.2"), &installer2); 762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Start with 0.9, and update to 1.0 764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const GURL expected_update_url_1( 765eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "http://localhost/upd?extra=foo" 766eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "&x=id%3Djebgalgnebhfojomionfpkfelancnnkf%26v%3D0.9%26fp%3D%26uc" 767eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "&x=id%3Dabagagagagagagagagagagagagagagag%26v%3D2.2%26fp%3D%26uc"); 768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const GURL expected_update_url_2( 770eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "http://localhost/upd?extra=foo" 771eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "&x=id%3Dabagagagagagagagagagagagagagagag%26v%3D2.2%26fp%3D%26uc" 772eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "&x=id%3Djebgalgnebhfojomionfpkfelancnnkf%26v%3D1.0%26fp%3D%26uc"); 773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 774c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) interceptor.SetResponse(expected_update_url_1, 775c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_file("updatecheck_reply_1.xml")); 776c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) interceptor.SetResponse(expected_update_url_2, 777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_file("updatecheck_reply_1.xml")); 778c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) interceptor.SetResponse(GURL(expected_crx_url), 779c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_file("jebgalgnebhfojomionfpkfelancnnkf.crx")); 780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 781c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Loop twice to issue two checks: (1) with original 0.9 version 782c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // and (2) with the updated 1.0 version. 783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_configurator()->SetLoopCount(2); 784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 785c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) component_updater()->Start(); 7864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RunThreads(); 787c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 788c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error()); 789c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, static_cast<TestInstaller*>(com1.installer)->install_count()); 790c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error()); 791c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->install_count()); 792c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(1, ping_checker.NumHits()) << ping_checker.GetPings(); 7943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(0, ping_checker.NumMisses()) << ping_checker.GetPings(); 795c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(3, interceptor.GetHitCount()); 796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 797a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) component_updater()->Stop(); 798a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Now re-register, pretending to be an even newer version (2.2) 800a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer1)); 801a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) { 802a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) InSequence seq; 803a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer1, 804a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0)) 805a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Times(1); 806a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer1, 8071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0)) 8081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) .Times(1); 8091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_CALL(observer1, 810a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0)) 811a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Times(1); 812a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 813a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 814a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer2)); 815a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) { 816a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) InSequence seq; 817a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer2, 818a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0)) 819a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Times(1); 820a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer2, 8211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0)) 8221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) .Times(1); 8231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_CALL(observer2, 824a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0)) 825a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Times(1); 826a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 827a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 828eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestInstaller installer3; 829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(ComponentUpdateService::kReplaced, 830eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RegisterComponent(&com1, 831eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch kTestComponent_jebg, 832eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Version("2.2"), 833eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch &installer3)); 834c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 835c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Check that we send out 2.2 as our version. 836c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Interceptor's hit count should go up by 1. 837c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const GURL expected_update_url_3( 838eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "http://localhost/upd?extra=foo" 839eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "&x=id%3Djebgalgnebhfojomionfpkfelancnnkf%26v%3D2.2%26fp%3D%26uc" 840eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "&x=id%3Dabagagagagagagagagagagagagagagag%26v%3D2.2%26fp%3D%26uc"); 841c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 842c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) interceptor.SetResponse(expected_update_url_3, 843c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_file("updatecheck_reply_1.xml")); 844c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 845c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Loop once just to notice the check happening with the re-register version. 846c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_configurator()->SetLoopCount(1); 847c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) component_updater()->Start(); 8484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RunThreads(); 849c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 850c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(4, interceptor.GetHitCount()); 851c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 852eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // We created a new installer, so the counts go back to 0. 853c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error()); 854c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->install_count()); 855c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error()); 856c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->install_count()); 857c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 858c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) component_updater()->Stop(); 859c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 860eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 861ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Verify that we can download and install a component and a differential 862ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// update to that component. We do three loops; the final loop should do 863ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// nothing. 864ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// We also check that exactly 5 non-ping network requests are issued: 865ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// 1- update check (response: v1 available) 866ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// 2- download crx (v1) 867ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// 3- update check (response: v2 available) 868ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// 4- download differential crx (v1 to v2) 869ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// 5- update check (response: no further update available) 870ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// There should be two pings, one for each update. The second will bear a 871ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// diffresult=1, while the first will not. 872ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochTEST_F(ComponentUpdaterTest, DifferentialUpdate) { 873ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch std::map<std::string, std::string> map; 874ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch map.insert(std::pair<std::string, std::string>("eventtype", "\"3\"")); 875ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch map.insert(std::pair<std::string, std::string>("eventresult", "\"1\"")); 876ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch map.insert(std::pair<std::string, std::string>("diffresult", "\"1\"")); 877ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PingChecker ping_checker(map); 878ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch URLRequestPostInterceptor post_interceptor(&ping_checker); 879ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch content::URLLocalHostRequestPrepackagedInterceptor interceptor; 880ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 881ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch VersionedTestInstaller installer; 882ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch CrxComponent com; 883ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch RegisterComponent(&com, kTestComponent_ihfo, Version("0.0"), &installer); 884ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 885ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const GURL expected_update_url_0( 886ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch "http://localhost/upd?extra=foo" 887ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch "&x=id%3Dihfokbkgjpifnbbojhneepfflplebdkc%26v%3D0.0%26fp%3D%26uc"); 888ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const GURL expected_update_url_1( 889ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch "http://localhost/upd?extra=foo" 890ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch "&x=id%3Dihfokbkgjpifnbbojhneepfflplebdkc%26v%3D1.0%26fp%3D1%26uc"); 891ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const GURL expected_update_url_2( 892ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch "http://localhost/upd?extra=foo" 893ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch "&x=id%3Dihfokbkgjpifnbbojhneepfflplebdkc%26v%3D2.0%26fp%3Df22%26uc"); 894ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const GURL expected_crx_url_1( 895ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch "http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"); 896ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const GURL expected_crx_url_1_diff_2( 897ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch "http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx"); 898ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 899ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch interceptor.SetResponse(expected_update_url_0, 900ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch test_file("updatecheck_diff_reply_1.xml")); 901ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch interceptor.SetResponse(expected_update_url_1, 902ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch test_file("updatecheck_diff_reply_2.xml")); 903ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch interceptor.SetResponse(expected_update_url_2, 904ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch test_file("updatecheck_diff_reply_3.xml")); 905ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch interceptor.SetResponse(expected_crx_url_1, 906ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1.crx")); 907ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch interceptor.SetResponse( 908ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch expected_crx_url_1_diff_2, 909ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx")); 910ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 911ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch test_configurator()->SetLoopCount(3); 912ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 913ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch component_updater()->Start(); 9144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RunThreads(); 915ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 916ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error()); 917ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(2, static_cast<TestInstaller*>(com.installer)->install_count()); 918ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 919ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // One ping has the diffresult=1, the other does not. 9203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(1, ping_checker.NumHits()) << ping_checker.GetPings(); 9213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(1, ping_checker.NumMisses()) << ping_checker.GetPings(); 922ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 923ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(5, interceptor.GetHitCount()); 924ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 925ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch component_updater()->Stop(); 926ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 927ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 928eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Verify that component installation falls back to downloading and installing 929eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// a full update if the differential update fails (in this case, because the 930eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// installer does not know about the existing files). We do two loops; the final 931eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// loop should do nothing. 932ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// We also check that exactly 4 non-ping network requests are issued: 933eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 1- update check (loop 1) 934eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 2- download differential crx 935eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 3- download full crx 936eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 4- update check (loop 2 - no update available) 937ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// There should be one ping for the first attempted update. 938a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 939a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(ComponentUpdaterTest, DifferentialUpdateFails) { 940ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch std::map<std::string, std::string> map; 941ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch map.insert(std::pair<std::string, std::string>("eventtype", "\"3\"")); 942ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch map.insert(std::pair<std::string, std::string>("eventresult", "\"1\"")); 943ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch map.insert(std::pair<std::string, std::string>("diffresult", "\"0\"")); 944ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch map.insert(std::pair<std::string, std::string>("differrorcode", "\"16\"")); 945ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PingChecker ping_checker(map); 946ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch URLRequestPostInterceptor post_interceptor(&ping_checker); 947eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch content::URLLocalHostRequestPrepackagedInterceptor interceptor; 948eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 949eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestInstaller installer; 950eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CrxComponent com; 951eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RegisterComponent(&com, kTestComponent_ihfo, Version("1.0"), &installer); 952eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 953eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const GURL expected_update_url_1( 954eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "http://localhost/upd?extra=foo" 955eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "&x=id%3Dihfokbkgjpifnbbojhneepfflplebdkc%26v%3D1.0%26fp%3D%26uc"); 956eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const GURL expected_update_url_2( 957eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "http://localhost/upd?extra=foo" 958eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "&x=id%3Dihfokbkgjpifnbbojhneepfflplebdkc%26v%3D2.0%26fp%3Df22%26uc"); 959eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const GURL expected_crx_url_1( 960eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"); 961eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const GURL expected_crx_url_1_diff_2( 962eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx"); 963eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const GURL expected_crx_url_2( 964eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_2.crx"); 965eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 966eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch interceptor.SetResponse(expected_update_url_1, 967eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch test_file("updatecheck_diff_reply_2.xml")); 968eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch interceptor.SetResponse(expected_update_url_2, 969eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch test_file("updatecheck_diff_reply_3.xml")); 970eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch interceptor.SetResponse(expected_crx_url_1, 971eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1.crx")); 972eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch interceptor.SetResponse( 973eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch expected_crx_url_1_diff_2, 974eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx")); 975eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch interceptor.SetResponse(expected_crx_url_2, 976eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch test_file("ihfokbkgjpifnbbojhneepfflplebdkc_2.crx")); 977eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 978eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch test_configurator()->SetLoopCount(2); 979eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 980eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch component_updater()->Start(); 9814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RunThreads(); 982eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 983eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // A failed differential update does not count as a failed install. 984eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error()); 985eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(1, static_cast<TestInstaller*>(com.installer)->install_count()); 986eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 9873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(1, ping_checker.NumHits()) << ping_checker.GetPings(); 9883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(0, ping_checker.NumMisses()) << ping_checker.GetPings(); 989eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(4, interceptor.GetHitCount()); 990eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 991eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch component_updater()->Stop(); 992eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 993eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 994ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Verify that a failed installation causes an install failure ping. 995ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochTEST_F(ComponentUpdaterTest, CheckFailedInstallPing) { 996ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch std::map<std::string, std::string> map; 997ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch map.insert(std::pair<std::string, std::string>("eventtype", "\"3\"")); 998ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch map.insert(std::pair<std::string, std::string>("eventresult", "\"0\"")); 999ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch map.insert(std::pair<std::string, std::string>("errorcode", "\"9\"")); 1000ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch map.insert(std::pair<std::string, std::string>("previousversion", 1001ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch "\"0.9\"")); 1002ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch map.insert(std::pair<std::string, std::string>("nextversion", "\"1.0\"")); 1003ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PingChecker ping_checker(map); 1004ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch URLRequestPostInterceptor post_interceptor(&ping_checker); 1005ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch content::URLLocalHostRequestPrepackagedInterceptor interceptor; 1006ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1007ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // This test installer reports installation failure. 1008ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch class : public TestInstaller { 1009ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual bool Install(const base::DictionaryValue& manifest, 1010ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const base::FilePath& unpack_path) OVERRIDE { 1011ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ++install_count_; 1012ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch base::DeleteFile(unpack_path, true); 1013ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return false; 1014ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 1015ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } installer; 1016ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1017ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch CrxComponent com; 1018ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch RegisterComponent(&com, kTestComponent_jebg, Version("0.9"), &installer); 1019ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1020ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Start with 0.9, and attempt update to 1.0 1021ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const GURL expected_update_url_1( 1022ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch "http://localhost/upd?extra=foo" 1023ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch "&x=id%3Djebgalgnebhfojomionfpkfelancnnkf%26v%3D0.9%26fp%3D%26uc"); 1024ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1025ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch interceptor.SetResponse(expected_update_url_1, 1026ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch test_file("updatecheck_reply_1.xml")); 1027ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch interceptor.SetResponse(GURL(expected_crx_url), 1028ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch test_file("jebgalgnebhfojomionfpkfelancnnkf.crx")); 1029ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1030ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Loop twice to issue two checks: (1) with original 0.9 version 1031ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // and (2), which should retry with 0.9. 1032ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch test_configurator()->SetLoopCount(2); 1033ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch component_updater()->Start(); 10344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RunThreads(); 1035ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1036ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Loop once more, but expect no ping because a noupdate response is issued. 1037ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // This is necessary to clear out the fire-and-forget ping from the previous 1038ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // iteration. 1039ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch interceptor.SetResponse(expected_update_url_1, 1040ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch test_file("updatecheck_reply_noupdate.xml")); 1041ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch test_configurator()->SetLoopCount(1); 1042ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch component_updater()->Start(); 10434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RunThreads(); 1044ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1045ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error()); 1046ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(2, static_cast<TestInstaller*>(com.installer)->install_count()); 1047ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 10483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(2, ping_checker.NumHits()) << ping_checker.GetPings(); 10493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(0, ping_checker.NumMisses()) << ping_checker.GetPings(); 1050ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(5, interceptor.GetHitCount()); 1051ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1052ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch component_updater()->Stop(); 1053ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 1054ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1055eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Verify that we successfully propagate a patcher error. 1056eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// ihfokbkgjpifnbbojhneepfflplebdkc_1to2_bad.crx contains an incorrect 1057eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// patching instruction that should fail. 1058eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(ComponentUpdaterTest, DifferentialUpdateFailErrorcode) { 1059ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch std::map<std::string, std::string> map; 1060ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch map.insert(std::pair<std::string, std::string>("eventtype", "\"3\"")); 1061ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch map.insert(std::pair<std::string, std::string>("eventresult", "\"1\"")); 1062ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch map.insert(std::pair<std::string, std::string>("diffresult", "\"0\"")); 1063ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch map.insert(std::pair<std::string, std::string>("differrorcode", "\"14\"")); 1064ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch map.insert(std::pair<std::string, std::string>("diffextracode1", "\"305\"")); 1065ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PingChecker ping_checker(map); 1066ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch URLRequestPostInterceptor post_interceptor(&ping_checker); 1067eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch content::URLLocalHostRequestPrepackagedInterceptor interceptor; 1068eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1069eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch VersionedTestInstaller installer; 1070eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CrxComponent com; 1071eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RegisterComponent(&com, kTestComponent_ihfo, Version("0.0"), &installer); 1072eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1073eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const GURL expected_update_url_0( 1074eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "http://localhost/upd?extra=foo" 1075eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "&x=id%3Dihfokbkgjpifnbbojhneepfflplebdkc%26v%3D0.0%26fp%3D%26uc"); 1076eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const GURL expected_update_url_1( 1077eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "http://localhost/upd?extra=foo" 1078eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "&x=id%3Dihfokbkgjpifnbbojhneepfflplebdkc%26v%3D1.0%26fp%3D1%26uc"); 1079eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const GURL expected_update_url_2( 1080eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "http://localhost/upd?extra=foo" 1081eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "&x=id%3Dihfokbkgjpifnbbojhneepfflplebdkc%26v%3D2.0%26fp%3Df22%26uc"); 1082eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const GURL expected_crx_url_1( 1083eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"); 1084eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const GURL expected_crx_url_1_diff_2( 1085eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx"); 1086eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const GURL expected_crx_url_2( 1087eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_2.crx"); 1088eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1089eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch interceptor.SetResponse(expected_update_url_0, 1090eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch test_file("updatecheck_diff_reply_1.xml")); 1091eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch interceptor.SetResponse(expected_update_url_1, 1092eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch test_file("updatecheck_diff_reply_2.xml")); 1093eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch interceptor.SetResponse(expected_update_url_2, 1094eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch test_file("updatecheck_diff_reply_3.xml")); 1095eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch interceptor.SetResponse(expected_crx_url_1, 1096eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1.crx")); 1097eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch interceptor.SetResponse( 1098eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch expected_crx_url_1_diff_2, 1099eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1to2_bad.crx")); 1100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch interceptor.SetResponse(expected_crx_url_2, 1101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch test_file("ihfokbkgjpifnbbojhneepfflplebdkc_2.crx")); 1102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 11034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) test_configurator()->SetLoopCount(2); 1104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch component_updater()->Start(); 11064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RunThreads(); 11074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) component_updater()->Stop(); 11084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // There may still be pings in the queue. 11094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RunThreadsUntilIdle(); 1110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error()); 1112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(2, static_cast<TestInstaller*>(com.installer)->install_count()); 1113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 11143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(1, ping_checker.NumHits()) << ping_checker.GetPings(); 11153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(1, ping_checker.NumMisses()) << ping_checker.GetPings(); 11164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(5, interceptor.GetHitCount()); 1117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1118