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

Unified Diff: content/browser/loader/upload_progress_tracker_unittest.cc

Issue 2612903008: Add UploadProgressTracker unittest (Closed)
Patch Set: +expectation for unreported small progress. 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/browser/loader/upload_progress_tracker.cc ('k') | content/test/BUILD.gn » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..508368d41f1be66b57133cac8e29e079e2ac7c07
--- /dev/null
+++ b/content/browser/loader/upload_progress_tracker_unittest.cc
@@ -0,0 +1,256 @@
+// 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/bind.h"
+#include "base/location.h"
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "base/single_thread_task_runner.h"
+#include "base/test/test_simple_task_runner.h"
+#include "net/base/upload_progress.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace content {
+namespace {
+
+class TestingUploadProgressTracker : public UploadProgressTracker {
+ public:
+ TestingUploadProgressTracker(
+ const tracked_objects::Location& location,
+ UploadProgressReportCallback report_callback,
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner)
+ : UploadProgressTracker(location,
+ std::move(report_callback),
+ nullptr,
+ std::move(task_runner)),
+ current_time_(base::TimeTicks::Now()) {}
+
+ void set_upload_progress(const net::UploadProgress& upload_progress) {
+ upload_progress_ = upload_progress;
+ }
+
+ void set_current_time(const base::TimeTicks& current_time) {
+ current_time_ = current_time;
+ }
+
+ private:
+ // UploadProgressTracker overrides.
+ base::TimeTicks GetCurrentTime() const override { return current_time_; }
+ net::UploadProgress GetUploadProgress() const override {
+ return upload_progress_;
+ }
+
+ base::TimeTicks current_time_;
+ net::UploadProgress upload_progress_;
+
+ DISALLOW_COPY_AND_ASSIGN(TestingUploadProgressTracker);
+};
+
+} // namespace
+
+class UploadProgressTrackerTest : public ::testing::Test {
+ public:
+ UploadProgressTrackerTest()
+ : task_runner_(new base::TestSimpleTaskRunner),
+ upload_progress_tracker_(
+ FROM_HERE,
+ base::BindRepeating(
+ &UploadProgressTrackerTest::OnUploadProgressReported,
+ base::Unretained(this)),
+ task_runner_) {}
+
+ private:
+ void OnUploadProgressReported(const net::UploadProgress& progress) {
+ ++report_count_;
+ reported_position_ = progress.position();
+ reported_total_size_ = progress.size();
+ }
+
+ protected:
+ int report_count_ = 0;
+ int64_t reported_position_ = 0;
+ int64_t reported_total_size_ = 0;
+
+ scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
+ TestingUploadProgressTracker upload_progress_tracker_;
+
+ DISALLOW_COPY_AND_ASSIGN(UploadProgressTrackerTest);
+};
+
+TEST_F(UploadProgressTrackerTest, NoACK) {
+ upload_progress_tracker_.set_upload_progress(net::UploadProgress(500, 1000));
+
+ // The first timer task calls ReportUploadProgress.
+ EXPECT_EQ(0, report_count_);
+ task_runner_->RunPendingTasks();
+ EXPECT_EQ(1, report_count_);
+ EXPECT_EQ(500, reported_position_);
+ EXPECT_EQ(1000, reported_total_size_);
+
+ upload_progress_tracker_.set_upload_progress(net::UploadProgress(750, 1000));
+
+ // The second timer task does nothing, since the first report didn't send the
+ // ACK.
+ task_runner_->RunPendingTasks();
+ EXPECT_EQ(1, report_count_);
+}
+
+TEST_F(UploadProgressTrackerTest, NoUpload) {
+ upload_progress_tracker_.set_upload_progress(net::UploadProgress(0, 0));
+
+ // UploadProgressTracker does nothing on the empty upload content.
+ EXPECT_EQ(0, report_count_);
+ task_runner_->RunPendingTasks();
+ EXPECT_EQ(0, report_count_);
+}
+
+TEST_F(UploadProgressTrackerTest, NoProgress) {
+ upload_progress_tracker_.set_upload_progress(net::UploadProgress(500, 1000));
+
+ // The first timer task calls ReportUploadProgress.
+ EXPECT_EQ(0, report_count_);
+ task_runner_->RunPendingTasks();
+ EXPECT_EQ(1, report_count_);
+ EXPECT_EQ(500, reported_position_);
+ EXPECT_EQ(1000, reported_total_size_);
+
+ upload_progress_tracker_.OnAckReceived();
+
+ // The second time doesn't call ReportUploadProgress since there's no
+ // progress.
+ EXPECT_EQ(1, report_count_);
+ task_runner_->RunPendingTasks();
+ EXPECT_EQ(1, report_count_);
+}
+
+TEST_F(UploadProgressTrackerTest, Finished) {
+ upload_progress_tracker_.set_upload_progress(net::UploadProgress(999, 1000));
+
+ // The first timer task calls ReportUploadProgress.
+ EXPECT_EQ(0, report_count_);
+ task_runner_->RunPendingTasks();
+ EXPECT_EQ(1, report_count_);
+ EXPECT_EQ(999, reported_position_);
+ EXPECT_EQ(1000, reported_total_size_);
+
+ upload_progress_tracker_.OnAckReceived();
+ upload_progress_tracker_.set_upload_progress(net::UploadProgress(1000, 1000));
+
+ // The second timer task calls ReportUploadProgress for reporting the
+ // completion.
+ EXPECT_EQ(1, report_count_);
+ task_runner_->RunPendingTasks();
+ EXPECT_EQ(2, report_count_);
+ EXPECT_EQ(1000, reported_position_);
+ EXPECT_EQ(1000, reported_total_size_);
+}
+
+TEST_F(UploadProgressTrackerTest, Progress) {
+ upload_progress_tracker_.set_upload_progress(net::UploadProgress(500, 1000));
+
+ // The first timer task calls ReportUploadProgress.
+ EXPECT_EQ(0, report_count_);
+ task_runner_->RunPendingTasks();
+ EXPECT_EQ(1, report_count_);
+ EXPECT_EQ(500, reported_position_);
+ EXPECT_EQ(1000, reported_total_size_);
+
+ upload_progress_tracker_.OnAckReceived();
+ upload_progress_tracker_.set_upload_progress(net::UploadProgress(750, 1000));
+
+ // The second timer task calls ReportUploadProgress since the progress is
+ // big enough to report.
+ EXPECT_EQ(1, report_count_);
+ task_runner_->RunPendingTasks();
+ EXPECT_EQ(2, report_count_);
+ EXPECT_EQ(750, reported_position_);
+ EXPECT_EQ(1000, reported_total_size_);
+}
+
+TEST_F(UploadProgressTrackerTest, TimePassed) {
+ upload_progress_tracker_.set_upload_progress(net::UploadProgress(500, 1000));
+
+ // The first timer task calls ReportUploadProgress.
+ EXPECT_EQ(0, report_count_);
+ task_runner_->RunPendingTasks();
+ EXPECT_EQ(1, report_count_);
+ EXPECT_EQ(500, reported_position_);
+ EXPECT_EQ(1000, reported_total_size_);
+
+ upload_progress_tracker_.OnAckReceived();
+ upload_progress_tracker_.set_upload_progress(net::UploadProgress(501, 1000));
+
+ // The second timer task doesn't call ReportUploadProgress since the progress
+ // is too small to report it.
+ EXPECT_EQ(1, report_count_);
+ task_runner_->RunPendingTasks();
+ EXPECT_EQ(1, report_count_);
+
+ upload_progress_tracker_.set_current_time(base::TimeTicks::Now() +
+ base::TimeDelta::FromSeconds(1));
+
+ // The third timer task calls ReportUploadProgress since it's been long time
+ // from the last report.
+ EXPECT_EQ(1, report_count_);
+ task_runner_->RunPendingTasks();
+ EXPECT_EQ(2, report_count_);
+ EXPECT_EQ(501, reported_position_);
+ EXPECT_EQ(1000, reported_total_size_);
+}
+
+TEST_F(UploadProgressTrackerTest, Rewound) {
+ upload_progress_tracker_.set_upload_progress(net::UploadProgress(500, 1000));
+
+ // The first timer task calls ReportUploadProgress.
+ EXPECT_EQ(0, report_count_);
+ task_runner_->RunPendingTasks();
+ EXPECT_EQ(1, report_count_);
+ EXPECT_EQ(500, reported_position_);
+ EXPECT_EQ(1000, reported_total_size_);
+
+ upload_progress_tracker_.OnAckReceived();
+ upload_progress_tracker_.set_upload_progress(net::UploadProgress(250, 1000));
+
+ // The second timer task doesn't call ReportUploadProgress since the progress
+ // was rewound.
+ EXPECT_EQ(1, report_count_);
+ task_runner_->RunPendingTasks();
+ EXPECT_EQ(1, report_count_);
+
+ upload_progress_tracker_.set_current_time(base::TimeTicks::Now() +
+ base::TimeDelta::FromSeconds(1));
+
+ // Even after a good amount of time passed, the rewound progress should not be
+ // reported.
+ EXPECT_EQ(1, report_count_);
+ task_runner_->RunPendingTasks();
+ EXPECT_EQ(1, report_count_);
+}
+
+TEST_F(UploadProgressTrackerTest, Completed) {
+ upload_progress_tracker_.set_upload_progress(net::UploadProgress(500, 1000));
+
+ // The first timer task calls ReportUploadProgress.
+ EXPECT_EQ(0, report_count_);
+ task_runner_->RunPendingTasks();
+ EXPECT_EQ(1, report_count_);
+ EXPECT_EQ(500, reported_position_);
+ EXPECT_EQ(1000, reported_total_size_);
+
+ upload_progress_tracker_.set_upload_progress(net::UploadProgress(1000, 1000));
+
+ // OnUploadCompleted runs ReportUploadProgress even without Ack nor timer.
+ upload_progress_tracker_.OnUploadCompleted();
+ EXPECT_EQ(2, report_count_);
+ EXPECT_EQ(1000, reported_position_);
+ EXPECT_EQ(1000, reported_total_size_);
+
+ task_runner_->RunPendingTasks();
+ EXPECT_EQ(2, report_count_);
+ EXPECT_FALSE(task_runner_->HasPendingTask());
+}
+
+} // namespace context
« no previous file with comments | « content/browser/loader/upload_progress_tracker.cc ('k') | content/test/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698