component_updater_service_unittest.h revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
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>
13ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/basictypes.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/compiler_specific.h"
15ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/files/file_path.h"
16ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/memory/ref_counted.h"
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/memory/scoped_ptr.h"
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/component_updater/component_updater_service.h"
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/component_updater/test/component_patcher_mock.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"
22ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "net/url_request/url_request_test_util.h"
23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass TestInstaller;
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// component 1 has extension id "jebgalgnebhfojomionfpkfelancnnkf", and
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// the RSA public key the following hash:
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst uint8 jebg_hash[] = {0x94, 0x16, 0x0b, 0x6d, 0x41, 0x75, 0xe9, 0xec,
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           0x8e, 0xd5, 0xfa, 0x54, 0xb0, 0xd2, 0xdd, 0xa5,
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           0x6e, 0x05, 0x6b, 0xe8, 0x73, 0x47, 0xf6, 0xc4,
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           0x11, 0x9f, 0xbc, 0xb3, 0x09, 0xb3, 0x5b, 0x40};
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// component 2 has extension id "abagagagagagagagagagagagagagagag", and
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// the RSA public key the following hash:
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst uint8 abag_hash[] = {0x01, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x01};
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// component 3 has extension id "ihfokbkgjpifnbbojhneepfflplebdkc", and
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// the RSA public key the following hash:
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst uint8 ihfo_hash[] = {0x87, 0x5e, 0xa1, 0xa6, 0x9f, 0x85, 0xd1, 0x1e,
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           0x97, 0xd4, 0x4f, 0x55, 0xbf, 0xb4, 0x13, 0xa2,
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           0xe7, 0xc5, 0xc8, 0xf5, 0x60, 0x19, 0x78, 0x1b,
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           0x6d, 0xe9, 0x4c, 0xeb, 0x96, 0x05, 0x42, 0x17};
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass TestConfigurator : public ComponentUpdateService::Configurator {
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public:
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  explicit TestConfigurator();
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual ~TestConfigurator();
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual int InitialDelay() OVERRIDE;
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  typedef std::pair<CrxComponent*, int> CheckAtLoopCount;
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual int NextCheckDelay() OVERRIDE;
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual int StepDelay() OVERRIDE;
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual int StepDelayMedium() OVERRIDE;
623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual int MinimumReCheckWait() OVERRIDE;
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual int OnDemandDelay() OVERRIDE;
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual GURL UpdateUrl() OVERRIDE;
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
69ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  virtual GURL PingUrl() OVERRIDE;
70ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual const char* ExtraRequestParams() OVERRIDE;
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual size_t UrlSizeLimit() OVERRIDE;
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual net::URLRequestContextGetter* RequestContext() OVERRIDE;
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Don't use the utility process to decode files.
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual bool InProcess() OVERRIDE;
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual ComponentPatcher* CreateComponentPatcher() OVERRIDE;
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual bool DeltasEnabled() const OVERRIDE;
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void SetLoopCount(int times);
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void SetRecheckTime(int seconds);
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void SetOnDemandTime(int seconds);
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void AddComponentToCheck(CrxComponent* com, int at_loop_iter);
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void SetComponentUpdateService(ComponentUpdateService* cus);
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void SetQuitClosure(const base::Closure& quit_closure);
954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private:
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int times_;
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int recheck_time_;
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int ondemand_time_;
100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::list<CheckAtLoopCount> components_to_check_;
102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ComponentUpdateService* cus_;
103ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  scoped_refptr<net::TestURLRequestContextGetter> context_;
1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::Closure quit_closure_;
105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass ComponentUpdaterTest : public testing::Test {
108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public:
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  enum TestComponents {
110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    kTestComponent_abag,
111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    kTestComponent_jebg,
112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    kTestComponent_ihfo,
113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  };
114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ComponentUpdaterTest();
116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual ~ComponentUpdaterTest();
118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void TearDown();
120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ComponentUpdateService* component_updater();
122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Makes the full path to a component updater test file.
124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const base::FilePath test_file(const char* file);
125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestConfigurator* test_configurator();
127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ComponentUpdateService::Status RegisterComponent(CrxComponent* com,
129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                                   TestComponents component,
130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                                   const Version& version,
131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                                   TestInstaller* installer);
1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
133ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch protected:
1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void RunThreads();
1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void RunThreadsUntilIdle();
136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private:
138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestConfigurator* test_config_;
139ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  base::FilePath test_data_dir_;
1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  content::TestBrowserThreadBundle thread_bundle_;
141ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  scoped_ptr<ComponentUpdateService> component_updater_;
142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst char expected_crx_url[] =
145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    "http://localhost/download/jebgalgnebhfojomionfpkfelancnnkf.crx";
146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
147ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochclass PingChecker : public RequestCounter {
148ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch public:
149ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  explicit PingChecker(const std::map<std::string, std::string>& attributes);
150ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
151ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  virtual ~PingChecker();
152ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
153ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  virtual void Trial(net::URLRequest* request) OVERRIDE;
154ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
155ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  int NumHits() const {
156ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return num_hits_;
157ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
158ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  int NumMisses() const {
159ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return num_misses_;
160ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
1613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::string GetPings() const;
162ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
163ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch private:
1643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::vector<std::string> pings_;
165ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  int num_hits_;
166ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  int num_misses_;
167ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  const std::map<std::string, std::string> attributes_;
168ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  virtual bool Test(net::URLRequest* request);
169ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch};
170ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
171a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class MockComponentObserver : public ComponentObserver {
172a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public:
173a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  MockComponentObserver();
174a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ~MockComponentObserver();
175a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  MOCK_METHOD2(OnEvent, void(Events event, int extra));
176a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
177a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif  // CHROME_BROWSER_COMPONENT_UPDATER_TEST_COMPONENT_UPDATER_SERVICE_UNITTEST_H_
179