Home | History | Annotate | Download | only in download
      1 // Copyright (c) 2011 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/memory/weak_ptr.h"
      7 #include "chrome/browser/download/download_status_updater.h"
      8 #include "chrome/browser/download/download_status_updater_delegate.h"
      9 #include "testing/gtest/include/gtest/gtest.h"
     10 
     11 namespace {
     12 
     13 class MockDelegate : public DownloadStatusUpdaterDelegate {
     14  public:
     15   explicit MockDelegate(DownloadStatusUpdater* updater)
     16       : updater_(updater->AsWeakPtr()),
     17         is_download_progress_known_(true),
     18         in_progress_download_count_(0),
     19         received_bytes_(0),
     20         total_bytes_(0) {
     21     EXPECT_TRUE(updater);
     22     if (updater_)
     23       updater_->AddDelegate(this);
     24   }
     25 
     26   ~MockDelegate() {
     27     EXPECT_TRUE(updater_);
     28     if (updater_)
     29       updater_->RemoveDelegate(this);
     30   }
     31 
     32   // Overriden from DownloadStatusUpdaterDelegate:
     33   virtual bool IsDownloadProgressKnown() {
     34     return is_download_progress_known_;
     35   }
     36 
     37   virtual int64 GetInProgressDownloadCount() {
     38     return in_progress_download_count_;
     39   }
     40 
     41   virtual int64 GetReceivedDownloadBytes() {
     42     return received_bytes_;
     43   }
     44 
     45   virtual int64 GetTotalDownloadBytes() {
     46     return total_bytes_;
     47   }
     48 
     49   void set_is_download_progress_known(bool progress_known) {
     50     is_download_progress_known_ = progress_known;
     51   }
     52 
     53   void set_in_progress_download_count(int64 download_count) {
     54     in_progress_download_count_ = download_count;
     55   }
     56 
     57   void set_received_bytes(int64 received_bytes) {
     58     received_bytes_ = received_bytes;
     59   }
     60 
     61   void set_total_bytes(int64 total_bytes) {
     62     total_bytes_ = total_bytes;
     63   }
     64 
     65  private:
     66   base::WeakPtr<DownloadStatusUpdater> updater_;
     67 
     68   bool is_download_progress_known_;
     69   int64 in_progress_download_count_;
     70   int64 received_bytes_;
     71   int64 total_bytes_;
     72 
     73   DISALLOW_COPY_AND_ASSIGN(MockDelegate);
     74 };
     75 
     76 }  // namespace
     77 
     78 class DownloadStatusUpdaterTest : public testing::Test {
     79  protected:
     80   DownloadStatusUpdater updater_;
     81 };
     82 
     83 TEST_F(DownloadStatusUpdaterTest, Basic) {
     84   float progress = -1;
     85   EXPECT_TRUE(updater_.GetProgress(&progress));
     86   EXPECT_FLOAT_EQ(0, progress);
     87   EXPECT_EQ(0, updater_.GetInProgressDownloadCount());
     88 }
     89 
     90 TEST_F(DownloadStatusUpdaterTest, OneDelegate) {
     91   MockDelegate delegate(&updater_);
     92 
     93   {
     94     float progress = -1;
     95     EXPECT_TRUE(updater_.GetProgress(&progress));
     96     EXPECT_FLOAT_EQ(0, progress);
     97     EXPECT_EQ(0, updater_.GetInProgressDownloadCount());
     98   }
     99 
    100   delegate.set_in_progress_download_count(1);
    101   delegate.set_received_bytes(21);
    102   delegate.set_total_bytes(42);
    103 
    104   {
    105     float progress = -1;
    106     EXPECT_TRUE(updater_.GetProgress(&progress));
    107     EXPECT_FLOAT_EQ(static_cast<float>(1) / 2, progress);
    108     EXPECT_EQ(1, updater_.GetInProgressDownloadCount());
    109   }
    110 
    111   delegate.set_is_download_progress_known(false);
    112 
    113   {
    114     float progress = -1;
    115     EXPECT_FALSE(updater_.GetProgress(&progress));
    116     EXPECT_FLOAT_EQ(0, progress);
    117     EXPECT_EQ(1, updater_.GetInProgressDownloadCount());
    118   }
    119 }
    120 
    121 TEST_F(DownloadStatusUpdaterTest, MultipleDelegates) {
    122   scoped_ptr<MockDelegate> delegate1(new MockDelegate(&updater_));
    123   scoped_ptr<MockDelegate> delegate2(new MockDelegate(&updater_));
    124 
    125   {
    126     float progress = -1;
    127     EXPECT_TRUE(updater_.GetProgress(&progress));
    128     EXPECT_FLOAT_EQ(0, progress);
    129     EXPECT_EQ(0, updater_.GetInProgressDownloadCount());
    130   }
    131 
    132   delegate1->set_in_progress_download_count(1);
    133   delegate1->set_received_bytes(14);
    134   delegate1->set_total_bytes(21);
    135 
    136   delegate2->set_in_progress_download_count(2);
    137   delegate2->set_received_bytes(7);
    138   delegate2->set_total_bytes(21);
    139 
    140   {
    141     float progress = -1;
    142     EXPECT_TRUE(updater_.GetProgress(&progress));
    143     EXPECT_FLOAT_EQ(static_cast<float>(1) / 2, progress);
    144     EXPECT_EQ(3, updater_.GetInProgressDownloadCount());
    145   }
    146 
    147   delegate1->set_is_download_progress_known(false);
    148 
    149   {
    150     float progress = -1;
    151     EXPECT_FALSE(updater_.GetProgress(&progress));
    152     EXPECT_FLOAT_EQ(0, progress);
    153     EXPECT_EQ(3, updater_.GetInProgressDownloadCount());
    154   }
    155 
    156   delegate1.reset();
    157 
    158   {
    159     float progress = -1;
    160     EXPECT_TRUE(updater_.GetProgress(&progress));
    161     EXPECT_FLOAT_EQ(static_cast<float>(1) / 3, progress);
    162     EXPECT_EQ(2, updater_.GetInProgressDownloadCount());
    163   }
    164 }
    165