Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(143)

Side by Side Diff: chrome/browser/component_updater/test/component_updater_service_unittest.cc

Issue 74893002: Changed the update protocol for component updater from v2 to v3. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Addressed feedback from cdn@ Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/component_updater/test/component_updater_service_unitte st.h" 5 #include "chrome/browser/component_updater/test/component_updater_service_unitte st.h"
6 #include "base/file_util.h" 6 #include "base/file_util.h"
7 #include "base/path_service.h" 7 #include "base/path_service.h"
8 #include "base/run_loop.h" 8 #include "base/run_loop.h"
9 #include "base/strings/string_number_conversions.h" 9 #include "base/strings/string_number_conversions.h"
10 #include "base/strings/stringprintf.h" 10 #include "base/strings/stringprintf.h"
11 #include "base/values.h" 11 #include "base/values.h"
12 #include "chrome/browser/component_updater/test/test_installer.h" 12 #include "chrome/browser/component_updater/test/test_installer.h"
13 #include "chrome/common/chrome_paths.h" 13 #include "chrome/common/chrome_paths.h"
14 #include "content/public/browser/browser_thread.h" 14 #include "content/public/browser/browser_thread.h"
15 #include "content/test/net/url_request_prepackaged_interceptor.h"
16 #include "libxml/globals.h" 15 #include "libxml/globals.h"
17 #include "net/base/upload_bytes_element_reader.h" 16 #include "net/base/upload_bytes_element_reader.h"
18 #include "net/url_request/url_fetcher.h" 17 #include "net/url_request/url_fetcher.h"
19 #include "url/gurl.h" 18 #include "url/gurl.h"
20 19
21 using content::BrowserThread; 20 using content::BrowserThread;
22 21
23 using ::testing::_; 22 using ::testing::_;
24 using ::testing::InSequence; 23 using ::testing::InSequence;
25 using ::testing::Mock; 24 using ::testing::Mock;
26 25
27 namespace component_updater { 26 namespace component_updater {
28 27
28 #define POST_INTERCEPT_SCHEME "http"
29 #define POST_INTERCEPT_HOSTNAME "localhost2"
30 #define POST_INTERCEPT_PATH "/update2"
31
29 MockComponentObserver::MockComponentObserver() { 32 MockComponentObserver::MockComponentObserver() {
30 } 33 }
31 34
32 MockComponentObserver::~MockComponentObserver() { 35 MockComponentObserver::~MockComponentObserver() {
33 } 36 }
34 37
35 TestConfigurator::TestConfigurator() 38 TestConfigurator::TestConfigurator()
36 : times_(1), 39 : times_(1),
37 recheck_time_(0), 40 recheck_time_(0),
38 ondemand_time_(0), 41 ondemand_time_(0),
(...skipping 29 matching lines...) Expand all
68 71
69 int TestConfigurator::MinimumReCheckWait() { 72 int TestConfigurator::MinimumReCheckWait() {
70 return recheck_time_; 73 return recheck_time_;
71 } 74 }
72 75
73 int TestConfigurator::OnDemandDelay() { 76 int TestConfigurator::OnDemandDelay() {
74 return ondemand_time_; 77 return ondemand_time_;
75 } 78 }
76 79
77 GURL TestConfigurator::UpdateUrl() { 80 GURL TestConfigurator::UpdateUrl() {
78 return GURL("http://localhost/upd"); 81 return GURL(POST_INTERCEPT_SCHEME "://"
82 POST_INTERCEPT_HOSTNAME POST_INTERCEPT_PATH);
79 } 83 }
80 84
81 GURL TestConfigurator::PingUrl() { 85 GURL TestConfigurator::PingUrl() {
82 return GURL("http://localhost2/update2"); 86 return UpdateUrl();
83 } 87 }
84 88
85 const char* TestConfigurator::ExtraRequestParams() { return "extra=foo"; } 89 const char* TestConfigurator::ExtraRequestParams() { return "extra=foo"; }
86 90
87 size_t TestConfigurator::UrlSizeLimit() { return 256; } 91 size_t TestConfigurator::UrlSizeLimit() { return 256; }
88 92
89 net::URLRequestContextGetter* TestConfigurator::RequestContext() { 93 net::URLRequestContextGetter* TestConfigurator::RequestContext() {
90 return context_.get(); 94 return context_.get();
91 } 95 }
92 96
(...skipping 22 matching lines...) Expand all
115 void TestConfigurator::SetComponentUpdateService(ComponentUpdateService* cus) { 119 void TestConfigurator::SetComponentUpdateService(ComponentUpdateService* cus) {
116 cus_ = cus; 120 cus_ = cus;
117 } 121 }
118 122
119 void TestConfigurator::SetQuitClosure(const base::Closure& quit_closure) { 123 void TestConfigurator::SetQuitClosure(const base::Closure& quit_closure) {
120 quit_closure_ = quit_closure; 124 quit_closure_ = quit_closure;
121 } 125 }
122 126
123 127
124 InterceptorFactory::InterceptorFactory() 128 InterceptorFactory::InterceptorFactory()
125 : URLRequestPostInterceptorFactory("http", "localhost2") {} 129 : URLRequestPostInterceptorFactory(POST_INTERCEPT_SCHEME,
130 POST_INTERCEPT_HOSTNAME) {}
126 131
127 InterceptorFactory::~InterceptorFactory() {} 132 InterceptorFactory::~InterceptorFactory() {}
128 133
129 URLRequestPostInterceptor* InterceptorFactory::CreateInterceptor() { 134 URLRequestPostInterceptor* InterceptorFactory::CreateInterceptor() {
130 return URLRequestPostInterceptorFactory::CreateInterceptor("/update2"); 135 return URLRequestPostInterceptorFactory::CreateInterceptor(
136 base::FilePath::FromUTF8Unsafe(POST_INTERCEPT_PATH));
131 } 137 }
132 138
133 class PartialMatch : public URLRequestPostInterceptor::RequestMatcher { 139 class PartialMatch : public URLRequestPostInterceptor::RequestMatcher {
134 public: 140 public:
135 explicit PartialMatch(const std::string& expected) : expected_(expected) {} 141 explicit PartialMatch(const std::string& expected) : expected_(expected) {}
136 virtual bool Match(const std::string& actual) const OVERRIDE { 142 virtual bool Match(const std::string& actual) const OVERRIDE {
137 return actual.find(expected_) != std::string::npos; 143 return actual.find(expected_) != std::string::npos;
138 } 144 }
139 145
140 private: 146 private:
(...skipping 15 matching lines...) Expand all
156 test_data_dir_ = test_data_dir_.AppendASCII("components"); 162 test_data_dir_ = test_data_dir_.AppendASCII("components");
157 163
158 net::URLFetcher::SetEnableInterceptionForTests(true); 164 net::URLFetcher::SetEnableInterceptionForTests(true);
159 } 165 }
160 166
161 ComponentUpdaterTest::~ComponentUpdaterTest() { 167 ComponentUpdaterTest::~ComponentUpdaterTest() {
162 net::URLFetcher::SetEnableInterceptionForTests(false); 168 net::URLFetcher::SetEnableInterceptionForTests(false);
163 } 169 }
164 170
165 void ComponentUpdaterTest::SetUp() { 171 void ComponentUpdaterTest::SetUp() {
172 get_interceptor_.reset(new GetInterceptor);
166 interceptor_factory_.reset(new InterceptorFactory); 173 interceptor_factory_.reset(new InterceptorFactory);
174 post_interceptor_ = interceptor_factory_->CreateInterceptor();
175 EXPECT_TRUE(post_interceptor_);
167 } 176 }
168 177
169 void ComponentUpdaterTest::TearDown() { 178 void ComponentUpdaterTest::TearDown() {
170 interceptor_factory_.reset(); 179 interceptor_factory_.reset();
180 get_interceptor_.reset();
171 xmlCleanupGlobals(); 181 xmlCleanupGlobals();
172 } 182 }
173 183
174 ComponentUpdateService* ComponentUpdaterTest::component_updater() { 184 ComponentUpdateService* ComponentUpdaterTest::component_updater() {
175 return component_updater_.get(); 185 return component_updater_.get();
176 } 186 }
177 187
178 // Makes the full path to a component updater test file. 188 // Makes the full path to a component updater test file.
179 const base::FilePath ComponentUpdaterTest::test_file(const char* file) { 189 const base::FilePath ComponentUpdaterTest::test_file(const char* file) {
180 return test_data_dir_.AppendASCII(file); 190 return test_data_dir_.AppendASCII(file);
(...skipping 20 matching lines...) Expand all
201 } 211 }
202 com->version = version; 212 com->version = version;
203 com->installer = installer; 213 com->installer = installer;
204 return component_updater_->RegisterComponent(*com); 214 return component_updater_->RegisterComponent(*com);
205 } 215 }
206 216
207 void ComponentUpdaterTest::RunThreads() { 217 void ComponentUpdaterTest::RunThreads() {
208 base::RunLoop runloop; 218 base::RunLoop runloop;
209 test_configurator()->SetQuitClosure(runloop.QuitClosure()); 219 test_configurator()->SetQuitClosure(runloop.QuitClosure());
210 runloop.Run(); 220 runloop.Run();
221
222 // Since some tests need to drain currently enqueued tasks such as network
223 // intercepts on the IO thread, run the threads until they are
224 // idle. The component updater service won't loop again until the loop count
225 // is set and the service is started.
226 RunThreadsUntilIdle();
211 } 227 }
212 228
213 void ComponentUpdaterTest::RunThreadsUntilIdle() { 229 void ComponentUpdaterTest::RunThreadsUntilIdle() {
214 base::RunLoop().RunUntilIdle(); 230 base::RunLoop().RunUntilIdle();
215 } 231 }
216 232
217 ComponentUpdateService::Status OnDemandTester::OnDemand( 233 ComponentUpdateService::Status OnDemandTester::OnDemand(
218 ComponentUpdateService* cus, const std::string& component_id) { 234 ComponentUpdateService* cus, const std::string& component_id) {
219 return cus->OnDemandUpdate(component_id); 235 return cus->OnDemandUpdate(component_id);
220 } 236 }
221 237
222 // Verify that our test fixture work and the component updater can 238 // Verify that our test fixture work and the component updater can
223 // be created and destroyed with no side effects. 239 // be created and destroyed with no side effects.
224 TEST_F(ComponentUpdaterTest, VerifyFixture) { 240 TEST_F(ComponentUpdaterTest, VerifyFixture) {
225 EXPECT_TRUE(component_updater() != NULL); 241 EXPECT_TRUE(component_updater() != NULL);
226 } 242 }
227 243
228 // Verify that the component updater can be caught in a quick 244 // Verify that the component updater can be caught in a quick
229 // start-shutdown situation. Failure of this test will be a crash. 245 // start-shutdown situation. Failure of this test will be a crash.
230 TEST_F(ComponentUpdaterTest, StartStop) { 246 TEST_F(ComponentUpdaterTest, StartStop) {
231 component_updater()->Start(); 247 component_updater()->Start();
232 RunThreadsUntilIdle(); 248 RunThreadsUntilIdle();
233 component_updater()->Stop(); 249 component_updater()->Stop();
234 } 250 }
235 251
236 // Verify that when the server has no updates, we go back to sleep and 252 // Verify that when the server has no updates, we go back to sleep and
237 // the COMPONENT_UPDATER_STARTED and COMPONENT_UPDATER_SLEEPING notifications 253 // the COMPONENT_UPDATER_STARTED and COMPONENT_UPDATER_SLEEPING notifications
238 // are generated. No pings are sent. 254 // are generated. No pings are sent.
239 TEST_F(ComponentUpdaterTest, CheckCrxSleep) { 255 TEST_F(ComponentUpdaterTest, CheckCrxSleep) {
240 URLRequestPostInterceptor* post_interceptor( 256 MockComponentObserver observer;
241 interceptor_factory_->CreateInterceptor());
242 EXPECT_TRUE(post_interceptor != NULL);
243 EXPECT_TRUE(post_interceptor->ExpectRequest(new PartialMatch(
244 "event eventtype")));
245 257
246 content::URLLocalHostRequestPrepackagedInterceptor interceptor; 258 EXPECT_CALL(observer,
259 OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
260 .Times(1);
261 EXPECT_CALL(observer,
262 OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
263 .Times(2);
264 EXPECT_CALL(observer,
265 OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
266 .Times(2);
247 267
248 MockComponentObserver observer; 268 EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
269 "updatecheck"), test_file("updatecheck_reply_1.xml")));
270 EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
271 "updatecheck"), test_file("updatecheck_reply_1.xml")));
249 272
250 TestInstaller installer; 273 TestInstaller installer;
251 CrxComponent com; 274 CrxComponent com;
252 com.observer = &observer; 275 com.observer = &observer;
253 EXPECT_EQ(ComponentUpdateService::kOk, 276 EXPECT_EQ(ComponentUpdateService::kOk,
254 RegisterComponent(&com, 277 RegisterComponent(&com,
255 kTestComponent_abag, 278 kTestComponent_abag,
256 Version("1.1"), 279 Version("1.1"),
257 &installer)); 280 &installer));
258 281
259 const GURL expected_update_url(
260 "http://localhost/upd?extra=foo"
261 "&x=id%3Dabagagagagagagagagagagagagagagag%26v%3D1.1%26fp%3D%26uc");
262
263 interceptor.SetResponse(expected_update_url,
264 test_file("updatecheck_reply_1.xml"));
265
266 // We loop twice, but there are no updates so we expect two sleep messages. 282 // We loop twice, but there are no updates so we expect two sleep messages.
267 test_configurator()->SetLoopCount(2); 283 test_configurator()->SetLoopCount(2);
268
269 EXPECT_CALL(observer,
270 OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
271 .Times(1);
272 component_updater()->Start(); 284 component_updater()->Start();
273
274 EXPECT_CALL(observer,
275 OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
276 .Times(2);
277
278 EXPECT_CALL(observer,
279 OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
280 .Times(2);
281 RunThreads(); 285 RunThreads();
282 286
283 EXPECT_EQ(2, interceptor.GetHitCount());
284
285 EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error()); 287 EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
286 EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count()); 288 EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count());
287 289
290 // Expect to see the two update check requests and no other requests,
291 // including pings.
292 EXPECT_EQ(2, post_interceptor_->GetHitCount())
293 << post_interceptor_->GetRequestsAsString();
294 EXPECT_EQ(2, post_interceptor_->GetCount())
295 << post_interceptor_->GetRequestsAsString();
296 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
297 "<app appid=\"abagagagagagagagagagagagagagagag\" version=\"1.1\">"
298 "<updatecheck /></app>"))
299 << post_interceptor_->GetRequestsAsString();
300 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[1].find(
301 "<app appid=\"abagagagagagagagagagagagagagagag\" version=\"1.1\">"
302 "<updatecheck /></app>"))
303 << post_interceptor_->GetRequestsAsString();
304
288 component_updater()->Stop(); 305 component_updater()->Stop();
289 306
290 // Loop twice again but this case we simulate a server error by returning 307 // Loop twice again but this case we simulate a server error by returning
291 // an empty file. 308 // an empty file. Expect the behavior of the service to be the same as before.
292
293 interceptor.SetResponse(expected_update_url,
294 test_file("updatecheck_reply_empty"));
295
296 test_configurator()->SetLoopCount(2);
297
298 EXPECT_CALL(observer, 309 EXPECT_CALL(observer,
299 OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0)) 310 OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
300 .Times(1); 311 .Times(1);
301 component_updater()->Start();
302
303 EXPECT_CALL(observer, 312 EXPECT_CALL(observer,
304 OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0)) 313 OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
305 .Times(2); 314 .Times(2);
306 EXPECT_CALL(observer, 315 EXPECT_CALL(observer,
307 OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0)) 316 OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
308 .Times(2); 317 .Times(2);
318
319 post_interceptor_->Reset();
320 EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
321 "updatecheck"), test_file("updatecheck_reply_empty")));
322 EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
323 "updatecheck"), test_file("updatecheck_reply_empty")));
324
325 test_configurator()->SetLoopCount(2);
326 component_updater()->Start();
309 RunThreads(); 327 RunThreads();
310 328
311 EXPECT_EQ(0, post_interceptor->GetHitCount())
312 << post_interceptor->GetRequestsAsString();
313 EXPECT_EQ(0, post_interceptor->GetMissCount())
314 << post_interceptor->GetRequestsAsString();
315
316 EXPECT_EQ(4, interceptor.GetHitCount());
317
318 EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error()); 329 EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
319 EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count()); 330 EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count());
320 331
332 EXPECT_EQ(2, post_interceptor_->GetHitCount())
333 << post_interceptor_->GetRequestsAsString();
334 EXPECT_EQ(2, post_interceptor_->GetCount())
335 << post_interceptor_->GetRequestsAsString();
336 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
337 "<app appid=\"abagagagagagagagagagagagagagagag\" version=\"1.1\">"
338 "<updatecheck /></app>"))
339 << post_interceptor_->GetRequestsAsString();
340 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[1].find(
341 "<app appid=\"abagagagagagagagagagagagagagagag\" version=\"1.1\">"
342 "<updatecheck /></app>"))
343 << post_interceptor_->GetRequestsAsString();
344
321 component_updater()->Stop(); 345 component_updater()->Stop();
322 } 346 }
323 347
324 // Verify that we can check for updates and install one component. Besides 348 // Verify that we can check for updates and install one component. Besides
325 // the notifications above COMPONENT_UPDATE_FOUND and COMPONENT_UPDATE_READY 349 // the notifications above COMPONENT_UPDATE_FOUND and COMPONENT_UPDATE_READY
326 // should have been fired. We do two loops so the second time around there 350 // should have been fired. We do two loops so the second time around there
327 // should be nothing left to do. 351 // should be nothing left to do.
328 // We also check that only 3 non-ping network requests are issued: 352 // We also check that the following network requests are issued:
329 // 1- manifest check 353 // 1- manifest check
330 // 2- download crx 354 // 2- download crx
331 // 3- second manifest check. 355 // 3- ping
332 // Only one ping is sent. 356 // 4- second manifest check.
333 TEST_F(ComponentUpdaterTest, InstallCrx) { 357 TEST_F(ComponentUpdaterTest, InstallCrx) {
334 URLRequestPostInterceptor* post_interceptor(
335 interceptor_factory_->CreateInterceptor());
336 EXPECT_TRUE(post_interceptor != NULL);
337 EXPECT_TRUE(post_interceptor->ExpectRequest(new PartialMatch(
338 "<o:app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"1.0\">"
339 "<o:event eventtype=\"3\" eventresult=\"1\" "
340 "previousversion=\"0.9\" nextversion=\"1.0\"/></o:app>")));
341
342 content::URLLocalHostRequestPrepackagedInterceptor interceptor;
343
344 MockComponentObserver observer1; 358 MockComponentObserver observer1;
345 { 359 {
346 InSequence seq; 360 InSequence seq;
347 EXPECT_CALL(observer1, 361 EXPECT_CALL(observer1,
348 OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0)) 362 OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
349 .Times(1); 363 .Times(1);
350 EXPECT_CALL(observer1, 364 EXPECT_CALL(observer1,
351 OnEvent(ComponentObserver::COMPONENT_UPDATE_FOUND, 0)) 365 OnEvent(ComponentObserver::COMPONENT_UPDATE_FOUND, 0))
352 .Times(1); 366 .Times(1);
353 EXPECT_CALL(observer1, 367 EXPECT_CALL(observer1,
(...skipping 26 matching lines...) Expand all
380 OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0)) 394 OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
381 .Times(1); 395 .Times(1);
382 EXPECT_CALL(observer2, 396 EXPECT_CALL(observer2,
383 OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0)) 397 OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
384 .Times(1); 398 .Times(1);
385 EXPECT_CALL(observer2, 399 EXPECT_CALL(observer2,
386 OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0)) 400 OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
387 .Times(1); 401 .Times(1);
388 } 402 }
389 403
404 EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
405 "updatecheck"), test_file("updatecheck_reply_1.xml")));
406 EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
407 EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
408 "updatecheck"), test_file("updatecheck_reply_1.xml")));
409
410 get_interceptor_->SetResponse(
411 GURL(expected_crx_url),
412 test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
413
390 TestInstaller installer1; 414 TestInstaller installer1;
391 CrxComponent com1; 415 CrxComponent com1;
392 com1.observer = &observer1; 416 com1.observer = &observer1;
393 RegisterComponent(&com1, kTestComponent_jebg, Version("0.9"), &installer1); 417 RegisterComponent(&com1, kTestComponent_jebg, Version("0.9"), &installer1);
394 TestInstaller installer2; 418 TestInstaller installer2;
395 CrxComponent com2; 419 CrxComponent com2;
396 com2.observer = &observer2; 420 com2.observer = &observer2;
397 RegisterComponent(&com2, kTestComponent_abag, Version("2.2"), &installer2); 421 RegisterComponent(&com2, kTestComponent_abag, Version("2.2"), &installer2);
398 422
399 const GURL expected_update_url_1(
400 "http://localhost/upd?extra=foo"
401 "&x=id%3Djebgalgnebhfojomionfpkfelancnnkf%26v%3D0.9%26fp%3D%26uc"
402 "&x=id%3Dabagagagagagagagagagagagagagagag%26v%3D2.2%26fp%3D%26uc");
403
404 const GURL expected_update_url_2(
405 "http://localhost/upd?extra=foo"
406 "&x=id%3Dabagagagagagagagagagagagagagagag%26v%3D2.2%26fp%3D%26uc"
407 "&x=id%3Djebgalgnebhfojomionfpkfelancnnkf%26v%3D1.0%26fp%3D%26uc");
408
409 interceptor.SetResponse(expected_update_url_1,
410 test_file("updatecheck_reply_1.xml"));
411 interceptor.SetResponse(expected_update_url_2,
412 test_file("updatecheck_reply_1.xml"));
413 interceptor.SetResponse(GURL(expected_crx_url),
414 test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
415
416 test_configurator()->SetLoopCount(2); 423 test_configurator()->SetLoopCount(2);
417
418 component_updater()->Start(); 424 component_updater()->Start();
419 RunThreads(); 425 RunThreads();
420 426
421 EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error()); 427 EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error());
422 EXPECT_EQ(1, static_cast<TestInstaller*>(com1.installer)->install_count()); 428 EXPECT_EQ(1, static_cast<TestInstaller*>(com1.installer)->install_count());
423 EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error()); 429 EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error());
424 EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->install_count()); 430 EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->install_count());
425 431
426 EXPECT_EQ(3, interceptor.GetHitCount()); 432 // Expect three request in total: two update checks and one ping.
433 EXPECT_EQ(3, post_interceptor_->GetHitCount())
434 << post_interceptor_->GetRequestsAsString();
435 EXPECT_EQ(3, post_interceptor_->GetCount())
436 << post_interceptor_->GetRequestsAsString();
427 437
428 EXPECT_EQ(1, post_interceptor->GetHitCount()) 438 // Expect one component download.
429 << post_interceptor->GetRequestsAsString(); 439 EXPECT_EQ(1, get_interceptor_->GetHitCount());
430 EXPECT_EQ(0, post_interceptor->GetMissCount()) 440
431 << post_interceptor->GetRequestsAsString(); 441 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
442 "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"0.9\">"
443 "<updatecheck /></app>"))
444 << post_interceptor_->GetRequestsAsString();
445 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
446 "<app appid=\"abagagagagagagagagagagagagagagag\" version=\"2.2\">"
447 "<updatecheck /></app>"))
448 << post_interceptor_->GetRequestsAsString();
449
450 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[1].find(
451 "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" "
452 "version=\"0.9\" nextversion=\"1.0\">"
453 "<event eventtype=\"3\" eventresult=\"1\"/></app>"))
454 << post_interceptor_->GetRequestsAsString();
455
456 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[2].find(
457 "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"1.0\">"
458 "<updatecheck /></app>"));
459 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[2].find(
460 "<app appid=\"abagagagagagagagagagagagagagagag\" version=\"2.2\">"
461 "<updatecheck /></app>"))
462 << post_interceptor_->GetRequestsAsString();
432 463
433 component_updater()->Stop(); 464 component_updater()->Stop();
434 } 465 }
435 466
436 // This test checks that the "prodversionmin" value is handled correctly. In 467 // This test checks that the "prodversionmin" value is handled correctly. In
437 // particular there should not be an install because the minimum product 468 // particular there should not be an install because the minimum product
438 // version is much higher than of chrome. 469 // version is much higher than of chrome.
439 TEST_F(ComponentUpdaterTest, ProdVersionCheck) { 470 TEST_F(ComponentUpdaterTest, ProdVersionCheck) {
440 URLRequestPostInterceptor* post_interceptor( 471 EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
441 interceptor_factory_->CreateInterceptor()); 472 "updatecheck"), test_file("updatecheck_reply_2.xml")));
442 EXPECT_TRUE(post_interceptor != NULL);
443 EXPECT_TRUE(post_interceptor->ExpectRequest(new PartialMatch(
444 "event eventtype")));
445 473
446 content::URLLocalHostRequestPrepackagedInterceptor interceptor; 474 get_interceptor_->SetResponse(
475 GURL(expected_crx_url),
476 test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
447 477
448 TestInstaller installer; 478 TestInstaller installer;
449 CrxComponent com; 479 CrxComponent com;
450 RegisterComponent(&com, kTestComponent_jebg, Version("0.9"), &installer); 480 RegisterComponent(&com, kTestComponent_jebg, Version("0.9"), &installer);
451 481
452 const GURL expected_update_url(
453 "http://localhost/upd?extra=foo&x=id%3D"
454 "jebgalgnebhfojomionfpkfelancnnkf%26v%3D0.9%26fp%3D%26uc");
455
456 interceptor.SetResponse(expected_update_url,
457 test_file("updatecheck_reply_2.xml"));
458 interceptor.SetResponse(GURL(expected_crx_url),
459 test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
460
461 test_configurator()->SetLoopCount(1); 482 test_configurator()->SetLoopCount(1);
462 component_updater()->Start(); 483 component_updater()->Start();
463 RunThreads(); 484 RunThreads();
464 485
465 EXPECT_EQ(0, post_interceptor->GetHitCount()) 486 // Expect one update check and no ping.
466 << post_interceptor->GetRequestsAsString(); 487 EXPECT_EQ(1, post_interceptor_->GetHitCount())
467 EXPECT_EQ(1, interceptor.GetHitCount()); 488 << post_interceptor_->GetRequestsAsString();
489 EXPECT_EQ(1, post_interceptor_->GetCount())
490 << post_interceptor_->GetRequestsAsString();
491
492 // Expect no download to occur.
493 EXPECT_EQ(0, get_interceptor_->GetHitCount());
468 494
469 EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error()); 495 EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
470 EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count()); 496 EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count());
471 497
472 component_updater()->Stop(); 498 component_updater()->Stop();
473 } 499 }
474 500
475 // Test that a update check due to an on demand call can cause installs. 501 // Test that a update check due to an on demand call can cause installs.
476 // Here is the timeline: 502 // Here is the timeline:
477 // - First loop: we return a reply that indicates no update, so 503 // - First loop: we return a reply that indicates no update, so
478 // nothing happens. 504 // nothing happens.
479 // - We make an on demand call. 505 // - We make an on demand call.
480 // - This triggers a second loop, which has a reply that triggers an install. 506 // - This triggers a second loop, which has a reply that triggers an install.
481 TEST_F(ComponentUpdaterTest, OnDemandUpdate) { 507 TEST_F(ComponentUpdaterTest, OnDemandUpdate) {
482 URLRequestPostInterceptor* post_interceptor(
483 interceptor_factory_->CreateInterceptor());
484 EXPECT_TRUE(post_interceptor != NULL);
485 EXPECT_TRUE(post_interceptor->ExpectRequest(new PartialMatch(
486 "<o:app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"1.0\">"
487 "<o:event eventtype=\"3\" eventresult=\"1\" "
488 "previousversion=\"0.9\" nextversion=\"1.0\"/></o:app>")));
489
490 content::URLLocalHostRequestPrepackagedInterceptor interceptor;
491
492 MockComponentObserver observer1; 508 MockComponentObserver observer1;
493 { 509 {
494 InSequence seq; 510 InSequence seq;
495 EXPECT_CALL(observer1, 511 EXPECT_CALL(observer1,
496 OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0)) 512 OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
497 .Times(1); 513 .Times(1);
498 EXPECT_CALL(observer1, 514 EXPECT_CALL(observer1,
499 OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0)) 515 OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
500 .Times(1); 516 .Times(1);
501 EXPECT_CALL(observer1, 517 EXPECT_CALL(observer1,
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
534 OnEvent(ComponentObserver::COMPONENT_UPDATE_READY, 0)) 550 OnEvent(ComponentObserver::COMPONENT_UPDATE_READY, 0))
535 .Times(1); 551 .Times(1);
536 EXPECT_CALL(observer2, 552 EXPECT_CALL(observer2,
537 OnEvent(ComponentObserver::COMPONENT_UPDATED, 0)) 553 OnEvent(ComponentObserver::COMPONENT_UPDATED, 0))
538 .Times(1); 554 .Times(1);
539 EXPECT_CALL(observer2, 555 EXPECT_CALL(observer2,
540 OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0)) 556 OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
541 .Times(1); 557 .Times(1);
542 } 558 }
543 559
560 EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
561 "updatecheck"), test_file("updatecheck_reply_empty")));
562
563 get_interceptor_->SetResponse(
564 GURL(expected_crx_url),
565 test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
566
544 TestInstaller installer1; 567 TestInstaller installer1;
545 CrxComponent com1; 568 CrxComponent com1;
546 com1.observer = &observer1; 569 com1.observer = &observer1;
547 RegisterComponent(&com1, kTestComponent_abag, Version("2.2"), &installer1); 570 RegisterComponent(&com1, kTestComponent_abag, Version("2.2"), &installer1);
548 TestInstaller installer2; 571 TestInstaller installer2;
549 CrxComponent com2; 572 CrxComponent com2;
550 com2.observer = &observer2; 573 com2.observer = &observer2;
551 RegisterComponent(&com2, kTestComponent_jebg, Version("0.9"), &installer2); 574 RegisterComponent(&com2, kTestComponent_jebg, Version("0.9"), &installer2);
552 575
553 const GURL expected_update_url_1(
554 "http://localhost/upd?extra=foo"
555 "&x=id%3Dabagagagagagagagagagagagagagagag%26v%3D2.2%26fp%3D%26uc"
556 "&x=id%3Djebgalgnebhfojomionfpkfelancnnkf%26v%3D0.9%26fp%3D%26uc");
557
558 const GURL expected_update_url_2(
559 "http://localhost/upd?extra=foo"
560 "&x=id%3Djebgalgnebhfojomionfpkfelancnnkf%26v%3D0.9%26fp%3D%26uc"
561 "%26installsource%3Dondemand"
562 "&x=id%3Dabagagagagagagagagagagagagagagag%26v%3D2.2%26fp%3D%26uc");
563
564 interceptor.SetResponse(expected_update_url_1,
565 test_file("updatecheck_reply_empty"));
566 interceptor.SetResponse(expected_update_url_2,
567 test_file("updatecheck_reply_1.xml"));
568 interceptor.SetResponse(GURL(expected_crx_url),
569 test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
570 // No update normally. 576 // No update normally.
571 test_configurator()->SetLoopCount(1); 577 test_configurator()->SetLoopCount(1);
572 component_updater()->Start(); 578 component_updater()->Start();
573 RunThreads(); 579 RunThreads();
574 component_updater()->Stop(); 580 component_updater()->Stop();
575 581
582 EXPECT_EQ(1, post_interceptor_->GetHitCount())
583 << post_interceptor_->GetRequestsAsString();
584 EXPECT_EQ(1, post_interceptor_->GetCount())
585 << post_interceptor_->GetRequestsAsString();
586
587 EXPECT_EQ(0, get_interceptor_->GetHitCount());
588
576 // Update after an on-demand check is issued. 589 // Update after an on-demand check is issued.
590 post_interceptor_->Reset();
591 EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
592 "updatecheck"), test_file("updatecheck_reply_1.xml")));
593 EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
594
577 EXPECT_EQ(ComponentUpdateService::kOk, 595 EXPECT_EQ(ComponentUpdateService::kOk,
578 OnDemandTester::OnDemand(component_updater(), 596 OnDemandTester::OnDemand(component_updater(),
579 GetCrxComponentID(com2))); 597 GetCrxComponentID(com2)));
580 test_configurator()->SetLoopCount(1); 598 test_configurator()->SetLoopCount(1);
581 component_updater()->Start(); 599 component_updater()->Start();
582 RunThreads(); 600 RunThreads();
583 601
584 EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error()); 602 EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error());
585 EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->install_count()); 603 EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->install_count());
586 EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error()); 604 EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error());
587 EXPECT_EQ(1, static_cast<TestInstaller*>(com2.installer)->install_count()); 605 EXPECT_EQ(1, static_cast<TestInstaller*>(com2.installer)->install_count());
588 606
589 EXPECT_EQ(3, interceptor.GetHitCount()); 607 EXPECT_EQ(2, post_interceptor_->GetHitCount())
608 << post_interceptor_->GetRequestsAsString();
609 EXPECT_EQ(2, post_interceptor_->GetCount())
610 << post_interceptor_->GetRequestsAsString();
611
612 EXPECT_EQ(1, get_interceptor_->GetHitCount());
613
614 // Expect the update check to contain an "ondemand" request for the
615 // second component (com2) and a normal request for the other component.
616 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
617 "<app appid=\"abagagagagagagagagagagagagagagag\" "
618 "version=\"2.2\"><updatecheck /></app>"))
619 << post_interceptor_->GetRequestsAsString();
620 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
621 "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" "
622 "version=\"0.9\" installsource=\"ondemand\"><updatecheck /></app>"))
623 << post_interceptor_->GetRequestsAsString();
624 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[1].find(
625 "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" "
626 "version=\"0.9\" nextversion=\"1.0\">"
627 "<event eventtype=\"3\" eventresult=\"1\"/></app>"))
628 << post_interceptor_->GetRequestsAsString();
590 629
591 // Also check what happens if previous check too soon. 630 // Also check what happens if previous check too soon.
592 test_configurator()->SetOnDemandTime(60 * 60); 631 test_configurator()->SetOnDemandTime(60 * 60);
593 EXPECT_EQ(ComponentUpdateService::kError, 632 EXPECT_EQ(ComponentUpdateService::kError,
594 OnDemandTester::OnDemand(component_updater(), 633 OnDemandTester::OnDemand(component_updater(),
595 GetCrxComponentID(com2))); 634 GetCrxComponentID(com2)));
596 // Okay, now reset to 0 for the other tests. 635 // Okay, now reset to 0 for the other tests.
597 test_configurator()->SetOnDemandTime(0); 636 test_configurator()->SetOnDemandTime(0);
598 component_updater()->Stop(); 637 component_updater()->Stop();
599 638
(...skipping 19 matching lines...) Expand all
619 OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0)) 658 OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
620 .Times(1); 659 .Times(1);
621 EXPECT_CALL(observer2, 660 EXPECT_CALL(observer2,
622 OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0)) 661 OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
623 .Times(1); 662 .Times(1);
624 EXPECT_CALL(observer2, 663 EXPECT_CALL(observer2,
625 OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0)) 664 OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
626 .Times(1); 665 .Times(1);
627 } 666 }
628 667
629 const GURL expected_update_url_3( 668 // No update: error from no server response
630 "http://localhost/upd?extra=foo" 669 post_interceptor_->Reset();
631 "&x=id%3Djebgalgnebhfojomionfpkfelancnnkf%26v%3D1.0%26fp%3D%26uc" 670 EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
632 "&x=id%3Dabagagagagagagagagagagagagagagag%26v%3D2.2%26fp%3D%26uc"); 671 "updatecheck"), test_file("updatecheck_reply_empty")));
633 672
634 // No update: error from no server response
635 interceptor.SetResponse(expected_update_url_3,
636 test_file("updatecheck_reply_empty"));
637 test_configurator()->SetLoopCount(1); 673 test_configurator()->SetLoopCount(1);
638 component_updater()->Start(); 674 component_updater()->Start();
639 EXPECT_EQ(ComponentUpdateService::kOk, 675 EXPECT_EQ(ComponentUpdateService::kOk,
640 OnDemandTester::OnDemand(component_updater(), 676 OnDemandTester::OnDemand(component_updater(),
641 GetCrxComponentID(com2))); 677 GetCrxComponentID(com2)));
678 RunThreads();
679 component_updater()->Stop();
642 680
643 RunThreads(); 681 EXPECT_EQ(1, post_interceptor_->GetHitCount())
644 682 << post_interceptor_->GetRequestsAsString();
645 component_updater()->Stop(); 683 EXPECT_EQ(1, post_interceptor_->GetCount())
684 << post_interceptor_->GetRequestsAsString();
646 685
647 // No update: already updated to 1.0 so nothing new 686 // No update: already updated to 1.0 so nothing new
648 EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer1)); 687 EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer1));
649 { 688 {
650 InSequence seq; 689 InSequence seq;
651 EXPECT_CALL(observer1, 690 EXPECT_CALL(observer1,
652 OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0)) 691 OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
653 .Times(1); 692 .Times(1);
654 EXPECT_CALL(observer1, 693 EXPECT_CALL(observer1,
655 OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0)) 694 OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
656 .Times(1); 695 .Times(1);
657 EXPECT_CALL(observer1, 696 EXPECT_CALL(observer1,
658 OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0)) 697 OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
659 .Times(1); 698 .Times(1);
660 } 699 }
661 EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer2)); 700 EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer2));
662 { 701 {
663 InSequence seq; 702 InSequence seq;
664 EXPECT_CALL(observer2, 703 EXPECT_CALL(observer2,
665 OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0)) 704 OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
666 .Times(1); 705 .Times(1);
667 EXPECT_CALL(observer2, 706 EXPECT_CALL(observer2,
668 OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0)) 707 OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
669 .Times(1); 708 .Times(1);
670 EXPECT_CALL(observer2, 709 EXPECT_CALL(observer2,
671 OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0)) 710 OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
672 .Times(1); 711 .Times(1);
673 } 712 }
674 713
675 interceptor.SetResponse(expected_update_url_3, 714 post_interceptor_->Reset();
676 test_file("updatecheck_reply_1.xml")); 715 EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
716 "updatecheck"), test_file("updatecheck_reply_1.xml")));
717
677 test_configurator()->SetLoopCount(1); 718 test_configurator()->SetLoopCount(1);
678 component_updater()->Start(); 719 component_updater()->Start();
679 EXPECT_EQ(ComponentUpdateService::kOk, 720 EXPECT_EQ(ComponentUpdateService::kOk,
680 OnDemandTester::OnDemand(component_updater(), 721 OnDemandTester::OnDemand(component_updater(),
681 GetCrxComponentID(com2))); 722 GetCrxComponentID(com2)));
682
683 RunThreads(); 723 RunThreads();
684 724
685 EXPECT_EQ(1, post_interceptor->GetHitCount()) 725 EXPECT_EQ(1, post_interceptor_->GetHitCount())
686 << post_interceptor->GetRequestsAsString(); 726 << post_interceptor_->GetRequestsAsString();
687 EXPECT_EQ(0, post_interceptor->GetMissCount()) 727 EXPECT_EQ(1, post_interceptor_->GetCount())
688 << post_interceptor->GetRequestsAsString(); 728 << post_interceptor_->GetRequestsAsString();
689 729
690 component_updater()->Stop(); 730 component_updater()->Stop();
691 } 731 }
692 732
693 // Verify that a previously registered component can get re-registered 733 // Verify that a previously registered component can get re-registered
694 // with a different version. 734 // with a different version.
695 TEST_F(ComponentUpdaterTest, CheckReRegistration) { 735 TEST_F(ComponentUpdaterTest, CheckReRegistration) {
696 URLRequestPostInterceptor* post_interceptor(
697 interceptor_factory_->CreateInterceptor());
698 EXPECT_TRUE(post_interceptor != NULL);
699 EXPECT_TRUE(post_interceptor->ExpectRequest(new PartialMatch(
700 "<o:app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"1.0\">"
701 "<o:event eventtype=\"3\" eventresult=\"1\" "
702 "previousversion=\"0.9\" nextversion=\"1.0\"/></o:app>")));
703
704 content::URLLocalHostRequestPrepackagedInterceptor interceptor;
705
706 MockComponentObserver observer1; 736 MockComponentObserver observer1;
707 { 737 {
708 InSequence seq; 738 InSequence seq;
709 EXPECT_CALL(observer1, 739 EXPECT_CALL(observer1,
710 OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0)) 740 OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
711 .Times(1); 741 .Times(1);
712 EXPECT_CALL(observer1, 742 EXPECT_CALL(observer1,
713 OnEvent(ComponentObserver::COMPONENT_UPDATE_FOUND, 0)) 743 OnEvent(ComponentObserver::COMPONENT_UPDATE_FOUND, 0))
714 .Times(1); 744 .Times(1);
715 EXPECT_CALL(observer1, 745 EXPECT_CALL(observer1,
(...skipping 26 matching lines...) Expand all
742 OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0)) 772 OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
743 .Times(1); 773 .Times(1);
744 EXPECT_CALL(observer2, 774 EXPECT_CALL(observer2,
745 OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0)) 775 OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
746 .Times(1); 776 .Times(1);
747 EXPECT_CALL(observer2, 777 EXPECT_CALL(observer2,
748 OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0)) 778 OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
749 .Times(1); 779 .Times(1);
750 } 780 }
751 781
782 EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
783 "updatecheck"), test_file("updatecheck_reply_1.xml")));
784 EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
785 EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
786 "updatecheck"), test_file("updatecheck_reply_1.xml")));
787
788 get_interceptor_->SetResponse(
789 GURL(expected_crx_url),
790 test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
791
752 TestInstaller installer1; 792 TestInstaller installer1;
753 CrxComponent com1; 793 CrxComponent com1;
754 com1.observer = &observer1; 794 com1.observer = &observer1;
755 RegisterComponent(&com1, kTestComponent_jebg, Version("0.9"), &installer1); 795 RegisterComponent(&com1, kTestComponent_jebg, Version("0.9"), &installer1);
756 TestInstaller installer2; 796 TestInstaller installer2;
757 CrxComponent com2; 797 CrxComponent com2;
758 com2.observer = &observer2; 798 com2.observer = &observer2;
759 RegisterComponent(&com2, kTestComponent_abag, Version("2.2"), &installer2); 799 RegisterComponent(&com2, kTestComponent_abag, Version("2.2"), &installer2);
760 800
761 // Start with 0.9, and update to 1.0 801 // Loop twice to issue two checks: (1) with original 0.9 version, update to
762 const GURL expected_update_url_1( 802 // 1.0, and do the second check (2) with the updated 1.0 version.
763 "http://localhost/upd?extra=foo"
764 "&x=id%3Djebgalgnebhfojomionfpkfelancnnkf%26v%3D0.9%26fp%3D%26uc"
765 "&x=id%3Dabagagagagagagagagagagagagagagag%26v%3D2.2%26fp%3D%26uc");
766
767 const GURL expected_update_url_2(
768 "http://localhost/upd?extra=foo"
769 "&x=id%3Dabagagagagagagagagagagagagagagag%26v%3D2.2%26fp%3D%26uc"
770 "&x=id%3Djebgalgnebhfojomionfpkfelancnnkf%26v%3D1.0%26fp%3D%26uc");
771
772 interceptor.SetResponse(expected_update_url_1,
773 test_file("updatecheck_reply_1.xml"));
774 interceptor.SetResponse(expected_update_url_2,
775 test_file("updatecheck_reply_1.xml"));
776 interceptor.SetResponse(GURL(expected_crx_url),
777 test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
778
779 // Loop twice to issue two checks: (1) with original 0.9 version
780 // and (2) with the updated 1.0 version.
781 test_configurator()->SetLoopCount(2); 803 test_configurator()->SetLoopCount(2);
782
783 component_updater()->Start(); 804 component_updater()->Start();
784 RunThreads(); 805 RunThreads();
785 806
786 EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error()); 807 EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error());
787 EXPECT_EQ(1, static_cast<TestInstaller*>(com1.installer)->install_count()); 808 EXPECT_EQ(1, static_cast<TestInstaller*>(com1.installer)->install_count());
788 EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error()); 809 EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error());
789 EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->install_count()); 810 EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->install_count());
790 811
791 EXPECT_EQ(1, post_interceptor->GetHitCount()) 812 EXPECT_EQ(3, post_interceptor_->GetHitCount())
792 << post_interceptor->GetRequestsAsString(); 813 << post_interceptor_->GetRequestsAsString();
793 EXPECT_EQ(0, post_interceptor->GetMissCount()) 814 EXPECT_EQ(1, get_interceptor_->GetHitCount());
794 << post_interceptor->GetRequestsAsString();
795 815
796 EXPECT_EQ(3, interceptor.GetHitCount()); 816 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
817 "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"0.9\">"
818 "<updatecheck /></app>"))
819 << post_interceptor_->GetRequestsAsString();
820 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[1].find(
821 "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" "
822 "version=\"0.9\" nextversion=\"1.0\">"
823 "<event eventtype=\"3\" eventresult=\"1\"/></app>"))
824 << post_interceptor_->GetRequestsAsString();
825 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[2].find(
826 "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"1.0\">"
827 "<updatecheck /></app>"))
828 << post_interceptor_->GetRequestsAsString();
797 829
798 component_updater()->Stop(); 830 component_updater()->Stop();
799 831
800 // Now re-register, pretending to be an even newer version (2.2) 832 // Now re-register, pretending to be an even newer version (2.2)
801 EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer1)); 833 EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer1));
802 { 834 {
803 InSequence seq; 835 InSequence seq;
804 EXPECT_CALL(observer1, 836 EXPECT_CALL(observer1,
805 OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0)) 837 OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
806 .Times(1); 838 .Times(1);
(...skipping 12 matching lines...) Expand all
819 OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0)) 851 OnEvent(ComponentObserver::COMPONENT_UPDATER_STARTED, 0))
820 .Times(1); 852 .Times(1);
821 EXPECT_CALL(observer2, 853 EXPECT_CALL(observer2,
822 OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0)) 854 OnEvent(ComponentObserver::COMPONENT_NOT_UPDATED, 0))
823 .Times(1); 855 .Times(1);
824 EXPECT_CALL(observer2, 856 EXPECT_CALL(observer2,
825 OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0)) 857 OnEvent(ComponentObserver::COMPONENT_UPDATER_SLEEPING, 0))
826 .Times(1); 858 .Times(1);
827 } 859 }
828 860
861 post_interceptor_->Reset();
862 EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
863 "updatecheck"), test_file("updatecheck_reply_1.xml")));
864
829 TestInstaller installer3; 865 TestInstaller installer3;
830 EXPECT_EQ(ComponentUpdateService::kReplaced, 866 EXPECT_EQ(ComponentUpdateService::kReplaced,
831 RegisterComponent(&com1, 867 RegisterComponent(&com1,
832 kTestComponent_jebg, 868 kTestComponent_jebg,
833 Version("2.2"), 869 Version("2.2"),
834 &installer3)); 870 &installer3));
835 871
836 // Check that we send out 2.2 as our version.
837 // Interceptor's hit count should go up by 1.
838 const GURL expected_update_url_3(
839 "http://localhost/upd?extra=foo"
840 "&x=id%3Djebgalgnebhfojomionfpkfelancnnkf%26v%3D2.2%26fp%3D%26uc"
841 "&x=id%3Dabagagagagagagagagagagagagagagag%26v%3D2.2%26fp%3D%26uc");
842
843 interceptor.SetResponse(expected_update_url_3,
844 test_file("updatecheck_reply_1.xml"));
845
846 // Loop once just to notice the check happening with the re-register version. 872 // Loop once just to notice the check happening with the re-register version.
847 test_configurator()->SetLoopCount(1); 873 test_configurator()->SetLoopCount(1);
848 component_updater()->Start(); 874 component_updater()->Start();
849 RunThreads(); 875 RunThreads();
850 876
851 EXPECT_EQ(4, interceptor.GetHitCount());
852
853 // No additional pings are expected.
854 EXPECT_EQ(1, post_interceptor->GetHitCount())
855 << post_interceptor->GetRequestsAsString();
856 EXPECT_EQ(0, post_interceptor->GetMissCount())
857 << post_interceptor->GetRequestsAsString();
858
859 // We created a new installer, so the counts go back to 0. 877 // We created a new installer, so the counts go back to 0.
860 EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error()); 878 EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error());
861 EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->install_count()); 879 EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->install_count());
862 EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error()); 880 EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error());
863 EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->install_count()); 881 EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->install_count());
864 882
883 // One update check and no additional pings are expected.
884 EXPECT_EQ(1, post_interceptor_->GetHitCount())
885 << post_interceptor_->GetRequestsAsString();
886 EXPECT_EQ(1, post_interceptor_->GetCount())
887 << post_interceptor_->GetRequestsAsString();
888
889 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
890 "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"2.2\">"
891 "<updatecheck /></app>"));
892
865 component_updater()->Stop(); 893 component_updater()->Stop();
866 } 894 }
867 895
868 // Verify that we can download and install a component and a differential 896 // Verify that we can download and install a component and a differential
869 // update to that component. We do three loops; the final loop should do 897 // update to that component. We do three loops; the final loop should do
870 // nothing. 898 // nothing.
871 // We also check that exactly 5 non-ping network requests are issued: 899 // We also check that exactly 5 non-ping network requests are issued:
872 // 1- update check (response: v1 available) 900 // 1- update check (response: v1 available)
873 // 2- download crx (v1) 901 // 2- download crx (v1)
874 // 3- update check (response: v2 available) 902 // 3- update check (response: v2 available)
875 // 4- download differential crx (v1 to v2) 903 // 4- download differential crx (v1 to v2)
876 // 5- update check (response: no further update available) 904 // 5- update check (response: no further update available)
877 // There should be two pings, one for each update. The second will bear a 905 // There should be two pings, one for each update. The second will bear a
878 // diffresult=1, while the first will not. 906 // diffresult=1, while the first will not.
879 TEST_F(ComponentUpdaterTest, DifferentialUpdate) { 907 TEST_F(ComponentUpdaterTest, DifferentialUpdate) {
880 URLRequestPostInterceptor* post_interceptor( 908 EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
881 interceptor_factory_->CreateInterceptor()); 909 "updatecheck"), test_file("updatecheck_diff_reply_1.xml")));
882 EXPECT_TRUE(post_interceptor != NULL); 910 EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
883 EXPECT_TRUE(post_interceptor->ExpectRequest(new PartialMatch( 911 EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
884 "<o:app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"1.0\">" 912 "updatecheck"), test_file("updatecheck_diff_reply_2.xml")));
885 "<o:event eventtype=\"3\" eventresult=\"1\" " 913 EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
886 "previousversion=\"0.0\" nextversion=\"1.0\" nextfp=\"1\"/></o:app>"))); 914 EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
887 EXPECT_TRUE(post_interceptor->ExpectRequest(new PartialMatch( 915 "updatecheck"), test_file("updatecheck_diff_reply_3.xml")));
888 "<o:app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"2.0\">"
889 "<o:event eventtype=\"3\" eventresult=\"1\" "
890 "previousversion=\"1.0\" nextversion=\"2.0\" "
891 "diffresult=\"1\" previousfp=\"1\" nextfp=\"f22\"/></o:app>")));
892 916
893 content::URLLocalHostRequestPrepackagedInterceptor interceptor; 917 get_interceptor_->SetResponse(
918 GURL("http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"),
919 test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"));
920 get_interceptor_->SetResponse(
921 GURL("http://localhost/download/"
922 "ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx"),
923 test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx"));
894 924
895 VersionedTestInstaller installer; 925 VersionedTestInstaller installer;
896 CrxComponent com; 926 CrxComponent com;
897 RegisterComponent(&com, kTestComponent_ihfo, Version("0.0"), &installer); 927 RegisterComponent(&com, kTestComponent_ihfo, Version("0.0"), &installer);
898 928
899 const GURL expected_update_url_0(
900 "http://localhost/upd?extra=foo"
901 "&x=id%3Dihfokbkgjpifnbbojhneepfflplebdkc%26v%3D0.0%26fp%3D%26uc");
902 const GURL expected_update_url_1(
903 "http://localhost/upd?extra=foo"
904 "&x=id%3Dihfokbkgjpifnbbojhneepfflplebdkc%26v%3D1.0%26fp%3D1%26uc");
905 const GURL expected_update_url_2(
906 "http://localhost/upd?extra=foo"
907 "&x=id%3Dihfokbkgjpifnbbojhneepfflplebdkc%26v%3D2.0%26fp%3Df22%26uc");
908 const GURL expected_crx_url_1(
909 "http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_1.crx");
910 const GURL expected_crx_url_1_diff_2(
911 "http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx");
912
913 interceptor.SetResponse(expected_update_url_0,
914 test_file("updatecheck_diff_reply_1.xml"));
915 interceptor.SetResponse(expected_update_url_1,
916 test_file("updatecheck_diff_reply_2.xml"));
917 interceptor.SetResponse(expected_update_url_2,
918 test_file("updatecheck_diff_reply_3.xml"));
919 interceptor.SetResponse(expected_crx_url_1,
920 test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"));
921 interceptor.SetResponse(
922 expected_crx_url_1_diff_2,
923 test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx"));
924
925 test_configurator()->SetLoopCount(3); 929 test_configurator()->SetLoopCount(3);
926
927 component_updater()->Start(); 930 component_updater()->Start();
928 RunThreads(); 931 RunThreads();
929 932
930 EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error()); 933 EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
931 EXPECT_EQ(2, static_cast<TestInstaller*>(com.installer)->install_count()); 934 EXPECT_EQ(2, static_cast<TestInstaller*>(com.installer)->install_count());
932 935
933 // One ping has the diffresult=1, the other does not. 936 EXPECT_EQ(5, post_interceptor_->GetHitCount())
934 EXPECT_EQ(2, post_interceptor->GetHitCount()) 937 << post_interceptor_->GetRequestsAsString();
935 << post_interceptor->GetRequestsAsString(); 938 EXPECT_EQ(5, post_interceptor_->GetCount())
936 EXPECT_EQ(0, post_interceptor->GetMissCount()) 939 << post_interceptor_->GetRequestsAsString();
937 << post_interceptor->GetRequestsAsString(); 940 EXPECT_EQ(2, get_interceptor_->GetHitCount());
938 941
939 EXPECT_EQ(5, interceptor.GetHitCount()); 942 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
940 943 "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"0.0\">"
944 "<updatecheck /></app>"))
945 << post_interceptor_->GetRequestsAsString();
946 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[1].find(
947 "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" "
948 "version=\"0.0\" nextversion=\"1.0\">"
949 "<event eventtype=\"3\" eventresult=\"1\" nextfp=\"1\"/></app>"))
950 << post_interceptor_->GetRequestsAsString();
951 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[2].find(
952 "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"1.0\">"
953 "<updatecheck /><packages><package fp=\"1\"/></packages></app>"))
954 << post_interceptor_->GetRequestsAsString();
955 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[3].find(
956 "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" "
957 "version=\"1.0\" nextversion=\"2.0\">"
958 "<event eventtype=\"3\" eventresult=\"1\" diffresult=\"1\" "
959 "previousfp=\"1\" nextfp=\"22\"/></app>"))
960 << post_interceptor_->GetRequestsAsString();
961 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[4].find(
962 "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"2.0\">"
963 "<updatecheck /><packages><package fp=\"22\"/></packages></app>"))
964 << post_interceptor_->GetRequestsAsString();
941 component_updater()->Stop(); 965 component_updater()->Stop();
942 } 966 }
943 967
944 // Verify that component installation falls back to downloading and installing 968 // Verify that component installation falls back to downloading and installing
945 // a full update if the differential update fails (in this case, because the 969 // a full update if the differential update fails (in this case, because the
946 // installer does not know about the existing files). We do two loops; the final 970 // installer does not know about the existing files). We do two loops; the final
947 // loop should do nothing. 971 // loop should do nothing.
948 // We also check that exactly 4 non-ping network requests are issued: 972 // We also check that exactly 4 non-ping network requests are issued:
949 // 1- update check (loop 1) 973 // 1- update check (loop 1)
950 // 2- download differential crx 974 // 2- download differential crx
951 // 3- download full crx 975 // 3- download full crx
952 // 4- update check (loop 2 - no update available) 976 // 4- update check (loop 2 - no update available)
953 // There should be one ping for the first attempted update. 977 // There should be one ping for the first attempted update.
954 TEST_F(ComponentUpdaterTest, DifferentialUpdateFails) { 978 TEST_F(ComponentUpdaterTest, DifferentialUpdateFails) {
955 URLRequestPostInterceptor* post_interceptor( 979 EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
956 interceptor_factory_->CreateInterceptor()); 980 "updatecheck"), test_file("updatecheck_diff_reply_2.xml")));
957 EXPECT_TRUE(post_interceptor != NULL); 981 EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
958 EXPECT_TRUE(post_interceptor->ExpectRequest(new PartialMatch( 982 EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
959 "<o:app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"2.0\">" 983 "updatecheck"), test_file("updatecheck_diff_reply_3.xml")));
960 "<o:event eventtype=\"3\" eventresult=\"1\" "
961 "previousversion=\"1.0\" nextversion=\"2.0\" "
962 "diffresult=\"0\" differrorcat=\"2\" differrorcode=\"16\" "
963 "nextfp=\"f22\"/></o:app>")));
964 984
965 content::URLLocalHostRequestPrepackagedInterceptor interceptor; 985 get_interceptor_->SetResponse(
986 GURL("http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"),
987 test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"));
988 get_interceptor_->SetResponse(
989 GURL("http://localhost/download/"
990 "ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx"),
991 test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx"));
992 get_interceptor_->SetResponse(
993 GURL("http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_2.crx"),
994 test_file("ihfokbkgjpifnbbojhneepfflplebdkc_2.crx"));
966 995
967 TestInstaller installer; 996 TestInstaller installer;
968 CrxComponent com; 997 CrxComponent com;
969 RegisterComponent(&com, kTestComponent_ihfo, Version("1.0"), &installer); 998 RegisterComponent(&com, kTestComponent_ihfo, Version("1.0"), &installer);
970 999
971 const GURL expected_update_url_1(
972 "http://localhost/upd?extra=foo"
973 "&x=id%3Dihfokbkgjpifnbbojhneepfflplebdkc%26v%3D1.0%26fp%3D%26uc");
974 const GURL expected_update_url_2(
975 "http://localhost/upd?extra=foo"
976 "&x=id%3Dihfokbkgjpifnbbojhneepfflplebdkc%26v%3D2.0%26fp%3Df22%26uc");
977 const GURL expected_crx_url_1(
978 "http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_1.crx");
979 const GURL expected_crx_url_1_diff_2(
980 "http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx");
981 const GURL expected_crx_url_2(
982 "http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_2.crx");
983
984 interceptor.SetResponse(expected_update_url_1,
985 test_file("updatecheck_diff_reply_2.xml"));
986 interceptor.SetResponse(expected_update_url_2,
987 test_file("updatecheck_diff_reply_3.xml"));
988 interceptor.SetResponse(expected_crx_url_1,
989 test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"));
990 interceptor.SetResponse(
991 expected_crx_url_1_diff_2,
992 test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx"));
993 interceptor.SetResponse(expected_crx_url_2,
994 test_file("ihfokbkgjpifnbbojhneepfflplebdkc_2.crx"));
995
996 test_configurator()->SetLoopCount(2); 1000 test_configurator()->SetLoopCount(2);
997
998 component_updater()->Start(); 1001 component_updater()->Start();
999 RunThreads(); 1002 RunThreads();
1000 1003
1001 // A failed differential update does not count as a failed install. 1004 // A failed differential update does not count as a failed install.
1002 EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error()); 1005 EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
1003 EXPECT_EQ(1, static_cast<TestInstaller*>(com.installer)->install_count()); 1006 EXPECT_EQ(1, static_cast<TestInstaller*>(com.installer)->install_count());
1004 1007
1005 EXPECT_EQ(1, post_interceptor->GetHitCount()) 1008 EXPECT_EQ(3, post_interceptor_->GetHitCount())
1006 << post_interceptor->GetRequestsAsString(); 1009 << post_interceptor_->GetRequestsAsString();
1007 EXPECT_EQ(0, post_interceptor->GetMissCount()) 1010 EXPECT_EQ(3, post_interceptor_->GetCount())
1008 << post_interceptor->GetRequestsAsString(); 1011 << post_interceptor_->GetRequestsAsString();
1012 EXPECT_EQ(2, get_interceptor_->GetHitCount());
1009 1013
1010 EXPECT_EQ(4, interceptor.GetHitCount()); 1014 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
1015 "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"1.0\">"
1016 "<updatecheck /></app>"))
1017 << post_interceptor_->GetRequestsAsString();
1018 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[1].find(
1019 "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" "
1020 "version=\"1.0\" nextversion=\"2.0\">"
1021 "<event eventtype=\"3\" eventresult=\"1\" diffresult=\"0\" "
1022 "differrorcat=\"2\" differrorcode=\"16\" nextfp=\"22\"/></app>"))
1023 << post_interceptor_->GetRequestsAsString();
1024 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[2].find(
1025 "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"2.0\">"
1026 "<updatecheck /><packages><package fp=\"22\"/></packages></app>"))
1027 << post_interceptor_->GetRequestsAsString();
1011 1028
1012 component_updater()->Stop(); 1029 component_updater()->Stop();
1013 } 1030 }
1014 1031
1015 // Verify that a failed installation causes an install failure ping. 1032 // Verify that a failed installation causes an install failure ping.
1016 TEST_F(ComponentUpdaterTest, CheckFailedInstallPing) { 1033 TEST_F(ComponentUpdaterTest, CheckFailedInstallPing) {
1017 URLRequestPostInterceptor* post_interceptor(
1018 interceptor_factory_->CreateInterceptor());
1019 EXPECT_TRUE(post_interceptor != NULL);
1020 EXPECT_TRUE(post_interceptor->ExpectRequest(new PartialMatch(
1021 "<o:app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"0.9\">"
1022 "<o:event eventtype=\"3\" eventresult=\"0\" "
1023 "previousversion=\"0.9\" nextversion=\"1.0\" "
1024 "errorcat=\"3\" errorcode=\"9\"/></o:app>")));
1025 EXPECT_TRUE(post_interceptor->ExpectRequest(new PartialMatch(
1026 "<o:app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"0.9\">"
1027 "<o:event eventtype=\"3\" eventresult=\"0\" "
1028 "previousversion=\"0.9\" nextversion=\"1.0\" "
1029 "errorcat=\"3\" errorcode=\"9\"/></o:app>")));
1030
1031 content::URLLocalHostRequestPrepackagedInterceptor interceptor;
1032
1033 // This test installer reports installation failure. 1034 // This test installer reports installation failure.
1034 class : public TestInstaller { 1035 class : public TestInstaller {
1035 virtual bool Install(const base::DictionaryValue& manifest, 1036 virtual bool Install(const base::DictionaryValue& manifest,
1036 const base::FilePath& unpack_path) OVERRIDE { 1037 const base::FilePath& unpack_path) OVERRIDE {
1037 ++install_count_; 1038 ++install_count_;
1038 base::DeleteFile(unpack_path, true); 1039 base::DeleteFile(unpack_path, true);
1039 return false; 1040 return false;
1040 } 1041 }
1041 } installer; 1042 } installer;
1042 1043
1044 EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
1045 "updatecheck"), test_file("updatecheck_reply_1.xml")));
1046 EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
1047 EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
1048 "updatecheck"), test_file("updatecheck_reply_1.xml")));
1049 EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
1050 get_interceptor_->SetResponse(
1051 GURL(expected_crx_url),
1052 test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
1053
1054 // Start with 0.9, and attempt update to 1.0.
1055 // Loop twice to issue two checks: (1) with original 0.9 version
1056 // and (2), which should retry with 0.9.
1043 CrxComponent com; 1057 CrxComponent com;
1044 RegisterComponent(&com, kTestComponent_jebg, Version("0.9"), &installer); 1058 RegisterComponent(&com, kTestComponent_jebg, Version("0.9"), &installer);
1045 1059
1046 // Start with 0.9, and attempt update to 1.0
1047 const GURL expected_update_url_1(
1048 "http://localhost/upd?extra=foo"
1049 "&x=id%3Djebgalgnebhfojomionfpkfelancnnkf%26v%3D0.9%26fp%3D%26uc");
1050
1051 interceptor.SetResponse(expected_update_url_1,
1052 test_file("updatecheck_reply_1.xml"));
1053 interceptor.SetResponse(GURL(expected_crx_url),
1054 test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
1055
1056 // Loop twice to issue two checks: (1) with original 0.9 version
1057 // and (2), which should retry with 0.9.
1058 test_configurator()->SetLoopCount(2); 1060 test_configurator()->SetLoopCount(2);
1059 component_updater()->Start(); 1061 component_updater()->Start();
1060 RunThreads(); 1062 RunThreads();
1061 1063
1064 EXPECT_EQ(4, post_interceptor_->GetHitCount())
1065 << post_interceptor_->GetRequestsAsString();
1066 EXPECT_EQ(2, get_interceptor_->GetHitCount());
1067
1068 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
1069 "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"0.9\">"
1070 "<updatecheck /></app>"))
1071 << post_interceptor_->GetRequestsAsString();
1072 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[1].find(
1073 "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" "
1074 "version=\"0.9\" nextversion=\"1.0\">"
1075 "<event eventtype=\"3\" eventresult=\"0\" "
1076 "errorcat=\"3\" errorcode=\"9\"/></app>"))
1077 << post_interceptor_->GetRequestsAsString();
1078 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[2].find(
1079 "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"0.9\">"
1080 "<updatecheck /></app>"))
1081 << post_interceptor_->GetRequestsAsString();
1082 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[3].find(
1083 "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" "
1084 "version=\"0.9\" nextversion=\"1.0\">"
1085 "<event eventtype=\"3\" eventresult=\"0\" "
1086 "errorcat=\"3\" errorcode=\"9\"/></app>"))
1087 << post_interceptor_->GetRequestsAsString();
1088
1062 // Loop once more, but expect no ping because a noupdate response is issued. 1089 // Loop once more, but expect no ping because a noupdate response is issued.
1063 // This is necessary to clear out the fire-and-forget ping from the previous 1090 // This is necessary to clear out the fire-and-forget ping from the previous
1064 // iteration. 1091 // iteration.
1065 interceptor.SetResponse(expected_update_url_1, 1092 post_interceptor_->Reset();
1066 test_file("updatecheck_reply_noupdate.xml")); 1093 EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
1094 "updatecheck"), test_file("updatecheck_reply_noupdate.xml")));
1095
1067 test_configurator()->SetLoopCount(1); 1096 test_configurator()->SetLoopCount(1);
1068 component_updater()->Start(); 1097 component_updater()->Start();
1069 RunThreads(); 1098 RunThreads();
1070 1099
1071 EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error()); 1100 EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
1072 EXPECT_EQ(2, static_cast<TestInstaller*>(com.installer)->install_count()); 1101 EXPECT_EQ(2, static_cast<TestInstaller*>(com.installer)->install_count());
1073 1102
1074 EXPECT_EQ(2, post_interceptor->GetHitCount()) 1103 EXPECT_EQ(1, post_interceptor_->GetHitCount())
1075 << post_interceptor->GetRequestsAsString(); 1104 << post_interceptor_->GetRequestsAsString();
1076 EXPECT_EQ(0, post_interceptor->GetMissCount()) 1105 EXPECT_EQ(1, post_interceptor_->GetCount())
1077 << post_interceptor->GetRequestsAsString(); 1106 << post_interceptor_->GetRequestsAsString();
1078 1107
1079 EXPECT_EQ(5, interceptor.GetHitCount()); 1108 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
1109 "<app appid=\"jebgalgnebhfojomionfpkfelancnnkf\" version=\"0.9\">"
1110 "<updatecheck /></app>"))
1111 << post_interceptor_->GetRequestsAsString();
1080 1112
1081 component_updater()->Stop(); 1113 component_updater()->Stop();
1082 } 1114 }
1083 1115
1084 // Verify that we successfully propagate a patcher error. 1116 // Verify that we successfully propagate a patcher error.
1085 // ihfokbkgjpifnbbojhneepfflplebdkc_1to2_bad.crx contains an incorrect 1117 // ihfokbkgjpifnbbojhneepfflplebdkc_1to2_bad.crx contains an incorrect
1086 // patching instruction that should fail. 1118 // patching instruction that should fail.
1087 TEST_F(ComponentUpdaterTest, DifferentialUpdateFailErrorcode) { 1119 TEST_F(ComponentUpdaterTest, DifferentialUpdateFailErrorcode) {
1088 URLRequestPostInterceptor* post_interceptor( 1120 EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
1089 interceptor_factory_->CreateInterceptor()); 1121 "updatecheck"), test_file("updatecheck_diff_reply_1.xml")));
1090 EXPECT_TRUE(post_interceptor != NULL); 1122 EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
1091 EXPECT_TRUE(post_interceptor->ExpectRequest(new PartialMatch( 1123 EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
1092 "<o:app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"1.0\">" 1124 "updatecheck"), test_file("updatecheck_diff_reply_2.xml")));
1093 "<o:event eventtype=\"3\" eventresult=\"1\" " 1125 EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch("event")));
1094 "previousversion=\"0.0\" nextversion=\"1.0\" nextfp=\"1\"/></o:app>"))); 1126 EXPECT_TRUE(post_interceptor_->ExpectRequest(new PartialMatch(
1095 EXPECT_TRUE(post_interceptor->ExpectRequest(new PartialMatch( 1127 "updatecheck"), test_file("updatecheck_diff_reply_3.xml")));
1096 "<o:app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"2.0\">"
1097 "<o:event eventtype=\"3\" eventresult=\"1\" "
1098 "previousversion=\"1.0\" nextversion=\"2.0\" "
1099 "diffresult=\"0\" differrorcat=\"2\" "
1100 "differrorcode=\"14\" diffextracode1=\"305\" "
1101 "previousfp=\"1\" nextfp=\"f22\"/></o:app>")));
1102 1128
1103 content::URLLocalHostRequestPrepackagedInterceptor interceptor; 1129 get_interceptor_->SetResponse(
1130 GURL("http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"),
1131 test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"));
1132 // This intercept returns a different file than what is specified in the
1133 // update check response and requested in the download. The file that is
1134 // actually dowloaded contains a patching error, an therefore, an error
1135 // is injected at the time of patching.
1136 get_interceptor_->SetResponse(
1137 GURL("http://localhost/download/"
1138 "ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx"),
1139 test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1to2_bad.crx"));
1140 get_interceptor_->SetResponse(
1141 GURL("http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_2.crx"),
1142 test_file("ihfokbkgjpifnbbojhneepfflplebdkc_2.crx"));
1104 1143
1105 VersionedTestInstaller installer; 1144 VersionedTestInstaller installer;
1106 CrxComponent com; 1145 CrxComponent com;
1107 RegisterComponent(&com, kTestComponent_ihfo, Version("0.0"), &installer); 1146 RegisterComponent(&com, kTestComponent_ihfo, Version("0.0"), &installer);
1108 1147
1109 const GURL expected_update_url_0( 1148 test_configurator()->SetLoopCount(3);
1110 "http://localhost/upd?extra=foo"
1111 "&x=id%3Dihfokbkgjpifnbbojhneepfflplebdkc%26v%3D0.0%26fp%3D%26uc");
1112 const GURL expected_update_url_1(
1113 "http://localhost/upd?extra=foo"
1114 "&x=id%3Dihfokbkgjpifnbbojhneepfflplebdkc%26v%3D1.0%26fp%3D1%26uc");
1115 const GURL expected_update_url_2(
1116 "http://localhost/upd?extra=foo"
1117 "&x=id%3Dihfokbkgjpifnbbojhneepfflplebdkc%26v%3D2.0%26fp%3Df22%26uc");
1118 const GURL expected_crx_url_1(
1119 "http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_1.crx");
1120 const GURL expected_crx_url_1_diff_2(
1121 "http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx");
1122 const GURL expected_crx_url_2(
1123 "http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc_2.crx");
1124
1125 interceptor.SetResponse(expected_update_url_0,
1126 test_file("updatecheck_diff_reply_1.xml"));
1127 interceptor.SetResponse(expected_update_url_1,
1128 test_file("updatecheck_diff_reply_2.xml"));
1129 interceptor.SetResponse(expected_update_url_2,
1130 test_file("updatecheck_diff_reply_3.xml"));
1131 interceptor.SetResponse(expected_crx_url_1,
1132 test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"));
1133 interceptor.SetResponse(
1134 expected_crx_url_1_diff_2,
1135 test_file("ihfokbkgjpifnbbojhneepfflplebdkc_1to2_bad.crx"));
1136 interceptor.SetResponse(expected_crx_url_2,
1137 test_file("ihfokbkgjpifnbbojhneepfflplebdkc_2.crx"));
1138
1139 test_configurator()->SetLoopCount(2);
1140
1141 component_updater()->Start(); 1149 component_updater()->Start();
1142 RunThreads(); 1150 RunThreads();
1143 component_updater()->Stop(); 1151 component_updater()->Stop();
1144 // There may still be pings in the queue.
1145 RunThreadsUntilIdle();
1146 1152
1147 EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error()); 1153 EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
1148 EXPECT_EQ(2, static_cast<TestInstaller*>(com.installer)->install_count()); 1154 EXPECT_EQ(2, static_cast<TestInstaller*>(com.installer)->install_count());
1149 1155
1150 EXPECT_EQ(2, post_interceptor->GetHitCount()) 1156 EXPECT_EQ(5, post_interceptor_->GetHitCount())
1151 << post_interceptor->GetRequestsAsString(); 1157 << post_interceptor_->GetRequestsAsString();
1152 EXPECT_EQ(0, post_interceptor->GetMissCount()) 1158 EXPECT_EQ(5, post_interceptor_->GetCount())
1153 << post_interceptor->GetRequestsAsString(); 1159 << post_interceptor_->GetRequestsAsString();
1160 EXPECT_EQ(3, get_interceptor_->GetHitCount());
1154 1161
1155 EXPECT_EQ(5, interceptor.GetHitCount()); 1162 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find(
1163 "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"0.0\">"
1164 "<updatecheck /></app>"))
1165 << post_interceptor_->GetRequestsAsString();
1166 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[1].find(
1167 "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" "
1168 "version=\"0.0\" nextversion=\"1.0\">"
1169 "<event eventtype=\"3\" eventresult=\"1\" nextfp=\"1\"/></app>"))
1170 << post_interceptor_->GetRequestsAsString();
1171 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[2].find(
1172 "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"1.0\">"
1173 "<updatecheck /><packages><package fp=\"1\"/></packages></app>"))
1174 << post_interceptor_->GetRequestsAsString();
1175 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[3].find(
1176 "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" "
1177 "version=\"1.0\" nextversion=\"2.0\">"
1178 "<event eventtype=\"3\" eventresult=\"1\" "
1179 "diffresult=\"0\" differrorcat=\"2\" "
1180 "differrorcode=\"14\" diffextracode1=\"305\" "
1181 "previousfp=\"1\" nextfp=\"22\"/></app>"))
1182 << post_interceptor_->GetRequestsAsString();
1183 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[4].find(
1184 "<app appid=\"ihfokbkgjpifnbbojhneepfflplebdkc\" version=\"2.0\">"
1185 "<updatecheck /><packages><package fp=\"22\"/></packages></app>"))
1186 << post_interceptor_->GetRequestsAsString();
1156 } 1187 }
1157 1188
1158 } // namespace component_updater 1189 } // namespace component_updater
1159 1190
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698