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

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: Remove debug code. 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 DownloadRequestCoreTest() = default;
23 ~DownloadRequestCoreTest() override = default;
asanka 2017/02/03 22:16:23 Nit: you should be able to leave these out and ach
xingliu 2017/02/06 19:31:40 Done.
24
25 std::unique_ptr<DownloadUrlParameters> BuildDownloadParameters(
26 const std::string& url) const {
27 GURL gurl(url);
28 return base::MakeUnique<DownloadUrlParameters>(
29 gurl, request_context_getter_.get());
30 }
31
32 void CheckRequestHeaders(const std::string& name,
33 const std::string& expected_header_value) const {
asanka 2017/02/03 22:16:23 Nit/suggestion: Introduce a way to verify that the
xingliu 2017/02/06 19:31:40 Done.
34 DCHECK(url_request_.get());
35 std::string header_value;
36 url_request_->extra_request_headers().GetHeader(name, &header_value);
37 EXPECT_EQ(expected_header_value, header_value);
38 }
39
40 void CreateRequestOnIOThread(DownloadUrlParameters* params) {
asanka 2017/02/03 22:16:23 Since you are using TestBrowserThreadBundle withou
xingliu 2017/02/06 19:31:40 This is awesome, thanks.
41 run_loop_.reset(new base::RunLoop());
42
43 // Run on Browser IO thread since there is a thread check in
44 // DownloadRequestCore.
45 BrowserThread::PostTaskAndReplyWithResult(
46 BrowserThread::IO, FROM_HERE,
47 base::Bind(&DownloadRequestCore::CreateRequestOnIOThread,
48 DownloadItem::kInvalidId, params),
49 base::Bind(&DownloadRequestCoreTest::OnRequestCreated,
50 base::Unretained(this)));
51
52 // RunLoop blocks the main test thread (currently Browser UI thread) until
53 // the |url_request_| is created and reply back to the main test thread.
54 run_loop_->Run();
55 }
56
57 void OnRequestCreated(std::unique_ptr<net::URLRequest> url_request) {
58 url_request_ = std::move(url_request);
59 DCHECK(url_request_.get());
60 run_loop_->Quit();
61 }
62
63 void SetUp() override {
64 request_context_getter_ = new net::TestURLRequestContextGetter(
65 content::BrowserThread::GetTaskRunnerForThread(
66 content::BrowserThread::UI));
67 }
68
69 void TearDown() override {
70 // URLRequest must be released before |request_context_getter_| gets
71 // destroyed.
72 url_request_.reset();
73 }
74
75 std::unique_ptr<base::RunLoop> run_loop_;
76 std::unique_ptr<net::URLRequest> url_request_;
77
78 // Used to test functions run on particular browser thread.
79 content::TestBrowserThreadBundle browser_threads_;
80 scoped_refptr<net::TestURLRequestContextGetter> request_context_getter_;
81 };
82
83 // Ensure "Range" header is built correctly for normal download.
84 TEST_F(DownloadRequestCoreTest, BuildRangeRequest) {
85 std::unique_ptr<DownloadUrlParameters> params =
86 BuildDownloadParameters("something.com");
asanka 2017/02/03 22:16:23 Nit: Use example.com for examples and tests.
xingliu 2017/02/06 19:31:40 Done.
87
88 // Check initial states.
89 EXPECT_EQ(DownloadSaveInfo::kLengthFullContent, params->length());
90 EXPECT_EQ(0, params->offset());
91
92 // Non-range request.
93 CreateRequestOnIOThread(params.get());
94 CheckRequestHeaders(net::HttpRequestHeaders::kRange, "");
95 CheckRequestHeaders(net::HttpRequestHeaders::kIfRange, "");
96 CheckRequestHeaders("If-Match", "");
97 CheckRequestHeaders("If-Unmodified-Since", "");
98 url_request_.reset();
99
100 // Range request with header "Range:bytes=50-99".
101 // Requires strong validator.
102 params->set_etag("123");
103 params->set_offset(50);
104 params->set_length(50);
105 CreateRequestOnIOThread(params.get());
106 CheckRequestHeaders(net::HttpRequestHeaders::kRange, "bytes=50-99");
107 CheckRequestHeaders(net::HttpRequestHeaders::kIfRange, "");
108 CheckRequestHeaders("If-Match", "123");
109 CheckRequestHeaders("If-Unmodified-Since", "");
110 url_request_.reset();
111
112 // Range request with header "Range:bytes=0-49".
113 // Requires strong validator.
114 params->set_etag("123");
115 params->set_offset(0);
116 params->set_length(50);
117 CreateRequestOnIOThread(params.get());
118 CheckRequestHeaders(net::HttpRequestHeaders::kRange, "bytes=0-49");
119 CheckRequestHeaders(net::HttpRequestHeaders::kIfRange, "");
120 CheckRequestHeaders("If-Match", "123");
121 CheckRequestHeaders("If-Unmodified-Since", "");
122 url_request_.reset();
123 }
124
125 // Ensure "Range" header is built correctly for download resumption.
126 // Notice download resumption requires strong validator(i.e. etag or
127 // last-modified).
128 TEST_F(DownloadRequestCoreTest, BuildRangeRequestWithoutLength) {
129 std::unique_ptr<DownloadUrlParameters> params =
130 BuildDownloadParameters("something.com");
131 params->set_etag("123");
132 params->set_offset(50);
133 CreateRequestOnIOThread(params.get());
134 CheckRequestHeaders(net::HttpRequestHeaders::kRange, "bytes=50-");
135 CheckRequestHeaders(net::HttpRequestHeaders::kIfRange, "123");
136 CheckRequestHeaders("If-Match", "");
137 CheckRequestHeaders("If-Unmodified-Since", "");
138 url_request_.reset();
139 }
asanka 2017/02/03 22:16:23 Add a test case with both an etag and a last-modif
xingliu 2017/02/06 19:31:40 Done.
140
141 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698