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