Home | History | Annotate | Download | only in test
      1 // Copyright 2013 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 "base/memory/scoped_ptr.h"
      6 #include "base/message_loop/message_loop.h"
      7 #include "base/run_loop.h"
      8 #include "base/version.h"
      9 #include "components/component_updater/component_updater_ping_manager.h"
     10 #include "components/component_updater/crx_update_item.h"
     11 #include "components/component_updater/test/test_configurator.h"
     12 #include "components/component_updater/test/url_request_post_interceptor.h"
     13 #include "net/url_request/url_request_test_util.h"
     14 #include "testing/gtest/include/gtest/gtest.h"
     15 
     16 namespace component_updater {
     17 
     18 class ComponentUpdaterPingManagerTest : public testing::Test {
     19  public:
     20   ComponentUpdaterPingManagerTest();
     21   virtual ~ComponentUpdaterPingManagerTest() {}
     22 
     23   void RunThreadsUntilIdle();
     24 
     25   // Overrides from testing::Test.
     26   virtual void SetUp() OVERRIDE;
     27   virtual void TearDown() OVERRIDE;
     28 
     29  protected:
     30   scoped_ptr<TestConfigurator> config_;
     31   scoped_ptr<PingManager> ping_manager_;
     32 
     33  private:
     34   base::MessageLoopForIO loop_;
     35 };
     36 
     37 ComponentUpdaterPingManagerTest::ComponentUpdaterPingManagerTest()
     38     : config_(new TestConfigurator(base::MessageLoopProxy::current(),
     39                                    base::MessageLoopProxy::current())) {
     40 }
     41 
     42 void ComponentUpdaterPingManagerTest::SetUp() {
     43   ping_manager_.reset(new PingManager(*config_));
     44 }
     45 
     46 void ComponentUpdaterPingManagerTest::TearDown() {
     47   ping_manager_.reset();
     48   config_.reset();
     49 }
     50 
     51 void ComponentUpdaterPingManagerTest::RunThreadsUntilIdle() {
     52   base::RunLoop().RunUntilIdle();
     53 }
     54 
     55 // Test is flaky: http://crbug.com/349547
     56 TEST_F(ComponentUpdaterPingManagerTest, DISABLED_PingManagerTest) {
     57   scoped_ptr<InterceptorFactory> interceptor_factory(
     58       new InterceptorFactory(base::MessageLoopProxy::current()));
     59   URLRequestPostInterceptor* interceptor =
     60       interceptor_factory->CreateInterceptor();
     61   EXPECT_TRUE(interceptor);
     62 
     63   // Test eventresult="1" is sent for successful updates.
     64   CrxUpdateItem item;
     65   item.id = "abc";
     66   item.status = CrxUpdateItem::kUpdated;
     67   item.previous_version = base::Version("1.0");
     68   item.next_version = base::Version("2.0");
     69 
     70   ping_manager_->OnUpdateComplete(&item);
     71   base::RunLoop().RunUntilIdle();
     72 
     73   EXPECT_EQ(1, interceptor->GetCount()) << interceptor->GetRequestsAsString();
     74   EXPECT_NE(string::npos,
     75             interceptor->GetRequests()[0].find(
     76                 "<app appid=\"abc\" version=\"1.0\" nextversion=\"2.0\">"
     77                 "<event eventtype=\"3\" eventresult=\"1\"/></app>"))
     78       << interceptor->GetRequestsAsString();
     79   interceptor->Reset();
     80 
     81   // Test eventresult="0" is sent for failed updates.
     82   item = CrxUpdateItem();
     83   item.id = "abc";
     84   item.status = CrxUpdateItem::kNoUpdate;
     85   item.previous_version = base::Version("1.0");
     86   item.next_version = base::Version("2.0");
     87 
     88   ping_manager_->OnUpdateComplete(&item);
     89   base::RunLoop().RunUntilIdle();
     90 
     91   EXPECT_EQ(1, interceptor->GetCount()) << interceptor->GetRequestsAsString();
     92   EXPECT_NE(string::npos,
     93             interceptor->GetRequests()[0].find(
     94                 "<app appid=\"abc\" version=\"1.0\" nextversion=\"2.0\">"
     95                 "<event eventtype=\"3\" eventresult=\"0\"/></app>"))
     96       << interceptor->GetRequestsAsString();
     97   interceptor->Reset();
     98 
     99   // Test the error values and the fingerprints.
    100   item = CrxUpdateItem();
    101   item.id = "abc";
    102   item.status = CrxUpdateItem::kNoUpdate;
    103   item.previous_version = base::Version("1.0");
    104   item.next_version = base::Version("2.0");
    105   item.previous_fp = "prev fp";
    106   item.next_fp = "next fp";
    107   item.error_category = 1;
    108   item.error_code = 2;
    109   item.extra_code1 = -1;
    110   item.diff_error_category = 10;
    111   item.diff_error_code = 20;
    112   item.diff_extra_code1 = -10;
    113   item.diff_update_failed = true;
    114   item.crx_diffurls.push_back(GURL("http://host/path"));
    115 
    116   ping_manager_->OnUpdateComplete(&item);
    117   base::RunLoop().RunUntilIdle();
    118 
    119   EXPECT_EQ(1, interceptor->GetCount()) << interceptor->GetRequestsAsString();
    120   EXPECT_NE(string::npos,
    121             interceptor->GetRequests()[0].find(
    122                 "<app appid=\"abc\" version=\"1.0\" nextversion=\"2.0\">"
    123                 "<event eventtype=\"3\" eventresult=\"0\" errorcat=\"1\" "
    124                 "errorcode=\"2\" extracode1=\"-1\" diffresult=\"0\" "
    125                 "differrorcat=\"10\" "
    126                 "differrorcode=\"20\" diffextracode1=\"-10\" "
    127                 "previousfp=\"prev fp\" nextfp=\"next fp\"/></app>"))
    128       << interceptor->GetRequestsAsString();
    129   interceptor->Reset();
    130 
    131   // Test the download metrics.
    132   item = CrxUpdateItem();
    133   item.id = "abc";
    134   item.status = CrxUpdateItem::kUpdated;
    135   item.previous_version = base::Version("1.0");
    136   item.next_version = base::Version("2.0");
    137 
    138   CrxDownloader::DownloadMetrics download_metrics;
    139   download_metrics.url = GURL("http://host1/path1");
    140   download_metrics.downloader = CrxDownloader::DownloadMetrics::kUrlFetcher;
    141   download_metrics.error = -1;
    142   download_metrics.downloaded_bytes = 123;
    143   download_metrics.total_bytes = 456;
    144   download_metrics.download_time_ms = 987;
    145   item.download_metrics.push_back(download_metrics);
    146 
    147   download_metrics = CrxDownloader::DownloadMetrics();
    148   download_metrics.url = GURL("http://host2/path2");
    149   download_metrics.downloader = CrxDownloader::DownloadMetrics::kBits;
    150   download_metrics.error = 0;
    151   download_metrics.downloaded_bytes = 1230;
    152   download_metrics.total_bytes = 4560;
    153   download_metrics.download_time_ms = 9870;
    154   item.download_metrics.push_back(download_metrics);
    155 
    156   ping_manager_->OnUpdateComplete(&item);
    157   base::RunLoop().RunUntilIdle();
    158 
    159   EXPECT_EQ(1, interceptor->GetCount()) << interceptor->GetRequestsAsString();
    160   EXPECT_NE(
    161       string::npos,
    162       interceptor->GetRequests()[0].find(
    163           "<app appid=\"abc\" version=\"1.0\" nextversion=\"2.0\">"
    164           "<event eventtype=\"3\" eventresult=\"1\"/>"
    165           "<event eventtype=\"14\" eventresult=\"0\" downloader=\"direct\" "
    166           "errorcode=\"-1\" url=\"http://host1/path1\" downloaded=\"123\" "
    167           "total=\"456\" download_time_ms=\"987\"/>"
    168           "<event eventtype=\"14\" eventresult=\"1\" downloader=\"bits\" "
    169           "url=\"http://host2/path2\" downloaded=\"1230\" total=\"4560\" "
    170           "download_time_ms=\"9870\"/></app>"))
    171       << interceptor->GetRequestsAsString();
    172   interceptor->Reset();
    173 }
    174 
    175 }  // namespace component_updater
    176