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

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

Issue 12054003: Add an API to component_updater that asks to do an update check "now". (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: cleanup Created 7 years, 10 months 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/component_updater_service.h" 5 #include "chrome/browser/component_updater/component_updater_service.h"
6 6
7 #include "base/compiler_specific.h" 7 #include "base/compiler_specific.h"
8 #include "base/file_path.h" 8 #include "base/file_path.h"
9 #include "base/file_util.h" 9 #include "base/file_util.h"
10 #include "base/memory/scoped_vector.h" 10 #include "base/memory/scoped_vector.h"
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 component_updater_.reset(ComponentUpdateServiceFactory(test_config_)); 153 component_updater_.reset(ComponentUpdateServiceFactory(test_config_));
154 // The test directory is chrome/test/data/components. 154 // The test directory is chrome/test/data/components.
155 PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir_); 155 PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir_);
156 test_data_dir_ = test_data_dir_.AppendASCII("components"); 156 test_data_dir_ = test_data_dir_.AppendASCII("components");
157 157
158 // Subscribe to all component updater notifications. 158 // Subscribe to all component updater notifications.
159 const int notifications[] = { 159 const int notifications[] = {
160 chrome::NOTIFICATION_COMPONENT_UPDATER_STARTED, 160 chrome::NOTIFICATION_COMPONENT_UPDATER_STARTED,
161 chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, 161 chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING,
162 chrome::NOTIFICATION_COMPONENT_UPDATE_FOUND, 162 chrome::NOTIFICATION_COMPONENT_UPDATE_FOUND,
163 chrome::NOTIFICATION_COMPONENT_UPDATE_READY 163 chrome::NOTIFICATION_COMPONENT_UPDATE_READY,
164 chrome::NOTIFICATION_COMPONENT_UPDATE_COMPLETE,
165 chrome::NOTIFICATION_COMPONENT_UPDATE_NOT_UPDATED,
166 chrome::NOTIFICATION_COMPONENT_UPDATE_FAILED
164 }; 167 };
165 168
166 for (int ix = 0; ix != arraysize(notifications); ++ix) { 169 for (int ix = 0; ix != arraysize(notifications); ++ix) {
167 notification_tracker_.ListenFor( 170 notification_tracker_.ListenFor(
168 notifications[ix], content::NotificationService::AllSources()); 171 notifications[ix], content::NotificationService::AllSources());
169 } 172 }
170 net::URLFetcher::SetEnableInterceptionForTests(true); 173 net::URLFetcher::SetEnableInterceptionForTests(true);
171 } 174 }
172 175
173 ~ComponentUpdaterTest() { 176 ~ComponentUpdaterTest() {
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
373 TestNotificationTracker::Event ev1 = notification_tracker().at(1); 376 TestNotificationTracker::Event ev1 = notification_tracker().at(1);
374 EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATE_FOUND, ev1.type); 377 EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATE_FOUND, ev1.type);
375 378
376 TestNotificationTracker::Event ev2 = notification_tracker().at(2); 379 TestNotificationTracker::Event ev2 = notification_tracker().at(2);
377 EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATE_READY, ev2.type); 380 EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATE_READY, ev2.type);
378 381
379 TestNotificationTracker::Event ev3 = notification_tracker().at(3); 382 TestNotificationTracker::Event ev3 = notification_tracker().at(3);
380 EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev3.type); 383 EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev3.type);
381 384
382 TestNotificationTracker::Event ev4 = notification_tracker().at(4); 385 TestNotificationTracker::Event ev4 = notification_tracker().at(4);
383 EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev3.type); 386 EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev4.type);
384 387
385 component_updater()->Stop(); 388 component_updater()->Stop();
386 } 389 }
387 390
388 // This test is like the above InstallCrx but the second component 391 // This test is like the above InstallCrx but the second component
389 // has a different source. In this case there would be two manifest 392 // has a different source. In this case there would be two manifest
390 // checks to different urls, each only containing one component. 393 // checks to different urls, each only containing one component.
391 TEST_F(ComponentUpdaterTest, InstallCrxTwoSources) { 394 TEST_F(ComponentUpdaterTest, InstallCrxTwoSources) {
392 MessageLoop message_loop; 395 MessageLoop message_loop;
393 content::TestBrowserThread ui_thread(BrowserThread::UI, &message_loop); 396 content::TestBrowserThread ui_thread(BrowserThread::UI, &message_loop);
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
445 TestNotificationTracker::Event ev1 = notification_tracker().at(2); 448 TestNotificationTracker::Event ev1 = notification_tracker().at(2);
446 EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATE_FOUND, ev1.type); 449 EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATE_FOUND, ev1.type);
447 450
448 TestNotificationTracker::Event ev2 = notification_tracker().at(3); 451 TestNotificationTracker::Event ev2 = notification_tracker().at(3);
449 EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATE_READY, ev2.type); 452 EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATE_READY, ev2.type);
450 453
451 TestNotificationTracker::Event ev3 = notification_tracker().at(4); 454 TestNotificationTracker::Event ev3 = notification_tracker().at(4);
452 EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev3.type); 455 EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev3.type);
453 456
454 TestNotificationTracker::Event ev4 = notification_tracker().at(5); 457 TestNotificationTracker::Event ev4 = notification_tracker().at(5);
455 EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev3.type); 458 EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev4.type);
456 459
457 component_updater()->Stop(); 460 component_updater()->Stop();
458 } 461 }
459 462
460 // This test checks that the "prodversionmin" value is handled correctly. In 463 // This test checks that the "prodversionmin" value is handled correctly. In
461 // particular there should not be an install because the minimum product 464 // particular there should not be an install because the minimum product
462 // version is much higher than of chrome. 465 // version is much higher than of chrome.
463 TEST_F(ComponentUpdaterTest, ProdVersionCheck) { 466 TEST_F(ComponentUpdaterTest, ProdVersionCheck) {
464 MessageLoop message_loop; 467 MessageLoop message_loop;
465 content::TestBrowserThread ui_thread(BrowserThread::UI, &message_loop); 468 content::TestBrowserThread ui_thread(BrowserThread::UI, &message_loop);
(...skipping 20 matching lines...) Expand all
486 test_configurator()->SetLoopCount(1); 489 test_configurator()->SetLoopCount(1);
487 component_updater()->Start(); 490 component_updater()->Start();
488 message_loop.Run(); 491 message_loop.Run();
489 492
490 EXPECT_EQ(1, interceptor.GetHitCount()); 493 EXPECT_EQ(1, interceptor.GetHitCount());
491 EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error()); 494 EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
492 EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count()); 495 EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count());
493 496
494 component_updater()->Stop(); 497 component_updater()->Stop();
495 } 498 }
499
500 // Test that a ping for an update check can cause installs.
501 // Here is the timeline:
502 // - First loop: we return a reply that indicates no update, so
503 // nothing happens.
504 // - We ping.
505 // - This triggers a second loop, which has a reply that triggers an install.
506 TEST_F(ComponentUpdaterTest, CheckForUpdateSoon) {
507 MessageLoop message_loop;
508 content::TestBrowserThread ui_thread(BrowserThread::UI, &message_loop);
509 content::TestBrowserThread file_thread(BrowserThread::FILE);
510 content::TestBrowserThread io_thread(BrowserThread::IO);
511
512 io_thread.StartIOThread();
513 file_thread.Start();
514
515 content::URLRequestPrepackagedInterceptor interceptor;
516
517 CrxComponent com1;
518 RegisterComponent(&com1, kTestComponent_jebg, Version("0.9"));
519 CrxComponent com2;
520 RegisterComponent(&com2, kTestComponent_abag, Version("2.2"));
521
522 // The first the URL requests info for every registered component.
523 const GURL expected_update_url_1(
524 "http://localhost/upd?extra=foo&x=id%3D"
525 "jebgalgnebhfojomionfpkfelancnnkf%26v%3D0.9%26uc&x=id%3D"
526 "abagagagagagagagagagagagagagagag%26v%3D2.2%26uc");
527
528 // The second the URL only requests info for the pinged component.
529 const GURL expected_update_url_2(
530 "http://localhost/upd?extra=foo&x=id%3D"
531 "jebgalgnebhfojomionfpkfelancnnkf%26v%3D0.9%26uc");
532
533 interceptor.SetResponse(expected_update_url_1,
534 test_file("updatecheck_reply_empty"));
535 interceptor.SetResponse(expected_update_url_2,
536 test_file("updatecheck_reply_1.xml"));
537 interceptor.SetResponse(GURL(expected_crx_url),
538 test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
539
540 test_configurator()->SetLoopCount(1);
541 component_updater()->Start();
542 message_loop.Run();
543
544 EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error());
545 EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->install_count());
546 EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error());
547 EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->install_count());
548
549 // Test success.
550
551 // CheckForUpdateSoon also requires a loop to ScheduleNextRun,
552 // so we need to reset the component updater. The difference is that
553 // it will give preference to checking for work for the single com1.
554 component_updater()->Stop();
555 test_configurator()->SetLoopCount(1);
556 component_updater()->Start();
557 EXPECT_EQ(ComponentUpdateService::kOk,
558 component_updater()->CheckForUpdateSoon(com1));
559 EXPECT_EQ(ComponentUpdateService::kInProgress,
560 component_updater()->CheckForUpdateSoon(com2));
561 message_loop.Run();
562
563 EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error());
564 EXPECT_EQ(1, static_cast<TestInstaller*>(com1.installer)->install_count());
565 EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error());
566 EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->install_count());
567
568 EXPECT_EQ(4, interceptor.GetHitCount());
569
570 ASSERT_EQ(7ul, notification_tracker().size());
571
572 TestNotificationTracker::Event ev0= notification_tracker().at(0);
573 EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_STARTED, ev0.type);
574
575 TestNotificationTracker::Event ev1 = notification_tracker().at(1);
576 EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev1.type);
577
578 TestNotificationTracker::Event ev2 = notification_tracker().at(2);
579 EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_STARTED, ev2.type);
580
581 TestNotificationTracker::Event ev3 = notification_tracker().at(3);
582 EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATE_FOUND, ev3.type);
583
584 TestNotificationTracker::Event ev4 = notification_tracker().at(4);
585 EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATE_READY, ev4.type);
586
587 TestNotificationTracker::Event ev5 = notification_tracker().at(5);
588 EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATE_COMPLETE, ev5.type);
589
590 TestNotificationTracker::Event ev6 = notification_tracker().at(6);
591 EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev6.type);
592
593 component_updater()->Stop();
594
595 // Test a few error cases.
596 const GURL expected_update_url_3(
597 "http://localhost/upd?extra=foo&x=id%3D"
598 "jebgalgnebhfojomionfpkfelancnnkf%26v%3D1.0%26uc");
599
600 // No update: error from no server response
601 interceptor.SetResponse(expected_update_url_3,
602 test_file("updatecheck_reply_empty"));
603 notification_tracker().Reset();
604 test_configurator()->SetLoopCount(1);
605 component_updater()->Start();
606 EXPECT_EQ(ComponentUpdateService::kOk,
607 component_updater()->CheckForUpdateSoon(com1));
608
609 message_loop.Run();
610
611 ASSERT_EQ(3ul, notification_tracker().size());
612 ev0 = notification_tracker().at(0);
613 EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_STARTED, ev0.type);
614 ev1 = notification_tracker().at(1);
615 EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATE_FAILED, ev1.type);
616 ev2 = notification_tracker().at(2);
617 EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev2.type);
618 component_updater()->Stop();
619
620 // No update: already updated to 1.0 so nothing new
621 interceptor.SetResponse(expected_update_url_3,
622 test_file("updatecheck_reply_1.xml"));
623 notification_tracker().Reset();
624 test_configurator()->SetLoopCount(1);
625 component_updater()->Start();
626 EXPECT_EQ(ComponentUpdateService::kOk,
627 component_updater()->CheckForUpdateSoon(com1));
628
629 message_loop.Run();
630
631 ASSERT_EQ(3ul, notification_tracker().size());
632 ev0 = notification_tracker().at(0);
633 EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_STARTED, ev0.type);
634 ev1 = notification_tracker().at(1);
635 EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATE_NOT_UPDATED, ev1.type);
636 ev2 = notification_tracker().at(2);
637 EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev2.type);
638 component_updater()->Stop();
639 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698