component_updater_service_unittest.cc revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
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) 503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/browser/component_updater/test/component_updater_service_unittest.h" 603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <vector> 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/scoped_ptr.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/run_loop.h" 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/string_number_conversions.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/string_util.h" 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/stringprintf.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/component_updater/component_updater_resource_throttle.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "components/component_updater/component_updater_utils.h" 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/component_updater/test/test_configurator.h" 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/component_updater/test/test_installer.h" 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/component_updater/test/url_request_post_interceptor.h" 234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/browser/browser_thread.h" 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/resource_controller.h" 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/resource_request_info.h" 26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/resource_throttle.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "libxml/globals.h" 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/base/upload_bytes_element_reader.h" 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/url_request/test_url_request_interceptor.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_fetcher.h" 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/url_request/url_request.h" 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "net/url_request/url_request_test_util.h" 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using ::testing::_; 38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)using ::testing::AnyNumber; 39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using ::testing::InSequence; 40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using ::testing::Mock; 41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace component_updater { 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuMockServiceObserver::MockServiceObserver() { 45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 46a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuMockServiceObserver::~MockServiceObserver() { 48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 49a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 50ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochComponentUpdaterTest::ComponentUpdaterTest() 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : post_interceptor_(NULL), 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci test_config_(NULL), 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP) { 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // The component updater instance under test. 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci test_config_ = new TestConfigurator( 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BrowserThread::GetBlockingPool() 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ->GetSequencedTaskRunnerWithShutdownBehavior( 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BrowserThread::GetBlockingPool()->GetSequenceToken(), 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::SequencedWorkerPool::SKIP_ON_SHUTDOWN), 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO)); 61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch component_updater_.reset(ComponentUpdateServiceFactory(test_config_)); 62ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch net::URLFetcher::SetEnableInterceptionForTests(true); 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochComponentUpdaterTest::~ComponentUpdaterTest() { 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch net::URLFetcher::SetEnableInterceptionForTests(false); 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ComponentUpdaterTest::SetUp() { 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci get_interceptor_.reset(new GetInterceptor( 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO), 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BrowserThread::GetBlockingPool()->GetTaskRunnerWithShutdownBehavior( 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::SequencedWorkerPool::SKIP_ON_SHUTDOWN))); 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci interceptor_factory_.reset(new InterceptorFactory( 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO))); 77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) post_interceptor_ = interceptor_factory_->CreateInterceptor(); 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(post_interceptor_); 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ComponentUpdaterTest::TearDown() { 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) interceptor_factory_.reset(); 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) get_interceptor_.reset(); 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch xmlCleanupGlobals(); 85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochComponentUpdateService* ComponentUpdaterTest::component_updater() { 88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return component_updater_.get(); 89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 91010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Makes the full path to a component updater test file. 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst base::FilePath ComponentUpdaterTest::test_file(const char* file) { 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::FilePath path; 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PathService::Get(base::DIR_SOURCE_ROOT, &path); 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return path.AppendASCII("components").AppendASCII("test").AppendASCII("data") 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .AppendASCII("component_updater").AppendASCII(file); 97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTestConfigurator* ComponentUpdaterTest::test_configurator() { 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return test_config_; 101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochComponentUpdateService::Status ComponentUpdaterTest::RegisterComponent( 104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CrxComponent* com, 105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestComponents component, 106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const Version& version, 107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestInstaller* installer) { 108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (component == kTestComponent_abag) { 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch com->name = "test_abag"; 110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch com->pk_hash.assign(abag_hash, abag_hash + arraysize(abag_hash)); 111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else if (component == kTestComponent_jebg) { 112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch com->name = "test_jebg"; 113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch com->pk_hash.assign(jebg_hash, jebg_hash + arraysize(jebg_hash)); 114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else { 115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch com->name = "test_ihfo"; 116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch com->pk_hash.assign(ihfo_hash, ihfo_hash + arraysize(ihfo_hash)); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch com->version = version; 119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch com->installer = installer; 120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return component_updater_->RegisterComponent(*com); 121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void ComponentUpdaterTest::RunThreads() { 1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::RunLoop runloop; 1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) test_configurator()->SetQuitClosure(runloop.QuitClosure()); 1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) runloop.Run(); 127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Since some tests need to drain currently enqueued tasks such as network 129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // intercepts on the IO thread, run the threads until they are 130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // idle. The component updater service won't loop again until the loop count 131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // is set and the service is started. 132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RunThreadsUntilIdle(); 1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void ComponentUpdaterTest::RunThreadsUntilIdle() { 1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 1374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)ComponentUpdateService::Status OnDemandTester::OnDemand( 140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ComponentUpdateService* cus, 141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::string& component_id) { 142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return cus->GetOnDemandUpdater().OnDemandUpdate(component_id); 1431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 1441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that our test fixture work and the component updater can 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// be created and destroyed with no side effects. 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, VerifyFixture) { 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(component_updater() != NULL); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that the component updater can be caught in a quick 152ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// start-shutdown situation. Failure of this test will be a crash. 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, StartStop) { 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater()->Start(); 1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RunThreadsUntilIdle(); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater()->Stop(); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that when the server has no updates, we go back to sleep and 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the COMPONENT_UPDATER_STARTED and COMPONENT_UPDATER_SLEEPING notifications 161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// are generated. No pings are sent. 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, CheckCrxSleep) { 1635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu MockServiceObserver observer; 164a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_CALL(observer, 1665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, "")) 167010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_CALL(observer, 1695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, "")) 170010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(2); 171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_CALL(observer, 1725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED, 1735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "abagagagagagagagagagagagagagagag")) 174010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(2); 175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 176010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(post_interceptor_->ExpectRequest( 177010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml"))); 178010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(post_interceptor_->ExpectRequest( 179010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml"))); 180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestInstaller installer; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrxComponent com; 1835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu component_updater()->AddObserver(&observer); 184010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ( 185010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ComponentUpdateService::kOk, 186010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RegisterComponent(&com, kTestComponent_abag, Version("1.1"), &installer)); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We loop twice, but there are no updates so we expect two sleep messages. 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_configurator()->SetLoopCount(2); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater()->Start(); 1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RunThreads(); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error()); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count()); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Expect to see the two update check requests and no other requests, 197f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // including pings. 198f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(2, post_interceptor_->GetHitCount()) 199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(2, post_interceptor_->GetCount()) 201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE( 203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) string::npos, 204010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) post_interceptor_->GetRequests()[0].find( 205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<app appid=\"abagagagagagagagagagagagagagagag\" version=\"1.1\">" 206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<updatecheck /></app>")) 207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 208010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE( 209010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) string::npos, 210010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) post_interceptor_->GetRequests()[1].find( 211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<app appid=\"abagagagagagagagagagagagagagagag\" version=\"1.1\">" 212010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<updatecheck /></app>")) 213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater()->Stop(); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Loop twice again but this case we simulate a server error by returning 218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // an empty file. Expect the behavior of the service to be the same as before. 219010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(observer, OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, "")) 220010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 221a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(observer, 2225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, "")) 223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(2); 2241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_CALL(observer, 2255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED, 2265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "abagagagagagagagagagagagagagagag")) 227010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(2); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 229f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) post_interceptor_->Reset(); 230010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(post_interceptor_->ExpectRequest( 231010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new PartialMatch("updatecheck"), test_file("updatecheck_reply_empty"))); 232010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(post_interceptor_->ExpectRequest( 233010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new PartialMatch("updatecheck"), test_file("updatecheck_reply_empty"))); 234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) test_configurator()->SetLoopCount(2); 236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) component_updater()->Start(); 237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RunThreads(); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error()); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count()); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 242f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(2, post_interceptor_->GetHitCount()) 243f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(2, post_interceptor_->GetCount()) 245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 246010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE( 247010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) string::npos, 248010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) post_interceptor_->GetRequests()[0].find( 249010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<app appid=\"abagagagagagagagagagagagagagagag\" version=\"1.1\">" 250010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<updatecheck /></app>")) 251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 252010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE( 253010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) string::npos, 254010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) post_interceptor_->GetRequests()[1].find( 255010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<app appid=\"abagagagagagagagagagagagagagagag\" version=\"1.1\">" 256010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<updatecheck /></app>")) 257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater()->Stop(); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we can check for updates and install one component. Besides 263ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// the notifications above COMPONENT_UPDATE_FOUND and COMPONENT_UPDATE_READY 264ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// should have been fired. We do two loops so the second time around there 265ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// should be nothing left to do. 266f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// We also check that the following network requests are issued: 267f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// 1- update check 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2- download crx 269f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// 3- ping 270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// 4- second update check. 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, InstallCrx) { 2725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu MockServiceObserver observer; 273a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) { 274a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) InSequence seq; 2755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 2765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, "")) 277010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 2785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 2795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_UPDATE_FOUND, 2805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "jebgalgnebhfojomionfpkfelancnnkf")) 281010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 2825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 2835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED, 2845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "abagagagagagagagagagagagagagagag")) 285010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 286010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(observer, 287010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) OnEvent(ServiceObserver::COMPONENT_UPDATE_DOWNLOADING, 288010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "jebgalgnebhfojomionfpkfelancnnkf")) 289010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(AnyNumber()); 2905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 2915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_UPDATE_READY, 2925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "jebgalgnebhfojomionfpkfelancnnkf")) 293010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 2945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 2955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_UPDATED, 2965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "jebgalgnebhfojomionfpkfelancnnkf")) 297010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 2985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 2995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, "")) 300010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 3015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 3025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED, 3035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "jebgalgnebhfojomionfpkfelancnnkf")) 304010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 3055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 3065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED, 3075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "abagagagagagagagagagagagagagagag")) 308010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 3095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 3105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, "")) 311010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 312a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 313a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 314010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(post_interceptor_->ExpectRequest( 315010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml"))); 316f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event"))); 317010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(post_interceptor_->ExpectRequest( 318010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml"))); 319f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 320f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) get_interceptor_->SetResponse( 321f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GURL(expected_crx_url), 322f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) test_file("jebgalgnebhfojomionfpkfelancnnkf.crx")); 323f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 3245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu component_updater()->AddObserver(&observer); 3255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 326eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestInstaller installer1; 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrxComponent com1; 328eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RegisterComponent(&com1, kTestComponent_jebg, Version("0.9"), &installer1); 329eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestInstaller installer2; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrxComponent com2; 331eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RegisterComponent(&com2, kTestComponent_abag, Version("2.2"), &installer2); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_configurator()->SetLoopCount(2); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater()->Start(); 3354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RunThreads(); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error()); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, static_cast<TestInstaller*>(com1.installer)->install_count()); 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error()); 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->install_count()); 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 342f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Expect three request in total: two update checks and one ping. 343f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(3, post_interceptor_->GetHitCount()) 344f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 345f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(3, post_interceptor_->GetCount()) 346f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 347f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 348f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Expect one component download. 349f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(1, get_interceptor_->GetHitCount()); 350f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 351010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE( 352010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) string::npos, 353010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) post_interceptor_->GetRequests()[0].find( 354010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"0.9\">" 355010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<updatecheck /></app>")) 356f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 357010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE( 358010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) string::npos, 359010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) post_interceptor_->GetRequests()[0].find( 360010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<app appid=\"abagagagagagagagagagagagagagagag\" version=\"2.2\">" 361010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<updatecheck /></app>")) 362f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 363f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 364010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE( 365010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) string::npos, 366010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) post_interceptor_->GetRequests()[1].find( 367010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" " 368010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "version=\"0.9\" nextversion=\"1.0\">" 369010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<event eventtype=\"3\" eventresult=\"1\"/>")) 370f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 371f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 372010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE( 373010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) string::npos, 374010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) post_interceptor_->GetRequests()[2].find( 375010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"1.0\">" 376010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<updatecheck /></app>")); 377010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE( 378010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) string::npos, 379010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) post_interceptor_->GetRequests()[2].find( 380010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<app appid=\"abagagagagagagagagagagagagagagag\" version=\"2.2\">" 381010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<updatecheck /></app>")) 382f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Test the protocol version is correct and the extra request attributes 3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // are included in the request. 386010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE( 387010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) string::npos, 388010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) post_interceptor_->GetRequests()[0].find( 389010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "request protocol=\"3.0\" extra=\"foo\"")) 3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Tokenize the request string to look for specific attributes, which 3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // are important for backward compatibility with the version v2 of the update 3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // protocol. In this case, inspect the <request>, which is the first element 3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // after the xml declaration of the update request body. 3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Expect to find the |os|, |arch|, |prodchannel|, and |prodversion| 3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // attributes: 3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // <?xml version="1.0" encoding="UTF-8"?> 3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // <request... os=... arch=... prodchannel=... prodversion=...> 4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // ... 4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // </request> 4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string update_request(post_interceptor_->GetRequests()[0]); 4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<base::StringPiece> elements; 4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Tokenize(update_request, "<>", &elements); 4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_NE(string::npos, elements[1].find(" os=")); 4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_NE(string::npos, elements[1].find(" arch=")); 4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_NE(string::npos, elements[1].find(" prodchannel=")); 4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_NE(string::npos, elements[1].find(" prodversion=")); 4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Look for additional attributes of the request, such as |version|, 4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // |requestid|, |lang|, and |nacl_arch|. 4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_NE(string::npos, elements[1].find(" version=")); 4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_NE(string::npos, elements[1].find(" requestid=")); 4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_NE(string::npos, elements[1].find(" lang=")); 4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_NE(string::npos, elements[1].find(" nacl_arch=")); 4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) component_updater()->Stop(); 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test checks that the "prodversionmin" value is handled correctly. In 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// particular there should not be an install because the minimum product 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// version is much higher than of chrome. 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, ProdVersionCheck) { 424010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(post_interceptor_->ExpectRequest( 425010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new PartialMatch("updatecheck"), test_file("updatecheck_reply_2.xml"))); 426f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 427f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) get_interceptor_->SetResponse( 428f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GURL(expected_crx_url), 429f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) test_file("jebgalgnebhfojomionfpkfelancnnkf.crx")); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 431eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestInstaller installer; 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrxComponent com; 433eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RegisterComponent(&com, kTestComponent_jebg, Version("0.9"), &installer); 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_configurator()->SetLoopCount(1); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater()->Start(); 4374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RunThreads(); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 439f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Expect one update check and no ping. 440f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(1, post_interceptor_->GetHitCount()) 441f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 442f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(1, post_interceptor_->GetCount()) 443f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 444f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 445f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Expect no download to occur. 446f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0, get_interceptor_->GetHitCount()); 447f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error()); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count()); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater()->Stop(); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 454f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Test that a update check due to an on demand call can cause installs. 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Here is the timeline: 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - First loop: we return a reply that indicates no update, so 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// nothing happens. 458f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// - We make an on demand call. 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - This triggers a second loop, which has a reply that triggers an install. 4606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#if defined(OS_LINUX) 4616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// http://crbug.com/396488 4626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define MAYBE_OnDemandUpdate DISABLED_OnDemandUpdate 4636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#else 4646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define MAYBE_OnDemandUpdate OnDemandUpdate 4656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif 4666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(ComponentUpdaterTest, MAYBE_OnDemandUpdate) { 4675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu MockServiceObserver observer; 468a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) { 469a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) InSequence seq; 4705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 4715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, "")) 472010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 4735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 4745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED, 4755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "abagagagagagagagagagagagagagagag")) 476010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 4775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 4785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED, 4795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "jebgalgnebhfojomionfpkfelancnnkf")) 480010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 4815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 4825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, "")) 483010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 4845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 4855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, "")) 486010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 4875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 4885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_UPDATE_FOUND, 4895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "jebgalgnebhfojomionfpkfelancnnkf")) 490010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 4915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 4925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED, 4935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "abagagagagagagagagagagagagagagag")) 494010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 495010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(observer, 496010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) OnEvent(ServiceObserver::COMPONENT_UPDATE_DOWNLOADING, 497010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "jebgalgnebhfojomionfpkfelancnnkf")) 498010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(AnyNumber()); 4995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 5005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_UPDATE_READY, 5015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "jebgalgnebhfojomionfpkfelancnnkf")) 502010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 5035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 5045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_UPDATED, 5055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "jebgalgnebhfojomionfpkfelancnnkf")) 506010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 5075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 5085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, "")) 509010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 510a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 511a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 512010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(post_interceptor_->ExpectRequest( 513010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new PartialMatch("updatecheck"), test_file("updatecheck_reply_empty"))); 514f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 515f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) get_interceptor_->SetResponse( 516f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GURL(expected_crx_url), 517f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) test_file("jebgalgnebhfojomionfpkfelancnnkf.crx")); 518f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu component_updater()->AddObserver(&observer); 5205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 521eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestInstaller installer1; 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CrxComponent com1; 523eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RegisterComponent(&com1, kTestComponent_abag, Version("2.2"), &installer1); 524eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestInstaller installer2; 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CrxComponent com2; 526eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RegisterComponent(&com2, kTestComponent_jebg, Version("0.9"), &installer2); 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // No update normally. 5291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) test_configurator()->SetLoopCount(1); 5301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) component_updater()->Start(); 5311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) RunThreads(); 5321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) component_updater()->Stop(); 5331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 534f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(1, post_interceptor_->GetHitCount()) 535f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 536f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(1, post_interceptor_->GetCount()) 537f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 538f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 539f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0, get_interceptor_->GetHitCount()); 540f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Update after an on-demand check is issued. 542f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) post_interceptor_->Reset(); 543010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(post_interceptor_->ExpectRequest( 544010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml"))); 545f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event"))); 546f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 547010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ( 548010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ComponentUpdateService::kOk, 549010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) OnDemandTester::OnDemand(component_updater(), GetCrxComponentID(com2))); 5501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) test_configurator()->SetLoopCount(1); 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) component_updater()->Start(); 5524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RunThreads(); 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error()); 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->install_count()); 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error()); 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, static_cast<TestInstaller*>(com2.installer)->install_count()); 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 559f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(2, post_interceptor_->GetHitCount()) 560f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 561f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(2, post_interceptor_->GetCount()) 562f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 563f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 564f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(1, get_interceptor_->GetHitCount()); 565f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 566f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Expect the update check to contain an "ondemand" request for the 567f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // second component (com2) and a normal request for the other component. 568010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE( 569010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) string::npos, 570010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) post_interceptor_->GetRequests()[0].find( 571010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<app appid=\"abagagagagagagagagagagagagagagag\" " 572010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "version=\"2.2\"><updatecheck /></app>")) 573f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 574010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE( 575010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) string::npos, 576010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) post_interceptor_->GetRequests()[0].find( 577010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" " 578010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "version=\"0.9\" installsource=\"ondemand\"><updatecheck /></app>")) 579f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 580010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE( 581010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) string::npos, 582010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) post_interceptor_->GetRequests()[1].find( 583010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" " 584010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "version=\"0.9\" nextversion=\"1.0\">" 585010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<event eventtype=\"3\" eventresult=\"1\"/>")) 586f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 58846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Also check what happens if previous check too soon. It works, since this 58946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // direct OnDemand call does not implement a cooldown. 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_configurator()->SetOnDemandTime(60 * 60); 591010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ( 59246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ComponentUpdateService::kOk, 593010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) OnDemandTester::OnDemand(component_updater(), GetCrxComponentID(com2))); 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Okay, now reset to 0 for the other tests. 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_configurator()->SetOnDemandTime(0); 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) component_updater()->Stop(); 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Test a few error cases. NOTE: We don't have callbacks for 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // when the updates failed yet. 6005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer)); 601a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) { 602a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) InSequence seq; 6035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 6045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, "")) 605010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 6065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 6075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED, 6085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "abagagagagagagagagagagagagagagag")) 609010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 6105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 6115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED, 6125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "jebgalgnebhfojomionfpkfelancnnkf")) 613010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 6145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 6155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, "")) 616010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 617a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 618a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No update: error from no server response 620f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) post_interceptor_->Reset(); 621010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(post_interceptor_->ExpectRequest( 622010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new PartialMatch("updatecheck"), test_file("updatecheck_reply_empty"))); 623f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_configurator()->SetLoopCount(1); 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) component_updater()->Start(); 626010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ( 627010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ComponentUpdateService::kOk, 628010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) OnDemandTester::OnDemand(component_updater(), GetCrxComponentID(com2))); 6294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RunThreads(); 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) component_updater()->Stop(); 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(1, post_interceptor_->GetHitCount()) 633f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 634f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(1, post_interceptor_->GetCount()) 635f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 636f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No update: already updated to 1.0 so nothing new 6385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer)); 639a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) { 640a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) InSequence seq; 6415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 6425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, "")) 643010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 6445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 6455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED, 6465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "jebgalgnebhfojomionfpkfelancnnkf")) 647010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 6485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 6495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED, 6505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "abagagagagagagagagagagagagagagag")) 651010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 6525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 6535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, "")) 654010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 655a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 656a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 657f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) post_interceptor_->Reset(); 658010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(post_interceptor_->ExpectRequest( 659010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml"))); 660f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_configurator()->SetLoopCount(1); 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) component_updater()->Start(); 663010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ( 664010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ComponentUpdateService::kOk, 665010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) OnDemandTester::OnDemand(component_updater(), GetCrxComponentID(com2))); 6664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RunThreads(); 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 668f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(1, post_interceptor_->GetHitCount()) 669f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 670f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(1, post_interceptor_->GetCount()) 671f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 672ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) component_updater()->Stop(); 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Verify that a previously registered component can get re-registered 677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// with a different version. 678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ComponentUpdaterTest, CheckReRegistration) { 6795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu MockServiceObserver observer; 680a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) { 681a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) InSequence seq; 6825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 6835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, "")) 684010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 6855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 6865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_UPDATE_FOUND, 6875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "jebgalgnebhfojomionfpkfelancnnkf")) 688010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 6895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 6905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED, 6915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "abagagagagagagagagagagagagagagag")) 692010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 693010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(observer, 694010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) OnEvent(ServiceObserver::COMPONENT_UPDATE_DOWNLOADING, 695010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "jebgalgnebhfojomionfpkfelancnnkf")) 696010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(AnyNumber()); 6975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 6985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_UPDATE_READY, 6995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "jebgalgnebhfojomionfpkfelancnnkf")) 700010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 7015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 7025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_UPDATED, 7035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "jebgalgnebhfojomionfpkfelancnnkf")) 704010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 7055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 7065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, "")) 707010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 7085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 7095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED, 7105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "jebgalgnebhfojomionfpkfelancnnkf")) 711010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 7125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 7135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED, 7145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "abagagagagagagagagagagagagagagag")) 715010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 7165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 7175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, "")) 718010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 719a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 720a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 721010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(post_interceptor_->ExpectRequest( 722010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml"))); 723f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event"))); 724010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(post_interceptor_->ExpectRequest( 725010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml"))); 726f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 727f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) get_interceptor_->SetResponse( 728f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GURL(expected_crx_url), 729f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) test_file("jebgalgnebhfojomionfpkfelancnnkf.crx")); 730f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 7315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu component_updater()->AddObserver(&observer); 7325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 733eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestInstaller installer1; 734c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CrxComponent com1; 735eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RegisterComponent(&com1, kTestComponent_jebg, Version("0.9"), &installer1); 736eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestInstaller installer2; 737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CrxComponent com2; 738eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RegisterComponent(&com2, kTestComponent_abag, Version("2.2"), &installer2); 739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 740f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Loop twice to issue two checks: (1) with original 0.9 version, update to 741f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // 1.0, and do the second check (2) with the updated 1.0 version. 742c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_configurator()->SetLoopCount(2); 743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) component_updater()->Start(); 7444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RunThreads(); 745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error()); 747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, static_cast<TestInstaller*>(com1.installer)->install_count()); 748c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error()); 749c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->install_count()); 750c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 751f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(3, post_interceptor_->GetHitCount()) 752010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 753f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(1, get_interceptor_->GetHitCount()); 754f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 755010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE( 756010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) string::npos, 757010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) post_interceptor_->GetRequests()[0].find( 758010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"0.9\">" 759010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<updatecheck /></app>")) 760f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 761010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE( 762010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) string::npos, 763010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) post_interceptor_->GetRequests()[1].find( 764010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" " 765010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "version=\"0.9\" nextversion=\"1.0\">" 766010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<event eventtype=\"3\" eventresult=\"1\"/>")) 767f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 768010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE( 769010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) string::npos, 770010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) post_interceptor_->GetRequests()[2].find( 771010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"1.0\">" 772010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<updatecheck /></app>")) 773f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 774c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 775a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) component_updater()->Stop(); 776a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Now re-register, pretending to be an even newer version (2.2) 7785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer)); 779a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) { 780a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) InSequence seq; 7815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 7825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, "")) 783010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 7845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 7855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED, 7865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "jebgalgnebhfojomionfpkfelancnnkf")) 787010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 7885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 7895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED, 7905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "abagagagagagagagagagagagagagagag")) 791010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 7925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 7935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, "")) 794010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 795a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 796a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 797f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) post_interceptor_->Reset(); 798010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(post_interceptor_->ExpectRequest( 799010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml"))); 800f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 801eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestInstaller installer3; 802c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(ComponentUpdateService::kReplaced, 803010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RegisterComponent( 804010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) &com1, kTestComponent_jebg, Version("2.2"), &installer3)); 805c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 806c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Loop once just to notice the check happening with the re-register version. 807c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_configurator()->SetLoopCount(1); 808c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) component_updater()->Start(); 8094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RunThreads(); 810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 811eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // We created a new installer, so the counts go back to 0. 812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error()); 813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->install_count()); 814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error()); 815c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->install_count()); 816c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 817f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // One update check and no additional pings are expected. 818f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(1, post_interceptor_->GetHitCount()) 819010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 820f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(1, post_interceptor_->GetCount()) 821010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 822f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 823010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE( 824010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) string::npos, 825010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) post_interceptor_->GetRequests()[0].find( 826010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"2.2\">" 827010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<updatecheck /></app>")); 828f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) component_updater()->Stop(); 830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 831eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 832ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Verify that we can download and install a component and a differential 833ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// update to that component. We do three loops; the final loop should do 834ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// nothing. 835ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// We also check that exactly 5 non-ping network requests are issued: 836ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// 1- update check (response: v1 available) 837ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// 2- download crx (v1) 838ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// 3- update check (response: v2 available) 839ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// 4- download differential crx (v1 to v2) 840ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// 5- update check (response: no further update available) 841ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// There should be two pings, one for each update. The second will bear a 842ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// diffresult=1, while the first will not. 843ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochTEST_F(ComponentUpdaterTest, DifferentialUpdate) { 844010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(post_interceptor_->ExpectRequest( 845010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new PartialMatch("updatecheck"), 846010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) test_file("updatecheck_diff_reply_1.xml"))); 847f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event"))); 848010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(post_interceptor_->ExpectRequest( 849010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new PartialMatch("updatecheck"), 850010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) test_file("updatecheck_diff_reply_2.xml"))); 851f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event"))); 852010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(post_interceptor_->ExpectRequest( 853010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new PartialMatch("updatecheck"), 854010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) test_file("updatecheck_diff_reply_3.xml"))); 855f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 856f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) get_interceptor_->SetResponse( 857f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GURL("http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"), 858f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1.crx")); 859f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) get_interceptor_->SetResponse( 860f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GURL("http://localhost/download/" 861f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx"), 862f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx")); 863ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 864ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch VersionedTestInstaller installer; 865ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch CrxComponent com; 866ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch RegisterComponent(&com, kTestComponent_ihfo, Version("0.0"), &installer); 867ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 868ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch test_configurator()->SetLoopCount(3); 869ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch component_updater()->Start(); 8704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RunThreads(); 871ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 872ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error()); 873ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(2, static_cast<TestInstaller*>(com.installer)->install_count()); 874ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 875f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(5, post_interceptor_->GetHitCount()) 876f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 877f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(5, post_interceptor_->GetCount()) 878f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 879f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(2, get_interceptor_->GetHitCount()); 880f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 881010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE( 882010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) string::npos, 883010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) post_interceptor_->GetRequests()[0].find( 884010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"0.0\">" 885010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<updatecheck /></app>")) 886f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 887010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE( 888010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) string::npos, 889010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) post_interceptor_->GetRequests()[1].find( 890010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" " 891010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "version=\"0.0\" nextversion=\"1.0\">" 892010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<event eventtype=\"3\" eventresult=\"1\" nextfp=\"1\"/>")) 893f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 894010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE( 895010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) string::npos, 896010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) post_interceptor_->GetRequests()[2].find( 897010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"1.0\">" 898010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<updatecheck /><packages><package fp=\"1\"/></packages></app>")) 899f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 900010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE( 901010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) string::npos, 902010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) post_interceptor_->GetRequests()[3].find( 903010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" " 904010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "version=\"1.0\" nextversion=\"2.0\">" 905010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<event eventtype=\"3\" eventresult=\"1\" diffresult=\"1\" " 906010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "previousfp=\"1\" nextfp=\"22\"/>")) 907f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 908010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE( 909010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) string::npos, 910010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) post_interceptor_->GetRequests()[4].find( 911010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"2.0\">" 912010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<updatecheck /><packages><package fp=\"22\"/></packages></app>")) 913f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 914ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch component_updater()->Stop(); 915ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 916ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 917eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Verify that component installation falls back to downloading and installing 918eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// a full update if the differential update fails (in this case, because the 919eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// installer does not know about the existing files). We do two loops; the final 920eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// loop should do nothing. 921ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// We also check that exactly 4 non-ping network requests are issued: 922eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 1- update check (loop 1) 923eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 2- download differential crx 924eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 3- download full crx 925eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 4- update check (loop 2 - no update available) 926ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// There should be one ping for the first attempted update. 9270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// This test is flaky on Android. crbug.com/329883 9280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#if defined(OS_ANDROID) 9290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#define MAYBE_DifferentialUpdateFails DISABLED_DifferentialUpdateFails 9300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#else 9310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#define MAYBE_DifferentialUpdateFails DifferentialUpdateFails 9320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#endif 9330529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(ComponentUpdaterTest, MAYBE_DifferentialUpdateFails) { 934010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(post_interceptor_->ExpectRequest( 935010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new PartialMatch("updatecheck"), 936010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) test_file("updatecheck_diff_reply_2.xml"))); 937f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event"))); 938010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(post_interceptor_->ExpectRequest( 939010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new PartialMatch("updatecheck"), 940010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) test_file("updatecheck_diff_reply_3.xml"))); 941f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 942f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) get_interceptor_->SetResponse( 943f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GURL("http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"), 944f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1.crx")); 945f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) get_interceptor_->SetResponse( 946f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GURL("http://localhost/download/" 947010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx"), 948f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx")); 949f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) get_interceptor_->SetResponse( 950f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GURL("http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_2.crx"), 951f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) test_file("ihfokbkgjpifnbbojhneepfflplebdkc_2.crx")); 952eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 953eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestInstaller installer; 954eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CrxComponent com; 955eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RegisterComponent(&com, kTestComponent_ihfo, Version("1.0"), &installer); 956eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 957eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch test_configurator()->SetLoopCount(2); 958eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch component_updater()->Start(); 9594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RunThreads(); 960eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 961eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // A failed differential update does not count as a failed install. 962eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error()); 963eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(1, static_cast<TestInstaller*>(com.installer)->install_count()); 964eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 965f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(3, post_interceptor_->GetHitCount()) 966f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 967f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(3, post_interceptor_->GetCount()) 968f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 969f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(2, get_interceptor_->GetHitCount()); 970f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 971010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE( 972010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) string::npos, 973010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) post_interceptor_->GetRequests()[0].find( 974010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"1.0\">" 975010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<updatecheck /></app>")) 976f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 977010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE( 978010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) string::npos, 979010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) post_interceptor_->GetRequests()[1].find( 980010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" " 981010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "version=\"1.0\" nextversion=\"2.0\">" 982010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<event eventtype=\"3\" eventresult=\"1\" diffresult=\"0\" " 983010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "differrorcat=\"2\" differrorcode=\"16\" nextfp=\"22\"/>")) 984f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 985010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE( 986010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) string::npos, 987010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) post_interceptor_->GetRequests()[2].find( 988010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"2.0\">" 989010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<updatecheck /><packages><package fp=\"22\"/></packages></app>")) 990f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 991eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 992eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch component_updater()->Stop(); 993eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 994eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 9955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Test is flakey on Android bots. See crbug.com/331420. 9965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_ANDROID) 9975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define MAYBE_CheckFailedInstallPing DISABLED_CheckFailedInstallPing 9985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else 9995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define MAYBE_CheckFailedInstallPing CheckFailedInstallPing 10005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 1001ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Verify that a failed installation causes an install failure ping. 1002010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(ComponentUpdaterTest, MAYBE_CheckFailedInstallPing) { 1003ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // This test installer reports installation failure. 1004ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch class : public TestInstaller { 1005ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual bool Install(const base::DictionaryValue& manifest, 1006ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const base::FilePath& unpack_path) OVERRIDE { 1007ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ++install_count_; 1008ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch base::DeleteFile(unpack_path, true); 1009ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return false; 1010ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 1011ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } installer; 1012ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1013010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(post_interceptor_->ExpectRequest( 1014010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml"))); 1015f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event"))); 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"))); 1019f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) get_interceptor_->SetResponse( 1020f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GURL(expected_crx_url), 1021f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) test_file("jebgalgnebhfojomionfpkfelancnnkf.crx")); 1022f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1023f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Start with 0.9, and attempt update to 1.0. 1024f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Loop twice to issue two checks: (1) with original 0.9 version 1025f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // and (2), which should retry with 0.9. 1026ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch CrxComponent com; 1027ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch RegisterComponent(&com, kTestComponent_jebg, Version("0.9"), &installer); 1028ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1029ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch test_configurator()->SetLoopCount(2); 1030ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch component_updater()->Start(); 10314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RunThreads(); 1032ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1033f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(4, post_interceptor_->GetHitCount()) 1034f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 1035f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(2, get_interceptor_->GetHitCount()); 1036f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1037010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE( 1038010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) string::npos, 1039010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) post_interceptor_->GetRequests()[0].find( 1040010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"0.9\">" 1041010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<updatecheck /></app>")) 1042f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 1043010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE( 1044010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) string::npos, 1045010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) post_interceptor_->GetRequests()[1].find( 1046010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" " 1047010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "version=\"0.9\" nextversion=\"1.0\">" 1048010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<event eventtype=\"3\" eventresult=\"0\" " 1049010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "errorcat=\"3\" errorcode=\"9\"/>")) 1050f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 1051010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE( 1052010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) string::npos, 1053010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) post_interceptor_->GetRequests()[2].find( 1054010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"0.9\">" 1055010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<updatecheck /></app>")) 1056f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 1057010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE( 1058010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) string::npos, 1059010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) post_interceptor_->GetRequests()[3].find( 1060010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" " 1061010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "version=\"0.9\" nextversion=\"1.0\">" 1062010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<event eventtype=\"3\" eventresult=\"0\" " 1063010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "errorcat=\"3\" errorcode=\"9\"/>")) 1064f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 1065f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1066ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Loop once more, but expect no ping because a noupdate response is issued. 1067ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // This is necessary to clear out the fire-and-forget ping from the previous 1068ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // iteration. 1069f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) post_interceptor_->Reset(); 1070010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(post_interceptor_->ExpectRequest( 1071010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new PartialMatch("updatecheck"), 1072010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) test_file("updatecheck_reply_noupdate.xml"))); 1073f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1074ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch test_configurator()->SetLoopCount(1); 1075ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch component_updater()->Start(); 10764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RunThreads(); 1077ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1078ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error()); 1079ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(2, static_cast<TestInstaller*>(com.installer)->install_count()); 1080ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1081f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(1, post_interceptor_->GetHitCount()) 1082f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 1083f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(1, post_interceptor_->GetCount()) 1084f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 1085f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1086010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE( 1087010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) string::npos, 1088010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) post_interceptor_->GetRequests()[0].find( 1089010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"0.9\">" 1090010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<updatecheck /></app>")) 1091f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 1092ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1093ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch component_updater()->Stop(); 1094ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 1095ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1096eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Verify that we successfully propagate a patcher error. 1097eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// ihfokbkgjpifnbbojhneepfflplebdkc_1to2_bad.crx contains an incorrect 1098eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// patching instruction that should fail. 1099eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(ComponentUpdaterTest, DifferentialUpdateFailErrorcode) { 1100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(post_interceptor_->ExpectRequest( 1101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new PartialMatch("updatecheck"), 1102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) test_file("updatecheck_diff_reply_1.xml"))); 1103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event"))); 1104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(post_interceptor_->ExpectRequest( 1105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new PartialMatch("updatecheck"), 1106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) test_file("updatecheck_diff_reply_2.xml"))); 1107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event"))); 1108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(post_interceptor_->ExpectRequest( 1109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new PartialMatch("updatecheck"), 1110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) test_file("updatecheck_diff_reply_3.xml"))); 1111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) get_interceptor_->SetResponse( 1113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GURL("http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"), 1114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1.crx")); 1115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // This intercept returns a different file than what is specified in the 1116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // update check response and requested in the download. The file that is 1117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // actually dowloaded contains a patching error, an therefore, an error 1118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // is injected at the time of patching. 1119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) get_interceptor_->SetResponse( 1120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GURL("http://localhost/download/" 1121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx"), 1122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1to2_bad.crx")); 1123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) get_interceptor_->SetResponse( 1124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GURL("http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_2.crx"), 1125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) test_file("ihfokbkgjpifnbbojhneepfflplebdkc_2.crx")); 1126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch VersionedTestInstaller installer; 1128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CrxComponent com; 1129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RegisterComponent(&com, kTestComponent_ihfo, Version("0.0"), &installer); 1130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) test_configurator()->SetLoopCount(3); 1132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch component_updater()->Start(); 11334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RunThreads(); 11344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) component_updater()->Stop(); 1135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error()); 1137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(2, static_cast<TestInstaller*>(com.installer)->install_count()); 1138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(5, post_interceptor_->GetHitCount()) 1140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 1141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(5, post_interceptor_->GetCount()) 1142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 1143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(3, get_interceptor_->GetHitCount()); 1144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE( 1146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) string::npos, 1147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) post_interceptor_->GetRequests()[0].find( 1148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"0.0\">" 1149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<updatecheck /></app>")) 1150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 1151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE( 1152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) string::npos, 1153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) post_interceptor_->GetRequests()[1].find( 1154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" " 1155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "version=\"0.0\" nextversion=\"1.0\">" 1156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<event eventtype=\"3\" eventresult=\"1\" nextfp=\"1\"/>")) 1157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 1158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE( 1159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) string::npos, 1160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) post_interceptor_->GetRequests()[2].find( 1161010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"1.0\">" 1162010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<updatecheck /><packages><package fp=\"1\"/></packages></app>")) 1163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 1164010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE( 1165010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) string::npos, 1166010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) post_interceptor_->GetRequests()[3].find( 1167010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" " 1168010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "version=\"1.0\" nextversion=\"2.0\">" 1169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<event eventtype=\"3\" eventresult=\"1\" " 1170010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "diffresult=\"0\" differrorcat=\"2\" " 1171010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "differrorcode=\"14\" diffextracode1=\"305\" " 1172010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "previousfp=\"1\" nextfp=\"22\"/>")) 1173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 1174010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE( 1175010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) string::npos, 1176010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) post_interceptor_->GetRequests()[4].find( 1177010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"2.0\">" 1178010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "<updatecheck /><packages><package fp=\"22\"/></packages></app>")) 1179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << post_interceptor_->GetRequestsAsString(); 1180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 11825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class TestResourceController : public content::ResourceController { 11835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 11845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void SetThrottle(content::ResourceThrottle* throttle) {} 11855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 11865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)content::ResourceThrottle* RequestTestResourceThrottle( 11885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ComponentUpdateService* cus, 11895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestResourceController* controller, 11905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char* crx_id) { 11915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::TestURLRequestContext context; 11921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<net::URLRequest> url_request(context.CreateRequest( 11931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GURL("http://foo.example.com/thing.bin"), 11941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci net::DEFAULT_PRIORITY, 11951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NULL, 11961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NULL)); 11975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) content::ResourceThrottle* rt = GetOnDemandResourceThrottle(cus, crx_id); 11995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rt->set_controller_for_testing(controller); 12005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) controller->SetThrottle(rt); 12015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return rt; 12025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 12035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1204010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void RequestAndDeleteResourceThrottle(ComponentUpdateService* cus, 1205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const char* crx_id) { 1206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // By requesting a throttle and deleting it immediately we ensure that we 1207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // hit the case where the component updater tries to use the weak 1208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // pointer to a dead Resource throttle. 1209010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) class NoCallResourceController : public TestResourceController { 1210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public: 1211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual ~NoCallResourceController() {} 1212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void Cancel() OVERRIDE { CHECK(false); } 1213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void CancelAndIgnore() OVERRIDE { CHECK(false); } 1214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void CancelWithError(int error_code) OVERRIDE { CHECK(false); } 1215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void Resume() OVERRIDE { CHECK(false); } 12165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } controller; 1217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 12185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delete RequestTestResourceThrottle(cus, &controller, crx_id); 1219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 1220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 12215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ComponentUpdaterTest, ResourceThrottleDeletedNoUpdate) { 12225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu MockServiceObserver observer; 12235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu { 12245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu InSequence seq; 12255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 12265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, "")) 1227010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 12285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 12295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED, 12305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "abagagagagagagagagagagagagagagag")) 1231010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 12325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 12335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, "")) 1234010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 12355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1237010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(post_interceptor_->ExpectRequest( 1238010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml"))); 12395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TestInstaller installer; 1241f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CrxComponent com; 12425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu component_updater()->AddObserver(&observer); 1243010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ( 1244010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ComponentUpdateService::kOk, 1245010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RegisterComponent(&com, kTestComponent_abag, Version("1.1"), &installer)); 1246f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The following two calls ensure that we don't do an update check via the 1247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // timer, so the only update check should be the on-demand one. 1248f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) test_configurator()->SetInitialDelay(1000000); 1249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) test_configurator()->SetRecheckTime(1000000); 1250f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) test_configurator()->SetLoopCount(1); 1251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) component_updater()->Start(); 1252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1253f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RunThreadsUntilIdle(); 1254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0, post_interceptor_->GetHitCount()); 1256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1257010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BrowserThread::PostTask(BrowserThread::IO, 1258010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FROM_HERE, 1259010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&RequestAndDeleteResourceThrottle, 1260010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) component_updater(), 1261010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "abagagagagagagagagagagagagagagag")); 12625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RunThreads(); 12645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1, post_interceptor_->GetHitCount()); 12665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error()); 12675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count()); 12685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) component_updater()->Stop(); 12705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 12715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1272010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class CancelResourceController : public TestResourceController { 1273010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public: 12745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CancelResourceController() : throttle_(NULL), resume_called_(0) {} 12755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~CancelResourceController() { 12765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Check that the throttle has been resumed by the time we 12775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // exit the test. 1278010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CHECK_EQ(1, resume_called_); 12795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delete throttle_; 12805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 12815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void Cancel() OVERRIDE { CHECK(false); } 12825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void CancelAndIgnore() OVERRIDE { CHECK(false); } 12835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void CancelWithError(int error_code) OVERRIDE { CHECK(false); } 12845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void Resume() OVERRIDE { 1285010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BrowserThread::PostTask(BrowserThread::IO, 1286010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FROM_HERE, 1287010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&CancelResourceController::ResumeCalled, 1288010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Unretained(this))); 12895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 12905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void SetThrottle(content::ResourceThrottle* throttle) OVERRIDE { 12915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) throttle_ = throttle; 12925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool defer = false; 12935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Initially the throttle is blocked. The CUS needs to run a 12945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // task on the UI thread to decide if it should unblock. 12955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) throttle_->WillStartRequest(&defer); 12965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK(defer); 12975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 12985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1299010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private: 13005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void ResumeCalled() { ++resume_called_; } 13015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::ResourceThrottle* throttle_; 13035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int resume_called_; 13045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 13055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 130646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Tests the on-demand update with resource throttle, including the 130746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// cooldown interval between calls. 13085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ComponentUpdaterTest, ResourceThrottleLiveNoUpdate) { 13095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu MockServiceObserver observer; 13105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu { 13115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu InSequence seq; 13125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 13135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, "")) 1314010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 13155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 13165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED, 13175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "abagagagagagagagagagagagagagagag")) 1318010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 13195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 13205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, "")) 1321010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 132246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_CALL(observer, 132346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, "")) 132446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) .Times(1); 132546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_CALL(observer, 132646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED, 132746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "abagagagagagagagagagagagagagagag")) 132846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) .Times(1); 132946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_CALL(observer, 133046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, "")) 133146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) .Times(1); 133246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_CALL(observer, 133346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, "")) 133446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) .Times(1); 13355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 13365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1337010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(post_interceptor_->ExpectRequest( 1338010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml"))); 1339f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 13405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestInstaller installer; 13415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CrxComponent com; 13425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu component_updater()->AddObserver(&observer); 1343010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ( 1344010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ComponentUpdateService::kOk, 1345010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RegisterComponent(&com, kTestComponent_abag, Version("1.1"), &installer)); 13465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The following two calls ensure that we don't do an update check via the 13475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // timer, so the only update check should be the on-demand one. 13485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_configurator()->SetInitialDelay(1000000); 13495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_configurator()->SetRecheckTime(1000000); 13505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_configurator()->SetLoopCount(1); 13515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) component_updater()->Start(); 13525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RunThreadsUntilIdle(); 13545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, post_interceptor_->GetHitCount()); 13565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 135746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) { 135846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // First on-demand update check is expected to succeeded. 135946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) CancelResourceController controller; 13605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 136146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) BrowserThread::PostTask( 136246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) BrowserThread::IO, 136346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) FROM_HERE, 136446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(base::IgnoreResult(&RequestTestResourceThrottle), 136546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) component_updater(), 136646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) &controller, 136746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "abagagagagagagagagagagagagagagag")); 1368f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 136946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) RunThreads(); 1370f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 137146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(1, post_interceptor_->GetHitCount()); 137246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error()); 137346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count()); 1374f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 137546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) component_updater()->Stop(); 137646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 137746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 137846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) { 137946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Second on-demand update check is expected to succeed as well, since there 138046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // is no cooldown interval between calls, due to calling SetOnDemandTime. 138146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) test_configurator()->SetOnDemandTime(0); 138246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) test_configurator()->SetLoopCount(1); 138346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) component_updater()->Start(); 138446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 138546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) CancelResourceController controller; 138646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 138746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) BrowserThread::PostTask( 138846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) BrowserThread::IO, 138946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) FROM_HERE, 139046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(base::IgnoreResult(&RequestTestResourceThrottle), 139146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) component_updater(), 139246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) &controller, 139346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "abagagagagagagagagagagagagagagag")); 139446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 139546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) RunThreads(); 139646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 139746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(1, post_interceptor_->GetHitCount()); 139846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error()); 139946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count()); 140046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 140146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) component_updater()->Stop(); 140246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 140346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 140446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) { 140546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // This on-demand call is expected not to trigger a component update check. 140646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) test_configurator()->SetOnDemandTime(1000000); 140746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) component_updater()->Start(); 140846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 140946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) CancelResourceController controller; 141046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 141146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) BrowserThread::PostTask( 141246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) BrowserThread::IO, 141346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) FROM_HERE, 141446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(base::IgnoreResult(&RequestTestResourceThrottle), 141546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) component_updater(), 141646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) &controller, 141746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "abagagagagagagagagagagagagagagag")); 141846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) RunThreadsUntilIdle(); 141946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 1420f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 1421f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 14225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Tests adding and removing observers. 14235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(ComponentUpdaterTest, Observer) { 14245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu MockServiceObserver observer1, observer2; 14255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 14265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Expect that two observers see the events. 14275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu { 14285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu InSequence seq; 14295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer1, 14305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, "")) 1431010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 14325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer2, 14335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, "")) 1434010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 14355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer1, 14365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED, 14375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "abagagagagagagagagagagagagagagag")) 1438010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 14395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer2, 14405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED, 14415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "abagagagagagagagagagagagagagagag")) 1442010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 14435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer1, 14445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, "")) 1445010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 14465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer2, 14475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, "")) 1448010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 14495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 14505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1451010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(post_interceptor_->ExpectRequest( 1452010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml"))); 14535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 14545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu component_updater()->AddObserver(&observer1); 14555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu component_updater()->AddObserver(&observer2); 14565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 14575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu TestInstaller installer; 14585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu CrxComponent com; 1459010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ( 1460010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ComponentUpdateService::kOk, 1461010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RegisterComponent(&com, kTestComponent_abag, Version("1.1"), &installer)); 14625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu test_configurator()->SetLoopCount(1); 14635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu component_updater()->Start(); 14645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu RunThreads(); 14655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 14665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // After removing the first observer, it's only the second observer that 14675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // gets the events. 14685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer1)); 14695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer2)); 14705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu { 14715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu InSequence seq; 14725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer2, 14735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_UPDATER_STARTED, "")) 1474010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 14755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer2, 14765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_NOT_UPDATED, 14775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "abagagagagagagagagagagagagagagag")) 1478010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 14795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer2, 14805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnEvent(ServiceObserver::COMPONENT_UPDATER_SLEEPING, "")) 1481010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1); 14825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 14835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 14845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu component_updater()->RemoveObserver(&observer1); 14855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 14865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu test_configurator()->SetLoopCount(1); 14875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu component_updater()->Start(); 14885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu RunThreads(); 1489f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 14905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Both observers are removed and no one gets the events. 14915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer1)); 14925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer2)); 14935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu component_updater()->RemoveObserver(&observer2); 14945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 14955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu test_configurator()->SetLoopCount(1); 14965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu component_updater()->Start(); 14975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu RunThreads(); 14985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 14995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu component_updater()->Stop(); 15005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 15015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 15025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} // namespace component_updater 1503