| 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 |