OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "android_webview/browser/input_stream.h" | 5 #include "android_webview/browser/input_stream.h" |
6 #include "android_webview/browser/net/android_stream_reader_url_request_job.h" | 6 #include "android_webview/browser/net/android_stream_reader_url_request_job.h" |
7 #include "android_webview/browser/net/aw_url_request_job_factory.h" | 7 #include "android_webview/browser/net/aw_url_request_job_factory.h" |
8 #include "android_webview/browser/net/input_stream_reader.h" | 8 #include "android_webview/browser/net/input_stream_reader.h" |
9 #include "base/format_macros.h" | 9 #include "base/format_macros.h" |
10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
88 | 88 |
89 virtual bool GetCharset( | 89 virtual bool GetCharset( |
90 JNIEnv* env, | 90 JNIEnv* env, |
91 net::URLRequest* request, | 91 net::URLRequest* request, |
92 android_webview::InputStream* stream, | 92 android_webview::InputStream* stream, |
93 std::string* charset) { | 93 std::string* charset) { |
94 return false; | 94 return false; |
95 } | 95 } |
96 }; | 96 }; |
97 | 97 |
| 98 class NullStreamReaderDelegate : public StreamReaderDelegate { |
| 99 public: |
| 100 NullStreamReaderDelegate() {} |
| 101 |
| 102 virtual scoped_ptr<InputStream> OpenInputStream( |
| 103 JNIEnv* env, |
| 104 const GURL& url) { |
| 105 return make_scoped_ptr<InputStream>(NULL); |
| 106 } |
| 107 }; |
| 108 |
98 class MockInputStreamReader : public InputStreamReader { | 109 class MockInputStreamReader : public InputStreamReader { |
99 public: | 110 public: |
100 MockInputStreamReader() : InputStreamReader(new NotImplInputStream()) {} | 111 MockInputStreamReader() : InputStreamReader(new NotImplInputStream()) {} |
101 ~MockInputStreamReader() {} | 112 ~MockInputStreamReader() {} |
102 | 113 |
103 MOCK_METHOD1(Seek, int(const net::HttpByteRange& byte_range)); | 114 MOCK_METHOD1(Seek, int(const net::HttpByteRange& byte_range)); |
104 MOCK_METHOD2(ReadRawData, int(net::IOBuffer* buffer, int buffer_size)); | 115 MOCK_METHOD2(ReadRawData, int(net::IOBuffer* buffer, int buffer_size)); |
105 }; | 116 }; |
106 | 117 |
107 | 118 |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
153 void SetRange(net::URLRequest* req, int first_byte, int last_byte) { | 164 void SetRange(net::URLRequest* req, int first_byte, int last_byte) { |
154 net::HttpRequestHeaders headers; | 165 net::HttpRequestHeaders headers; |
155 headers.SetHeader(net::HttpRequestHeaders::kRange, | 166 headers.SetHeader(net::HttpRequestHeaders::kRange, |
156 base::StringPrintf( | 167 base::StringPrintf( |
157 "bytes=%" PRIuS "-%" PRIuS, | 168 "bytes=%" PRIuS "-%" PRIuS, |
158 first_byte, last_byte)); | 169 first_byte, last_byte)); |
159 req->SetExtraRequestHeaders(headers); | 170 req->SetExtraRequestHeaders(headers); |
160 } | 171 } |
161 | 172 |
162 void SetUpTestJob(scoped_ptr<InputStreamReader> stream_reader) { | 173 void SetUpTestJob(scoped_ptr<InputStreamReader> stream_reader) { |
163 scoped_ptr<AndroidStreamReaderURLRequestJob::Delegate> | 174 SetUpTestJob(stream_reader.Pass(), |
164 stream_reader_delegate(new StreamReaderDelegate()); | 175 make_scoped_ptr(new StreamReaderDelegate()) |
| 176 .PassAs<AndroidStreamReaderURLRequestJob::Delegate>()); |
| 177 } |
| 178 |
| 179 void SetUpTestJob(scoped_ptr<InputStreamReader> stream_reader, |
| 180 scoped_ptr<AndroidStreamReaderURLRequestJob::Delegate> |
| 181 stream_reader_delegate) { |
165 TestStreamReaderJob* test_stream_reader_job = | 182 TestStreamReaderJob* test_stream_reader_job = |
166 new TestStreamReaderJob( | 183 new TestStreamReaderJob( |
167 req_.get(), | 184 req_.get(), |
168 &network_delegate_, | 185 &network_delegate_, |
169 stream_reader_delegate.Pass(), | 186 stream_reader_delegate.Pass(), |
170 stream_reader.Pass()); | 187 stream_reader.Pass()); |
171 // The Interceptor is owned by the |factory_|. | 188 // The Interceptor is owned by the |factory_|. |
172 TestJobInterceptor* protocol_handler = new TestJobInterceptor; | 189 TestJobInterceptor* protocol_handler = new TestJobInterceptor; |
173 protocol_handler->set_main_intercept_job(test_stream_reader_job); | 190 protocol_handler->set_main_intercept_job(test_stream_reader_job); |
174 bool set_protocol = factory_.SetProtocolHandler("http", protocol_handler); | 191 bool set_protocol = factory_.SetProtocolHandler("http", protocol_handler); |
(...skipping 26 matching lines...) Expand all Loading... |
201 | 218 |
202 SetUpTestJob(stream_reader.PassAs<InputStreamReader>()); | 219 SetUpTestJob(stream_reader.PassAs<InputStreamReader>()); |
203 | 220 |
204 req_->Start(); | 221 req_->Start(); |
205 | 222 |
206 // The TestDelegate will quit the message loop on request completion. | 223 // The TestDelegate will quit the message loop on request completion. |
207 MessageLoop::current()->Run(); | 224 MessageLoop::current()->Run(); |
208 | 225 |
209 EXPECT_FALSE(url_request_delegate_.request_failed()); | 226 EXPECT_FALSE(url_request_delegate_.request_failed()); |
210 EXPECT_EQ(1, network_delegate_.completed_requests()); | 227 EXPECT_EQ(1, network_delegate_.completed_requests()); |
| 228 EXPECT_EQ(0, network_delegate_.error_count()); |
| 229 EXPECT_EQ(200, req_->GetResponseCode()); |
| 230 } |
| 231 |
| 232 TEST_F(AndroidStreamReaderURLRequestJobTest, ReadWithNullStream) { |
| 233 SetUpTestJob(scoped_ptr<InputStreamReader>(), |
| 234 make_scoped_ptr(new NullStreamReaderDelegate()) |
| 235 .PassAs<AndroidStreamReaderURLRequestJob::Delegate>()); |
| 236 req_->Start(); |
| 237 |
| 238 // The TestDelegate will quit the message loop on request completion. |
| 239 MessageLoop::current()->Run(); |
| 240 |
| 241 // The request_failed() method is named confusingly but all it checks is |
| 242 // whether the request got as far as calling NotifyHeadersComplete. |
| 243 EXPECT_FALSE(url_request_delegate_.request_failed()); |
| 244 EXPECT_EQ(1, network_delegate_.completed_requests()); |
| 245 // A null input stream shouldn't result in an error. See crbug.com/180950. |
| 246 EXPECT_EQ(0, network_delegate_.error_count()); |
| 247 EXPECT_EQ(404, req_->GetResponseCode()); |
211 } | 248 } |
212 | 249 |
213 TEST_F(AndroidStreamReaderURLRequestJobTest, ReadPartOfStream) { | 250 TEST_F(AndroidStreamReaderURLRequestJobTest, ReadPartOfStream) { |
214 const int bytes_available = 128; | 251 const int bytes_available = 128; |
215 const int offset = 32; | 252 const int offset = 32; |
216 const int bytes_to_read = bytes_available - offset; | 253 const int bytes_to_read = bytes_available - offset; |
217 scoped_ptr<StrictMock<MockInputStreamReader> > stream_reader( | 254 scoped_ptr<StrictMock<MockInputStreamReader> > stream_reader( |
218 new StrictMock<MockInputStreamReader>()); | 255 new StrictMock<MockInputStreamReader>()); |
219 { | 256 { |
220 InSequence s; | 257 InSequence s; |
(...skipping 10 matching lines...) Expand all Loading... |
231 SetUpTestJob(stream_reader.PassAs<InputStreamReader>()); | 268 SetUpTestJob(stream_reader.PassAs<InputStreamReader>()); |
232 | 269 |
233 SetRange(req_.get(), offset, bytes_available); | 270 SetRange(req_.get(), offset, bytes_available); |
234 req_->Start(); | 271 req_->Start(); |
235 | 272 |
236 MessageLoop::current()->Run(); | 273 MessageLoop::current()->Run(); |
237 | 274 |
238 EXPECT_FALSE(url_request_delegate_.request_failed()); | 275 EXPECT_FALSE(url_request_delegate_.request_failed()); |
239 EXPECT_EQ(bytes_to_read, url_request_delegate_.bytes_received()); | 276 EXPECT_EQ(bytes_to_read, url_request_delegate_.bytes_received()); |
240 EXPECT_EQ(1, network_delegate_.completed_requests()); | 277 EXPECT_EQ(1, network_delegate_.completed_requests()); |
| 278 EXPECT_EQ(0, network_delegate_.error_count()); |
241 } | 279 } |
242 | 280 |
243 TEST_F(AndroidStreamReaderURLRequestJobTest, | 281 TEST_F(AndroidStreamReaderURLRequestJobTest, |
244 ReadStreamWithMoreAvailableThanActual) { | 282 ReadStreamWithMoreAvailableThanActual) { |
245 const int bytes_available_reported = 190; | 283 const int bytes_available_reported = 190; |
246 const int bytes_available = 128; | 284 const int bytes_available = 128; |
247 const int offset = 0; | 285 const int offset = 0; |
248 const int bytes_to_read = bytes_available - offset; | 286 const int bytes_to_read = bytes_available - offset; |
249 scoped_ptr<StrictMock<MockInputStreamReader> > stream_reader( | 287 scoped_ptr<StrictMock<MockInputStreamReader> > stream_reader( |
250 new StrictMock<MockInputStreamReader>()); | 288 new StrictMock<MockInputStreamReader>()); |
(...skipping 10 matching lines...) Expand all Loading... |
261 SetUpTestJob(stream_reader.PassAs<InputStreamReader>()); | 299 SetUpTestJob(stream_reader.PassAs<InputStreamReader>()); |
262 | 300 |
263 SetRange(req_.get(), offset, bytes_available_reported); | 301 SetRange(req_.get(), offset, bytes_available_reported); |
264 req_->Start(); | 302 req_->Start(); |
265 | 303 |
266 MessageLoop::current()->Run(); | 304 MessageLoop::current()->Run(); |
267 | 305 |
268 EXPECT_FALSE(url_request_delegate_.request_failed()); | 306 EXPECT_FALSE(url_request_delegate_.request_failed()); |
269 EXPECT_EQ(bytes_to_read, url_request_delegate_.bytes_received()); | 307 EXPECT_EQ(bytes_to_read, url_request_delegate_.bytes_received()); |
270 EXPECT_EQ(1, network_delegate_.completed_requests()); | 308 EXPECT_EQ(1, network_delegate_.completed_requests()); |
| 309 EXPECT_EQ(0, network_delegate_.error_count()); |
271 } | 310 } |
272 | 311 |
273 TEST_F(AndroidStreamReaderURLRequestJobTest, DeleteJobMidWaySeek) { | 312 TEST_F(AndroidStreamReaderURLRequestJobTest, DeleteJobMidWaySeek) { |
274 const int offset = 20; | 313 const int offset = 20; |
275 const int bytes_available = 128; | 314 const int bytes_available = 128; |
276 base::RunLoop loop; | 315 base::RunLoop loop; |
277 scoped_ptr<StrictMock<MockInputStreamReader> > stream_reader( | 316 scoped_ptr<StrictMock<MockInputStreamReader> > stream_reader( |
278 new StrictMock<MockInputStreamReader>()); | 317 new StrictMock<MockInputStreamReader>()); |
279 EXPECT_CALL(*stream_reader, Seek(_)) | 318 EXPECT_CALL(*stream_reader, Seek(_)) |
280 .WillOnce(DoAll(InvokeWithoutArgs(&loop, &base::RunLoop::Quit), | 319 .WillOnce(DoAll(InvokeWithoutArgs(&loop, &base::RunLoop::Quit), |
(...skipping 30 matching lines...) Expand all Loading... |
311 | 350 |
312 SetRange(req_.get(), offset, bytes_available); | 351 SetRange(req_.get(), offset, bytes_available); |
313 req_->Start(); | 352 req_->Start(); |
314 | 353 |
315 loop.Run(); | 354 loop.Run(); |
316 | 355 |
317 EXPECT_EQ(0, network_delegate_.completed_requests()); | 356 EXPECT_EQ(0, network_delegate_.completed_requests()); |
318 req_->Cancel(); | 357 req_->Cancel(); |
319 EXPECT_EQ(1, network_delegate_.completed_requests()); | 358 EXPECT_EQ(1, network_delegate_.completed_requests()); |
320 } | 359 } |
OLD | NEW |