Chromium Code Reviews| Index: content/browser/loader/upload_progress_tracker_unittest.cc |
| diff --git a/content/browser/loader/upload_progress_tracker_unittest.cc b/content/browser/loader/upload_progress_tracker_unittest.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..81563af2ad1c4261b79cdb957686f0026283d959 |
| --- /dev/null |
| +++ b/content/browser/loader/upload_progress_tracker_unittest.cc |
| @@ -0,0 +1,142 @@ |
| +// Copyright 2017 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "content/browser/loader/upload_progress_tracker.h" |
| + |
| +#include "base/test/test_simple_task_runner.h" |
| +#include "net/base/upload_progress.h" |
| +#include "testing/gmock/include/gmock/gmock.h" |
| +#include "testing/gtest/include/gtest/gtest.h" |
| + |
| +using testing::_; |
| +using testing::Return; |
| + |
| +namespace content { |
| +namespace { |
| + |
| +class MockUploadProgressTrackerClient : public UploadProgressTracker::Client { |
| + public: |
| + MockUploadProgressTrackerClient() {} |
| + ~MockUploadProgressTrackerClient() override {} |
| + |
| + MOCK_METHOD0(GetUploadProgress, net::UploadProgress()); |
| + MOCK_METHOD2(ReportUploadProgress, void(int64_t, int64_t)); |
|
mmenke
2017/01/06 15:54:53
I'd recommend against using gmock - it generally m
tzik
2017/01/10 06:54:41
Done.
|
| + |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(MockUploadProgressTrackerClient); |
| +}; |
| + |
| +} // namespace |
| + |
| +class UploadProgressTrackerTest : public ::testing::Test { |
| + public: |
| + UploadProgressTrackerTest() |
| + : task_runner_(new base::TestSimpleTaskRunner), |
| + upload_progress_tracker_(FROM_HERE, &tracker_client_, task_runner_) {} |
| + |
| + protected: |
| + scoped_refptr<base::TestSimpleTaskRunner> task_runner_; |
| + testing::StrictMock<MockUploadProgressTrackerClient> tracker_client_; |
| + UploadProgressTracker upload_progress_tracker_; |
| +}; |
| + |
| +TEST_F(UploadProgressTrackerTest, NoACK) { |
| + EXPECT_CALL(tracker_client_, GetUploadProgress()) |
| + .WillOnce(Return(net::UploadProgress(50, 100))); |
| + EXPECT_CALL(tracker_client_, ReportUploadProgress(_, _)).Times(1); |
| + |
| + // The first timer task calls ReportUploadProgress. |
| + task_runner_->RunPendingTasks(); |
| + |
| + // The second timer task does nothing, since the first task didn't send ACK. |
| + task_runner_->RunPendingTasks(); |
| +} |
| + |
| +TEST_F(UploadProgressTrackerTest, NoUpload) { |
| + EXPECT_CALL(tracker_client_, GetUploadProgress()) |
| + .WillRepeatedly(Return(net::UploadProgress(0, 0))); |
| + |
| + // UploadProgressTracker does nothing on the empty upload content. |
| + task_runner_->RunPendingTasks(); |
| +} |
| + |
| +TEST_F(UploadProgressTrackerTest, NoProgress) { |
| + EXPECT_CALL(tracker_client_, GetUploadProgress()) |
| + .Times(2) |
| + .WillRepeatedly(Return(net::UploadProgress(50, 100))); |
| + EXPECT_CALL(tracker_client_, ReportUploadProgress(_, _)).Times(1); |
| + |
| + // The first timer task calls ReportUploadProgress. |
| + task_runner_->RunPendingTasks(); |
| + |
| + upload_progress_tracker_.OnAckReceived(); |
| + |
| + // The second time doesn't call ReportUploadProgress since there's no |
| + // progress. |
| + task_runner_->RunPendingTasks(); |
| +} |
| + |
| +TEST_F(UploadProgressTrackerTest, Finished) { |
| + EXPECT_CALL(tracker_client_, GetUploadProgress()) |
| + .WillOnce(Return(net::UploadProgress(999, 1000))) |
| + .WillOnce(Return(net::UploadProgress(1000, 1000))); |
| + EXPECT_CALL(tracker_client_, ReportUploadProgress(_, _)).Times(2); |
| + |
| + // The first timer task calls ReportUploadProgress. |
| + task_runner_->RunPendingTasks(); |
| + |
| + upload_progress_tracker_.OnAckReceived(); |
| + |
| + // The second timer task calls ReportUploadProgress for reporting the |
| + // completion. |
| + task_runner_->RunPendingTasks(); |
| +} |
| + |
| +TEST_F(UploadProgressTrackerTest, Progress) { |
| + EXPECT_CALL(tracker_client_, GetUploadProgress()) |
| + .WillOnce(Return(net::UploadProgress(50, 100))) |
| + .WillOnce(Return(net::UploadProgress(75, 100))); |
| + EXPECT_CALL(tracker_client_, ReportUploadProgress(_, _)).Times(2); |
| + |
| + // The first timer task calls ReportUploadProgress. |
| + task_runner_->RunPendingTasks(); |
| + |
| + upload_progress_tracker_.OnAckReceived(); |
| + |
| + // The second timer task calls ReportUploadProgress since the progress is |
| + // big enough to report. |
| + task_runner_->RunPendingTasks(); |
| +} |
| + |
| +TEST_F(UploadProgressTrackerTest, TimePassed) { |
| + EXPECT_CALL(tracker_client_, GetUploadProgress()) |
| + .WillOnce(Return(net::UploadProgress(500, 1000))) |
| + .WillOnce(Return(net::UploadProgress(501, 1000))); |
| + EXPECT_CALL(tracker_client_, ReportUploadProgress(_, _)).Times(2); |
| + |
| + // The first timer task calls ReportUploadProgress. |
| + task_runner_->RunPendingTasks(); |
| + |
| + upload_progress_tracker_.OnAckReceived(); |
| + upload_progress_tracker_.SetLastUploadTicksForTesting(base::TimeTicks()); |
| + |
| + // The second timer task calls ReportUploadProgress since it's been long time |
| + // from the last report. |
| + task_runner_->RunPendingTasks(); |
| +} |
| + |
| +TEST_F(UploadProgressTrackerTest, Completed) { |
| + EXPECT_CALL(tracker_client_, GetUploadProgress()) |
| + .WillOnce(Return(net::UploadProgress(50, 100))) |
| + .WillOnce(Return(net::UploadProgress(100, 100))); |
| + EXPECT_CALL(tracker_client_, ReportUploadProgress(_, _)).Times(2); |
| + |
| + // The first timer task calls ReportUploadProgress. |
| + task_runner_->RunPendingTasks(); |
| + |
| + // OnUploadCompleted runs ReportUploadProgress even without Ack nor timer. |
| + upload_progress_tracker_.OnUploadCompleted(); |
| +} |
| + |
| +} // namespace context |