component_updater_service_unittest.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
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)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_path.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_vector.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/component_updater/component_updater_interceptor.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_notification_types.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_notification_tracker.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "googleurl/src/gurl.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "libxml/globals.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_fetcher.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_test_util.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::TestNotificationTracker;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Overrides some of the component updater behaviors so it is easier to test
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and loops faster. In actual usage it takes hours do to a full cycle.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestConfigurator : public ComponentUpdateService::Configurator {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestConfigurator() : times_(1) {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int InitialDelay() OVERRIDE { return 0; }
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int NextCheckDelay() OVERRIDE {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This is called when a new full cycle of checking for updates is going
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // to happen. In test we normally only test one cycle so it is a good
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // time to break from the test messageloop Run() method so the test can
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // finish.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (--times_ > 0)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MessageLoop::current()->Quit();
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int StepDelay() OVERRIDE {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int MinimumReCheckWait() OVERRIDE {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual GURL UpdateUrl() OVERRIDE { return GURL("http://localhost/upd"); }
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual const char* ExtraRequestParams() OVERRIDE { return "extra=foo"; }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual size_t UrlSizeLimit() OVERRIDE { return 256; }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual net::URLRequestContextGetter* RequestContext() OVERRIDE {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new TestURLRequestContextGetter(
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO));
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't use the utility process to decode files.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool InProcess() OVERRIDE { return true; }
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnEvent(Events event, int extra) OVERRIDE { }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set how many update checks are called, the default value is just once.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetLoopCount(int times) { times_ = times; }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int times_;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestInstaller : public ComponentInstaller {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public :
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit TestInstaller()
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : error_(0), install_count_(0) {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnUpdateError(int error) OVERRIDE {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(0, error);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    error_ = error;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Install(base::DictionaryValue* manifest,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const FilePath& unpack_path) OVERRIDE {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++install_count_;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete manifest;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return file_util::Delete(unpack_path, true);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int error() const { return error_; }
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int install_count() const { return install_count_; }
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int error_;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int install_count_;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// component 1 has extension id "jebgalgnebhfojomionfpkfelancnnkf", and
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the RSA public key the following hash:
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint8 jebg_hash[] = {0x94,0x16,0x0b,0x6d,0x41,0x75,0xe9,0xec,0x8e,0xd5,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           0xfa,0x54,0xb0,0xd2,0xdd,0xa5,0x6e,0x05,0x6b,0xe8,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           0x73,0x47,0xf6,0xc4,0x11,0x9f,0xbc,0xb3,0x09,0xb3,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           0x5b,0x40};
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// component 2 has extension id "abagagagagagagagagagagagagagagag", and
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the RSA public key the following hash:
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint8 abag_hash[] = {0x01,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           0x06,0x01};
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char header_ok_reply[] =
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "HTTP/1.1 200 OK\0"
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Content-type: text/html\0"
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\0";
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char expected_crx_url[] =
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://localhost/download/jebgalgnebhfojomionfpkfelancnnkf.crx";
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Common fixture for all the component updater tests.
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ComponentUpdaterTest : public testing::Test {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum TestComponents {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kTestComponent_abag,
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kTestComponent_jebg
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ComponentUpdaterTest() : component_updater_(NULL), test_config_(NULL) {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The component updater instance under test.
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_config_ = new TestConfigurator;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    component_updater_.reset(ComponentUpdateServiceFactory(test_config_));
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The test directory is chrome/test/data/components.
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir_);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_data_dir_ = test_data_dir_.AppendASCII("components");
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Subscribe to all component updater notifications.
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int notifications[] = {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_COMPONENT_UPDATER_STARTED,
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING,
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_COMPONENT_UPDATE_FOUND,
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_COMPONENT_UPDATE_READY
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int ix = 0; ix != arraysize(notifications); ++ix) {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      notification_tracker_.ListenFor(
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          notifications[ix], content::NotificationService::AllSources());
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::URLFetcher::SetEnableInterceptionForTests(true);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~ComponentUpdaterTest() {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::URLFetcher::SetEnableInterceptionForTests(false);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TearDown() {
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCleanupGlobals();
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ComponentUpdateService* component_updater() {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return component_updater_.get();
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Makes the full path to a component updater test file.
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FilePath test_file(const char* file) {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return test_data_dir_.AppendASCII(file);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestNotificationTracker& notification_tracker() {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return notification_tracker_;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestConfigurator* test_configurator() {
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return test_config_;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RegisterComponent(CrxComponent* com,
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         TestComponents component,
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const Version& version) {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (component == kTestComponent_abag) {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      com->name = "test_abag";
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      com->pk_hash.assign(abag_hash, abag_hash + arraysize(abag_hash));
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      com->name = "test_jebg";
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      com->pk_hash.assign(jebg_hash, jebg_hash + arraysize(jebg_hash));
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    com->version = version;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestInstaller* installer = new TestInstaller;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    com->installer = installer;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_installers_.push_back(installer);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    component_updater_->RegisterComponent(*com);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ComponentUpdateService> component_updater_;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath test_data_dir_;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestNotificationTracker notification_tracker_;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestConfigurator* test_config_;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ComponentInstaller objects to delete after each test.
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<TestInstaller> test_installers_;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that our test fixture work and the component updater can
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// be created and destroyed with no side effects.
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, VerifyFixture) {
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(component_updater() != NULL);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0ul, notification_tracker().size());
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that the component updater can be caught in a quick
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// start-shutdown situation. Failure of this test will be a crash. Also
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// if there is no work to do, there are no notifications generated.
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, StartStop) {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageLoop message_loop;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread ui_thread(BrowserThread::UI, &message_loop);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Start();
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop.RunAllPending();
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Stop();
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0ul, notification_tracker().size());
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that when the server has no updates, we go back to sleep and
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the COMPONENT_UPDATER_STARTED and COMPONENT_UPDATER_SLEEPING notifications
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// are generated.
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, CheckCrxSleep) {
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageLoop message_loop;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread ui_thread(BrowserThread::UI, &message_loop);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread file_thread(BrowserThread::FILE);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread io_thread(BrowserThread::IO);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  io_thread.StartIOThread();
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_thread.Start();
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<ComponentUpdateInterceptor>
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      interceptor(new ComponentUpdateInterceptor());
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrxComponent com;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterComponent(&com, kTestComponent_abag, Version("1.1"));
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char expected_update_url[] =
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://localhost/upd?extra=foo&x=id%3D"
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "abagagagagagagagagagagagagagagag%26v%3D1.1%26uc";
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor->SetResponse(expected_update_url,
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           header_ok_reply,
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           test_file("updatecheck_reply_1.xml"));
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We loop twice, but there are no updates so we expect two sleep messages.
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_configurator()->SetLoopCount(2);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Start();
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1ul, notification_tracker().size());
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestNotificationTracker::Event ev1 = notification_tracker().at(0);
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_STARTED, ev1.type);
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop.Run();
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3ul, notification_tracker().size());
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestNotificationTracker::Event ev2 = notification_tracker().at(1);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev2.type);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestNotificationTracker::Event ev3 = notification_tracker().at(2);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev2.type);
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, interceptor->hit_count());
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count());
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Stop();
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Loop twice again but this case we simulate a server error by returning
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // an empty file.
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor->SetResponse(expected_update_url,
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           header_ok_reply,
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           test_file("updatecheck_reply_empty"));
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  notification_tracker().Reset();
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_configurator()->SetLoopCount(2);
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Start();
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop.Run();
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3ul, notification_tracker().size());
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ev1 = notification_tracker().at(0);
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_STARTED, ev1.type);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ev2 = notification_tracker().at(1);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev2.type);
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ev3 = notification_tracker().at(2);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev2.type);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4, interceptor->hit_count());
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count());
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Stop();
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we can check for updates and install one component. Besides
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the notifications above NOTIFICATION_COMPONENT_UPDATE_FOUND and
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NOTIFICATION_COMPONENT_UPDATE_READY should have been fired. We do two loops
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// so the second time around there should be nothing left to do.
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We also check that only 3 network requests are issued:
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1- manifest check
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2- download crx
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3- second manifest check.
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, InstallCrx) {
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageLoop message_loop;
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread ui_thread(BrowserThread::UI, &message_loop);
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread file_thread(BrowserThread::FILE);
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread io_thread(BrowserThread::IO);
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  io_thread.StartIOThread();
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_thread.Start();
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<ComponentUpdateInterceptor>
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      interceptor(new ComponentUpdateInterceptor());
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrxComponent com1;
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterComponent(&com1, kTestComponent_jebg, Version("0.9"));
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrxComponent com2;
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterComponent(&com2, kTestComponent_abag, Version("2.2"));
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char expected_update_url_1[] =
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://localhost/upd?extra=foo&x=id%3D"
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "jebgalgnebhfojomionfpkfelancnnkf%26v%3D0.9%26uc&x=id%3D"
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "abagagagagagagagagagagagagagagag%26v%3D2.2%26uc";
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char expected_update_url_2[] =
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://localhost/upd?extra=foo&x=id%3D"
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "abagagagagagagagagagagagagagagag%26v%3D2.2%26uc&x=id%3D"
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "jebgalgnebhfojomionfpkfelancnnkf%26v%3D1.0%26uc";
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor->SetResponse(expected_update_url_1, header_ok_reply,
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           test_file("updatecheck_reply_1.xml"));
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor->SetResponse(expected_update_url_2, header_ok_reply,
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           test_file("updatecheck_reply_1.xml"));
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor->SetResponse(expected_crx_url, header_ok_reply,
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_configurator()->SetLoopCount(2);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Start();
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop.Run();
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error());
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, static_cast<TestInstaller*>(com1.installer)->install_count());
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3, interceptor->hit_count());
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(5ul, notification_tracker().size());
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestNotificationTracker::Event ev1 = notification_tracker().at(1);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATE_FOUND, ev1.type);
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestNotificationTracker::Event ev2 = notification_tracker().at(2);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATE_READY, ev2.type);
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestNotificationTracker::Event ev3 = notification_tracker().at(3);
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev3.type);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestNotificationTracker::Event ev4 = notification_tracker().at(4);
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev3.type);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Stop();
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test checks that the "prodversionmin" value is handled correctly. In
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// particular there should not be an install because the minimum product
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// version is much higher than of chrome.
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ComponentUpdaterTest, ProdVersionCheck) {
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageLoop message_loop;
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread ui_thread(BrowserThread::UI, &message_loop);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread file_thread(BrowserThread::FILE);
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread io_thread(BrowserThread::IO);
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  io_thread.StartIOThread();
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_thread.Start();
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<ComponentUpdateInterceptor>
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      interceptor(new ComponentUpdateInterceptor());
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrxComponent com;
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterComponent(&com, kTestComponent_jebg, Version("0.9"));
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char expected_update_url[] =
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://localhost/upd?extra=foo&x=id%3D"
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "jebgalgnebhfojomionfpkfelancnnkf%26v%3D0.9%26uc";
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor->SetResponse(expected_update_url,
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           header_ok_reply,
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           test_file("updatecheck_reply_2.xml"));
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor->SetResponse(expected_crx_url, header_ok_reply,
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_configurator()->SetLoopCount(1);
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Start();
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop.Run();
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, interceptor->hit_count());
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count());
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component_updater()->Stop();
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
418