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

Side by Side Diff: content/browser/download/download_request_core_unittest.cc

Issue 2660783002: Range request support for parallel download in DownloadRequestCore. (Closed)
Patch Set: Work on feedbacks. Created 3 years, 10 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 unified diff | Download patch
OLDNEW
(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
OLDNEW
« no previous file with comments | « content/browser/download/download_request_core.cc ('k') | content/public/browser/download_save_info.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698