component_updater_service_unittest.h revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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" 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/component_updater/test/component_patcher_mock.h" 21ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/component_updater/test/url_request_post_interceptor.h" 224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h" 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/test/net/url_request_prepackaged_interceptor.h" 24ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "net/url_request/url_request_test_util.h" 25a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "testing/gtest/include/gtest/gtest.h" 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace component_updater { 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class TestInstaller; 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Intercepts HTTP GET requests sent to "localhost". 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)typedef content::URLLocalHostRequestPrepackagedInterceptor GetInterceptor; 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Intercepts HTTP POST requests sent to "localhost2". 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class InterceptorFactory : public URLRequestPostInterceptorFactory { 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public: 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) InterceptorFactory(); 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ~InterceptorFactory(); 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) URLRequestPostInterceptor* CreateInterceptor(); 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private: 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(InterceptorFactory); 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class PartialMatch : public URLRequestPostInterceptor::RequestMatcher { 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) explicit PartialMatch(const std::string& expected) : expected_(expected) {} 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual bool Match(const std::string& actual) const OVERRIDE; 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 ComponentPatcher* CreateComponentPatcher() OVERRIDE; 95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual bool DeltasEnabled() const OVERRIDE; 96a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual bool UseBackgroundDownloader() const OVERRIDE; 97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) typedef std::pair<CrxComponent*, int> CheckAtLoopCount; 99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void SetLoopCount(int times); 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void SetRecheckTime(int seconds); 101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void SetOnDemandTime(int seconds); 102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void SetComponentUpdateService(ComponentUpdateService* cus); 1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void SetQuitClosure(const base::Closure& quit_closure); 104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void SetInitialDelay(int seconds); 105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private: 107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int initial_time_; 108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int times_; 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int recheck_time_; 110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int ondemand_time_; 111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ComponentUpdateService* cus_; 113ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch scoped_refptr<net::TestURLRequestContextGetter> context_; 1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Closure quit_closure_; 115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass ComponentUpdaterTest : public testing::Test { 118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public: 119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch enum TestComponents { 120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch kTestComponent_abag, 121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch kTestComponent_jebg, 122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch kTestComponent_ihfo, 123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }; 124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ComponentUpdaterTest(); 126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual ~ComponentUpdaterTest(); 128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void SetUp(); 130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void TearDown(); 132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ComponentUpdateService* component_updater(); 134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Makes the full path to a component updater test file. 136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::FilePath test_file(const char* file); 137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestConfigurator* test_configurator(); 139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ComponentUpdateService::Status RegisterComponent(CrxComponent* com, 141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestComponents component, 142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const Version& version, 143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestInstaller* installer); 1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 145ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch protected: 1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void RunThreads(); 1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void RunThreadsUntilIdle(); 148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<InterceptorFactory> interceptor_factory_; 150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) URLRequestPostInterceptor* post_interceptor_; // Owned by the factory. 151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<GetInterceptor> get_interceptor_; 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 163a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class MockComponentObserver : public ComponentObserver { 164a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public: 165a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) MockComponentObserver(); 166a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ~MockComponentObserver(); 167a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) MOCK_METHOD2(OnEvent, void(Events event, int extra)); 168a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}; 169a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class OnDemandTester { 1711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public: 1721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) static ComponentUpdateService::Status OnDemand( 1731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ComponentUpdateService* cus, const std::string& component_id); 1741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}; 1751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace component_updater 177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // CHROME_BROWSER_COMPONENT_UPDATER_TEST_COMPONENT_UPDATER_SERVICE_UNITTEST_H_ 179