Chromium Code Reviews| OLD | NEW |
|---|---|
| (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 | |
| OLD | NEW |