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