• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • 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:
MockDelegate(DownloadStatusUpdater * updater)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 
~MockDelegate()26   ~MockDelegate() {
27     EXPECT_TRUE(updater_);
28     if (updater_)
29       updater_->RemoveDelegate(this);
30   }
31 
32   // Overriden from DownloadStatusUpdaterDelegate:
IsDownloadProgressKnown()33   virtual bool IsDownloadProgressKnown() {
34     return is_download_progress_known_;
35   }
36 
GetInProgressDownloadCount()37   virtual int64 GetInProgressDownloadCount() {
38     return in_progress_download_count_;
39   }
40 
GetReceivedDownloadBytes()41   virtual int64 GetReceivedDownloadBytes() {
42     return received_bytes_;
43   }
44 
GetTotalDownloadBytes()45   virtual int64 GetTotalDownloadBytes() {
46     return total_bytes_;
47   }
48 
set_is_download_progress_known(bool progress_known)49   void set_is_download_progress_known(bool progress_known) {
50     is_download_progress_known_ = progress_known;
51   }
52 
set_in_progress_download_count(int64 download_count)53   void set_in_progress_download_count(int64 download_count) {
54     in_progress_download_count_ = download_count;
55   }
56 
set_received_bytes(int64 received_bytes)57   void set_received_bytes(int64 received_bytes) {
58     received_bytes_ = received_bytes;
59   }
60 
set_total_bytes(int64 total_bytes)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 
TEST_F(DownloadStatusUpdaterTest,Basic)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 
TEST_F(DownloadStatusUpdaterTest,OneDelegate)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 
TEST_F(DownloadStatusUpdaterTest,MultipleDelegates)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