Home | History | Annotate | Download | only in updater
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include <list>
      6 #include <map>
      7 #include <set>
      8 #include <vector>
      9 
     10 #include "base/bind.h"
     11 #include "base/bind_helpers.h"
     12 #include "base/command_line.h"
     13 #include "base/compiler_specific.h"
     14 #include "base/memory/scoped_ptr.h"
     15 #include "base/memory/weak_ptr.h"
     16 #include "base/message_loop/message_loop.h"
     17 #include "base/run_loop.h"
     18 #include "base/sequenced_task_runner.h"
     19 #include "base/stl_util.h"
     20 #include "base/strings/string_number_conversions.h"
     21 #include "base/strings/string_split.h"
     22 #include "base/strings/string_util.h"
     23 #include "base/strings/stringprintf.h"
     24 #include "base/threading/thread.h"
     25 #include "base/version.h"
     26 #include "chrome/browser/chrome_notification_types.h"
     27 #include "chrome/browser/extensions/crx_installer.h"
     28 #include "chrome/browser/extensions/extension_error_reporter.h"
     29 #include "chrome/browser/extensions/extension_sync_data.h"
     30 #include "chrome/browser/extensions/test_extension_prefs.h"
     31 #include "chrome/browser/extensions/test_extension_service.h"
     32 #include "chrome/browser/extensions/test_extension_system.h"
     33 #include "chrome/browser/extensions/updater/chrome_extension_downloader_factory.h"
     34 #include "chrome/browser/extensions/updater/extension_downloader.h"
     35 #include "chrome/browser/extensions/updater/extension_downloader_delegate.h"
     36 #include "chrome/browser/extensions/updater/extension_updater.h"
     37 #include "chrome/browser/extensions/updater/request_queue_impl.h"
     38 #include "chrome/browser/google/google_brand.h"
     39 #include "chrome/browser/prefs/pref_service_syncable.h"
     40 #include "chrome/common/pref_names.h"
     41 #include "chrome/test/base/testing_profile.h"
     42 #include "components/crx_file/id_util.h"
     43 #include "components/omaha_query_params/omaha_query_params.h"
     44 #include "content/public/browser/notification_details.h"
     45 #include "content/public/browser/notification_observer.h"
     46 #include "content/public/browser/notification_registrar.h"
     47 #include "content/public/browser/notification_service.h"
     48 #include "content/public/browser/notification_source.h"
     49 #include "content/public/test/test_browser_thread_bundle.h"
     50 #include "content/public/test/test_utils.h"
     51 #include "extensions/browser/extension_prefs.h"
     52 #include "extensions/browser/extension_registry.h"
     53 #include "extensions/browser/extension_system.h"
     54 #include "extensions/browser/updater/manifest_fetch_data.h"
     55 #include "extensions/common/extension.h"
     56 #include "extensions/common/extension_urls.h"
     57 #include "extensions/common/manifest_constants.h"
     58 #include "google_apis/gaia/fake_identity_provider.h"
     59 #include "google_apis/gaia/fake_oauth2_token_service.h"
     60 #include "libxml/globals.h"
     61 #include "net/base/backoff_entry.h"
     62 #include "net/base/escape.h"
     63 #include "net/base/load_flags.h"
     64 #include "net/http/http_request_headers.h"
     65 #include "net/url_request/test_url_fetcher_factory.h"
     66 #include "net/url_request/url_request_status.h"
     67 #include "testing/gmock/include/gmock/gmock.h"
     68 #include "testing/gtest/include/gtest/gtest.h"
     69 #include "url/third_party/mozilla/url_parse.h"
     70 
     71 #if defined(OS_CHROMEOS)
     72 #include "chrome/browser/chromeos/login/users/scoped_test_user_manager.h"
     73 #include "chrome/browser/chromeos/settings/cros_settings.h"
     74 #include "chrome/browser/chromeos/settings/device_settings_service.h"
     75 #endif
     76 
     77 using base::Time;
     78 using base::TimeDelta;
     79 using content::BrowserThread;
     80 using omaha_query_params::OmahaQueryParams;
     81 using testing::DoAll;
     82 using testing::Invoke;
     83 using testing::InvokeWithoutArgs;
     84 using testing::Mock;
     85 using testing::Return;
     86 using testing::SetArgPointee;
     87 using testing::_;
     88 
     89 namespace extensions {
     90 
     91 typedef ExtensionDownloaderDelegate::Error Error;
     92 typedef ExtensionDownloaderDelegate::PingResult PingResult;
     93 
     94 namespace {
     95 
     96 const net::BackoffEntry::Policy kNoBackoffPolicy = {
     97   // Number of initial errors (in sequence) to ignore before applying
     98   // exponential back-off rules.
     99   1000,
    100 
    101   // Initial delay for exponential back-off in ms.
    102   0,
    103 
    104   // Factor by which the waiting time will be multiplied.
    105   0,
    106 
    107   // Fuzzing percentage. ex: 10% will spread requests randomly
    108   // between 90%-100% of the calculated time.
    109   0,
    110 
    111   // Maximum amount of time we are willing to delay our request in ms.
    112   0,
    113 
    114   // Time to keep an entry from being discarded even when it
    115   // has no significant state, -1 to never discard.
    116   -1,
    117 
    118   // Don't use initial delay unless the last request was an error.
    119   false,
    120 };
    121 
    122 const char kEmptyUpdateUrlData[] = "";
    123 
    124 const char kAuthUserQueryKey[] = "authuser";
    125 
    126 int kExpectedLoadFlags =
    127     net::LOAD_DO_NOT_SEND_COOKIES |
    128     net::LOAD_DO_NOT_SAVE_COOKIES |
    129     net::LOAD_DISABLE_CACHE;
    130 
    131 int kExpectedLoadFlagsForDownloadWithCookies = net::LOAD_DISABLE_CACHE;
    132 
    133 // Fake authentication constants
    134 const char kFakeAccountId[] = "bobloblaw (at) lawblog.example.com";
    135 const char kFakeOAuth2Token[] = "ce n'est pas un jeton";
    136 
    137 const ManifestFetchData::PingData kNeverPingedData(
    138     ManifestFetchData::kNeverPinged, ManifestFetchData::kNeverPinged, true);
    139 
    140 class MockExtensionDownloaderDelegate : public ExtensionDownloaderDelegate {
    141  public:
    142   MOCK_METHOD4(OnExtensionDownloadFailed, void(const std::string&,
    143                                                Error,
    144                                                const PingResult&,
    145                                                const std::set<int>&));
    146   MOCK_METHOD7(OnExtensionDownloadFinished, void(const std::string&,
    147                                                  const base::FilePath&,
    148                                                  bool,
    149                                                  const GURL&,
    150                                                  const std::string&,
    151                                                  const PingResult&,
    152                                                  const std::set<int>&));
    153   MOCK_METHOD2(GetPingDataForExtension,
    154                bool(const std::string&, ManifestFetchData::PingData*));
    155   MOCK_METHOD1(GetUpdateUrlData, std::string(const std::string&));
    156   MOCK_METHOD1(IsExtensionPending, bool(const std::string&));
    157   MOCK_METHOD2(GetExtensionExistingVersion,
    158                bool(const std::string&, std::string*));
    159 
    160   void Wait() {
    161     scoped_refptr<content::MessageLoopRunner> runner =
    162         new content::MessageLoopRunner;
    163     quit_closure_ = runner->QuitClosure();
    164     runner->Run();
    165     quit_closure_.Reset();
    166   }
    167 
    168   void Quit() {
    169     quit_closure_.Run();
    170   }
    171 
    172   void DelegateTo(ExtensionDownloaderDelegate* delegate) {
    173     ON_CALL(*this, OnExtensionDownloadFailed(_, _, _, _))
    174         .WillByDefault(Invoke(delegate,
    175             &ExtensionDownloaderDelegate::OnExtensionDownloadFailed));
    176     ON_CALL(*this, OnExtensionDownloadFinished(_, _, _, _, _, _, _))
    177         .WillByDefault(Invoke(delegate,
    178             &ExtensionDownloaderDelegate::OnExtensionDownloadFinished));
    179     ON_CALL(*this, GetPingDataForExtension(_, _))
    180         .WillByDefault(Invoke(delegate,
    181             &ExtensionDownloaderDelegate::GetPingDataForExtension));
    182     ON_CALL(*this, GetUpdateUrlData(_))
    183         .WillByDefault(Invoke(delegate,
    184             &ExtensionDownloaderDelegate::GetUpdateUrlData));
    185     ON_CALL(*this, IsExtensionPending(_))
    186         .WillByDefault(Invoke(delegate,
    187             &ExtensionDownloaderDelegate::IsExtensionPending));
    188     ON_CALL(*this, GetExtensionExistingVersion(_, _))
    189         .WillByDefault(Invoke(delegate,
    190             &ExtensionDownloaderDelegate::GetExtensionExistingVersion));
    191   }
    192 
    193  private:
    194   base::Closure quit_closure_;
    195 };
    196 
    197 const int kNotificationsObserved[] = {
    198     extensions::NOTIFICATION_EXTENSION_UPDATING_STARTED,
    199     extensions::NOTIFICATION_EXTENSION_UPDATE_FOUND,
    200 };
    201 
    202 // A class that observes the notifications sent by the ExtensionUpdater and
    203 // the ExtensionDownloader.
    204 class NotificationsObserver : public content::NotificationObserver {
    205  public:
    206   NotificationsObserver() {
    207     for (size_t i = 0; i < arraysize(kNotificationsObserved); ++i) {
    208       count_[i] = 0;
    209       registrar_.Add(this,
    210                      kNotificationsObserved[i],
    211                      content::NotificationService::AllSources());
    212     }
    213   }
    214 
    215   virtual ~NotificationsObserver() {
    216     for (size_t i = 0; i < arraysize(kNotificationsObserved); ++i) {
    217       registrar_.Remove(this,
    218                         kNotificationsObserved[i],
    219                         content::NotificationService::AllSources());
    220     }
    221   }
    222 
    223   size_t StartedCount() { return count_[0]; }
    224   size_t UpdatedCount() { return count_[1]; }
    225 
    226   bool Updated(const std::string& id) {
    227     return updated_.find(id) != updated_.end();
    228   }
    229 
    230   void Wait() {
    231     scoped_refptr<content::MessageLoopRunner> runner =
    232         new content::MessageLoopRunner;
    233     quit_closure_ = runner->QuitClosure();
    234     runner->Run();
    235     quit_closure_.Reset();
    236   }
    237 
    238  private:
    239   virtual void Observe(int type,
    240                        const content::NotificationSource& source,
    241                        const content::NotificationDetails& details) OVERRIDE {
    242     if (!quit_closure_.is_null())
    243       quit_closure_.Run();
    244     for (size_t i = 0; i < arraysize(kNotificationsObserved); ++i) {
    245       if (kNotificationsObserved[i] == type) {
    246         count_[i]++;
    247         if (type == extensions::NOTIFICATION_EXTENSION_UPDATE_FOUND) {
    248           updated_.insert(
    249               content::Details<UpdateDetails>(details)->id);
    250         }
    251         return;
    252       }
    253     }
    254     NOTREACHED();
    255   }
    256 
    257   content::NotificationRegistrar registrar_;
    258   size_t count_[arraysize(kNotificationsObserved)];
    259   std::set<std::string> updated_;
    260   base::Closure quit_closure_;
    261 
    262   DISALLOW_COPY_AND_ASSIGN(NotificationsObserver);
    263 };
    264 
    265 // Extracts the integer value of the |authuser| query parameter. Returns 0 if
    266 // the parameter is not set.
    267 int GetAuthUserQueryValue(const GURL& url) {
    268   std::string query_string = url.query();
    269   url::Component query(0, query_string.length());
    270   url::Component key, value;
    271   while (
    272       url::ExtractQueryKeyValue(query_string.c_str(), &query, &key, &value)) {
    273     std::string key_string = query_string.substr(key.begin, key.len);
    274     if (key_string == kAuthUserQueryKey) {
    275       int user_index = 0;
    276       base::StringToInt(query_string.substr(value.begin, value.len),
    277                         &user_index);
    278       return user_index;
    279     }
    280   }
    281   return 0;
    282 }
    283 
    284 }  // namespace
    285 
    286 // Base class for further specialized test classes.
    287 class MockService : public TestExtensionService {
    288  public:
    289   explicit MockService(TestExtensionPrefs* prefs)
    290       : prefs_(prefs),
    291         pending_extension_manager_(&profile_),
    292         downloader_delegate_override_(NULL) {
    293   }
    294 
    295   virtual ~MockService() {}
    296 
    297   virtual PendingExtensionManager* pending_extension_manager() OVERRIDE {
    298     ADD_FAILURE() << "Subclass should override this if it will "
    299                   << "be accessed by a test.";
    300     return &pending_extension_manager_;
    301   }
    302 
    303   Profile* profile() { return &profile_; }
    304 
    305   net::URLRequestContextGetter* request_context() {
    306     return profile_.GetRequestContext();
    307   }
    308 
    309   ExtensionPrefs* extension_prefs() { return prefs_->prefs(); }
    310 
    311   PrefService* pref_service() { return prefs_->pref_service(); }
    312 
    313   FakeOAuth2TokenService* fake_token_service() {
    314     return fake_token_service_.get();
    315   }
    316 
    317   // Creates test extensions and inserts them into list. The name and
    318   // version are all based on their index. If |update_url| is non-null, it
    319   // will be used as the update_url for each extension.
    320   // The |id| is used to distinguish extension names and make sure that
    321   // no two extensions share the same name.
    322   void CreateTestExtensions(int id, int count, ExtensionList *list,
    323                             const std::string* update_url,
    324                             Manifest::Location location) {
    325     for (int i = 1; i <= count; i++) {
    326       base::DictionaryValue manifest;
    327       manifest.SetString(manifest_keys::kVersion,
    328                          base::StringPrintf("%d.0.0.0", i));
    329       manifest.SetString(manifest_keys::kName,
    330                          base::StringPrintf("Extension %d.%d", id, i));
    331       if (update_url)
    332         manifest.SetString(manifest_keys::kUpdateURL, *update_url);
    333       scoped_refptr<Extension> e =
    334           prefs_->AddExtensionWithManifest(manifest, location);
    335       ASSERT_TRUE(e.get() != NULL);
    336       list->push_back(e);
    337     }
    338   }
    339 
    340   ExtensionDownloader::Factory GetDownloaderFactory() {
    341     return base::Bind(&MockService::CreateExtensionDownloader,
    342                       base::Unretained(this));
    343   }
    344 
    345   ExtensionDownloader::Factory GetAuthenticatedDownloaderFactory() {
    346     return base::Bind(&MockService::CreateExtensionDownloaderWithIdentity,
    347                       base::Unretained(this));
    348   }
    349 
    350   void OverrideDownloaderDelegate(ExtensionDownloaderDelegate* delegate) {
    351     downloader_delegate_override_ = delegate;
    352   }
    353 
    354  protected:
    355   TestExtensionPrefs* const prefs_;
    356   TestingProfile profile_;
    357   PendingExtensionManager pending_extension_manager_;
    358 
    359  private:
    360   scoped_ptr<ExtensionDownloader> CreateExtensionDownloader(
    361       ExtensionDownloaderDelegate* delegate) {
    362     return ChromeExtensionDownloaderFactory::CreateForRequestContext(
    363         request_context(),
    364         downloader_delegate_override_ ? downloader_delegate_override_
    365                                       : delegate);
    366   }
    367 
    368   scoped_ptr<ExtensionDownloader> CreateExtensionDownloaderWithIdentity(
    369       ExtensionDownloaderDelegate* delegate) {
    370     scoped_ptr<FakeIdentityProvider> fake_identity_provider;
    371     fake_token_service_.reset(new FakeOAuth2TokenService());
    372     fake_identity_provider.reset(new FakeIdentityProvider(
    373           fake_token_service_.get()));
    374     fake_identity_provider->LogIn(kFakeAccountId);
    375     fake_token_service_->AddAccount(kFakeAccountId);
    376 
    377     scoped_ptr<ExtensionDownloader> downloader(
    378         CreateExtensionDownloader(delegate));
    379     downloader->SetWebstoreIdentityProvider(
    380         fake_identity_provider.PassAs<IdentityProvider>());
    381     return downloader.Pass();
    382   }
    383 
    384   scoped_ptr<FakeOAuth2TokenService> fake_token_service_;
    385 
    386   ExtensionDownloaderDelegate* downloader_delegate_override_;
    387 
    388   DISALLOW_COPY_AND_ASSIGN(MockService);
    389 };
    390 
    391 
    392 bool ShouldInstallExtensionsOnly(const Extension* extension) {
    393   return extension->GetType() == Manifest::TYPE_EXTENSION;
    394 }
    395 
    396 bool ShouldInstallThemesOnly(const Extension* extension) {
    397   return extension->is_theme();
    398 }
    399 
    400 bool ShouldAlwaysInstall(const Extension* extension) {
    401   return true;
    402 }
    403 
    404 // Loads some pending extension records into a pending extension manager.
    405 void SetupPendingExtensionManagerForTest(
    406     int count,
    407     const GURL& update_url,
    408     PendingExtensionManager* pending_extension_manager) {
    409   for (int i = 1; i <= count; ++i) {
    410     PendingExtensionInfo::ShouldAllowInstallPredicate should_allow_install =
    411         (i % 2 == 0) ? &ShouldInstallThemesOnly : &ShouldInstallExtensionsOnly;
    412     const bool kIsFromSync = true;
    413     const bool kInstallSilently = true;
    414     const bool kMarkAcknowledged = false;
    415     const bool kRemoteInstall = false;
    416     std::string id =
    417         crx_file::id_util::GenerateId(base::StringPrintf("extension%i", i));
    418 
    419     pending_extension_manager->AddForTesting(
    420         PendingExtensionInfo(id,
    421                              std::string(),
    422                              update_url,
    423                              Version(),
    424                              should_allow_install,
    425                              kIsFromSync,
    426                              kInstallSilently,
    427                              Manifest::INTERNAL,
    428                              Extension::NO_FLAGS,
    429                              kMarkAcknowledged,
    430                              kRemoteInstall));
    431   }
    432 }
    433 
    434 class ServiceForManifestTests : public MockService {
    435  public:
    436   explicit ServiceForManifestTests(TestExtensionPrefs* prefs)
    437       : MockService(prefs),
    438         registry_(ExtensionRegistry::Get(profile())) {
    439   }
    440 
    441   virtual ~ServiceForManifestTests() {}
    442 
    443   virtual const Extension* GetExtensionById(
    444       const std::string& id, bool include_disabled) const OVERRIDE {
    445     const Extension* result = registry_->enabled_extensions().GetByID(id);
    446     if (result || !include_disabled)
    447       return result;
    448     return registry_->disabled_extensions().GetByID(id);
    449   }
    450 
    451   virtual const ExtensionSet* extensions() const OVERRIDE {
    452     return &registry_->enabled_extensions();
    453   }
    454 
    455   virtual PendingExtensionManager* pending_extension_manager() OVERRIDE {
    456     return &pending_extension_manager_;
    457   }
    458 
    459   virtual const Extension* GetPendingExtensionUpdate(
    460       const std::string& id) const OVERRIDE {
    461     return NULL;
    462   }
    463 
    464   virtual bool IsExtensionEnabled(const std::string& id) const OVERRIDE {
    465     return !registry_->disabled_extensions().Contains(id);
    466   }
    467 
    468   void set_extensions(ExtensionList extensions,
    469                       ExtensionList disabled_extensions) {
    470     registry_->ClearAll();
    471     for (ExtensionList::const_iterator it = extensions.begin();
    472          it != extensions.end(); ++it) {
    473       registry_->AddEnabled(*it);
    474     }
    475     for (ExtensionList::const_iterator it = disabled_extensions.begin();
    476          it != disabled_extensions.end(); ++it) {
    477       registry_->AddDisabled(*it);
    478     }
    479   }
    480 
    481  private:
    482   ExtensionRegistry* registry_;
    483 };
    484 
    485 class ServiceForDownloadTests : public MockService {
    486  public:
    487   explicit ServiceForDownloadTests(TestExtensionPrefs* prefs)
    488       : MockService(prefs) {
    489   }
    490 
    491   // Add a fake crx installer to be returned by a call to UpdateExtension()
    492   // with a specific ID.  Caller keeps ownership of |crx_installer|.
    493   void AddFakeCrxInstaller(const std::string& id, CrxInstaller* crx_installer) {
    494     fake_crx_installers_[id] = crx_installer;
    495   }
    496 
    497   virtual bool UpdateExtension(
    498       const std::string& id,
    499       const base::FilePath& extension_path,
    500       bool file_ownership_passed,
    501       CrxInstaller** out_crx_installer) OVERRIDE {
    502     extension_id_ = id;
    503     install_path_ = extension_path;
    504 
    505     if (ContainsKey(fake_crx_installers_, id)) {
    506       *out_crx_installer = fake_crx_installers_[id];
    507       return true;
    508     }
    509 
    510     return false;
    511   }
    512 
    513   virtual PendingExtensionManager* pending_extension_manager() OVERRIDE {
    514     return &pending_extension_manager_;
    515   }
    516 
    517   virtual const Extension* GetExtensionById(
    518       const std::string& id, bool) const OVERRIDE {
    519     last_inquired_extension_id_ = id;
    520     return NULL;
    521   }
    522 
    523   const std::string& extension_id() const { return extension_id_; }
    524   const base::FilePath& install_path() const { return install_path_; }
    525 
    526  private:
    527   // Hold the set of ids that UpdateExtension() should fake success on.
    528   // UpdateExtension(id, ...) will return true iff fake_crx_installers_
    529   // contains key |id|.  |out_install_notification_source| will be set
    530   // to Source<CrxInstaller(fake_crx_installers_[i]).
    531   std::map<std::string, CrxInstaller*> fake_crx_installers_;
    532 
    533   std::string extension_id_;
    534   base::FilePath install_path_;
    535   GURL download_url_;
    536 
    537   // The last extension ID that GetExtensionById was called with.
    538   // Mutable because the method that sets it (GetExtensionById) is const
    539   // in the actual extension service, but must record the last extension
    540   // ID in this test class.
    541   mutable std::string last_inquired_extension_id_;
    542 };
    543 
    544 static const int kUpdateFrequencySecs = 15;
    545 
    546 // Takes a string with KEY=VALUE parameters separated by '&' in |params| and
    547 // puts the key/value pairs into |result|. For keys with no value, the empty
    548 // string is used. So for "a=1&b=foo&c", result would map "a" to "1", "b" to
    549 // "foo", and "c" to "".
    550 static void ExtractParameters(const std::string& params,
    551                               std::map<std::string, std::string>* result) {
    552   std::vector<std::string> pairs;
    553   base::SplitString(params, '&', &pairs);
    554   for (size_t i = 0; i < pairs.size(); i++) {
    555     std::vector<std::string> key_val;
    556     base::SplitString(pairs[i], '=', &key_val);
    557     if (!key_val.empty()) {
    558       std::string key = key_val[0];
    559       EXPECT_TRUE(result->find(key) == result->end());
    560       (*result)[key] = (key_val.size() == 2) ? key_val[1] : std::string();
    561     } else {
    562       NOTREACHED();
    563     }
    564   }
    565 }
    566 
    567 static void VerifyQueryAndExtractParameters(
    568     const std::string& query,
    569     std::map<std::string, std::string>* result) {
    570   std::map<std::string, std::string> params;
    571   ExtractParameters(query, &params);
    572 
    573   std::string omaha_params = OmahaQueryParams::Get(OmahaQueryParams::CRX);
    574   std::map<std::string, std::string> expected;
    575   ExtractParameters(omaha_params, &expected);
    576 
    577   for (std::map<std::string, std::string>::iterator it = expected.begin();
    578        it != expected.end(); ++it) {
    579     EXPECT_EQ(it->second, params[it->first]);
    580   }
    581 
    582   EXPECT_EQ(1U, params.count("x"));
    583   std::string decoded = net::UnescapeURLComponent(
    584       params["x"], net::UnescapeRule::URL_SPECIAL_CHARS);
    585   ExtractParameters(decoded, result);
    586 }
    587 
    588 // All of our tests that need to use private APIs of ExtensionUpdater live
    589 // inside this class (which is a friend to ExtensionUpdater).
    590 class ExtensionUpdaterTest : public testing::Test {
    591  public:
    592   ExtensionUpdaterTest()
    593       : thread_bundle_(
    594             content::TestBrowserThreadBundle::IO_MAINLOOP) {
    595   }
    596 
    597   virtual void SetUp() OVERRIDE {
    598     prefs_.reset(new TestExtensionPrefs(base::MessageLoopProxy::current()));
    599   }
    600 
    601   virtual void TearDown() OVERRIDE {
    602     // Some tests create URLRequestContextGetters, whose destruction must run
    603     // on the IO thread. Make sure the IO loop spins before shutdown so that
    604     // those objects are released.
    605     RunUntilIdle();
    606     prefs_.reset();
    607   }
    608 
    609   void RunUntilIdle() {
    610     prefs_->pref_service()->CommitPendingWrite();
    611     base::RunLoop().RunUntilIdle();
    612   }
    613 
    614   void SimulateTimerFired(ExtensionUpdater* updater) {
    615     EXPECT_TRUE(updater->timer_.IsRunning());
    616     updater->timer_.Stop();
    617     updater->TimerFired();
    618     content::RunAllBlockingPoolTasksUntilIdle();
    619   }
    620 
    621   // Adds a Result with the given data to results.
    622   void AddParseResult(const std::string& id,
    623                       const std::string& version,
    624                       const std::string& url,
    625                       UpdateManifest::Results* results) {
    626     UpdateManifest::Result result;
    627     result.extension_id = id;
    628     result.version = version;
    629     result.crx_url = GURL(url);
    630     results->list.push_back(result);
    631   }
    632 
    633   void StartUpdateCheck(ExtensionDownloader* downloader,
    634                         ManifestFetchData* fetch_data) {
    635     downloader->StartUpdateCheck(scoped_ptr<ManifestFetchData>(fetch_data));
    636   }
    637 
    638   size_t ManifestFetchersCount(ExtensionDownloader* downloader) {
    639     return downloader->manifests_queue_.size() +
    640            (downloader->manifest_fetcher_.get() ? 1 : 0);
    641   }
    642 
    643   void TestExtensionUpdateCheckRequests(bool pending) {
    644     // Create an extension with an update_url.
    645     ServiceForManifestTests service(prefs_.get());
    646     std::string update_url("http://foo.com/bar");
    647     ExtensionList extensions;
    648     NotificationsObserver observer;
    649     PendingExtensionManager* pending_extension_manager =
    650         service.pending_extension_manager();
    651     if (pending) {
    652       SetupPendingExtensionManagerForTest(1, GURL(update_url),
    653                                           pending_extension_manager);
    654     } else {
    655       service.CreateTestExtensions(1, 1, &extensions, &update_url,
    656                                    Manifest::INTERNAL);
    657       service.set_extensions(extensions, ExtensionList());
    658     }
    659 
    660     // Set up and start the updater.
    661     net::TestURLFetcherFactory factory;
    662     ExtensionUpdater updater(&service,
    663                              service.extension_prefs(),
    664                              service.pref_service(),
    665                              service.profile(),
    666                              60 * 60 * 24,
    667                              NULL,
    668                              service.GetDownloaderFactory());
    669     updater.Start();
    670 
    671     // Tell the update that it's time to do update checks.
    672     EXPECT_EQ(0u, observer.StartedCount());
    673     SimulateTimerFired(&updater);
    674     EXPECT_EQ(1u, observer.StartedCount());
    675 
    676     // Get the url our mock fetcher was asked to fetch.
    677     net::TestURLFetcher* fetcher =
    678         factory.GetFetcherByID(ExtensionDownloader::kManifestFetcherId);
    679     const GURL& url = fetcher->GetOriginalURL();
    680     EXPECT_FALSE(url.is_empty());
    681     EXPECT_TRUE(url.is_valid());
    682     EXPECT_TRUE(url.SchemeIs("http"));
    683     EXPECT_EQ("foo.com", url.host());
    684     EXPECT_EQ("/bar", url.path());
    685 
    686     // Validate the extension request parameters in the query. It should
    687     // look something like "x=id%3D<id>%26v%3D<version>%26uc".
    688     EXPECT_TRUE(url.has_query());
    689     std::map<std::string, std::string> params;
    690     VerifyQueryAndExtractParameters(url.query(), &params);
    691     if (pending) {
    692       EXPECT_TRUE(pending_extension_manager->IsIdPending(params["id"]));
    693       EXPECT_EQ("0.0.0.0", params["v"]);
    694     } else {
    695       EXPECT_EQ(extensions[0]->id(), params["id"]);
    696       EXPECT_EQ(extensions[0]->VersionString(), params["v"]);
    697     }
    698     EXPECT_EQ("", params["uc"]);
    699   }
    700 
    701   void TestUpdateUrlDataEmpty() {
    702     const std::string id = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
    703     const std::string version = "1.0";
    704 
    705     // Make sure that an empty update URL data string does not cause a ap=
    706     // option to appear in the x= parameter.
    707     scoped_ptr<ManifestFetchData> fetch_data(
    708         CreateManifestFetchData(GURL("http://localhost/foo")));
    709     fetch_data->AddExtension(
    710         id, version, &kNeverPingedData, std::string(), std::string(), false);
    711 
    712     std::map<std::string, std::string> params;
    713     VerifyQueryAndExtractParameters(fetch_data->full_url().query(), &params);
    714     EXPECT_EQ(id, params["id"]);
    715     EXPECT_EQ(version, params["v"]);
    716     EXPECT_EQ(0U, params.count("ap"));
    717   }
    718 
    719   void TestUpdateUrlDataSimple() {
    720     const std::string id = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
    721     const std::string version = "1.0";
    722 
    723     // Make sure that an update URL data string causes an appropriate ap=
    724     // option to appear in the x= parameter.
    725     scoped_ptr<ManifestFetchData> fetch_data(
    726         CreateManifestFetchData(GURL("http://localhost/foo")));
    727     fetch_data->AddExtension(
    728         id, version, &kNeverPingedData, "bar", std::string(), false);
    729     std::map<std::string, std::string> params;
    730     VerifyQueryAndExtractParameters(fetch_data->full_url().query(), &params);
    731     EXPECT_EQ(id, params["id"]);
    732     EXPECT_EQ(version, params["v"]);
    733     EXPECT_EQ("bar", params["ap"]);
    734   }
    735 
    736   void TestUpdateUrlDataCompound() {
    737     const std::string id = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
    738     const std::string version = "1.0";
    739 
    740     // Make sure that an update URL data string causes an appropriate ap=
    741     // option to appear in the x= parameter.
    742     scoped_ptr<ManifestFetchData> fetch_data(
    743         CreateManifestFetchData(GURL("http://localhost/foo")));
    744     fetch_data->AddExtension(
    745         id, version, &kNeverPingedData, "a=1&b=2&c", std::string(), false);
    746     std::map<std::string, std::string> params;
    747     VerifyQueryAndExtractParameters(fetch_data->full_url().query(), &params);
    748     EXPECT_EQ(id, params["id"]);
    749     EXPECT_EQ(version, params["v"]);
    750     EXPECT_EQ("a%3D1%26b%3D2%26c", params["ap"]);
    751   }
    752 
    753   void TestUpdateUrlDataFromGallery(const std::string& gallery_url) {
    754     net::TestURLFetcherFactory factory;
    755 
    756     MockService service(prefs_.get());
    757     MockExtensionDownloaderDelegate delegate;
    758     ExtensionDownloader downloader(&delegate, service.request_context());
    759     ExtensionList extensions;
    760     std::string url(gallery_url);
    761 
    762     service.CreateTestExtensions(1, 1, &extensions, &url, Manifest::INTERNAL);
    763 
    764     const std::string& id = extensions[0]->id();
    765     EXPECT_CALL(delegate, GetPingDataForExtension(id, _));
    766 
    767     downloader.AddExtension(*extensions[0].get(), 0);
    768     downloader.StartAllPending(NULL);
    769     net::TestURLFetcher* fetcher =
    770         factory.GetFetcherByID(ExtensionDownloader::kManifestFetcherId);
    771     ASSERT_TRUE(fetcher);
    772     // Make sure that extensions that update from the gallery ignore any
    773     // update URL data.
    774     const std::string& update_url = fetcher->GetOriginalURL().spec();
    775     std::string::size_type x = update_url.find("x=");
    776     EXPECT_NE(std::string::npos, x);
    777     std::string::size_type ap = update_url.find("ap%3D", x);
    778     EXPECT_EQ(std::string::npos, ap);
    779   }
    780 
    781   void TestInstallSource() {
    782     const std::string id = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
    783     const std::string version = "1.0";
    784     const std::string install_source = "instally";
    785 
    786     // Make sure that an installsource= appears in the x= parameter.
    787     scoped_ptr<ManifestFetchData> fetch_data(
    788         CreateManifestFetchData(GURL("http://localhost/foo")));
    789     fetch_data->AddExtension(id, version, &kNeverPingedData,
    790                              kEmptyUpdateUrlData, install_source, false);
    791     std::map<std::string, std::string> params;
    792     VerifyQueryAndExtractParameters(fetch_data->full_url().query(), &params);
    793     EXPECT_EQ(id, params["id"]);
    794     EXPECT_EQ(version, params["v"]);
    795     EXPECT_EQ(install_source, params["installsource"]);
    796   }
    797 
    798   void TestDetermineUpdates() {
    799     TestingProfile profile;
    800     MockExtensionDownloaderDelegate delegate;
    801     ExtensionDownloader downloader(&delegate, profile.GetRequestContext());
    802 
    803     // Check passing an empty list of parse results to DetermineUpdates
    804     scoped_ptr<ManifestFetchData> fetch_data(
    805         CreateManifestFetchData(GURL("http://localhost/foo")));
    806     UpdateManifest::Results updates;
    807     std::vector<int> updateable;
    808     downloader.DetermineUpdates(*fetch_data, updates, &updateable);
    809     EXPECT_TRUE(updateable.empty());
    810 
    811     // Create two updates - expect that DetermineUpdates will return the first
    812     // one (v1.0 installed, v1.1 available) but not the second one (both
    813     // installed and available at v2.0).
    814     const std::string id1 = crx_file::id_util::GenerateId("1");
    815     const std::string id2 = crx_file::id_util::GenerateId("2");
    816     fetch_data->AddExtension(
    817         id1, "1.0.0.0", &kNeverPingedData, kEmptyUpdateUrlData, std::string(),
    818         false);
    819     AddParseResult(id1, "1.1", "http://localhost/e1_1.1.crx", &updates);
    820     fetch_data->AddExtension(
    821         id2, "2.0.0.0", &kNeverPingedData, kEmptyUpdateUrlData, std::string(),
    822         false);
    823     AddParseResult(id2, "2.0.0.0", "http://localhost/e2_2.0.crx", &updates);
    824 
    825     EXPECT_CALL(delegate, IsExtensionPending(_)).WillRepeatedly(Return(false));
    826     EXPECT_CALL(delegate, GetExtensionExistingVersion(id1, _))
    827         .WillOnce(DoAll(SetArgPointee<1>("1.0.0.0"),
    828                         Return(true)));
    829     EXPECT_CALL(delegate, GetExtensionExistingVersion(id2, _))
    830         .WillOnce(DoAll(SetArgPointee<1>("2.0.0.0"),
    831                         Return(true)));
    832 
    833     downloader.DetermineUpdates(*fetch_data, updates, &updateable);
    834     EXPECT_EQ(1u, updateable.size());
    835     EXPECT_EQ(0, updateable[0]);
    836   }
    837 
    838   void TestDetermineUpdatesPending() {
    839     // Create a set of test extensions
    840     ServiceForManifestTests service(prefs_.get());
    841     PendingExtensionManager* pending_extension_manager =
    842         service.pending_extension_manager();
    843     SetupPendingExtensionManagerForTest(3, GURL(), pending_extension_manager);
    844 
    845     TestingProfile profile;
    846     MockExtensionDownloaderDelegate delegate;
    847     ExtensionDownloader downloader(&delegate, profile.GetRequestContext());
    848 
    849     scoped_ptr<ManifestFetchData> fetch_data(
    850         CreateManifestFetchData(GURL("http://localhost/foo")));
    851     UpdateManifest::Results updates;
    852 
    853     std::list<std::string> ids_for_update_check;
    854     pending_extension_manager->GetPendingIdsForUpdateCheck(
    855         &ids_for_update_check);
    856 
    857     std::list<std::string>::const_iterator it;
    858     for (it = ids_for_update_check.begin();
    859          it != ids_for_update_check.end(); ++it) {
    860       fetch_data->AddExtension(*it,
    861                                "1.0.0.0",
    862                                &kNeverPingedData,
    863                                kEmptyUpdateUrlData,
    864                                std::string(),
    865                                false);
    866       AddParseResult(*it, "1.1", "http://localhost/e1_1.1.crx", &updates);
    867     }
    868 
    869     // The delegate will tell the downloader that all the extensions are
    870     // pending.
    871     EXPECT_CALL(delegate, IsExtensionPending(_)).WillRepeatedly(Return(true));
    872 
    873     std::vector<int> updateable;
    874     downloader.DetermineUpdates(*fetch_data, updates, &updateable);
    875     // All the apps should be updateable.
    876     EXPECT_EQ(3u, updateable.size());
    877     for (std::vector<int>::size_type i = 0; i < updateable.size(); ++i) {
    878       EXPECT_EQ(static_cast<int>(i), updateable[i]);
    879     }
    880   }
    881 
    882   void TestMultipleManifestDownloading() {
    883     net::TestURLFetcherFactory factory;
    884     factory.set_remove_fetcher_on_delete(true);
    885     net::TestURLFetcher* fetcher = NULL;
    886     MockService service(prefs_.get());
    887     MockExtensionDownloaderDelegate delegate;
    888     ExtensionDownloader downloader(&delegate, service.request_context());
    889     downloader.manifests_queue_.set_backoff_policy(&kNoBackoffPolicy);
    890 
    891     GURL kUpdateUrl("http://localhost/manifest1");
    892 
    893     scoped_ptr<ManifestFetchData> fetch1(CreateManifestFetchData(kUpdateUrl));
    894     scoped_ptr<ManifestFetchData> fetch2(CreateManifestFetchData(kUpdateUrl));
    895     scoped_ptr<ManifestFetchData> fetch3(CreateManifestFetchData(kUpdateUrl));
    896     scoped_ptr<ManifestFetchData> fetch4(CreateManifestFetchData(kUpdateUrl));
    897     ManifestFetchData::PingData zeroDays(0, 0, true);
    898     fetch1->AddExtension(
    899         "1111", "1.0", &zeroDays, kEmptyUpdateUrlData, std::string(), false);
    900     fetch2->AddExtension(
    901         "2222", "2.0", &zeroDays, kEmptyUpdateUrlData, std::string(), false);
    902     fetch3->AddExtension(
    903         "3333", "3.0", &zeroDays, kEmptyUpdateUrlData, std::string(), false);
    904     fetch4->AddExtension(
    905         "4444", "4.0", &zeroDays, kEmptyUpdateUrlData, std::string(), false);
    906 
    907     // This will start the first fetcher and queue the others. The next in queue
    908     // is started as each fetcher receives its response. Note that the fetchers
    909     // don't necessarily run in the order that they are started from here.
    910     GURL fetch1_url = fetch1->full_url();
    911     GURL fetch2_url = fetch2->full_url();
    912     GURL fetch3_url = fetch3->full_url();
    913     GURL fetch4_url = fetch4->full_url();
    914     downloader.StartUpdateCheck(fetch1.Pass());
    915     downloader.StartUpdateCheck(fetch2.Pass());
    916     downloader.StartUpdateCheck(fetch3.Pass());
    917     downloader.StartUpdateCheck(fetch4.Pass());
    918     RunUntilIdle();
    919 
    920     for (int i = 0; i < 4; ++i) {
    921       fetcher = factory.GetFetcherByID(ExtensionDownloader::kManifestFetcherId);
    922       ASSERT_TRUE(fetcher);
    923       ASSERT_TRUE(fetcher->delegate());
    924       EXPECT_TRUE(fetcher->GetLoadFlags() == kExpectedLoadFlags);
    925       EXPECT_FALSE(fetcher->GetOriginalURL().is_empty());
    926 
    927       if (fetcher->GetOriginalURL() == fetch1_url) {
    928         // The first fetch will fail.
    929         EXPECT_CALL(delegate, OnExtensionDownloadFailed(
    930             "1111", ExtensionDownloaderDelegate::MANIFEST_FETCH_FAILED, _, _));
    931         fetcher->set_url(kUpdateUrl);
    932         fetcher->set_status(net::URLRequestStatus());
    933         fetcher->set_response_code(400);
    934         fetcher->delegate()->OnURLFetchComplete(fetcher);
    935         RunUntilIdle();
    936         Mock::VerifyAndClearExpectations(&delegate);
    937         fetch1_url = GURL();
    938       } else if (fetcher->GetOriginalURL() == fetch2_url) {
    939         // The second fetch gets invalid data.
    940         const std::string kInvalidXml = "invalid xml";
    941         EXPECT_CALL(delegate, OnExtensionDownloadFailed(
    942             "2222", ExtensionDownloaderDelegate::MANIFEST_INVALID, _, _))
    943             .WillOnce(InvokeWithoutArgs(
    944                 &delegate,
    945                 &MockExtensionDownloaderDelegate::Quit));
    946         fetcher->set_url(kUpdateUrl);
    947         fetcher->set_status(net::URLRequestStatus());
    948         fetcher->set_response_code(200);
    949         fetcher->SetResponseString(kInvalidXml);
    950         fetcher->delegate()->OnURLFetchComplete(fetcher);
    951         delegate.Wait();
    952         Mock::VerifyAndClearExpectations(&delegate);
    953         fetch2_url = GURL();
    954       } else if (fetcher->GetOriginalURL() == fetch3_url) {
    955         // The third fetcher doesn't have an update available.
    956         const std::string kNoUpdate =
    957             "<?xml version='1.0' encoding='UTF-8'?>"
    958             "<gupdate xmlns='http://www.google.com/update2/response'"
    959             "                protocol='2.0'>"
    960             " <app appid='3333'>"
    961             "  <updatecheck codebase='http://example.com/extension_3.0.0.0.crx'"
    962             "               version='3.0.0.0' prodversionmin='3.0.0.0' />"
    963             " </app>"
    964             "</gupdate>";
    965         EXPECT_CALL(delegate, IsExtensionPending("3333"))
    966             .WillOnce(Return(false));
    967         EXPECT_CALL(delegate, GetExtensionExistingVersion("3333", _))
    968             .WillOnce(DoAll(SetArgPointee<1>("3.0.0.0"),
    969                             Return(true)));
    970         EXPECT_CALL(delegate, OnExtensionDownloadFailed(
    971             "3333", ExtensionDownloaderDelegate::NO_UPDATE_AVAILABLE, _, _))
    972             .WillOnce(InvokeWithoutArgs(
    973                 &delegate,
    974                 &MockExtensionDownloaderDelegate::Quit));
    975         fetcher->set_url(kUpdateUrl);
    976         fetcher->set_status(net::URLRequestStatus());
    977         fetcher->set_response_code(200);
    978         fetcher->SetResponseString(kNoUpdate);
    979         fetcher->delegate()->OnURLFetchComplete(fetcher);
    980         delegate.Wait();
    981         Mock::VerifyAndClearExpectations(&delegate);
    982         fetch3_url = GURL();
    983       } else if (fetcher->GetOriginalURL() == fetch4_url) {
    984         // The last fetcher has an update.
    985         NotificationsObserver observer;
    986         const std::string kUpdateAvailable =
    987             "<?xml version='1.0' encoding='UTF-8'?>"
    988             "<gupdate xmlns='http://www.google.com/update2/response'"
    989             "                protocol='2.0'>"
    990             " <app appid='4444'>"
    991             "  <updatecheck codebase='http://example.com/extension_1.2.3.4.crx'"
    992             "               version='4.0.42.0' prodversionmin='4.0.42.0' />"
    993             " </app>"
    994             "</gupdate>";
    995         EXPECT_CALL(delegate, IsExtensionPending("4444"))
    996             .WillOnce(Return(false));
    997         EXPECT_CALL(delegate, GetExtensionExistingVersion("4444", _))
    998             .WillOnce(DoAll(SetArgPointee<1>("4.0.0.0"),
    999                             Return(true)));
   1000         fetcher->set_url(kUpdateUrl);
   1001         fetcher->set_status(net::URLRequestStatus());
   1002         fetcher->set_response_code(200);
   1003         fetcher->SetResponseString(kUpdateAvailable);
   1004         fetcher->delegate()->OnURLFetchComplete(fetcher);
   1005         observer.Wait();
   1006         Mock::VerifyAndClearExpectations(&delegate);
   1007 
   1008         // Verify that the downloader decided to update this extension.
   1009         EXPECT_EQ(1u, observer.UpdatedCount());
   1010         EXPECT_TRUE(observer.Updated("4444"));
   1011         fetch4_url = GURL();
   1012       } else {
   1013         ADD_FAILURE() << "Unexpected fetch: " << fetcher->GetOriginalURL();
   1014       }
   1015     }
   1016 
   1017     fetcher = factory.GetFetcherByID(ExtensionDownloader::kManifestFetcherId);
   1018     if (fetcher)
   1019       ADD_FAILURE() << "Unexpected fetch: " << fetcher->GetOriginalURL();
   1020   }
   1021 
   1022   void TestManifestRetryDownloading() {
   1023     net::TestURLFetcherFactory factory;
   1024     net::TestURLFetcher* fetcher = NULL;
   1025     NotificationsObserver observer;
   1026     MockService service(prefs_.get());
   1027     MockExtensionDownloaderDelegate delegate;
   1028     ExtensionDownloader downloader(&delegate, service.request_context());
   1029     downloader.manifests_queue_.set_backoff_policy(&kNoBackoffPolicy);
   1030 
   1031     GURL kUpdateUrl("http://localhost/manifest1");
   1032 
   1033     scoped_ptr<ManifestFetchData> fetch(CreateManifestFetchData(kUpdateUrl));
   1034     ManifestFetchData::PingData zeroDays(0, 0, true);
   1035     fetch->AddExtension(
   1036         "1111", "1.0", &zeroDays, kEmptyUpdateUrlData, std::string(), false);
   1037 
   1038     // This will start the first fetcher.
   1039     downloader.StartUpdateCheck(fetch.Pass());
   1040     RunUntilIdle();
   1041 
   1042     // ExtensionDownloader should retry kMaxRetries times and then fail.
   1043     EXPECT_CALL(delegate, OnExtensionDownloadFailed(
   1044         "1111", ExtensionDownloaderDelegate::MANIFEST_FETCH_FAILED, _, _));
   1045     for (int i = 0; i <= ExtensionDownloader::kMaxRetries; ++i) {
   1046       // All fetches will fail.
   1047       fetcher = factory.GetFetcherByID(ExtensionDownloader::kManifestFetcherId);
   1048       EXPECT_TRUE(fetcher != NULL && fetcher->delegate() != NULL);
   1049       EXPECT_TRUE(fetcher->GetLoadFlags() == kExpectedLoadFlags);
   1050       fetcher->set_url(kUpdateUrl);
   1051       fetcher->set_status(net::URLRequestStatus());
   1052       // Code 5xx causes ExtensionDownloader to retry.
   1053       fetcher->set_response_code(500);
   1054       fetcher->delegate()->OnURLFetchComplete(fetcher);
   1055       RunUntilIdle();
   1056     }
   1057     Mock::VerifyAndClearExpectations(&delegate);
   1058 
   1059 
   1060     // For response codes that are not in the 5xx range ExtensionDownloader
   1061     // should not retry.
   1062     fetch.reset(CreateManifestFetchData(kUpdateUrl));
   1063     fetch->AddExtension(
   1064         "1111", "1.0", &zeroDays, kEmptyUpdateUrlData, std::string(), false);
   1065 
   1066     // This will start the first fetcher.
   1067     downloader.StartUpdateCheck(fetch.Pass());
   1068     RunUntilIdle();
   1069 
   1070     EXPECT_CALL(delegate, OnExtensionDownloadFailed(
   1071         "1111", ExtensionDownloaderDelegate::MANIFEST_FETCH_FAILED, _, _));
   1072     // The first fetch will fail, and require retrying.
   1073     fetcher = factory.GetFetcherByID(ExtensionDownloader::kManifestFetcherId);
   1074     EXPECT_TRUE(fetcher != NULL && fetcher->delegate() != NULL);
   1075     EXPECT_TRUE(fetcher->GetLoadFlags() == kExpectedLoadFlags);
   1076     fetcher->set_url(kUpdateUrl);
   1077     fetcher->set_status(net::URLRequestStatus());
   1078     fetcher->set_response_code(500);
   1079     fetcher->delegate()->OnURLFetchComplete(fetcher);
   1080     RunUntilIdle();
   1081 
   1082     // The second fetch will fail with response 400 and should not cause
   1083     // ExtensionDownloader to retry.
   1084     fetcher = factory.GetFetcherByID(ExtensionDownloader::kManifestFetcherId);
   1085     EXPECT_TRUE(fetcher != NULL && fetcher->delegate() != NULL);
   1086     EXPECT_TRUE(fetcher->GetLoadFlags() == kExpectedLoadFlags);
   1087     fetcher->set_url(kUpdateUrl);
   1088     fetcher->set_status(net::URLRequestStatus());
   1089     fetcher->set_response_code(400);
   1090     fetcher->delegate()->OnURLFetchComplete(fetcher);
   1091     RunUntilIdle();
   1092 
   1093     Mock::VerifyAndClearExpectations(&delegate);
   1094   }
   1095 
   1096   void TestSingleExtensionDownloading(bool pending, bool retry, bool fail) {
   1097     net::TestURLFetcherFactory factory;
   1098     net::TestURLFetcher* fetcher = NULL;
   1099     scoped_ptr<ServiceForDownloadTests> service(
   1100         new ServiceForDownloadTests(prefs_.get()));
   1101     ExtensionUpdater updater(service.get(),
   1102                              service->extension_prefs(),
   1103                              service->pref_service(),
   1104                              service->profile(),
   1105                              kUpdateFrequencySecs,
   1106                              NULL,
   1107                              service->GetDownloaderFactory());
   1108     MockExtensionDownloaderDelegate delegate;
   1109     delegate.DelegateTo(&updater);
   1110     service->OverrideDownloaderDelegate(&delegate);
   1111     updater.Start();
   1112     updater.EnsureDownloaderCreated();
   1113     updater.downloader_->extensions_queue_.set_backoff_policy(
   1114         &kNoBackoffPolicy);
   1115 
   1116     GURL test_url("http://localhost/extension.crx");
   1117 
   1118     std::string id = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
   1119     std::string hash;
   1120     Version version("0.0.1");
   1121     std::set<int> requests;
   1122     requests.insert(0);
   1123     scoped_ptr<ExtensionDownloader::ExtensionFetch> fetch(
   1124         new ExtensionDownloader::ExtensionFetch(
   1125             id, test_url, hash, version.GetString(), requests));
   1126     updater.downloader_->FetchUpdatedExtension(fetch.Pass());
   1127 
   1128     if (pending) {
   1129       const bool kIsFromSync = true;
   1130       const bool kInstallSilently = true;
   1131       const bool kMarkAcknowledged = false;
   1132       const bool kRemoteInstall = false;
   1133       PendingExtensionManager* pending_extension_manager =
   1134           service->pending_extension_manager();
   1135       pending_extension_manager->AddForTesting(
   1136           PendingExtensionInfo(id,
   1137                                std::string(),
   1138                                test_url,
   1139                                version,
   1140                                &ShouldAlwaysInstall,
   1141                                kIsFromSync,
   1142                                kInstallSilently,
   1143                                Manifest::INTERNAL,
   1144                                Extension::NO_FLAGS,
   1145                                kMarkAcknowledged,
   1146                                kRemoteInstall));
   1147     }
   1148 
   1149     // Call back the ExtensionUpdater with a 200 response and some test data
   1150     base::FilePath extension_file_path(FILE_PATH_LITERAL("/whatever"));
   1151     fetcher = factory.GetFetcherByID(ExtensionDownloader::kExtensionFetcherId);
   1152     EXPECT_TRUE(fetcher != NULL && fetcher->delegate() != NULL);
   1153     EXPECT_TRUE(fetcher->GetLoadFlags() == kExpectedLoadFlags);
   1154 
   1155     if (retry) {
   1156       // Reply with response code 500 to cause ExtensionDownloader to retry
   1157       fetcher->set_url(test_url);
   1158       fetcher->set_status(net::URLRequestStatus());
   1159       fetcher->set_response_code(500);
   1160       fetcher->delegate()->OnURLFetchComplete(fetcher);
   1161 
   1162       RunUntilIdle();
   1163       fetcher = factory.GetFetcherByID(
   1164           ExtensionDownloader::kExtensionFetcherId);
   1165       EXPECT_TRUE(fetcher != NULL && fetcher->delegate() != NULL);
   1166       EXPECT_TRUE(fetcher->GetLoadFlags() == kExpectedLoadFlags);
   1167     }
   1168 
   1169     fetcher->set_url(test_url);
   1170     fetcher->set_status(net::URLRequestStatus());
   1171     if (fail) {
   1172       fetcher->set_response_code(404);
   1173       EXPECT_CALL(delegate, OnExtensionDownloadFailed(id, _, _, requests));
   1174     } else {
   1175       fetcher->set_response_code(200);
   1176       fetcher->SetResponseFilePath(extension_file_path);
   1177       EXPECT_CALL(delegate, OnExtensionDownloadFinished(
   1178           id, _, _, _, version.GetString(), _, requests));
   1179     }
   1180     fetcher->delegate()->OnURLFetchComplete(fetcher);
   1181 
   1182     RunUntilIdle();
   1183 
   1184     if (fail) {
   1185       // Don't expect any extension to have been installed.
   1186       EXPECT_TRUE(service->extension_id().empty());
   1187     } else {
   1188       // Expect that ExtensionUpdater asked the mock extensions service to
   1189       // install a file with the test data for the right id.
   1190       EXPECT_EQ(id, service->extension_id());
   1191       base::FilePath tmpfile_path = service->install_path();
   1192       EXPECT_FALSE(tmpfile_path.empty());
   1193       EXPECT_EQ(extension_file_path, tmpfile_path);
   1194     }
   1195   }
   1196 
   1197   // Update a single extension in an environment where the download request
   1198   // initially responds with a 403 status. If |identity_provider| is not NULL,
   1199   // this will first expect a request which includes an Authorization header
   1200   // with an OAuth2 bearer token; otherwise, or if OAuth2 failure is simulated,
   1201   // this expects the downloader to fall back onto cookie-based credentials.
   1202   void TestProtectedDownload(
   1203       const std::string& url_prefix,
   1204       bool enable_oauth2,
   1205       bool succeed_with_oauth2,
   1206       int valid_authuser,
   1207       int max_authuser) {
   1208     net::TestURLFetcherFactory factory;
   1209     net::TestURLFetcher* fetcher = NULL;
   1210     scoped_ptr<ServiceForDownloadTests> service(
   1211         new ServiceForDownloadTests(prefs_.get()));
   1212     const ExtensionDownloader::Factory& downloader_factory =
   1213         enable_oauth2 ? service->GetAuthenticatedDownloaderFactory()
   1214             : service->GetDownloaderFactory();
   1215     ExtensionUpdater updater(
   1216         service.get(),
   1217         service->extension_prefs(),
   1218         service->pref_service(),
   1219         service->profile(),
   1220         kUpdateFrequencySecs,
   1221         NULL,
   1222         downloader_factory);
   1223     updater.Start();
   1224     updater.EnsureDownloaderCreated();
   1225     updater.downloader_->extensions_queue_.set_backoff_policy(
   1226         &kNoBackoffPolicy);
   1227 
   1228     GURL test_url(base::StringPrintf("%s/extension.crx", url_prefix.c_str()));
   1229     std::string id = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
   1230     std::string hash;
   1231   Version version("0.0.1");
   1232     std::set<int> requests;
   1233     requests.insert(0);
   1234     scoped_ptr<ExtensionDownloader::ExtensionFetch> fetch(
   1235         new ExtensionDownloader::ExtensionFetch(
   1236             id, test_url, hash, version.GetString(), requests));
   1237     updater.downloader_->FetchUpdatedExtension(fetch.Pass());
   1238 
   1239     fetcher = factory.GetFetcherByID(ExtensionDownloader::kExtensionFetcherId);
   1240     EXPECT_TRUE(fetcher != NULL && fetcher->delegate() != NULL);
   1241     EXPECT_EQ(kExpectedLoadFlags, fetcher->GetLoadFlags());
   1242 
   1243     // Fake a 403 response.
   1244     fetcher->set_url(test_url);
   1245     fetcher->set_status(net::URLRequestStatus());
   1246     fetcher->set_response_code(403);
   1247     fetcher->delegate()->OnURLFetchComplete(fetcher);
   1248 
   1249     if (service->fake_token_service()) {
   1250       service->fake_token_service()->IssueAllTokensForAccount(
   1251           kFakeAccountId, kFakeOAuth2Token, base::Time::Now());
   1252     }
   1253     RunUntilIdle();
   1254 
   1255     bool using_oauth2 = false;
   1256     int expected_load_flags = kExpectedLoadFlags;
   1257     // Verify that the fetch has had its credentials properly incremented.
   1258     fetcher = factory.GetFetcherByID(ExtensionDownloader::kExtensionFetcherId);
   1259     EXPECT_TRUE(fetcher != NULL && fetcher->delegate() != NULL);
   1260     net::HttpRequestHeaders fetch_headers;
   1261     fetcher->GetExtraRequestHeaders(&fetch_headers);
   1262     // If the download URL is not https, no credentials should be provided.
   1263     if (!test_url.SchemeIsSecure()) {
   1264       // No cookies.
   1265       EXPECT_EQ(kExpectedLoadFlags, fetcher->GetLoadFlags());
   1266       // No Authorization header.
   1267       EXPECT_FALSE(fetch_headers.HasHeader(
   1268           net::HttpRequestHeaders::kAuthorization));
   1269       expected_load_flags = kExpectedLoadFlags;
   1270     } else {
   1271       // HTTPS is in use, so credentials are allowed.
   1272       if (enable_oauth2 && test_url.DomainIs("google.com")) {
   1273         // If an IdentityProvider is present and the URL is a google.com
   1274         // URL, the fetcher should be in OAuth2 mode after the intitial
   1275         // challenge.
   1276         EXPECT_TRUE(fetch_headers.HasHeader(
   1277             net::HttpRequestHeaders::kAuthorization));
   1278         std::string expected_header_value = base::StringPrintf("Bearer %s",
   1279             kFakeOAuth2Token);
   1280         std::string actual_header_value;
   1281         fetch_headers.GetHeader(net::HttpRequestHeaders::kAuthorization,
   1282                                 &actual_header_value);
   1283         EXPECT_EQ(expected_header_value, actual_header_value);
   1284         using_oauth2 = true;
   1285       } else {
   1286         // No IdentityProvider (or no google.com), so expect cookies instead of
   1287         // an Authorization header.
   1288         EXPECT_FALSE(fetch_headers.HasHeader(
   1289             net::HttpRequestHeaders::kAuthorization));
   1290         EXPECT_EQ(kExpectedLoadFlagsForDownloadWithCookies,
   1291             fetcher->GetLoadFlags());
   1292         expected_load_flags = kExpectedLoadFlagsForDownloadWithCookies;
   1293       }
   1294     }
   1295 
   1296     bool success = false;
   1297     if (using_oauth2) {
   1298       if (succeed_with_oauth2) {
   1299         success = true;
   1300       } else {
   1301         // Simulate OAuth2 failure and ensure that we fall back on cookies.
   1302         fetcher->set_url(test_url);
   1303         fetcher->set_status(net::URLRequestStatus());
   1304         fetcher->set_response_code(403);
   1305         fetcher->delegate()->OnURLFetchComplete(fetcher);
   1306         RunUntilIdle();
   1307 
   1308         const ExtensionDownloader::ExtensionFetch& fetch =
   1309             *updater.downloader_->extensions_queue_.active_request();
   1310         EXPECT_EQ(0, GetAuthUserQueryValue(fetch.url));
   1311         EXPECT_EQ(ExtensionDownloader::ExtensionFetch::CREDENTIALS_COOKIES,
   1312                   fetch.credentials);
   1313 
   1314         fetcher = factory.GetFetcherByID(
   1315             ExtensionDownloader::kExtensionFetcherId);
   1316         EXPECT_TRUE(fetcher != NULL && fetcher->delegate() != NULL);
   1317         fetcher->GetExtraRequestHeaders(&fetch_headers);
   1318         EXPECT_FALSE(fetch_headers.HasHeader(
   1319             net::HttpRequestHeaders::kAuthorization));
   1320         EXPECT_EQ(kExpectedLoadFlagsForDownloadWithCookies,
   1321             fetcher->GetLoadFlags());
   1322         expected_load_flags = kExpectedLoadFlagsForDownloadWithCookies;
   1323       }
   1324     }
   1325 
   1326     if (!success) {
   1327       // Not yet ready to simulate a successful fetch. At this point we begin
   1328       // simulating cookie-based authentication with increasing values of
   1329       // authuser (starting from 0.)
   1330       int user_index = 0;
   1331       for (; user_index <= max_authuser; ++user_index) {
   1332         const ExtensionDownloader::ExtensionFetch& fetch =
   1333             *updater.downloader_->extensions_queue_.active_request();
   1334         EXPECT_EQ(user_index, GetAuthUserQueryValue(fetch.url));
   1335         if (user_index == valid_authuser) {
   1336           success = true;
   1337           break;
   1338         }
   1339         // Simulate an authorization failure which should elicit an increment
   1340         // of the authuser value.
   1341         fetcher =
   1342             factory.GetFetcherByID(ExtensionDownloader::kExtensionFetcherId);
   1343         EXPECT_TRUE(fetcher != NULL && fetcher->delegate() != NULL);
   1344         EXPECT_EQ(expected_load_flags, fetcher->GetLoadFlags());
   1345         fetcher->set_url(fetch.url);
   1346         fetcher->set_status(net::URLRequestStatus());
   1347         fetcher->set_response_code(403);
   1348         fetcher->delegate()->OnURLFetchComplete(fetcher);
   1349         RunUntilIdle();
   1350       }
   1351 
   1352       // Simulate exhaustion of all available authusers.
   1353       if (!success && user_index > max_authuser) {
   1354         const ExtensionDownloader::ExtensionFetch& fetch =
   1355             *updater.downloader_->extensions_queue_.active_request();
   1356         fetcher =
   1357             factory.GetFetcherByID(ExtensionDownloader::kExtensionFetcherId);
   1358         EXPECT_TRUE(fetcher != NULL && fetcher->delegate() != NULL);
   1359         fetcher->set_url(fetch.url);
   1360         fetcher->set_status(net::URLRequestStatus());
   1361         fetcher->set_response_code(401);
   1362         fetcher->delegate()->OnURLFetchComplete(fetcher);
   1363         RunUntilIdle();
   1364       }
   1365     }
   1366 
   1367     // Simulate successful authorization with a 200 response.
   1368     if (success) {
   1369       fetcher =
   1370           factory.GetFetcherByID(ExtensionDownloader::kExtensionFetcherId);
   1371       EXPECT_TRUE(fetcher != NULL && fetcher->delegate() != NULL);
   1372       base::FilePath extension_file_path(FILE_PATH_LITERAL("/whatever"));
   1373       fetcher->set_url(test_url);
   1374       fetcher->set_status(net::URLRequestStatus());
   1375       fetcher->set_response_code(200);
   1376       fetcher->SetResponseFilePath(extension_file_path);
   1377       fetcher->delegate()->OnURLFetchComplete(fetcher);
   1378       RunUntilIdle();
   1379 
   1380       // Verify installation would proceed as normal.
   1381       EXPECT_EQ(id, service->extension_id());
   1382       base::FilePath tmpfile_path = service->install_path();
   1383       EXPECT_FALSE(tmpfile_path.empty());
   1384       EXPECT_EQ(extension_file_path, tmpfile_path);
   1385     }
   1386   }
   1387 
   1388   // Two extensions are updated.  If |updates_start_running| is true, the
   1389   // mock extensions service has UpdateExtension(...) return true, and
   1390   // the test is responsible for creating fake CrxInstallers.  Otherwise,
   1391   // UpdateExtension() returns false, signaling install failures.
   1392   void TestMultipleExtensionDownloading(bool updates_start_running) {
   1393     net::TestURLFetcherFactory factory;
   1394     net::TestURLFetcher* fetcher = NULL;
   1395     ServiceForDownloadTests service(prefs_.get());
   1396     ExtensionUpdater updater(&service,
   1397                              service.extension_prefs(),
   1398                              service.pref_service(),
   1399                              service.profile(),
   1400                              kUpdateFrequencySecs,
   1401                              NULL,
   1402                              service.GetDownloaderFactory());
   1403     updater.Start();
   1404     updater.EnsureDownloaderCreated();
   1405     updater.downloader_->extensions_queue_.set_backoff_policy(
   1406         &kNoBackoffPolicy);
   1407 
   1408     EXPECT_FALSE(updater.crx_install_is_running_);
   1409 
   1410     GURL url1("http://localhost/extension1.crx");
   1411     GURL url2("http://localhost/extension2.crx");
   1412 
   1413     std::string id1 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
   1414     std::string id2 = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";
   1415 
   1416     std::string hash1;
   1417     std::string hash2;
   1418 
   1419     std::string version1 = "0.1";
   1420     std::string version2 = "0.1";
   1421     std::set<int> requests;
   1422     requests.insert(0);
   1423     // Start two fetches
   1424     scoped_ptr<ExtensionDownloader::ExtensionFetch> fetch1(
   1425         new ExtensionDownloader::ExtensionFetch(
   1426             id1, url1, hash1, version1, requests));
   1427     scoped_ptr<ExtensionDownloader::ExtensionFetch> fetch2(
   1428         new ExtensionDownloader::ExtensionFetch(
   1429             id2, url2, hash2, version2, requests));
   1430     updater.downloader_->FetchUpdatedExtension(fetch1.Pass());
   1431     updater.downloader_->FetchUpdatedExtension(fetch2.Pass());
   1432 
   1433     // Make the first fetch complete.
   1434     base::FilePath extension_file_path(FILE_PATH_LITERAL("/whatever"));
   1435 
   1436     fetcher = factory.GetFetcherByID(ExtensionDownloader::kExtensionFetcherId);
   1437     EXPECT_TRUE(fetcher != NULL && fetcher->delegate() != NULL);
   1438     EXPECT_TRUE(fetcher->GetLoadFlags() == kExpectedLoadFlags);
   1439 
   1440     // We need some CrxInstallers, and CrxInstallers require a real
   1441     // ExtensionService.  Create one on the testing profile.  Any action
   1442     // the CrxInstallers take is on the testing profile's extension
   1443     // service, not on our mock |service|.  This allows us to fake
   1444     // the CrxInstaller actions we want.
   1445     TestingProfile profile;
   1446     static_cast<TestExtensionSystem*>(
   1447         ExtensionSystem::Get(&profile))->
   1448         CreateExtensionService(
   1449             CommandLine::ForCurrentProcess(),
   1450             base::FilePath(),
   1451             false);
   1452     ExtensionService* extension_service =
   1453         ExtensionSystem::Get(&profile)->extension_service();
   1454     extension_service->set_extensions_enabled(true);
   1455     extension_service->set_show_extensions_prompts(false);
   1456 
   1457     scoped_refptr<CrxInstaller> fake_crx1(
   1458         CrxInstaller::CreateSilent(extension_service));
   1459     scoped_refptr<CrxInstaller> fake_crx2(
   1460         CrxInstaller::CreateSilent(extension_service));
   1461 
   1462     if (updates_start_running) {
   1463       // Add fake CrxInstaller to be returned by service.UpdateExtension().
   1464       service.AddFakeCrxInstaller(id1, fake_crx1.get());
   1465       service.AddFakeCrxInstaller(id2, fake_crx2.get());
   1466     } else {
   1467       // If we don't add fake CRX installers, the mock service fakes a failure
   1468       // starting the install.
   1469     }
   1470 
   1471     fetcher->set_url(url1);
   1472     fetcher->set_status(net::URLRequestStatus());
   1473     fetcher->set_response_code(200);
   1474     fetcher->SetResponseFilePath(extension_file_path);
   1475     fetcher->delegate()->OnURLFetchComplete(fetcher);
   1476 
   1477     RunUntilIdle();
   1478 
   1479     // Expect that the service was asked to do an install with the right data.
   1480     base::FilePath tmpfile_path = service.install_path();
   1481     EXPECT_FALSE(tmpfile_path.empty());
   1482     EXPECT_EQ(id1, service.extension_id());
   1483     RunUntilIdle();
   1484 
   1485     // Make sure the second fetch finished and asked the service to do an
   1486     // update.
   1487     base::FilePath extension_file_path2(FILE_PATH_LITERAL("/whatever2"));
   1488     fetcher = factory.GetFetcherByID(ExtensionDownloader::kExtensionFetcherId);
   1489     EXPECT_TRUE(fetcher != NULL && fetcher->delegate() != NULL);
   1490     EXPECT_TRUE(fetcher->GetLoadFlags() == kExpectedLoadFlags);
   1491 
   1492     fetcher->set_url(url2);
   1493     fetcher->set_status(net::URLRequestStatus());
   1494     fetcher->set_response_code(200);
   1495     fetcher->SetResponseFilePath(extension_file_path2);
   1496     fetcher->delegate()->OnURLFetchComplete(fetcher);
   1497     RunUntilIdle();
   1498 
   1499     if (updates_start_running) {
   1500       EXPECT_TRUE(updater.crx_install_is_running_);
   1501 
   1502       // The second install should not have run, because the first has not
   1503       // sent a notification that it finished.
   1504       EXPECT_EQ(id1, service.extension_id());
   1505 
   1506       // Fake install notice.  This should start the second installation,
   1507       // which will be checked below.
   1508       fake_crx1->NotifyCrxInstallComplete(false);
   1509 
   1510       EXPECT_TRUE(updater.crx_install_is_running_);
   1511     }
   1512 
   1513     EXPECT_EQ(id2, service.extension_id());
   1514     EXPECT_FALSE(service.install_path().empty());
   1515 
   1516     // Make sure the correct crx contents were passed for the update call.
   1517     EXPECT_EQ(extension_file_path2, service.install_path());
   1518 
   1519     if (updates_start_running) {
   1520       EXPECT_TRUE(updater.crx_install_is_running_);
   1521       fake_crx2->NotifyCrxInstallComplete(false);
   1522     }
   1523     EXPECT_FALSE(updater.crx_install_is_running_);
   1524   }
   1525 
   1526   void TestGalleryRequestsWithBrand(bool use_organic_brand_code) {
   1527     google_brand::BrandForTesting brand_for_testing(
   1528         use_organic_brand_code ? "GGLS" : "TEST");
   1529 
   1530     // We want to test a variety of combinations of expected ping conditions for
   1531     // rollcall and active pings.
   1532     int ping_cases[] = { ManifestFetchData::kNeverPinged, 0, 1, 5 };
   1533 
   1534     for (size_t i = 0; i < arraysize(ping_cases); i++) {
   1535       for (size_t j = 0; j < arraysize(ping_cases); j++) {
   1536         for (size_t k = 0; k < 2; k++) {
   1537           int rollcall_ping_days = ping_cases[i];
   1538           int active_ping_days = ping_cases[j];
   1539           // Skip cases where rollcall_ping_days == -1, but
   1540           // active_ping_days > 0, because rollcall_ping_days == -1 means the
   1541           // app was just installed and this is the first update check after
   1542           // installation.
   1543           if (rollcall_ping_days == ManifestFetchData::kNeverPinged &&
   1544               active_ping_days > 0)
   1545             continue;
   1546 
   1547           bool active_bit = k > 0;
   1548           TestGalleryRequests(rollcall_ping_days, active_ping_days, active_bit,
   1549                               !use_organic_brand_code);
   1550           ASSERT_FALSE(HasFailure()) <<
   1551             " rollcall_ping_days=" << ping_cases[i] <<
   1552             " active_ping_days=" << ping_cases[j] <<
   1553             " active_bit=" << active_bit;
   1554         }
   1555       }
   1556     }
   1557   }
   1558 
   1559   // Test requests to both a Google server and a non-google server. This allows
   1560   // us to test various combinations of installed (ie roll call) and active
   1561   // (ie app launch) ping scenarios. The invariant is that each type of ping
   1562   // value should be present at most once per day, and can be calculated based
   1563   // on the delta between now and the last ping time (or in the case of active
   1564   // pings, that delta plus whether the app has been active).
   1565   void TestGalleryRequests(int rollcall_ping_days,
   1566                            int active_ping_days,
   1567                            bool active_bit,
   1568                            bool expect_brand_code) {
   1569     net::TestURLFetcherFactory factory;
   1570 
   1571     // Set up 2 mock extensions, one with a google.com update url and one
   1572     // without.
   1573     prefs_.reset(new TestExtensionPrefs(base::MessageLoopProxy::current()));
   1574     ServiceForManifestTests service(prefs_.get());
   1575     ExtensionList tmp;
   1576     GURL url1("http://clients2.google.com/service/update2/crx");
   1577     GURL url2("http://www.somewebsite.com");
   1578     service.CreateTestExtensions(1, 1, &tmp, &url1.possibly_invalid_spec(),
   1579                                  Manifest::INTERNAL);
   1580     service.CreateTestExtensions(2, 1, &tmp, &url2.possibly_invalid_spec(),
   1581                                  Manifest::INTERNAL);
   1582     EXPECT_EQ(2u, tmp.size());
   1583     service.set_extensions(tmp, ExtensionList());
   1584 
   1585     ExtensionPrefs* prefs = service.extension_prefs();
   1586     const std::string& id = tmp[0]->id();
   1587     Time now = Time::Now();
   1588     if (rollcall_ping_days == 0) {
   1589       prefs->SetLastPingDay(id, now - TimeDelta::FromSeconds(15));
   1590     } else if (rollcall_ping_days > 0) {
   1591       Time last_ping_day = now -
   1592                            TimeDelta::FromDays(rollcall_ping_days) -
   1593                            TimeDelta::FromSeconds(15);
   1594       prefs->SetLastPingDay(id, last_ping_day);
   1595     }
   1596 
   1597     // Store a value for the last day we sent an active ping.
   1598     if (active_ping_days == 0) {
   1599       prefs->SetLastActivePingDay(id, now - TimeDelta::FromSeconds(15));
   1600     } else if (active_ping_days > 0) {
   1601       Time last_active_ping_day = now -
   1602                                   TimeDelta::FromDays(active_ping_days) -
   1603                                   TimeDelta::FromSeconds(15);
   1604       prefs->SetLastActivePingDay(id, last_active_ping_day);
   1605     }
   1606     if (active_bit)
   1607       prefs->SetActiveBit(id, true);
   1608 
   1609     ExtensionUpdater updater(&service,
   1610                              service.extension_prefs(),
   1611                              service.pref_service(),
   1612                              service.profile(),
   1613                              kUpdateFrequencySecs,
   1614                              NULL,
   1615                              service.GetDownloaderFactory());
   1616     ExtensionUpdater::CheckParams params;
   1617     updater.Start();
   1618     updater.CheckNow(params);
   1619     content::RunAllBlockingPoolTasksUntilIdle();
   1620 
   1621     // Make the updater do manifest fetching, and note the urls it tries to
   1622     // fetch.
   1623     std::vector<GURL> fetched_urls;
   1624     net::TestURLFetcher* fetcher =
   1625       factory.GetFetcherByID(ExtensionDownloader::kManifestFetcherId);
   1626     EXPECT_TRUE(fetcher != NULL && fetcher->delegate() != NULL);
   1627     fetched_urls.push_back(fetcher->GetOriginalURL());
   1628 
   1629     fetcher->set_url(fetched_urls[0]);
   1630     fetcher->set_status(net::URLRequestStatus());
   1631     fetcher->set_response_code(500);
   1632     fetcher->SetResponseString(std::string());
   1633     fetcher->delegate()->OnURLFetchComplete(fetcher);
   1634 
   1635     fetcher = factory.GetFetcherByID(ExtensionDownloader::kManifestFetcherId);
   1636     fetched_urls.push_back(fetcher->GetOriginalURL());
   1637 
   1638     // The urls could have been fetched in either order, so use the host to
   1639     // tell them apart and note the query each used.
   1640     std::string url1_query;
   1641     std::string url2_query;
   1642     if (fetched_urls[0].host() == url1.host()) {
   1643       url1_query = fetched_urls[0].query();
   1644       url2_query = fetched_urls[1].query();
   1645     } else if (fetched_urls[0].host() == url2.host()) {
   1646       url1_query = fetched_urls[1].query();
   1647       url2_query = fetched_urls[0].query();
   1648     } else {
   1649       NOTREACHED();
   1650     }
   1651 
   1652     // First make sure the non-google query had no ping parameter.
   1653     std::string search_string = "ping%3D";
   1654     EXPECT_TRUE(url2_query.find(search_string) == std::string::npos);
   1655 
   1656     // Now make sure the google query had the correct ping parameter.
   1657     bool ping_expected = false;
   1658     bool did_rollcall = false;
   1659     if (rollcall_ping_days != 0) {
   1660       search_string += "r%253D" + base::IntToString(rollcall_ping_days);
   1661       did_rollcall = true;
   1662       ping_expected = true;
   1663     }
   1664     if (active_bit && active_ping_days != 0) {
   1665       if (did_rollcall)
   1666         search_string += "%2526";
   1667       search_string += "a%253D" + base::IntToString(active_ping_days);
   1668       ping_expected = true;
   1669     }
   1670     bool ping_found = url1_query.find(search_string) != std::string::npos;
   1671     EXPECT_EQ(ping_expected, ping_found) << "query was: " << url1_query
   1672         << " was looking for " << search_string;
   1673 
   1674     // Make sure the non-google query has no brand parameter.
   1675     const std::string brand_string = "brand%3D";
   1676     EXPECT_TRUE(url2_query.find(brand_string) == std::string::npos);
   1677 
   1678 #if defined(GOOGLE_CHROME_BUILD)
   1679     // Make sure the google query has a brand parameter, but only if the
   1680     // brand is non-organic.
   1681     if (expect_brand_code) {
   1682       EXPECT_TRUE(url1_query.find(brand_string) != std::string::npos);
   1683     } else {
   1684       EXPECT_TRUE(url1_query.find(brand_string) == std::string::npos);
   1685     }
   1686 #else
   1687     // Chromium builds never add the brand to the parameter, even for google
   1688     // queries.
   1689     EXPECT_TRUE(url1_query.find(brand_string) == std::string::npos);
   1690 #endif
   1691 
   1692     RunUntilIdle();
   1693   }
   1694 
   1695   // This makes sure that the extension updater properly stores the results
   1696   // of a <daystart> tag from a manifest fetch in one of two cases: 1) This is
   1697   // the first time we fetched the extension, or 2) We sent a ping value of
   1698   // >= 1 day for the extension.
   1699   void TestHandleManifestResults() {
   1700     ServiceForManifestTests service(prefs_.get());
   1701     GURL update_url("http://www.google.com/manifest");
   1702     ExtensionList tmp;
   1703     service.CreateTestExtensions(1, 1, &tmp, &update_url.spec(),
   1704                                  Manifest::INTERNAL);
   1705     service.set_extensions(tmp, ExtensionList());
   1706 
   1707     ExtensionUpdater updater(&service,
   1708                              service.extension_prefs(),
   1709                              service.pref_service(),
   1710                              service.profile(),
   1711                              kUpdateFrequencySecs,
   1712                              NULL,
   1713                              service.GetDownloaderFactory());
   1714     updater.Start();
   1715     updater.EnsureDownloaderCreated();
   1716 
   1717     scoped_ptr<ManifestFetchData> fetch_data(
   1718         CreateManifestFetchData(update_url));
   1719     const Extension* extension = tmp[0].get();
   1720     fetch_data->AddExtension(extension->id(),
   1721                              extension->VersionString(),
   1722                              &kNeverPingedData,
   1723                              kEmptyUpdateUrlData,
   1724                              std::string(),
   1725                              false);
   1726     UpdateManifest::Results results;
   1727     results.daystart_elapsed_seconds = 750;
   1728 
   1729     updater.downloader_->HandleManifestResults(*fetch_data, &results);
   1730     Time last_ping_day =
   1731         service.extension_prefs()->LastPingDay(extension->id());
   1732     EXPECT_FALSE(last_ping_day.is_null());
   1733     int64 seconds_diff = (Time::Now() - last_ping_day).InSeconds();
   1734     EXPECT_LT(seconds_diff - results.daystart_elapsed_seconds, 5);
   1735   }
   1736 
   1737  protected:
   1738   scoped_ptr<TestExtensionPrefs> prefs_;
   1739 
   1740   ManifestFetchData* CreateManifestFetchData(const GURL& update_url) {
   1741     return new ManifestFetchData(update_url,
   1742                                  0,
   1743                                  "",
   1744                                  OmahaQueryParams::Get(OmahaQueryParams::CRX),
   1745                                  ManifestFetchData::PING);
   1746   }
   1747 
   1748  private:
   1749   content::TestBrowserThreadBundle thread_bundle_;
   1750   content::InProcessUtilityThreadHelper in_process_utility_thread_helper_;
   1751 
   1752 #if defined OS_CHROMEOS
   1753   chromeos::ScopedTestDeviceSettingsService test_device_settings_service_;
   1754   chromeos::ScopedTestCrosSettings test_cros_settings_;
   1755   chromeos::ScopedTestUserManager test_user_manager_;
   1756 #endif
   1757 };
   1758 
   1759 // Because we test some private methods of ExtensionUpdater, it's easier for the
   1760 // actual test code to live in ExtenionUpdaterTest methods instead of TEST_F
   1761 // subclasses where friendship with ExtenionUpdater is not inherited.
   1762 
   1763 TEST_F(ExtensionUpdaterTest, TestExtensionUpdateCheckRequests) {
   1764   TestExtensionUpdateCheckRequests(false);
   1765 }
   1766 
   1767 TEST_F(ExtensionUpdaterTest, TestExtensionUpdateCheckRequestsPending) {
   1768   TestExtensionUpdateCheckRequests(true);
   1769 }
   1770 
   1771 TEST_F(ExtensionUpdaterTest, TestUpdateUrlData) {
   1772   TestUpdateUrlDataEmpty();
   1773   TestUpdateUrlDataSimple();
   1774   TestUpdateUrlDataCompound();
   1775   TestUpdateUrlDataFromGallery(
   1776       extension_urls::GetWebstoreUpdateUrl().spec());
   1777 }
   1778 
   1779 TEST_F(ExtensionUpdaterTest, TestInstallSource) {
   1780   TestInstallSource();
   1781 }
   1782 
   1783 TEST_F(ExtensionUpdaterTest, TestDetermineUpdates) {
   1784   TestDetermineUpdates();
   1785 }
   1786 
   1787 TEST_F(ExtensionUpdaterTest, TestDetermineUpdatesPending) {
   1788   TestDetermineUpdatesPending();
   1789 }
   1790 
   1791 TEST_F(ExtensionUpdaterTest, TestMultipleManifestDownloading) {
   1792   TestMultipleManifestDownloading();
   1793 }
   1794 
   1795 TEST_F(ExtensionUpdaterTest, TestSingleExtensionDownloading) {
   1796   TestSingleExtensionDownloading(false, false, false);
   1797 }
   1798 
   1799 TEST_F(ExtensionUpdaterTest, TestSingleExtensionDownloadingPending) {
   1800   TestSingleExtensionDownloading(true, false, false);
   1801 }
   1802 
   1803 TEST_F(ExtensionUpdaterTest, TestSingleExtensionDownloadingWithRetry) {
   1804   TestSingleExtensionDownloading(false, true, false);
   1805 }
   1806 
   1807 TEST_F(ExtensionUpdaterTest, TestSingleExtensionDownloadingPendingWithRetry) {
   1808   TestSingleExtensionDownloading(true, true, false);
   1809 }
   1810 
   1811 TEST_F(ExtensionUpdaterTest, TestSingleExtensionDownloadingFailure) {
   1812   TestSingleExtensionDownloading(false, false, true);
   1813 }
   1814 
   1815 TEST_F(ExtensionUpdaterTest, TestSingleExtensionDownloadingFailureWithRetry) {
   1816   TestSingleExtensionDownloading(false, true, true);
   1817 }
   1818 
   1819 TEST_F(ExtensionUpdaterTest, TestSingleExtensionDownloadingFailurePending) {
   1820   TestSingleExtensionDownloading(true, false, true);
   1821 }
   1822 
   1823 TEST_F(ExtensionUpdaterTest, ProtectedDownloadCookieAuth) {
   1824   TestProtectedDownload(
   1825       "https://chrome.google.com/webstore/download",
   1826       false, false,  // No OAuth2 support
   1827       0, 0);
   1828 }
   1829 
   1830 TEST_F(ExtensionUpdaterTest, ProtectedDownloadCookieFailure) {
   1831   TestProtectedDownload(
   1832       "https://chrome.google.com/webstore/download",
   1833       false, false,  // No OAuth2 support
   1834       0, -1);  // max_authuser=-1 simulates no valid authuser value.
   1835 }
   1836 
   1837 TEST_F(ExtensionUpdaterTest, ProtectedDownloadWithNonDefaultAuthUser1) {
   1838   TestProtectedDownload("https://google.com", false, false, 1, 1);
   1839 }
   1840 
   1841 TEST_F(ExtensionUpdaterTest, ProtectedDownloadWithNonDefaultAuthUser2) {
   1842   TestProtectedDownload("https://google.com", false, false, 2, 2);
   1843 }
   1844 
   1845 TEST_F(ExtensionUpdaterTest, ProtectedDownloadAuthUserExhaustionFailure) {
   1846   TestProtectedDownload("https://google.com", false, false, 2, 5);
   1847 }
   1848 
   1849 TEST_F(ExtensionUpdaterTest, ProtectedDownloadWithOAuth2Token) {
   1850   TestProtectedDownload(
   1851       "https://google.com",
   1852       true, true,
   1853       0, -1);
   1854 }
   1855 
   1856 TEST_F(ExtensionUpdaterTest, ProtectedDownloadWithOAuth2Failure) {
   1857   TestProtectedDownload(
   1858       "https://google.com",
   1859       true, false,
   1860       0, -1);
   1861 }
   1862 
   1863 TEST_F(ExtensionUpdaterTest, ProtectedDownloadNoOAuth2WithNonGoogleDomain) {
   1864   TestProtectedDownload(
   1865       "https://not-google.com",
   1866       true, true,
   1867       0, -1);
   1868 }
   1869 
   1870 TEST_F(ExtensionUpdaterTest, ProtectedDownloadFailWithoutHTTPS) {
   1871   TestProtectedDownload(
   1872       "http://google.com",
   1873       true, true,
   1874       0, 0);
   1875 }
   1876 
   1877 TEST_F(ExtensionUpdaterTest, TestMultipleExtensionDownloadingUpdatesFail) {
   1878   TestMultipleExtensionDownloading(false);
   1879 }
   1880 TEST_F(ExtensionUpdaterTest, TestMultipleExtensionDownloadingUpdatesSucceed) {
   1881   TestMultipleExtensionDownloading(true);
   1882 }
   1883 
   1884 TEST_F(ExtensionUpdaterTest, TestManifestRetryDownloading) {
   1885   TestManifestRetryDownloading();
   1886 }
   1887 
   1888 TEST_F(ExtensionUpdaterTest, TestGalleryRequestsWithOrganicBrand) {
   1889   TestGalleryRequestsWithBrand(true);
   1890 }
   1891 
   1892 TEST_F(ExtensionUpdaterTest, TestGalleryRequestsWithNonOrganicBrand) {
   1893   TestGalleryRequestsWithBrand(false);
   1894 }
   1895 
   1896 TEST_F(ExtensionUpdaterTest, TestHandleManifestResults) {
   1897   TestHandleManifestResults();
   1898 }
   1899 
   1900 TEST_F(ExtensionUpdaterTest, TestNonAutoUpdateableLocations) {
   1901   net::TestURLFetcherFactory factory;
   1902   ServiceForManifestTests service(prefs_.get());
   1903   ExtensionUpdater updater(&service,
   1904                            service.extension_prefs(),
   1905                            service.pref_service(),
   1906                            service.profile(),
   1907                            kUpdateFrequencySecs,
   1908                            NULL,
   1909                            service.GetDownloaderFactory());
   1910   MockExtensionDownloaderDelegate delegate;
   1911   service.OverrideDownloaderDelegate(&delegate);
   1912 
   1913   // Non-internal non-external extensions should be rejected.
   1914   ExtensionList extensions;
   1915   service.CreateTestExtensions(1, 1, &extensions, NULL,
   1916                                Manifest::INVALID_LOCATION);
   1917   service.CreateTestExtensions(2, 1, &extensions, NULL, Manifest::INTERNAL);
   1918   ASSERT_EQ(2u, extensions.size());
   1919   const std::string& updateable_id = extensions[1]->id();
   1920 
   1921   // These expectations fail if the delegate's methods are invoked for the
   1922   // first extension, which has a non-matching id.
   1923   EXPECT_CALL(delegate,
   1924               GetUpdateUrlData(updateable_id)).WillOnce(Return(""));
   1925   EXPECT_CALL(delegate, GetPingDataForExtension(updateable_id, _));
   1926 
   1927   service.set_extensions(extensions, ExtensionList());
   1928   ExtensionUpdater::CheckParams params;
   1929   updater.Start();
   1930   updater.CheckNow(params);
   1931   content::RunAllBlockingPoolTasksUntilIdle();
   1932 }
   1933 
   1934 TEST_F(ExtensionUpdaterTest, TestUpdatingDisabledExtensions) {
   1935   net::TestURLFetcherFactory factory;
   1936   ServiceForManifestTests service(prefs_.get());
   1937   ExtensionUpdater updater(&service,
   1938                            service.extension_prefs(),
   1939                            service.pref_service(),
   1940                            service.profile(),
   1941                            kUpdateFrequencySecs,
   1942                            NULL,
   1943                            service.GetDownloaderFactory());
   1944   MockExtensionDownloaderDelegate delegate;
   1945   service.OverrideDownloaderDelegate(&delegate);
   1946 
   1947   // Non-internal non-external extensions should be rejected.
   1948   ExtensionList enabled_extensions;
   1949   ExtensionList disabled_extensions;
   1950   service.CreateTestExtensions(1, 1, &enabled_extensions, NULL,
   1951       Manifest::INTERNAL);
   1952   service.CreateTestExtensions(2, 1, &disabled_extensions, NULL,
   1953       Manifest::INTERNAL);
   1954   ASSERT_EQ(1u, enabled_extensions.size());
   1955   ASSERT_EQ(1u, disabled_extensions.size());
   1956   const std::string& enabled_id = enabled_extensions[0]->id();
   1957   const std::string& disabled_id = disabled_extensions[0]->id();
   1958 
   1959   // We expect that both enabled and disabled extensions are auto-updated.
   1960   EXPECT_CALL(delegate, GetUpdateUrlData(enabled_id)).WillOnce(Return(""));
   1961   EXPECT_CALL(delegate, GetPingDataForExtension(enabled_id, _));
   1962   EXPECT_CALL(delegate,
   1963               GetUpdateUrlData(disabled_id)).WillOnce(Return(""));
   1964   EXPECT_CALL(delegate, GetPingDataForExtension(disabled_id, _));
   1965 
   1966   service.set_extensions(enabled_extensions, disabled_extensions);
   1967   ExtensionUpdater::CheckParams params;
   1968   updater.Start();
   1969   updater.CheckNow(params);
   1970   content::RunAllBlockingPoolTasksUntilIdle();
   1971 }
   1972 
   1973 TEST_F(ExtensionUpdaterTest, TestManifestFetchesBuilderAddExtension) {
   1974   net::TestURLFetcherFactory factory;
   1975   MockService service(prefs_.get());
   1976   MockExtensionDownloaderDelegate delegate;
   1977   scoped_ptr<ExtensionDownloader> downloader(
   1978       new ExtensionDownloader(&delegate, service.request_context()));
   1979   EXPECT_EQ(0u, ManifestFetchersCount(downloader.get()));
   1980 
   1981   // First, verify that adding valid extensions does invoke the callbacks on
   1982   // the delegate.
   1983   std::string id = crx_file::id_util::GenerateId("foo");
   1984   EXPECT_CALL(delegate, GetPingDataForExtension(id, _)).WillOnce(Return(false));
   1985   EXPECT_TRUE(
   1986       downloader->AddPendingExtension(id, GURL("http://example.com/update"),
   1987                                       0));
   1988   downloader->StartAllPending(NULL);
   1989   Mock::VerifyAndClearExpectations(&delegate);
   1990   EXPECT_EQ(1u, ManifestFetchersCount(downloader.get()));
   1991 
   1992   // Extensions with invalid update URLs should be rejected.
   1993   id = crx_file::id_util::GenerateId("foo2");
   1994   EXPECT_FALSE(
   1995       downloader->AddPendingExtension(id, GURL("http:google.com:foo"), 0));
   1996   downloader->StartAllPending(NULL);
   1997   EXPECT_EQ(1u, ManifestFetchersCount(downloader.get()));
   1998 
   1999   // Extensions with empty IDs should be rejected.
   2000   EXPECT_FALSE(downloader->AddPendingExtension(std::string(), GURL(), 0));
   2001   downloader->StartAllPending(NULL);
   2002   EXPECT_EQ(1u, ManifestFetchersCount(downloader.get()));
   2003 
   2004   // TODO(akalin): Test that extensions with empty update URLs
   2005   // converted from user scripts are rejected.
   2006 
   2007   // Reset the ExtensionDownloader so that it drops the current fetcher.
   2008   downloader.reset(
   2009       new ExtensionDownloader(&delegate, service.request_context()));
   2010   EXPECT_EQ(0u, ManifestFetchersCount(downloader.get()));
   2011 
   2012   // Extensions with empty update URLs should have a default one
   2013   // filled in.
   2014   id = crx_file::id_util::GenerateId("foo3");
   2015   EXPECT_CALL(delegate, GetPingDataForExtension(id, _)).WillOnce(Return(false));
   2016   EXPECT_TRUE(downloader->AddPendingExtension(id, GURL(), 0));
   2017   downloader->StartAllPending(NULL);
   2018   EXPECT_EQ(1u, ManifestFetchersCount(downloader.get()));
   2019 
   2020   net::TestURLFetcher* fetcher =
   2021       factory.GetFetcherByID(ExtensionDownloader::kManifestFetcherId);
   2022   ASSERT_TRUE(fetcher);
   2023   EXPECT_FALSE(fetcher->GetOriginalURL().is_empty());
   2024 }
   2025 
   2026 TEST_F(ExtensionUpdaterTest, TestStartUpdateCheckMemory) {
   2027   net::TestURLFetcherFactory factory;
   2028   MockService service(prefs_.get());
   2029   MockExtensionDownloaderDelegate delegate;
   2030   ExtensionDownloader downloader(&delegate, service.request_context());
   2031 
   2032   StartUpdateCheck(&downloader, CreateManifestFetchData(GURL()));
   2033   // This should delete the newly-created ManifestFetchData.
   2034   StartUpdateCheck(&downloader, CreateManifestFetchData(GURL()));
   2035   // This should add into |manifests_pending_|.
   2036   StartUpdateCheck(&downloader,
   2037                    CreateManifestFetchData(GURL("http://www.google.com")));
   2038   // The dtor of |downloader| should delete the pending fetchers.
   2039 }
   2040 
   2041 TEST_F(ExtensionUpdaterTest, TestCheckSoon) {
   2042   ServiceForManifestTests service(prefs_.get());
   2043   net::TestURLFetcherFactory factory;
   2044   ExtensionUpdater updater(&service,
   2045                            service.extension_prefs(),
   2046                            service.pref_service(),
   2047                            service.profile(),
   2048                            kUpdateFrequencySecs,
   2049                            NULL,
   2050                            service.GetDownloaderFactory());
   2051   EXPECT_FALSE(updater.WillCheckSoon());
   2052   updater.Start();
   2053   EXPECT_FALSE(updater.WillCheckSoon());
   2054   updater.CheckSoon();
   2055   EXPECT_TRUE(updater.WillCheckSoon());
   2056   updater.CheckSoon();
   2057   EXPECT_TRUE(updater.WillCheckSoon());
   2058   RunUntilIdle();
   2059   EXPECT_FALSE(updater.WillCheckSoon());
   2060   updater.CheckSoon();
   2061   EXPECT_TRUE(updater.WillCheckSoon());
   2062   updater.Stop();
   2063   EXPECT_FALSE(updater.WillCheckSoon());
   2064 }
   2065 
   2066 // TODO(asargent) - (http://crbug.com/12780) add tests for:
   2067 // -prodversionmin (shouldn't update if browser version too old)
   2068 // -manifests & updates arriving out of order / interleaved
   2069 // -malformed update url (empty, file://, has query, has a # fragment, etc.)
   2070 // -An extension gets uninstalled while updates are in progress (so it doesn't
   2071 //  "come back from the dead")
   2072 // -An extension gets manually updated to v3 while we're downloading v2 (ie
   2073 //  you don't get downgraded accidentally)
   2074 // -An update manifest mentions multiple updates
   2075 
   2076 }  // namespace extensions
   2077