component_updater_service_unittest.h revision 1e9bf3e0803691d0a228da41fc608347b6db4340
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 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)#ifndef CHROME_BROWSER_COMPONENT_UPDATER_TEST_COMPONENT_UPDATER_SERVICE_UNITTEST_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_COMPONENT_UPDATER_TEST_COMPONENT_UPDATER_SERVICE_UNITTEST_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <list>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <map>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utility>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/basictypes.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/compiler_specific.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/component_updater/component_updater_service.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/component_updater/test/component_patcher_mock.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/component_updater/test/url_request_post_interceptor.h"
21ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/public/test/test_browser_thread_bundle.h"
221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "net/url_request/url_request_test_util.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class TestInstaller;
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// component 1 has extension id "jebgalgnebhfojomionfpkfelancnnkf", and
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the RSA public key the following hash:
307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochconst uint8 jebg_hash[] = {0x94, 0x16, 0x0b, 0x6d, 0x41, 0x75, 0xe9, 0xec,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           0x8e, 0xd5, 0xfa, 0x54, 0xb0, 0xd2, 0xdd, 0xa5,
3268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                           0x6e, 0x05, 0x6b, 0xe8, 0x73, 0x47, 0xf6, 0xc4,
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           0x11, 0x9f, 0xbc, 0xb3, 0x09, 0xb3, 0x5b, 0x40};
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// component 2 has extension id "abagagagagagagagagagagagagagagag", and
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the RSA public key the following hash:
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint8 abag_hash[] = {0x01, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x01};
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// component 3 has extension id "ihfokbkgjpifnbbojhneepfflplebdkc", and
41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// the RSA public key the following hash:
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint8 ihfo_hash[] = {0x87, 0x5e, 0xa1, 0xa6, 0x9f, 0x85, 0xd1, 0x1e,
43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           0x97, 0xd4, 0x4f, 0x55, 0xbf, 0xb4, 0x13, 0xa2,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           0xe7, 0xc5, 0xc8, 0xf5, 0x60, 0x19, 0x78, 0x1b,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           0x6d, 0xe9, 0x4c, 0xeb, 0x96, 0x05, 0x42, 0x17};
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class TestConfigurator : public ComponentUpdateService::Configurator {
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  explicit TestConfigurator();
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestConfigurator();
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual int InitialDelay() OVERRIDE;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::pair<CrxComponent*, int> CheckAtLoopCount;
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual int NextCheckDelay() OVERRIDE;
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int StepDelay() OVERRIDE;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int StepDelayMedium() OVERRIDE;
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual int MinimumReCheckWait() OVERRIDE;
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual int OnDemandDelay() OVERRIDE;
6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual GURL UpdateUrl() OVERRIDE;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual GURL PingUrl() OVERRIDE;
70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual const char* ExtraRequestParams() OVERRIDE;
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual size_t UrlSizeLimit() OVERRIDE;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual net::URLRequestContextGetter* RequestContext() OVERRIDE;
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't use the utility process to decode files.
7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  virtual bool InProcess() OVERRIDE;
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ComponentPatcher* CreateComponentPatcher() OVERRIDE;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool DeltasEnabled() const OVERRIDE;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetLoopCount(int times);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void SetRecheckTime(int seconds);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetOnDemandTime(int seconds);
897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SetComponentUpdateService(ComponentUpdateService* cus);
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void SetQuitClosure(const base::Closure& quit_closure);
93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private:
95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int times_;
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int recheck_time_;
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int ondemand_time_;
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ComponentUpdateService* cus_;
100c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_refptr<net::TestURLRequestContextGetter> context_;
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Closure quit_closure_;
102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)};
103d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class ComponentUpdaterTest : public testing::Test {
1051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public:
10646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  enum TestComponents {
107e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    kTestComponent_abag,
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kTestComponent_jebg,
109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    kTestComponent_ihfo,
11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  };
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ComponentUpdaterTest();
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ComponentUpdaterTest();
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown();
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ComponentUpdateService* component_updater();
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Makes the full path to a component updater test file.
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::FilePath test_file(const char* file);
12268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestConfigurator* test_configurator();
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ComponentUpdateService::Status RegisterComponent(CrxComponent* com,
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   TestComponents component,
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   const Version& version,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   TestInstaller* installer);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void RunThreads();
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunThreadsUntilIdle();
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) private:
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestConfigurator* test_config_;
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::FilePath test_data_dir_;
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::TestBrowserThreadBundle thread_bundle_;
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ComponentUpdateService> component_updater_;
13968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)};
14068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
14168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char expected_crx_url[] =
14268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    "http://localhost/download/jebgalgnebhfojomionfpkfelancnnkf.crx";
14368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass PingChecker : public RequestCounter {
145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public:
146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  explicit PingChecker(const std::map<std::string, std::string>& attributes);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~PingChecker();
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Trial(net::URLRequest* request) OVERRIDE;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int NumHits() const {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return num_hits_;
154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
15568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  int NumMisses() const {
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return num_misses_;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string GetPings() const;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<std::string> pings_;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int num_hits_;
16368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  int num_misses_;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::map<std::string, std::string> attributes_;
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool Test(net::URLRequest* request);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class MockComponentObserver : public ComponentObserver {
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockComponentObserver();
1713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ~MockComponentObserver();
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(OnEvent, void(Events event, int extra));
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OnDemandTester {
17668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public:
17768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  static ComponentUpdateService::Status OnDemand(
17868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      ComponentUpdateService* cus, const std::string& component_id);
179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
18068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
18168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif  // CHROME_BROWSER_COMPONENT_UPDATER_TEST_COMPONENT_UPDATER_SERVICE_UNITTEST_H_
18268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)