Index: content/browser/loader/mojo_async_resource_handler_unittest.cc |
diff --git a/content/browser/loader/mojo_async_resource_handler_unittest.cc b/content/browser/loader/mojo_async_resource_handler_unittest.cc |
index bcd730abd9f2d092e1ea040d4f37b8c95a5945de..cbdd66e0e76fe29754dee0cbf4764d71ba9b6898 100644 |
--- a/content/browser/loader/mojo_async_resource_handler_unittest.cc |
+++ b/content/browser/loader/mojo_async_resource_handler_unittest.cc |
@@ -15,6 +15,7 @@ |
#include "base/memory/ptr_util.h" |
#include "base/memory/weak_ptr.h" |
#include "base/run_loop.h" |
+#include "base/test/test_simple_task_runner.h" |
#include "content/browser/loader/mock_resource_loader.h" |
#include "content/browser/loader/resource_controller.h" |
#include "content/browser/loader/resource_dispatcher_host_impl.h" |
@@ -44,6 +45,7 @@ |
#include "net/http/http_status_code.h" |
#include "net/http/http_util.h" |
#include "net/ssl/client_cert_store.h" |
+#include "net/test/url_request/url_request_mock_data_job.h" |
#include "net/url_request/url_request.h" |
#include "net/url_request/url_request_context.h" |
#include "net/url_request/url_request_status.h" |
@@ -56,6 +58,37 @@ namespace { |
constexpr int kSizeMimeSnifferRequiresForFirstOnWillRead = 2048; |
+class DummyUploadDataStream : public net::UploadDataStream { |
+ public: |
+ DummyUploadDataStream() : UploadDataStream(false, 0) {} |
+ |
+ int InitInternal(const net::NetLogWithSource& net_log) override { |
+ NOTREACHED(); |
+ return 0; |
+ } |
+ int ReadInternal(net::IOBuffer* buf, int buf_len) override { |
+ NOTREACHED(); |
+ return 0; |
+ } |
+ void ResetInternal() override { NOTREACHED(); } |
mmenke
2017/01/19 16:06:49
nit: include base/logging.h
tzik
2017/01/20 04:42:03
Done.
|
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(DummyUploadDataStream); |
mmenke
2017/01/19 16:06:49
include base/macros.h
tzik
2017/01/20 04:42:03
Done.
|
+}; |
+ |
+class FakeUploadProgressTracker : public UploadProgressTracker { |
+ public: |
+ using UploadProgressTracker::UploadProgressTracker; |
+ |
+ net::UploadProgress GetUploadProgress() const override { |
+ return upload_progress_; |
+ } |
+ base::TimeTicks GetCurrentTime() const override { return current_time_; } |
+ |
+ net::UploadProgress upload_progress_; |
+ base::TimeTicks current_time_; |
mmenke
2017/01/19 16:06:49
private:
DISALLOW_COPY_AND_ASSIGN?
tzik
2017/01/20 04:42:03
Done.
|
+}; |
+ |
class TestResourceDispatcherHostDelegate final |
: public ResourceDispatcherHostDelegate { |
public: |
@@ -186,7 +219,8 @@ class MojoAsyncResourceHandlerWithStubOperations |
: MojoAsyncResourceHandler(request, |
rdh, |
std::move(mojo_request), |
- std::move(url_loader_client)) {} |
+ std::move(url_loader_client)), |
+ task_runner_(new base::TestSimpleTaskRunner) {} |
~MojoAsyncResourceHandlerWithStubOperations() override {} |
void ResetBeginWriteExpectation() { is_begin_write_expectation_set_ = false; } |
@@ -204,6 +238,15 @@ class MojoAsyncResourceHandlerWithStubOperations |
metadata_ = std::move(metadata); |
} |
+ FakeUploadProgressTracker* upload_progress_tracker() const { |
+ return upload_progress_tracker_; |
+ } |
+ |
+ void PollUploadProgress() { |
+ task_runner_->RunPendingTasks(); |
+ base::RunLoop().RunUntilIdle(); |
+ } |
+ |
private: |
MojoResult BeginWrite(void** data, uint32_t* available) override { |
if (is_begin_write_expectation_set_) |
@@ -224,6 +267,17 @@ class MojoAsyncResourceHandlerWithStubOperations |
has_received_bad_message_ = true; |
} |
+ std::unique_ptr<UploadProgressTracker> CreateUploadProgressTracker( |
+ const tracked_objects::Location& from_here, |
+ UploadProgressTracker::UploadProgressReportCallback callback) override { |
+ DCHECK(!upload_progress_tracker_); |
+ |
+ auto upload_progress_tracker = base::MakeUnique<FakeUploadProgressTracker>( |
+ from_here, std::move(callback), request(), task_runner_); |
+ upload_progress_tracker_ = upload_progress_tracker.get(); |
+ return std::move(upload_progress_tracker); |
+ } |
+ |
bool is_begin_write_expectation_set_ = false; |
bool is_end_write_expectation_set_ = false; |
bool has_received_bad_message_ = false; |
@@ -231,6 +285,9 @@ class MojoAsyncResourceHandlerWithStubOperations |
MojoResult end_write_expectation_ = MOJO_RESULT_UNKNOWN; |
scoped_refptr<net::IOBufferWithSize> metadata_; |
+ FakeUploadProgressTracker* upload_progress_tracker_ = nullptr; |
+ scoped_refptr<base::TestSimpleTaskRunner> task_runner_; |
+ |
DISALLOW_COPY_AND_ASSIGN(MojoAsyncResourceHandlerWithStubOperations); |
}; |
@@ -273,7 +330,8 @@ class TestURLLoaderFactory final : public mojom::URLLoaderFactory { |
class MojoAsyncResourceHandlerTestBase { |
public: |
- MojoAsyncResourceHandlerTestBase() |
+ explicit MojoAsyncResourceHandlerTestBase( |
+ std::unique_ptr<net::UploadDataStream> upload_stream) |
: thread_bundle_(TestBrowserThreadBundle::IO_MAINLOOP), |
browser_context_(new TestBrowserContext()) { |
MojoAsyncResourceHandler::SetAllocationSizeForTesting(32 * 1024); |
@@ -285,6 +343,7 @@ class MojoAsyncResourceHandlerTestBase { |
browser_context_->GetResourceContext()->GetRequestContext(); |
request_ = request_context->CreateRequest( |
GURL("http://foo/"), net::DEFAULT_PRIORITY, &url_request_delegate_); |
+ request_->set_upload(std::move(upload_stream)); |
ResourceRequestInfo::AllocateForTesting( |
request_.get(), // request |
RESOURCE_TYPE_XHR, // resource_type |
@@ -330,15 +389,17 @@ class MojoAsyncResourceHandlerTestBase { |
} |
// Returns false if something bad happens. |
- bool CallOnWillStartAndOnResponseStarted() { |
- rdh_delegate_.set_num_on_response_started_calls_expectation(1); |
+ bool CallOnWillStart() { |
MockResourceLoader::Status result = |
mock_loader_->OnWillStart(request_->url()); |
EXPECT_EQ(MockResourceLoader::Status::IDLE, result); |
- if (result != MockResourceLoader::Status::IDLE) |
- return false; |
+ return result == MockResourceLoader::Status::IDLE; |
+ } |
- result = mock_loader_->OnResponseStarted( |
+ // Returns false if something bad happens. |
+ bool CallOnResponseStarted() { |
+ rdh_delegate_.set_num_on_response_started_calls_expectation(1); |
+ MockResourceLoader::Status result = mock_loader_->OnResponseStarted( |
make_scoped_refptr(new ResourceResponse())); |
EXPECT_EQ(MockResourceLoader::Status::IDLE, result); |
if (result != MockResourceLoader::Status::IDLE) |
@@ -352,6 +413,18 @@ class MojoAsyncResourceHandlerTestBase { |
return true; |
} |
+ // Returns false if something bad happens. |
+ bool CallOnWillStartAndOnResponseStarted() { |
+ return CallOnWillStart() && CallOnResponseStarted(); |
+ } |
+ |
+ void set_upload_progress(const net::UploadProgress& upload_progress) { |
+ handler_->upload_progress_tracker()->upload_progress_ = upload_progress; |
+ } |
+ void AdvanceCurrentTime(const base::TimeDelta& delta) { |
+ handler_->upload_progress_tracker()->current_time_ += delta; |
+ } |
+ |
TestBrowserThreadBundle thread_bundle_; |
TestResourceDispatcherHostDelegate rdh_delegate_; |
ResourceDispatcherHostImpl rdh_; |
@@ -368,7 +441,10 @@ class MojoAsyncResourceHandlerTestBase { |
}; |
class MojoAsyncResourceHandlerTest : public MojoAsyncResourceHandlerTestBase, |
- public ::testing::Test {}; |
+ public ::testing::Test { |
+ protected: |
+ MojoAsyncResourceHandlerTest() : MojoAsyncResourceHandlerTestBase(nullptr) {} |
+}; |
// This test class is parameterized with MojoAsyncResourceHandler's allocation |
// size. |
@@ -376,11 +452,21 @@ class MojoAsyncResourceHandlerWithAllocationSizeTest |
: public MojoAsyncResourceHandlerTestBase, |
public ::testing::TestWithParam<size_t> { |
protected: |
- MojoAsyncResourceHandlerWithAllocationSizeTest() { |
+ MojoAsyncResourceHandlerWithAllocationSizeTest() |
+ : MojoAsyncResourceHandlerTestBase(nullptr) { |
MojoAsyncResourceHandler::SetAllocationSizeForTesting(GetParam()); |
} |
}; |
+class MojoAsyncResourceHandlerUploadTest |
+ : public MojoAsyncResourceHandlerTestBase, |
+ public ::testing::Test { |
+ protected: |
+ MojoAsyncResourceHandlerUploadTest() |
+ : MojoAsyncResourceHandlerTestBase( |
+ base::MakeUnique<DummyUploadDataStream>()) {} |
+}; |
+ |
TEST_F(MojoAsyncResourceHandlerTest, InFlightRequests) { |
EXPECT_EQ(0, rdh_.num_in_flight_requests_for_testing()); |
handler_ = nullptr; |
@@ -428,6 +514,8 @@ TEST_F(MojoAsyncResourceHandlerTest, OnResponseStarted) { |
url_loader_client_.RunUntilCachedMetadataReceived(); |
EXPECT_EQ("hello", url_loader_client_.cached_metadata()); |
+ |
+ EXPECT_FALSE(url_loader_client_.has_received_upload_progress()); |
} |
TEST_F(MojoAsyncResourceHandlerTest, OnWillReadAndInFlightRequests) { |
@@ -798,6 +886,59 @@ TEST_F(MojoAsyncResourceHandlerTest, |
EXPECT_EQ(net::ERR_FAILED, mock_loader_->error_code()); |
} |
+TEST_F(MojoAsyncResourceHandlerUploadTest, UploadProgressHandling) { |
+ ASSERT_TRUE(CallOnWillStart()); |
+ |
+ // Expect no report for no progress. |
+ set_upload_progress(net::UploadProgress(0, 1000)); |
+ handler_->PollUploadProgress(); |
+ EXPECT_FALSE(url_loader_client_.has_received_upload_progress()); |
+ EXPECT_EQ(0, url_loader_client_.current_upload_position()); |
+ EXPECT_EQ(0, url_loader_client_.total_upload_size()); |
+ |
+ // Expect a upload progress report for a good amount of progress. |
+ url_loader_client_.reset_has_received_upload_progress(); |
+ set_upload_progress(net::UploadProgress(100, 1000)); |
+ handler_->PollUploadProgress(); |
+ EXPECT_TRUE(url_loader_client_.has_received_upload_progress()); |
+ EXPECT_EQ(100, url_loader_client_.current_upload_position()); |
+ EXPECT_EQ(1000, url_loader_client_.total_upload_size()); |
+ |
+ // Expect a upload progress report for the passed time. |
+ url_loader_client_.reset_has_received_upload_progress(); |
+ set_upload_progress(net::UploadProgress(101, 1000)); |
+ AdvanceCurrentTime(base::TimeDelta::FromSeconds(5)); |
+ handler_->PollUploadProgress(); |
+ EXPECT_TRUE(url_loader_client_.has_received_upload_progress()); |
+ EXPECT_EQ(101, url_loader_client_.current_upload_position()); |
+ EXPECT_EQ(1000, url_loader_client_.total_upload_size()); |
+ |
+ // A redirect rewinds the upload progress. Expect no report for the rewound |
+ // progress. |
mmenke
2017/01/19 16:06:49
Oops, sorry...When I said rewind, I actually mean
|
+ url_loader_client_.reset_has_received_upload_progress(); |
+ set_upload_progress(net::UploadProgress(0, 1000)); |
+ AdvanceCurrentTime(base::TimeDelta::FromSeconds(5)); |
+ handler_->PollUploadProgress(); |
+ EXPECT_FALSE(url_loader_client_.has_received_upload_progress()); |
+ |
+ // Set the progress to almost-finished state to prepare for the completion |
+ // report below. |
+ url_loader_client_.reset_has_received_upload_progress(); |
+ set_upload_progress(net::UploadProgress(999, 1000)); |
+ handler_->PollUploadProgress(); |
+ EXPECT_TRUE(url_loader_client_.has_received_upload_progress()); |
+ EXPECT_EQ(999, url_loader_client_.current_upload_position()); |
+ EXPECT_EQ(1000, url_loader_client_.total_upload_size()); |
+ |
+ // Expect a upload progress report for the upload completion. |
+ url_loader_client_.reset_has_received_upload_progress(); |
+ set_upload_progress(net::UploadProgress(1000, 1000)); |
+ ASSERT_TRUE(CallOnResponseStarted()); |
+ EXPECT_TRUE(url_loader_client_.has_received_upload_progress()); |
+ EXPECT_EQ(1000, url_loader_client_.current_upload_position()); |
+ EXPECT_EQ(1000, url_loader_client_.total_upload_size()); |
+} |
+ |
TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, |
OnWillReadWithLongContents) { |
ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |