Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(297)

Side by Side Diff: content/browser/loader/upload_progress_tracker_unittest.cc

Issue 2612903008: Add UploadProgressTracker unittest (Closed)
Patch Set: -gmock Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 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 "content/browser/loader/upload_progress_tracker.h"
6
7 #include "base/test/test_simple_task_runner.h"
8 #include "net/base/upload_progress.h"
9 #include "testing/gtest/include/gtest/gtest.h"
10
11 namespace content {
12 namespace {
13
14 class FakeUploadProgressTrackerClient : public UploadProgressTracker::Client {
15 public:
16 FakeUploadProgressTrackerClient() {}
17 ~FakeUploadProgressTrackerClient() override {}
18
19 net::UploadProgress GetUploadProgress() override {
20 return net::UploadProgress(current_position_, total_size_);
21 }
22
23 void ReportUploadProgress(int64_t current_position,
24 int64_t total_size) override {
25 ++report_count_;
26 current_position_ = current_position;
27 total_size_ = total_size;
mmenke 2017/01/11 19:31:13 Both of these two lines seems wrong. Seems like w
tzik 2017/01/12 13:00:57 Oh... Right, it's wrong.
28 }
29
30 int report_count() const { return report_count_; }
31 int64_t current_position() const { return current_position_; }
32 int64_t total_size() const { return total_size_; }
33
34 void set_current_position(int64_t current_position) {
35 current_position_ = current_position;
36 }
37
38 void set_total_size(int64_t total_size) { total_size_ = total_size; }
39
40 private:
41 int report_count_ = 0;
42 int64_t current_position_ = 0;
43 int64_t total_size_ = 0;
44
45 DISALLOW_COPY_AND_ASSIGN(FakeUploadProgressTrackerClient);
46 };
47
48 class TestingUploadProgressTracker : public UploadProgressTracker {
49 public:
50 TestingUploadProgressTracker(
51 const tracked_objects::Location& location,
52 Client* client,
53 scoped_refptr<base::SingleThreadTaskRunner> task_runner)
54 : UploadProgressTracker(location, client, std::move(task_runner)) {}
55
56 void set_current_time(const base::TimeTicks& current_time) {
57 current_time_ = current_time;
58 }
59
60 protected:
61 base::TimeTicks GetCurrentTime() override { return current_time_; }
mmenke 2017/01/11 19:31:14 Can be private
tzik 2017/01/12 13:00:57 Done.
62
63 base::TimeTicks current_time_;
mmenke 2017/01/11 19:31:14 Should be private.
tzik 2017/01/12 13:00:57 Done.
64 };
mmenke 2017/01/11 19:31:14 DISALLOW_COPY_AND_ASSIGN
tzik 2017/01/12 13:00:57 Done.
65
66 } // namespace
67
68 class UploadProgressTrackerTest : public ::testing::Test {
69 public:
70 UploadProgressTrackerTest()
71 : task_runner_(new base::TestSimpleTaskRunner),
72 upload_progress_tracker_(FROM_HERE, &tracker_client_, task_runner_) {}
mmenke 2017/01/11 19:31:14 include base/location.h for FROM_HERE
tzik 2017/01/12 13:00:57 Done.
73
74 protected:
75 scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
76 FakeUploadProgressTrackerClient tracker_client_;
77 TestingUploadProgressTracker upload_progress_tracker_;
78 };
79
80 TEST_F(UploadProgressTrackerTest, NoACK) {
81 tracker_client_.set_current_position(50);
82 tracker_client_.set_total_size(100);
83
84 // The first timer task calls ReportUploadProgress.
85 EXPECT_EQ(0, tracker_client_.report_count());
86 task_runner_->RunPendingTasks();
87 EXPECT_EQ(1, tracker_client_.report_count());
88 EXPECT_EQ(50, tracker_client_.current_position());
89 EXPECT_EQ(100, tracker_client_.total_size());
90
91 tracker_client_.set_current_position(75);
92
93 // The second timer task does nothing, since the first task didn't send ACK.
94 task_runner_->RunPendingTasks();
95 EXPECT_EQ(1, tracker_client_.report_count());
96 }
97
98 TEST_F(UploadProgressTrackerTest, NoUpload) {
99 tracker_client_.set_current_position(0);
100 tracker_client_.set_total_size(0);
101
102 // UploadProgressTracker does nothing on the empty upload content.
103 EXPECT_EQ(0, tracker_client_.report_count());
104 task_runner_->RunPendingTasks();
105 EXPECT_EQ(0, tracker_client_.report_count());
106 }
107
108 TEST_F(UploadProgressTrackerTest, NoProgress) {
109 tracker_client_.set_current_position(50);
110 tracker_client_.set_total_size(100);
111
112 // The first timer task calls ReportUploadProgress.
113 EXPECT_EQ(0, tracker_client_.report_count());
114 task_runner_->RunPendingTasks();
115 EXPECT_EQ(1, tracker_client_.report_count());
116 EXPECT_EQ(50, tracker_client_.current_position());
117 EXPECT_EQ(100, tracker_client_.total_size());
118
119 upload_progress_tracker_.OnAckReceived();
120
121 // The second time doesn't call ReportUploadProgress since there's no
122 // progress.
123 EXPECT_EQ(1, tracker_client_.report_count());
124 task_runner_->RunPendingTasks();
125 EXPECT_EQ(1, tracker_client_.report_count());
126 }
127
128 TEST_F(UploadProgressTrackerTest, Finished) {
129 tracker_client_.set_current_position(999);
130 tracker_client_.set_total_size(1000);
131
132 // The first timer task calls ReportUploadProgress.
133 EXPECT_EQ(0, tracker_client_.report_count());
134 task_runner_->RunPendingTasks();
135 EXPECT_EQ(1, tracker_client_.report_count());
136 EXPECT_EQ(999, tracker_client_.current_position());
137 EXPECT_EQ(1000, tracker_client_.total_size());
138
139 upload_progress_tracker_.OnAckReceived();
140 tracker_client_.set_current_position(1000);
141
142 // The second timer task calls ReportUploadProgress for reporting the
143 // completion.
144 EXPECT_EQ(1, tracker_client_.report_count());
145 task_runner_->RunPendingTasks();
146 EXPECT_EQ(2, tracker_client_.report_count());
147 EXPECT_EQ(1000, tracker_client_.current_position());
148 EXPECT_EQ(1000, tracker_client_.total_size());
149 }
150
151 TEST_F(UploadProgressTrackerTest, Progress) {
152 tracker_client_.set_current_position(50);
153 tracker_client_.set_total_size(100);
154
155 // The first timer task calls ReportUploadProgress.
156 EXPECT_EQ(0, tracker_client_.report_count());
157 task_runner_->RunPendingTasks();
158 EXPECT_EQ(1, tracker_client_.report_count());
159 EXPECT_EQ(50, tracker_client_.current_position());
160 EXPECT_EQ(100, tracker_client_.total_size());
161
162 upload_progress_tracker_.OnAckReceived();
163 tracker_client_.set_current_position(75);
164
165 // The second timer task calls ReportUploadProgress since the progress is
166 // big enough to report.
167 EXPECT_EQ(1, tracker_client_.report_count());
168 task_runner_->RunPendingTasks();
169 EXPECT_EQ(2, tracker_client_.report_count());
170 EXPECT_EQ(75, tracker_client_.current_position());
171 EXPECT_EQ(100, tracker_client_.total_size());
172 }
173
174 TEST_F(UploadProgressTrackerTest, TimePassed) {
mmenke 2017/01/11 19:31:13 Can this just be a copy of NoProgress, with a chan
tzik 2017/01/12 13:00:57 Done.
175 tracker_client_.set_current_position(500);
176 tracker_client_.set_total_size(1000);
177
178 // The first timer task calls ReportUploadProgress.
179 EXPECT_EQ(0, tracker_client_.report_count());
180 task_runner_->RunPendingTasks();
181 EXPECT_EQ(1, tracker_client_.report_count());
182 EXPECT_EQ(500, tracker_client_.current_position());
183 EXPECT_EQ(1000, tracker_client_.total_size());
mmenke 2017/01/11 19:31:14 Suggest using 500 / 1000 instead of 50/100 on all
tzik 2017/01/12 13:00:57 Done.
184
185 upload_progress_tracker_.OnAckReceived();
186 tracker_client_.set_current_position(501);
187 upload_progress_tracker_.set_current_time(base::TimeTicks::Now());
mmenke 2017/01/11 19:31:14 Relying on returning a time of 0 by default seems
tzik 2017/01/12 13:00:57 Done.
188
189 // The second timer task calls ReportUploadProgress since it's been long time
190 // from the last report.
191 EXPECT_EQ(1, tracker_client_.report_count());
192 task_runner_->RunPendingTasks();
193 EXPECT_EQ(2, tracker_client_.report_count());
194 EXPECT_EQ(501, tracker_client_.current_position());
195 EXPECT_EQ(1000, tracker_client_.total_size());
mmenke 2017/01/11 19:31:13 Also suggest a copy of this test where progress go
mmenke 2017/01/11 19:31:14 Suggest another copy of this test, without the tim
tzik 2017/01/12 13:00:57 Done.
196 }
197
198 TEST_F(UploadProgressTrackerTest, Completed) {
199 tracker_client_.set_current_position(50);
200 tracker_client_.set_total_size(100);
201
202 // The first timer task calls ReportUploadProgress.
203 EXPECT_EQ(0, tracker_client_.report_count());
204 task_runner_->RunPendingTasks();
205 EXPECT_EQ(1, tracker_client_.report_count());
206 EXPECT_EQ(50, tracker_client_.current_position());
207 EXPECT_EQ(100, tracker_client_.total_size());
208
209 tracker_client_.set_current_position(100);
210
211 // OnUploadCompleted runs ReportUploadProgress even without Ack nor timer.
212 upload_progress_tracker_.OnUploadCompleted();
213 EXPECT_EQ(2, tracker_client_.report_count());
214 EXPECT_EQ(100, tracker_client_.current_position());
215 EXPECT_EQ(100, tracker_client_.total_size());
216 }
mmenke 2017/01/11 19:31:14 It's not exciting, but maybe a test with an upload
tzik 2017/01/12 13:00:57 IIUC, request bodies always have fixed sizes that
mmenke 2017/01/12 16:06:54 That's not true when talking about Chrome in gener
217
218 } // namespace context
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698