component_updater_service_unittest.h revision 010d83a9304c5a91596085d917d248abff47903a
1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file. 4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#ifndef CHROME_BROWSER_COMPONENT_UPDATER_TEST_COMPONENT_UPDATER_SERVICE_UNITTEST_H_ 6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define CHROME_BROWSER_COMPONENT_UPDATER_TEST_COMPONENT_UPDATER_SERVICE_UNITTEST_H_ 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <list> 9ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include <map> 10ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include <string> 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <utility> 123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include <vector> 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 14ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/basictypes.h" 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/compiler_specific.h" 16ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/files/file_path.h" 17ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/memory/ref_counted.h" 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/memory/scoped_ptr.h" 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/component_updater/component_updater_service.h" 20ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/component_updater/test/url_request_post_interceptor.h" 214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h" 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/test/net/url_request_prepackaged_interceptor.h" 23ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "net/url_request/url_request_test_util.h" 24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "testing/gtest/include/gtest/gtest.h" 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace component_updater { 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class TestInstaller; 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Intercepts HTTP GET requests sent to "localhost". 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)typedef content::URLLocalHostRequestPrepackagedInterceptor GetInterceptor; 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Intercepts HTTP POST requests sent to "localhost2". 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class InterceptorFactory : public URLRequestPostInterceptorFactory { 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public: 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) InterceptorFactory(); 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ~InterceptorFactory(); 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) URLRequestPostInterceptor* CreateInterceptor(); 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private: 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(InterceptorFactory); 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class PartialMatch : public URLRequestPostInterceptor::RequestMatcher { 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) explicit PartialMatch(const std::string& expected) : expected_(expected) {} 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual bool Match(const std::string& actual) const OVERRIDE; 50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string expected_; 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PartialMatch); 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// component 1 has extension id "jebgalgnebhfojomionfpkfelancnnkf", and 58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// the RSA public key the following hash: 59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst uint8 jebg_hash[] = {0x94, 0x16, 0x0b, 0x6d, 0x41, 0x75, 0xe9, 0xec, 60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 0x8e, 0xd5, 0xfa, 0x54, 0xb0, 0xd2, 0xdd, 0xa5, 61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 0x6e, 0x05, 0x6b, 0xe8, 0x73, 0x47, 0xf6, 0xc4, 62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 0x11, 0x9f, 0xbc, 0xb3, 0x09, 0xb3, 0x5b, 0x40}; 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// component 2 has extension id "abagagagagagagagagagagagagagagag", and 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// the RSA public key the following hash: 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst uint8 abag_hash[] = {0x01, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x01}; 69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// component 3 has extension id "ihfokbkgjpifnbbojhneepfflplebdkc", and 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// the RSA public key the following hash: 71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst uint8 ihfo_hash[] = {0x87, 0x5e, 0xa1, 0xa6, 0x9f, 0x85, 0xd1, 0x1e, 72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 0x97, 0xd4, 0x4f, 0x55, 0xbf, 0xb4, 0x13, 0xa2, 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 0xe7, 0xc5, 0xc8, 0xf5, 0x60, 0x19, 0x78, 0x1b, 74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 0x6d, 0xe9, 0x4c, 0xeb, 0x96, 0x05, 0x42, 0x17}; 75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass TestConfigurator : public ComponentUpdateService::Configurator { 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public: 78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) TestConfigurator(); 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual ~TestConfigurator(); 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 81a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Overrrides for ComponentUpdateService::Configurator. 82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual int InitialDelay() OVERRIDE; 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual int NextCheckDelay() OVERRIDE; 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual int StepDelay() OVERRIDE; 853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual int StepDelayMedium() OVERRIDE; 86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual int MinimumReCheckWait() OVERRIDE; 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual int OnDemandDelay() OVERRIDE; 88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual GURL UpdateUrl() OVERRIDE; 89ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual GURL PingUrl() OVERRIDE; 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual std::string ExtraRequestParams() OVERRIDE; 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual size_t UrlSizeLimit() OVERRIDE; 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual net::URLRequestContextGetter* RequestContext() OVERRIDE; 93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual bool InProcess() OVERRIDE; 94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual bool DeltasEnabled() const OVERRIDE; 95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual bool UseBackgroundDownloader() const OVERRIDE; 96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 97a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) typedef std::pair<CrxComponent*, int> CheckAtLoopCount; 98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void SetLoopCount(int times); 99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void SetRecheckTime(int seconds); 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void SetOnDemandTime(int seconds); 101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void SetComponentUpdateService(ComponentUpdateService* cus); 1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void SetQuitClosure(const base::Closure& quit_closure); 103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void SetInitialDelay(int seconds); 104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private: 106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int initial_time_; 107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int times_; 108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int recheck_time_; 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int ondemand_time_; 110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ComponentUpdateService* cus_; 112ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch scoped_refptr<net::TestURLRequestContextGetter> context_; 1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Closure quit_closure_; 114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass ComponentUpdaterTest : public testing::Test { 117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public: 118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch enum TestComponents { 119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch kTestComponent_abag, 120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch kTestComponent_jebg, 121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch kTestComponent_ihfo, 122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }; 123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ComponentUpdaterTest(); 125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual ~ComponentUpdaterTest(); 127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void SetUp(); 129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void TearDown(); 131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ComponentUpdateService* component_updater(); 133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Makes the full path to a component updater test file. 135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::FilePath test_file(const char* file); 136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestConfigurator* test_configurator(); 138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ComponentUpdateService::Status RegisterComponent(CrxComponent* com, 140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestComponents component, 141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const Version& version, 142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestInstaller* installer); 1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 144ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch protected: 1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void RunThreads(); 1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void RunThreadsUntilIdle(); 147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<InterceptorFactory> interceptor_factory_; 149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) URLRequestPostInterceptor* post_interceptor_; // Owned by the factory. 150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<GetInterceptor> get_interceptor_; 152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private: 154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestConfigurator* test_config_; 155ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch base::FilePath test_data_dir_; 1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::TestBrowserThreadBundle thread_bundle_; 157ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch scoped_ptr<ComponentUpdateService> component_updater_; 158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst char expected_crx_url[] = 161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "http://localhost/download/jebgalgnebhfojomionfpkfelancnnkf.crx"; 162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass MockServiceObserver : public ServiceObserver { 164a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public: 1655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu MockServiceObserver(); 1665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ~MockServiceObserver(); 1675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu MOCK_METHOD2(OnEvent, void(Events event, const std::string&)); 168a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}; 169a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class OnDemandTester { 1711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public: 1721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) static ComponentUpdateService::Status OnDemand( 173010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ComponentUpdateService* cus, 174010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::string& component_id); 1751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}; 1761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace component_updater 178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // CHROME_BROWSER_COMPONENT_UPDATER_TEST_COMPONENT_UPDATER_SERVICE_UNITTEST_H_ 180