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