| 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 <memory> |
| 6 |
| 7 #include "base/memory/ptr_util.h" |
| 8 #include "base/run_loop.h" |
| 9 #include "content/browser/download/download_item_impl.h" |
| 10 #include "content/browser/download/download_request_core.h" |
| 11 #include "content/public/browser/browser_thread.h" |
| 12 #include "content/public/browser/download_url_parameters.h" |
| 13 #include "content/public/test/test_browser_thread_bundle.h" |
| 14 #include "net/http/http_request_headers.h" |
| 15 #include "net/url_request/url_request_test_util.h" |
| 16 #include "testing/gtest/include/gtest/gtest.h" |
| 17 |
| 18 namespace content { |
| 19 |
| 20 class DownloadRequestCoreTest : public testing::Test { |
| 21 public: |
| 22 std::unique_ptr<DownloadUrlParameters> BuildDownloadParameters( |
| 23 const std::string& url) const { |
| 24 GURL gurl(url); |
| 25 return base::MakeUnique<DownloadUrlParameters>( |
| 26 gurl, request_context_getter_.get()); |
| 27 } |
| 28 |
| 29 void CheckRequestHeaders(const std::string& name, |
| 30 const std::string& expected_header_value) const { |
| 31 DCHECK(url_request_.get()); |
| 32 std::string header_value; |
| 33 url_request_->extra_request_headers().GetHeader(name, &header_value); |
| 34 EXPECT_EQ(expected_header_value, header_value); |
| 35 } |
| 36 |
| 37 bool HasRequestHeader(const std::string& name) { |
| 38 DCHECK(url_request_.get()); |
| 39 return url_request_->extra_request_headers().HasHeader(name); |
| 40 } |
| 41 |
| 42 void CreateRequestOnIOThread(DownloadUrlParameters* params) { |
| 43 url_request_ = DownloadRequestCore::CreateRequestOnIOThread( |
| 44 DownloadItem::kInvalidId, params); |
| 45 DCHECK(url_request_.get()); |
| 46 } |
| 47 |
| 48 void SetUp() override { |
| 49 request_context_getter_ = new net::TestURLRequestContextGetter( |
| 50 content::BrowserThread::GetTaskRunnerForThread( |
| 51 content::BrowserThread::UI)); |
| 52 } |
| 53 |
| 54 void TearDown() override { |
| 55 // URLRequest must be released before |request_context_getter_| gets |
| 56 // destroyed. |
| 57 url_request_.reset(); |
| 58 } |
| 59 |
| 60 std::unique_ptr<net::URLRequest> url_request_; |
| 61 |
| 62 // Used to test functions run on particular browser thread. |
| 63 content::TestBrowserThreadBundle browser_threads_; |
| 64 scoped_refptr<net::TestURLRequestContextGetter> request_context_getter_; |
| 65 }; |
| 66 |
| 67 // Ensure "Range" header is built correctly for normal download. |
| 68 TEST_F(DownloadRequestCoreTest, BuildRangeRequest) { |
| 69 std::unique_ptr<DownloadUrlParameters> params = |
| 70 BuildDownloadParameters("example.com"); |
| 71 |
| 72 // Check initial states. |
| 73 EXPECT_EQ(DownloadSaveInfo::kLengthFullContent, params->length()); |
| 74 EXPECT_EQ(0, params->offset()); |
| 75 |
| 76 // Non-range request. |
| 77 CreateRequestOnIOThread(params.get()); |
| 78 EXPECT_FALSE(HasRequestHeader(net::HttpRequestHeaders::kRange)); |
| 79 EXPECT_FALSE(HasRequestHeader(net::HttpRequestHeaders::kIfRange)); |
| 80 EXPECT_FALSE(HasRequestHeader(net::HttpRequestHeaders::kIfMatch)); |
| 81 EXPECT_FALSE(HasRequestHeader(net::HttpRequestHeaders::kIfUnmodifiedSince)); |
| 82 url_request_.reset(); |
| 83 |
| 84 // Range request with header "Range:bytes=50-99", and etag. |
| 85 params->set_etag("123"); |
| 86 params->set_offset(50); |
| 87 params->set_length(50); |
| 88 CreateRequestOnIOThread(params.get()); |
| 89 CheckRequestHeaders(net::HttpRequestHeaders::kRange, "bytes=50-99"); |
| 90 EXPECT_FALSE(HasRequestHeader(net::HttpRequestHeaders::kIfRange)); |
| 91 CheckRequestHeaders(net::HttpRequestHeaders::kIfMatch, "123"); |
| 92 CheckRequestHeaders(net::HttpRequestHeaders::kIfUnmodifiedSince, ""); |
| 93 url_request_.reset(); |
| 94 |
| 95 // Range request with header "Range:bytes=0-49" and last modified time. |
| 96 std::string last_modified_time = "Tue, 15 Nov 1994 12:45:26 GMT"; |
| 97 params->set_etag(""); |
| 98 params->set_last_modified(last_modified_time); |
| 99 params->set_offset(0); |
| 100 params->set_length(50); |
| 101 CreateRequestOnIOThread(params.get()); |
| 102 CheckRequestHeaders(net::HttpRequestHeaders::kRange, "bytes=0-49"); |
| 103 EXPECT_FALSE(HasRequestHeader(net::HttpRequestHeaders::kIfRange)); |
| 104 EXPECT_FALSE(HasRequestHeader(net::HttpRequestHeaders::kIfMatch)); |
| 105 CheckRequestHeaders(net::HttpRequestHeaders::kIfUnmodifiedSince, |
| 106 last_modified_time); |
| 107 url_request_.reset(); |
| 108 |
| 109 // Range request with header "Range:bytes=10-59" and includes both etag and |
| 110 // last modified time. |
| 111 params->set_etag("123"); |
| 112 params->set_last_modified(last_modified_time); |
| 113 params->set_offset(10); |
| 114 params->set_length(50); |
| 115 CreateRequestOnIOThread(params.get()); |
| 116 CheckRequestHeaders(net::HttpRequestHeaders::kRange, "bytes=10-59"); |
| 117 EXPECT_FALSE(HasRequestHeader(net::HttpRequestHeaders::kIfRange)); |
| 118 CheckRequestHeaders(net::HttpRequestHeaders::kIfMatch, "123"); |
| 119 CheckRequestHeaders(net::HttpRequestHeaders::kIfUnmodifiedSince, |
| 120 last_modified_time); |
| 121 url_request_.reset(); |
| 122 } |
| 123 |
| 124 // Ensure "Range" header is built correctly for download resumption. |
| 125 // Notice download resumption requires strong validator(i.e. etag or |
| 126 // last-modified). |
| 127 TEST_F(DownloadRequestCoreTest, BuildRangeRequestWithoutLength) { |
| 128 std::unique_ptr<DownloadUrlParameters> params = |
| 129 BuildDownloadParameters("example.com"); |
| 130 params->set_etag("123"); |
| 131 params->set_offset(50); |
| 132 CreateRequestOnIOThread(params.get()); |
| 133 CheckRequestHeaders(net::HttpRequestHeaders::kRange, "bytes=50-"); |
| 134 CheckRequestHeaders(net::HttpRequestHeaders::kIfRange, "123"); |
| 135 EXPECT_FALSE(HasRequestHeader(net::HttpRequestHeaders::kIfMatch)); |
| 136 EXPECT_FALSE(HasRequestHeader(net::HttpRequestHeaders::kIfUnmodifiedSince)); |
| 137 url_request_.reset(); |
| 138 } |
| 139 |
| 140 } // namespace content |
| OLD | NEW |