component_updater_service_unittest.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/component_updater/component_updater_service.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <list> 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <utility> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_vector.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_notification_types.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_notification_tracker.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/test/net/url_request_prepackaged_interceptor.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "googleurl/src/gurl.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "libxml/globals.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_fetcher.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_test_util.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::TestNotificationTracker; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Overrides some of the component updater behaviors so it is easier to test 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and loops faster. In actual usage it takes hours do to a full cycle. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestConfigurator : public ComponentUpdateService::Configurator { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestConfigurator() 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : times_(1), recheck_time_(0), ondemand_time_(0), cus_(NULL) { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int InitialDelay() OVERRIDE { return 0; } 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef std::pair<CrxComponent*, int> CheckAtLoopCount; 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int NextCheckDelay() OVERRIDE { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is called when a new full cycle of checking for updates is going 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to happen. In test we normally only test one cycle so it is a good 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // time to break from the test messageloop Run() method so the test can 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // finish. 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (--times_ <= 0) { 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MessageLoop::current()->Quit(); 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Look for checks to issue in the middle of the loop. 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (std::list<CheckAtLoopCount>::iterator 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) i = components_to_check_.begin(); 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) i != components_to_check_.end(); ) { 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (i->second == times_) { 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cus_->CheckForUpdateSoon(*i->first); 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) i = components_to_check_.erase(i); 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++i; 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 1; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int StepDelay() OVERRIDE { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int MinimumReCheckWait() OVERRIDE { 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return recheck_time_; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual int OnDemandDelay() OVERRIDE { 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ondemand_time_; 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual GURL UpdateUrl(CrxComponent::UrlSource source) OVERRIDE { 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (source) { 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case CrxComponent::BANDAID: 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GURL("http://localhost/upd"); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case CrxComponent::CWS_PUBLIC: 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GURL("http://localhost/cws"); 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GURL("http://wronghost/bad"); 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual const char* ExtraRequestParams() OVERRIDE { return "extra=foo"; } 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual size_t UrlSizeLimit() OVERRIDE { return 256; } 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual net::URLRequestContextGetter* RequestContext() OVERRIDE { 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return new net::TestURLRequestContextGetter( 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO)); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't use the utility process to decode files. 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool InProcess() OVERRIDE { return true; } 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnEvent(Events event, int extra) OVERRIDE { } 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set how many update checks are called, the default value is just once. 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetLoopCount(int times) { times_ = times; } 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetRecheckTime(int seconds) { 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) recheck_time_ = seconds; 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetOnDemandTime(int seconds) { 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ondemand_time_ = seconds; 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void AddComponentToCheck(CrxComponent* com, int at_loop_iter) { 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) components_to_check_.push_back(std::make_pair(com, at_loop_iter)); 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetComponentUpdateService(ComponentUpdateService* cus) { 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cus_ = cus; 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int times_; 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int recheck_time_; 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int ondemand_time_; 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::list<CheckAtLoopCount> components_to_check_; 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ComponentUpdateService* cus_; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestInstaller : public ComponentInstaller { 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public : 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit TestInstaller() 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : error_(0), install_count_(0) { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnUpdateError(int error) OVERRIDE { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, error); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_ = error; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Install(base::DictionaryValue* manifest, 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& unpack_path) OVERRIDE { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++install_count_; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete manifest; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return file_util::Delete(unpack_path, true); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int error() const { return error_; } 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int install_count() const { return install_count_; } 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int error_; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int install_count_; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// component 1 has extension id "jebgalgnebhfojomionfpkfelancnnkf", and 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the RSA public key the following hash: 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint8 jebg_hash[] = {0x94,0x16,0x0b,0x6d,0x41,0x75,0xe9,0xec,0x8e,0xd5, 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0xfa,0x54,0xb0,0xd2,0xdd,0xa5,0x6e,0x05,0x6b,0xe8, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x73,0x47,0xf6,0xc4,0x11,0x9f,0xbc,0xb3,0x09,0xb3, 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x5b,0x40}; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// component 2 has extension id "abagagagagagagagagagagagagagagag", and 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the RSA public key the following hash: 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint8 abag_hash[] = {0x01,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x06,0x01}; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char expected_crx_url[] = 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://localhost/download/jebgalgnebhfojomionfpkfelancnnkf.crx"; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Common fixture for all the component updater tests. 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ComponentUpdaterTest : public testing::Test { 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum TestComponents { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTestComponent_abag, 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTestComponent_jebg 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ComponentUpdaterTest() : component_updater_(NULL), test_config_(NULL) { 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The component updater instance under test. 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_config_ = new TestConfigurator; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater_.reset(ComponentUpdateServiceFactory(test_config_)); 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_config_->SetComponentUpdateService(component_updater_.get()); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The test directory is chrome/test/data/components. 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir_); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_data_dir_ = test_data_dir_.AppendASCII("components"); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Subscribe to all component updater notifications. 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int notifications[] = { 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_COMPONENT_UPDATER_STARTED, 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_COMPONENT_UPDATE_FOUND, 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_COMPONENT_UPDATE_READY 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int ix = 0; ix != arraysize(notifications); ++ix) { 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification_tracker_.ListenFor( 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notifications[ix], content::NotificationService::AllSources()); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLFetcher::SetEnableInterceptionForTests(true); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~ComponentUpdaterTest() { 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLFetcher::SetEnableInterceptionForTests(false); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TearDown() { 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlCleanupGlobals(); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ComponentUpdateService* component_updater() { 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return component_updater_.get(); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Makes the full path to a component updater test file. 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath test_file(const char* file) { 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return test_data_dir_.AppendASCII(file); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNotificationTracker& notification_tracker() { 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return notification_tracker_; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestConfigurator* test_configurator() { 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return test_config_; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RegisterComponent(CrxComponent* com, 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestComponents component, 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Version& version) { 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (component == kTestComponent_abag) { 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) com->name = "test_abag"; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) com->pk_hash.assign(abag_hash, abag_hash + arraysize(abag_hash)); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) com->name = "test_jebg"; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) com->pk_hash.assign(jebg_hash, jebg_hash + arraysize(jebg_hash)); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) com->version = version; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestInstaller* installer = new TestInstaller; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) com->installer = installer; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_installers_.push_back(installer); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater_->RegisterComponent(*com); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ComponentUpdateService> component_updater_; 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath test_data_dir_; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNotificationTracker notification_tracker_; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestConfigurator* test_config_; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ComponentInstaller objects to delete after each test. 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedVector<TestInstaller> test_installers_; 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that our test fixture work and the component updater can 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// be created and destroyed with no side effects. 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, VerifyFixture) { 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(component_updater() != NULL); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0ul, notification_tracker().size()); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that the component updater can be caught in a quick 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// start-shutdown situation. Failure of this test will be a crash. Also 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// if there is no work to do, there are no notifications generated. 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, StartStop) { 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop message_loop; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread ui_thread(BrowserThread::UI, &message_loop); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater()->Start(); 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop.RunUntilIdle(); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater()->Stop(); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0ul, notification_tracker().size()); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that when the server has no updates, we go back to sleep and 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the COMPONENT_UPDATER_STARTED and COMPONENT_UPDATER_SLEEPING notifications 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// are generated. 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, CheckCrxSleep) { 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop message_loop; 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread ui_thread(BrowserThread::UI, &message_loop); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread file_thread(BrowserThread::FILE); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread io_thread(BrowserThread::IO); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) io_thread.StartIOThread(); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_thread.Start(); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::URLRequestPrepackagedInterceptor interceptor; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrxComponent com; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegisterComponent(&com, kTestComponent_abag, Version("1.1")); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL expected_update_url( 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://localhost/upd?extra=foo&x=id%3D" 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "abagagagagagagagagagagagagagagag%26v%3D1.1%26uc"); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) interceptor.SetResponse(expected_update_url, 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_file("updatecheck_reply_1.xml")); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We loop twice, but there are no updates so we expect two sleep messages. 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_configurator()->SetLoopCount(2); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater()->Start(); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1ul, notification_tracker().size()); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNotificationTracker::Event ev1 = notification_tracker().at(0); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_STARTED, ev1.type); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop.Run(); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3ul, notification_tracker().size()); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNotificationTracker::Event ev2 = notification_tracker().at(1); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev2.type); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNotificationTracker::Event ev3 = notification_tracker().at(2); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev2.type); 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, interceptor.GetHitCount()); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error()); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count()); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater()->Stop(); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Loop twice again but this case we simulate a server error by returning 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // an empty file. 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) interceptor.SetResponse(expected_update_url, 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_file("updatecheck_reply_empty")); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification_tracker().Reset(); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_configurator()->SetLoopCount(2); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater()->Start(); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop.Run(); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3ul, notification_tracker().size()); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ev1 = notification_tracker().at(0); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_STARTED, ev1.type); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ev2 = notification_tracker().at(1); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev2.type); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ev3 = notification_tracker().at(2); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev2.type); 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(4, interceptor.GetHitCount()); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error()); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count()); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater()->Stop(); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we can check for updates and install one component. Besides 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the notifications above NOTIFICATION_COMPONENT_UPDATE_FOUND and 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NOTIFICATION_COMPONENT_UPDATE_READY should have been fired. We do two loops 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// so the second time around there should be nothing left to do. 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We also check that only 3 network requests are issued: 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1- manifest check 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2- download crx 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3- second manifest check. 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, InstallCrx) { 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop message_loop; 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread ui_thread(BrowserThread::UI, &message_loop); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread file_thread(BrowserThread::FILE); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread io_thread(BrowserThread::IO); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) io_thread.StartIOThread(); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_thread.Start(); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::URLRequestPrepackagedInterceptor interceptor; 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrxComponent com1; 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegisterComponent(&com1, kTestComponent_jebg, Version("0.9")); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrxComponent com2; 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegisterComponent(&com2, kTestComponent_abag, Version("2.2")); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL expected_update_url_1( 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://localhost/upd?extra=foo&x=id%3D" 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "jebgalgnebhfojomionfpkfelancnnkf%26v%3D0.9%26uc&x=id%3D" 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "abagagagagagagagagagagagagagagag%26v%3D2.2%26uc"); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL expected_update_url_2( 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://localhost/upd?extra=foo&x=id%3D" 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "abagagagagagagagagagagagagagagag%26v%3D2.2%26uc&x=id%3D" 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "jebgalgnebhfojomionfpkfelancnnkf%26v%3D1.0%26uc"); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) interceptor.SetResponse(expected_update_url_1, 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_file("updatecheck_reply_1.xml")); 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) interceptor.SetResponse(expected_update_url_2, 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_file("updatecheck_reply_1.xml")); 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) interceptor.SetResponse(GURL(expected_crx_url), 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_file("jebgalgnebhfojomionfpkfelancnnkf.crx")); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_configurator()->SetLoopCount(2); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater()->Start(); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop.Run(); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error()); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, static_cast<TestInstaller*>(com1.installer)->install_count()); 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error()); 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->install_count()); 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(3, interceptor.GetHitCount()); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(5ul, notification_tracker().size()); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNotificationTracker::Event ev1 = notification_tracker().at(1); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATE_FOUND, ev1.type); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNotificationTracker::Event ev2 = notification_tracker().at(2); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATE_READY, ev2.type); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNotificationTracker::Event ev3 = notification_tracker().at(3); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev3.type); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNotificationTracker::Event ev4 = notification_tracker().at(4); 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev4.type); 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) component_updater()->Stop(); 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This test is like the above InstallCrx but the second component 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// has a different source. In this case there would be two manifest 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// checks to different urls, each only containing one component. 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ComponentUpdaterTest, InstallCrxTwoSources) { 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MessageLoop message_loop; 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::TestBrowserThread ui_thread(BrowserThread::UI, &message_loop); 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::TestBrowserThread file_thread(BrowserThread::FILE); 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::TestBrowserThread io_thread(BrowserThread::IO); 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) io_thread.StartIOThread(); 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_thread.Start(); 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::URLRequestPrepackagedInterceptor interceptor; 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CrxComponent com1; 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RegisterComponent(&com1, kTestComponent_abag, Version("2.2")); 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CrxComponent com2; 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) com2.source = CrxComponent::CWS_PUBLIC; 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RegisterComponent(&com2, kTestComponent_jebg, Version("0.9")); 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL expected_update_url_1( 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "http://localhost/upd?extra=foo&x=id%3D" 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "abagagagagagagagagagagagagagagag%26v%3D2.2%26uc"); 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL expected_update_url_2( 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "http://localhost/cws?extra=foo&x=id%3D" 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "jebgalgnebhfojomionfpkfelancnnkf%26v%3D0.9%26uc"); 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) interceptor.SetResponse(expected_update_url_1, 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_file("updatecheck_reply_3.xml")); 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) interceptor.SetResponse(expected_update_url_2, 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_file("updatecheck_reply_1.xml")); 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) interceptor.SetResponse(GURL(expected_crx_url), 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_file("jebgalgnebhfojomionfpkfelancnnkf.crx")); 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_configurator()->SetLoopCount(3); 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We have to set SetRecheckTime to something bigger than 0 or else the 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // component updater will keep re-checking the 'abag' component because 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the default source pre-empts the other sources. 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_configurator()->SetRecheckTime(60*60); 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) component_updater()->Start(); 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop.Run(); 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error()); 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->install_count()); 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error()); 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, static_cast<TestInstaller*>(com2.installer)->install_count()); 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(3, interceptor.GetHitCount()); 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(6ul, notification_tracker().size()); 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNotificationTracker::Event ev0 = notification_tracker().at(1); 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev0.type); 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNotificationTracker::Event ev1 = notification_tracker().at(2); 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATE_FOUND, ev1.type); 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNotificationTracker::Event ev2 = notification_tracker().at(3); 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATE_READY, ev2.type); 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNotificationTracker::Event ev3 = notification_tracker().at(4); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev3.type); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNotificationTracker::Event ev4 = notification_tracker().at(5); 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev4.type); 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater()->Stop(); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test checks that the "prodversionmin" value is handled correctly. In 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// particular there should not be an install because the minimum product 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// version is much higher than of chrome. 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, ProdVersionCheck) { 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop message_loop; 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread ui_thread(BrowserThread::UI, &message_loop); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread file_thread(BrowserThread::FILE); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread io_thread(BrowserThread::IO); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) io_thread.StartIOThread(); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_thread.Start(); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::URLRequestPrepackagedInterceptor interceptor; 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrxComponent com; 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegisterComponent(&com, kTestComponent_jebg, Version("0.9")); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL expected_update_url( 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://localhost/upd?extra=foo&x=id%3D" 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "jebgalgnebhfojomionfpkfelancnnkf%26v%3D0.9%26uc"); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) interceptor.SetResponse(expected_update_url, 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_file("updatecheck_reply_2.xml")); 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) interceptor.SetResponse(GURL(expected_crx_url), 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_file("jebgalgnebhfojomionfpkfelancnnkf.crx")); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_configurator()->SetLoopCount(1); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater()->Start(); 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop.Run(); 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, interceptor.GetHitCount()); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error()); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count()); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater()->Stop(); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that a ping for an update check can cause installs. 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Here is the timeline: 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - First loop: we return a reply that indicates no update, so 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// nothing happens. 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - We ping. 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - This triggers a second loop, which has a reply that triggers an install. 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ComponentUpdaterTest, CheckForUpdateSoon) { 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MessageLoop message_loop; 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::TestBrowserThread ui_thread(BrowserThread::UI, &message_loop); 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::TestBrowserThread file_thread(BrowserThread::FILE); 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::TestBrowserThread io_thread(BrowserThread::IO); 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) io_thread.StartIOThread(); 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_thread.Start(); 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::URLRequestPrepackagedInterceptor interceptor; 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CrxComponent com1; 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RegisterComponent(&com1, kTestComponent_abag, Version("2.2")); 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CrxComponent com2; 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RegisterComponent(&com2, kTestComponent_jebg, Version("0.9")); 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL expected_update_url_1( 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "http://localhost/upd?extra=foo&x=id%3D" 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "abagagagagagagagagagagagagagagag%26v%3D2.2%26uc&x=id%3D" 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "jebgalgnebhfojomionfpkfelancnnkf%26v%3D0.9%26uc"); 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL expected_update_url_2( 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "http://localhost/upd?extra=foo&x=id%3D" 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "jebgalgnebhfojomionfpkfelancnnkf%26v%3D0.9%26uc&x=id%3D" 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "abagagagagagagagagagagagagagagag%26v%3D2.2%26uc"); 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) interceptor.SetResponse(expected_update_url_1, 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_file("updatecheck_reply_empty")); 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) interceptor.SetResponse(expected_update_url_2, 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_file("updatecheck_reply_1.xml")); 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) interceptor.SetResponse(GURL(expected_crx_url), 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_file("jebgalgnebhfojomionfpkfelancnnkf.crx")); 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Test success. 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_configurator()->SetLoopCount(2); 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_configurator()->AddComponentToCheck(&com2, 1); 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) component_updater()->Start(); 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop.Run(); 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error()); 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->install_count()); 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, static_cast<TestInstaller*>(com2.installer)->error()); 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, static_cast<TestInstaller*>(com2.installer)->install_count()); 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(3, interceptor.GetHitCount()); 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(5ul, notification_tracker().size()); 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNotificationTracker::Event ev0= notification_tracker().at(0); 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_STARTED, ev0.type); 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNotificationTracker::Event ev1 = notification_tracker().at(1); 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev1.type); 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNotificationTracker::Event ev2 = notification_tracker().at(2); 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATE_FOUND, ev2.type); 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNotificationTracker::Event ev3 = notification_tracker().at(3); 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATE_READY, ev3.type); 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNotificationTracker::Event ev4 = notification_tracker().at(4); 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev4.type); 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Also check what happens if previous check too soon. 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_configurator()->SetOnDemandTime(60 * 60); 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ComponentUpdateService::kError, 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) component_updater()->CheckForUpdateSoon(com2)); 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Okay, now reset to 0 for the other tests. 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_configurator()->SetOnDemandTime(0); 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) component_updater()->Stop(); 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Test a few error cases. NOTE: We don't have callbacks for 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // when the updates failed yet. 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL expected_update_url_3( 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "http://localhost/upd?extra=foo&x=id%3D" 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "jebgalgnebhfojomionfpkfelancnnkf%26v%3D1.0%26uc&x=id%3D" 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "abagagagagagagagagagagagagagagag%26v%3D2.2%26uc"); 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No update: error from no server response 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) interceptor.SetResponse(expected_update_url_3, 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_file("updatecheck_reply_empty")); 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) notification_tracker().Reset(); 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_configurator()->SetLoopCount(1); 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) component_updater()->Start(); 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ComponentUpdateService::kOk, 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) component_updater()->CheckForUpdateSoon(com2)); 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop.Run(); 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(2ul, notification_tracker().size()); 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ev0 = notification_tracker().at(0); 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_STARTED, ev0.type); 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ev1 = notification_tracker().at(1); 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev1.type); 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) component_updater()->Stop(); 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No update: already updated to 1.0 so nothing new 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) interceptor.SetResponse(expected_update_url_3, 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_file("updatecheck_reply_1.xml")); 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) notification_tracker().Reset(); 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_configurator()->SetLoopCount(1); 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) component_updater()->Start(); 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ComponentUpdateService::kOk, 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) component_updater()->CheckForUpdateSoon(com2)); 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop.Run(); 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(2ul, notification_tracker().size()); 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ev0 = notification_tracker().at(0); 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_STARTED, ev0.type); 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ev1 = notification_tracker().at(1); 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev1.type); 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) component_updater()->Stop(); 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 656