component_updater_service_unittest.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/component_updater/component_updater_service.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_path.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_vector.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/component_updater/component_updater_interceptor.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_notification_types.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_notification_tracker.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "googleurl/src/gurl.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "libxml/globals.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_fetcher.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_test_util.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::TestNotificationTracker; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Overrides some of the component updater behaviors so it is easier to test 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and loops faster. In actual usage it takes hours do to a full cycle. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestConfigurator : public ComponentUpdateService::Configurator { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestConfigurator() : times_(1) { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int InitialDelay() OVERRIDE { return 0; } 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int NextCheckDelay() OVERRIDE { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is called when a new full cycle of checking for updates is going 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to happen. In test we normally only test one cycle so it is a good 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // time to break from the test messageloop Run() method so the test can 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // finish. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (--times_ > 0) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop::current()->Quit(); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int StepDelay() OVERRIDE { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int MinimumReCheckWait() OVERRIDE { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual GURL UpdateUrl() OVERRIDE { return GURL("http://localhost/upd"); } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual const char* ExtraRequestParams() OVERRIDE { return "extra=foo"; } 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual size_t UrlSizeLimit() OVERRIDE { return 256; } 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual net::URLRequestContextGetter* RequestContext() OVERRIDE { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new TestURLRequestContextGetter( 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO)); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't use the utility process to decode files. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool InProcess() OVERRIDE { return true; } 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnEvent(Events event, int extra) OVERRIDE { } 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set how many update checks are called, the default value is just once. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetLoopCount(int times) { times_ = times; } 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int times_; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestInstaller : public ComponentInstaller { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public : 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit TestInstaller() 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : error_(0), install_count_(0) { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnUpdateError(int error) OVERRIDE { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, error); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_ = error; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Install(base::DictionaryValue* manifest, 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FilePath& unpack_path) OVERRIDE { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++install_count_; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete manifest; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return file_util::Delete(unpack_path, true); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int error() const { return error_; } 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int install_count() const { return install_count_; } 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int error_; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int install_count_; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// component 1 has extension id "jebgalgnebhfojomionfpkfelancnnkf", and 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the RSA public key the following hash: 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint8 jebg_hash[] = {0x94,0x16,0x0b,0x6d,0x41,0x75,0xe9,0xec,0x8e,0xd5, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0xfa,0x54,0xb0,0xd2,0xdd,0xa5,0x6e,0x05,0x6b,0xe8, 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x73,0x47,0xf6,0xc4,0x11,0x9f,0xbc,0xb3,0x09,0xb3, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x5b,0x40}; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// component 2 has extension id "abagagagagagagagagagagagagagagag", and 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the RSA public key the following hash: 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint8 abag_hash[] = {0x01,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x06,0x01}; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char header_ok_reply[] = 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "HTTP/1.1 200 OK\0" 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Content-type: text/html\0" 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\0"; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char expected_crx_url[] = 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://localhost/download/jebgalgnebhfojomionfpkfelancnnkf.crx"; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Common fixture for all the component updater tests. 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ComponentUpdaterTest : public testing::Test { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum TestComponents { 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTestComponent_abag, 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTestComponent_jebg 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ComponentUpdaterTest() : component_updater_(NULL), test_config_(NULL) { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The component updater instance under test. 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_config_ = new TestConfigurator; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater_.reset(ComponentUpdateServiceFactory(test_config_)); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The test directory is chrome/test/data/components. 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir_); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_data_dir_ = test_data_dir_.AppendASCII("components"); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Subscribe to all component updater notifications. 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int notifications[] = { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_COMPONENT_UPDATER_STARTED, 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_COMPONENT_UPDATE_FOUND, 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_COMPONENT_UPDATE_READY 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int ix = 0; ix != arraysize(notifications); ++ix) { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification_tracker_.ListenFor( 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notifications[ix], content::NotificationService::AllSources()); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLFetcher::SetEnableInterceptionForTests(true); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ComponentUpdaterTest() { 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLFetcher::SetEnableInterceptionForTests(false); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void TearDown() { 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlCleanupGlobals(); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ComponentUpdateService* component_updater() { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return component_updater_.get(); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Makes the full path to a component updater test file. 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FilePath test_file(const char* file) { 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return test_data_dir_.AppendASCII(file); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNotificationTracker& notification_tracker() { 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return notification_tracker_; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestConfigurator* test_configurator() { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return test_config_; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RegisterComponent(CrxComponent* com, 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestComponents component, 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Version& version) { 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (component == kTestComponent_abag) { 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) com->name = "test_abag"; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) com->pk_hash.assign(abag_hash, abag_hash + arraysize(abag_hash)); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) com->name = "test_jebg"; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) com->pk_hash.assign(jebg_hash, jebg_hash + arraysize(jebg_hash)); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) com->version = version; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestInstaller* installer = new TestInstaller; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) com->installer = installer; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_installers_.push_back(installer); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater_->RegisterComponent(*com); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ComponentUpdateService> component_updater_; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FilePath test_data_dir_; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNotificationTracker notification_tracker_; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestConfigurator* test_config_; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ComponentInstaller objects to delete after each test. 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedVector<TestInstaller> test_installers_; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that our test fixture work and the component updater can 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// be created and destroyed with no side effects. 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, VerifyFixture) { 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(component_updater() != NULL); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0ul, notification_tracker().size()); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that the component updater can be caught in a quick 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// start-shutdown situation. Failure of this test will be a crash. Also 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// if there is no work to do, there are no notifications generated. 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, StartStop) { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop message_loop; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread ui_thread(BrowserThread::UI, &message_loop); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater()->Start(); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop.RunAllPending(); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater()->Stop(); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0ul, notification_tracker().size()); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that when the server has no updates, we go back to sleep and 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the COMPONENT_UPDATER_STARTED and COMPONENT_UPDATER_SLEEPING notifications 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// are generated. 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, CheckCrxSleep) { 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop message_loop; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread ui_thread(BrowserThread::UI, &message_loop); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread file_thread(BrowserThread::FILE); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread io_thread(BrowserThread::IO); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) io_thread.StartIOThread(); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_thread.Start(); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<ComponentUpdateInterceptor> 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor(new ComponentUpdateInterceptor()); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrxComponent com; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegisterComponent(&com, kTestComponent_abag, Version("1.1")); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char expected_update_url[] = 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://localhost/upd?extra=foo&x=id%3D" 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "abagagagagagagagagagagagagagagag%26v%3D1.1%26uc"; 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor->SetResponse(expected_update_url, 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) header_ok_reply, 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_file("updatecheck_reply_1.xml")); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We loop twice, but there are no updates so we expect two sleep messages. 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_configurator()->SetLoopCount(2); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater()->Start(); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1ul, notification_tracker().size()); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNotificationTracker::Event ev1 = notification_tracker().at(0); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_STARTED, ev1.type); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop.Run(); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3ul, notification_tracker().size()); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNotificationTracker::Event ev2 = notification_tracker().at(1); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev2.type); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNotificationTracker::Event ev3 = notification_tracker().at(2); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev2.type); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, interceptor->hit_count()); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error()); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count()); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater()->Stop(); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Loop twice again but this case we simulate a server error by returning 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // an empty file. 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor->SetResponse(expected_update_url, 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) header_ok_reply, 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_file("updatecheck_reply_empty")); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification_tracker().Reset(); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_configurator()->SetLoopCount(2); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater()->Start(); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop.Run(); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3ul, notification_tracker().size()); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ev1 = notification_tracker().at(0); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_STARTED, ev1.type); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ev2 = notification_tracker().at(1); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev2.type); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ev3 = notification_tracker().at(2); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev2.type); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, interceptor->hit_count()); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error()); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count()); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater()->Stop(); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we can check for updates and install one component. Besides 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the notifications above NOTIFICATION_COMPONENT_UPDATE_FOUND and 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NOTIFICATION_COMPONENT_UPDATE_READY should have been fired. We do two loops 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// so the second time around there should be nothing left to do. 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We also check that only 3 network requests are issued: 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1- manifest check 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2- download crx 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3- second manifest check. 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, InstallCrx) { 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop message_loop; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread ui_thread(BrowserThread::UI, &message_loop); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread file_thread(BrowserThread::FILE); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread io_thread(BrowserThread::IO); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) io_thread.StartIOThread(); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_thread.Start(); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<ComponentUpdateInterceptor> 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor(new ComponentUpdateInterceptor()); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrxComponent com1; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegisterComponent(&com1, kTestComponent_jebg, Version("0.9")); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrxComponent com2; 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegisterComponent(&com2, kTestComponent_abag, Version("2.2")); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char expected_update_url_1[] = 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://localhost/upd?extra=foo&x=id%3D" 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "jebgalgnebhfojomionfpkfelancnnkf%26v%3D0.9%26uc&x=id%3D" 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "abagagagagagagagagagagagagagagag%26v%3D2.2%26uc"; 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char expected_update_url_2[] = 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://localhost/upd?extra=foo&x=id%3D" 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "abagagagagagagagagagagagagagagag%26v%3D2.2%26uc&x=id%3D" 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "jebgalgnebhfojomionfpkfelancnnkf%26v%3D1.0%26uc"; 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor->SetResponse(expected_update_url_1, header_ok_reply, 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_file("updatecheck_reply_1.xml")); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor->SetResponse(expected_update_url_2, header_ok_reply, 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_file("updatecheck_reply_1.xml")); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor->SetResponse(expected_crx_url, header_ok_reply, 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_file("jebgalgnebhfojomionfpkfelancnnkf.crx")); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_configurator()->SetLoopCount(2); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater()->Start(); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop.Run(); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error()); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, static_cast<TestInstaller*>(com1.installer)->install_count()); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, interceptor->hit_count()); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(5ul, notification_tracker().size()); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNotificationTracker::Event ev1 = notification_tracker().at(1); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATE_FOUND, ev1.type); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNotificationTracker::Event ev2 = notification_tracker().at(2); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATE_READY, ev2.type); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNotificationTracker::Event ev3 = notification_tracker().at(3); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev3.type); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNotificationTracker::Event ev4 = notification_tracker().at(4); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev3.type); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater()->Stop(); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test checks that the "prodversionmin" value is handled correctly. In 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// particular there should not be an install because the minimum product 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// version is much higher than of chrome. 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, ProdVersionCheck) { 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop message_loop; 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread ui_thread(BrowserThread::UI, &message_loop); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread file_thread(BrowserThread::FILE); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread io_thread(BrowserThread::IO); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) io_thread.StartIOThread(); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_thread.Start(); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<ComponentUpdateInterceptor> 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor(new ComponentUpdateInterceptor()); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrxComponent com; 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegisterComponent(&com, kTestComponent_jebg, Version("0.9")); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char expected_update_url[] = 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://localhost/upd?extra=foo&x=id%3D" 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "jebgalgnebhfojomionfpkfelancnnkf%26v%3D0.9%26uc"; 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor->SetResponse(expected_update_url, 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) header_ok_reply, 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_file("updatecheck_reply_2.xml")); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor->SetResponse(expected_crx_url, header_ok_reply, 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_file("jebgalgnebhfojomionfpkfelancnnkf.crx")); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_configurator()->SetLoopCount(1); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater()->Start(); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop.Run(); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, interceptor->hit_count()); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error()); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count()); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater()->Stop(); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 418