| 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 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 86 net::URLRequest* request, | 86 net::URLRequest* request, |
| 87 const android_webview::InputStream& stream, | 87 const android_webview::InputStream& stream, |
| 88 std::string* charset) { | 88 std::string* charset) { |
| 89 return false; | 89 return false; |
| 90 } | 90 } |
| 91 }; | 91 }; |
| 92 | 92 |
| 93 class MockInputStreamReader : public InputStreamReader { | 93 class MockInputStreamReader : public InputStreamReader { |
| 94 public: | 94 public: |
| 95 MockInputStreamReader() : InputStreamReader(new NotImplInputStream()) {} | 95 MockInputStreamReader() : InputStreamReader(new NotImplInputStream()) {} |
| 96 ~MockInputStreamReader() {} |
| 96 | 97 |
| 97 MOCK_METHOD1(Seek, int(const net::HttpByteRange& byte_range)); | 98 MOCK_METHOD1(Seek, int(const net::HttpByteRange& byte_range)); |
| 98 | |
| 99 MOCK_METHOD2(ReadRawData, int(net::IOBuffer* buffer, int buffer_size)); | 99 MOCK_METHOD2(ReadRawData, int(net::IOBuffer* buffer, int buffer_size)); |
| 100 protected: | |
| 101 ~MockInputStreamReader() {} | |
| 102 }; | 100 }; |
| 103 | 101 |
| 104 | 102 |
| 105 class TestStreamReaderJob : public AndroidStreamReaderURLRequestJob { | 103 class TestStreamReaderJob : public AndroidStreamReaderURLRequestJob { |
| 106 public: | 104 public: |
| 107 TestStreamReaderJob( | 105 TestStreamReaderJob( |
| 108 net::URLRequest* request, | 106 net::URLRequest* request, |
| 109 net::NetworkDelegate* network_delegate, | 107 net::NetworkDelegate* network_delegate, |
| 110 scoped_ptr<Delegate> delegate, | 108 scoped_ptr<Delegate> delegate, |
| 111 scoped_refptr<InputStreamReader> stream_reader) | 109 scoped_ptr<InputStreamReader> stream_reader) |
| 112 : AndroidStreamReaderURLRequestJob(request, | 110 : AndroidStreamReaderURLRequestJob(request, |
| 113 network_delegate, | 111 network_delegate, |
| 114 delegate.Pass()), | 112 delegate.Pass()), |
| 115 stream_reader_(stream_reader) { | 113 stream_reader_(stream_reader.Pass()) { |
| 116 message_loop_proxy_ = base::MessageLoopProxy::current(); | 114 message_loop_proxy_ = base::MessageLoopProxy::current(); |
| 117 } | 115 } |
| 118 | 116 |
| 119 virtual scoped_refptr<InputStreamReader> CreateStreamReader( | 117 virtual scoped_ptr<InputStreamReader> CreateStreamReader( |
| 120 InputStream* stream) { | 118 InputStream* stream) { |
| 121 return stream_reader_; | 119 return stream_reader_.Pass(); |
| 122 } | 120 } |
| 123 protected: | 121 protected: |
| 124 virtual ~TestStreamReaderJob() {} | 122 virtual ~TestStreamReaderJob() {} |
| 125 | 123 |
| 126 virtual base::TaskRunner* GetWorkerThreadRunner() { | 124 virtual base::TaskRunner* GetWorkerThreadRunner() { |
| 127 return message_loop_proxy_.get(); | 125 return message_loop_proxy_.get(); |
| 128 } | 126 } |
| 129 | 127 |
| 130 scoped_refptr<InputStreamReader> stream_reader_; | 128 scoped_ptr<InputStreamReader> stream_reader_; |
| 131 scoped_refptr<base::MessageLoopProxy> message_loop_proxy_; | 129 scoped_refptr<base::MessageLoopProxy> message_loop_proxy_; |
| 132 }; | 130 }; |
| 133 | 131 |
| 134 class AndroidStreamReaderURLRequestJobTest : public Test { | 132 class AndroidStreamReaderURLRequestJobTest : public Test { |
| 135 public: | 133 public: |
| 136 AndroidStreamReaderURLRequestJobTest() | 134 AndroidStreamReaderURLRequestJobTest() |
| 137 : loop_(MessageLoop::TYPE_IO) { | 135 : loop_(MessageLoop::TYPE_IO) { |
| 138 } | 136 } |
| 139 protected: | 137 protected: |
| 140 virtual void SetUp() { | 138 virtual void SetUp() { |
| 141 context_.set_job_factory(&factory_); | 139 context_.set_job_factory(&factory_); |
| 142 context_.set_network_delegate(&network_delegate_); | 140 context_.set_network_delegate(&network_delegate_); |
| 143 req_.reset( | 141 req_.reset( |
| 144 new TestURLRequest(GURL("content://foo"), | 142 new TestURLRequest(GURL("content://foo"), |
| 145 &url_request_delegate_, | 143 &url_request_delegate_, |
| 146 &context_)); | 144 &context_)); |
| 147 req_->set_method("GET"); | 145 req_->set_method("GET"); |
| 148 } | 146 } |
| 149 | 147 |
| 150 void SetRange(net::URLRequest* req, int first_byte, int last_byte) { | 148 void SetRange(net::URLRequest* req, int first_byte, int last_byte) { |
| 151 net::HttpRequestHeaders headers; | 149 net::HttpRequestHeaders headers; |
| 152 headers.SetHeader(net::HttpRequestHeaders::kRange, | 150 headers.SetHeader(net::HttpRequestHeaders::kRange, |
| 153 base::StringPrintf( | 151 base::StringPrintf( |
| 154 "bytes=%" PRIuS "-%" PRIuS, | 152 "bytes=%" PRIuS "-%" PRIuS, |
| 155 first_byte, last_byte)); | 153 first_byte, last_byte)); |
| 156 req->SetExtraRequestHeaders(headers); | 154 req->SetExtraRequestHeaders(headers); |
| 157 } | 155 } |
| 158 | 156 |
| 159 void SetUpTestJob(InputStreamReader* stream_reader) { | 157 void SetUpTestJob(scoped_ptr<InputStreamReader> stream_reader) { |
| 160 scoped_ptr<AndroidStreamReaderURLRequestJob::Delegate> | 158 scoped_ptr<AndroidStreamReaderURLRequestJob::Delegate> |
| 161 stream_reader_delegate(new StreamReaderDelegate()); | 159 stream_reader_delegate(new StreamReaderDelegate()); |
| 162 TestStreamReaderJob* test_stream_reader_job = | 160 TestStreamReaderJob* test_stream_reader_job = |
| 163 new TestStreamReaderJob( | 161 new TestStreamReaderJob( |
| 164 req_.get(), | 162 req_.get(), |
| 165 &network_delegate_, | 163 &network_delegate_, |
| 166 stream_reader_delegate.Pass(), | 164 stream_reader_delegate.Pass(), |
| 167 stream_reader); | 165 stream_reader.Pass()); |
| 168 // The Interceptor is owned by the |factory_|. | 166 // The Interceptor is owned by the |factory_|. |
| 169 TestJobInterceptor* interceptor = new TestJobInterceptor; | 167 TestJobInterceptor* interceptor = new TestJobInterceptor; |
| 170 interceptor->set_main_intercept_job(test_stream_reader_job); | 168 interceptor->set_main_intercept_job(test_stream_reader_job); |
| 171 factory_.AddInterceptor(interceptor); | 169 factory_.AddInterceptor(interceptor); |
| 172 } | 170 } |
| 173 | 171 |
| 174 MessageLoop loop_; | 172 MessageLoop loop_; |
| 175 TestURLRequestContext context_; | 173 TestURLRequestContext context_; |
| 176 android_webview::AwURLRequestJobFactory factory_; | 174 android_webview::AwURLRequestJobFactory factory_; |
| 177 TestDelegate url_request_delegate_; | 175 TestDelegate url_request_delegate_; |
| 178 TestNetworkDelegate network_delegate_; | 176 TestNetworkDelegate network_delegate_; |
| 179 scoped_ptr<TestURLRequest> req_; | 177 scoped_ptr<TestURLRequest> req_; |
| 180 }; | 178 }; |
| 181 | 179 |
| 182 TEST_F(AndroidStreamReaderURLRequestJobTest, ReadEmptyStream) { | 180 TEST_F(AndroidStreamReaderURLRequestJobTest, ReadEmptyStream) { |
| 183 scoped_refptr<StrictMock<MockInputStreamReader> > stream_reader = | 181 scoped_ptr<StrictMock<MockInputStreamReader> > stream_reader( |
| 184 new StrictMock<MockInputStreamReader>(); | 182 new StrictMock<MockInputStreamReader>()); |
| 185 { | 183 { |
| 186 InSequence s; | 184 InSequence s; |
| 187 EXPECT_CALL(*stream_reader, Seek(_)) | 185 EXPECT_CALL(*stream_reader, Seek(_)) |
| 188 .WillOnce(Return(0)); | 186 .WillOnce(Return(0)); |
| 189 EXPECT_CALL(*stream_reader, ReadRawData(NotNull(), Gt(0))) | 187 EXPECT_CALL(*stream_reader, ReadRawData(NotNull(), Gt(0))) |
| 190 .WillOnce(Return(0)); | 188 .WillOnce(Return(0)); |
| 191 } | 189 } |
| 192 | 190 |
| 193 SetUpTestJob(stream_reader); | 191 SetUpTestJob(stream_reader.PassAs<InputStreamReader>()); |
| 194 | 192 |
| 195 req_->Start(); | 193 req_->Start(); |
| 196 | 194 |
| 197 // The TestDelegate will quit the message loop on request completion. | 195 // The TestDelegate will quit the message loop on request completion. |
| 198 MessageLoop::current()->Run(); | 196 MessageLoop::current()->Run(); |
| 199 | 197 |
| 200 EXPECT_FALSE(url_request_delegate_.request_failed()); | 198 EXPECT_FALSE(url_request_delegate_.request_failed()); |
| 201 EXPECT_EQ(1, network_delegate_.completed_requests()); | 199 EXPECT_EQ(1, network_delegate_.completed_requests()); |
| 202 } | 200 } |
| 203 | 201 |
| 204 TEST_F(AndroidStreamReaderURLRequestJobTest, ReadPartOfStream) { | 202 TEST_F(AndroidStreamReaderURLRequestJobTest, ReadPartOfStream) { |
| 205 const int bytes_available = 128; | 203 const int bytes_available = 128; |
| 206 const int offset = 32; | 204 const int offset = 32; |
| 207 const int bytes_to_read = bytes_available - offset; | 205 const int bytes_to_read = bytes_available - offset; |
| 208 scoped_refptr<StrictMock<MockInputStreamReader> > stream_reader = | 206 scoped_ptr<StrictMock<MockInputStreamReader> > stream_reader( |
| 209 new StrictMock<MockInputStreamReader>(); | 207 new StrictMock<MockInputStreamReader>()); |
| 210 { | 208 { |
| 211 InSequence s; | 209 InSequence s; |
| 212 EXPECT_CALL(*stream_reader, Seek(_)) | 210 EXPECT_CALL(*stream_reader, Seek(_)) |
| 213 .WillOnce(Return(bytes_available)); | 211 .WillOnce(Return(bytes_available)); |
| 214 EXPECT_CALL(*stream_reader, ReadRawData(NotNull(), Ge(bytes_to_read))) | 212 EXPECT_CALL(*stream_reader, ReadRawData(NotNull(), Ge(bytes_to_read))) |
| 215 .WillOnce(Return(bytes_to_read/2)); | 213 .WillOnce(Return(bytes_to_read/2)); |
| 216 EXPECT_CALL(*stream_reader, ReadRawData(NotNull(), Ge(bytes_to_read))) | 214 EXPECT_CALL(*stream_reader, ReadRawData(NotNull(), Ge(bytes_to_read))) |
| 217 .WillOnce(Return(bytes_to_read/2)); | 215 .WillOnce(Return(bytes_to_read/2)); |
| 218 EXPECT_CALL(*stream_reader, ReadRawData(NotNull(), Ge(bytes_to_read))) | 216 EXPECT_CALL(*stream_reader, ReadRawData(NotNull(), Ge(bytes_to_read))) |
| 219 .WillOnce(Return(0)); | 217 .WillOnce(Return(0)); |
| 220 } | 218 } |
| 221 | 219 |
| 222 SetUpTestJob(stream_reader); | 220 SetUpTestJob(stream_reader.PassAs<InputStreamReader>()); |
| 223 | 221 |
| 224 SetRange(req_.get(), offset, bytes_available); | 222 SetRange(req_.get(), offset, bytes_available); |
| 225 req_->Start(); | 223 req_->Start(); |
| 226 | 224 |
| 227 MessageLoop::current()->Run(); | 225 MessageLoop::current()->Run(); |
| 228 | 226 |
| 229 EXPECT_FALSE(url_request_delegate_.request_failed()); | 227 EXPECT_FALSE(url_request_delegate_.request_failed()); |
| 230 EXPECT_EQ(bytes_to_read, url_request_delegate_.bytes_received()); | 228 EXPECT_EQ(bytes_to_read, url_request_delegate_.bytes_received()); |
| 231 EXPECT_EQ(1, network_delegate_.completed_requests()); | 229 EXPECT_EQ(1, network_delegate_.completed_requests()); |
| 232 } | 230 } |
| 233 | 231 |
| 234 TEST_F(AndroidStreamReaderURLRequestJobTest, | 232 TEST_F(AndroidStreamReaderURLRequestJobTest, |
| 235 ReadStreamWithMoreAvailableThanActual) { | 233 ReadStreamWithMoreAvailableThanActual) { |
| 236 const int bytes_available_reported = 190; | 234 const int bytes_available_reported = 190; |
| 237 const int bytes_available = 128; | 235 const int bytes_available = 128; |
| 238 const int offset = 0; | 236 const int offset = 0; |
| 239 const int bytes_to_read = bytes_available - offset; | 237 const int bytes_to_read = bytes_available - offset; |
| 240 scoped_refptr<StrictMock<MockInputStreamReader> > stream_reader = | 238 scoped_ptr<StrictMock<MockInputStreamReader> > stream_reader( |
| 241 new StrictMock<MockInputStreamReader>(); | 239 new StrictMock<MockInputStreamReader>()); |
| 242 { | 240 { |
| 243 InSequence s; | 241 InSequence s; |
| 244 EXPECT_CALL(*stream_reader, Seek(_)) | 242 EXPECT_CALL(*stream_reader, Seek(_)) |
| 245 .WillOnce(Return(bytes_available_reported)); | 243 .WillOnce(Return(bytes_available_reported)); |
| 246 EXPECT_CALL(*stream_reader, ReadRawData(NotNull(), Ge(bytes_to_read))) | 244 EXPECT_CALL(*stream_reader, ReadRawData(NotNull(), Ge(bytes_to_read))) |
| 247 .WillOnce(Return(bytes_available)); | 245 .WillOnce(Return(bytes_available)); |
| 248 EXPECT_CALL(*stream_reader, ReadRawData(NotNull(), Ge(bytes_to_read))) | 246 EXPECT_CALL(*stream_reader, ReadRawData(NotNull(), Ge(bytes_to_read))) |
| 249 .WillOnce(Return(0)); | 247 .WillOnce(Return(0)); |
| 250 } | 248 } |
| 251 | 249 |
| 252 SetUpTestJob(stream_reader); | 250 SetUpTestJob(stream_reader.PassAs<InputStreamReader>()); |
| 253 | 251 |
| 254 SetRange(req_.get(), offset, bytes_available_reported); | 252 SetRange(req_.get(), offset, bytes_available_reported); |
| 255 req_->Start(); | 253 req_->Start(); |
| 256 | 254 |
| 257 MessageLoop::current()->Run(); | 255 MessageLoop::current()->Run(); |
| 258 | 256 |
| 259 EXPECT_FALSE(url_request_delegate_.request_failed()); | 257 EXPECT_FALSE(url_request_delegate_.request_failed()); |
| 260 EXPECT_EQ(bytes_to_read, url_request_delegate_.bytes_received()); | 258 EXPECT_EQ(bytes_to_read, url_request_delegate_.bytes_received()); |
| 261 EXPECT_EQ(1, network_delegate_.completed_requests()); | 259 EXPECT_EQ(1, network_delegate_.completed_requests()); |
| 262 } | 260 } |
| 263 | 261 |
| 264 TEST_F(AndroidStreamReaderURLRequestJobTest, DeleteJobMidWaySeek) { | 262 TEST_F(AndroidStreamReaderURLRequestJobTest, DeleteJobMidWaySeek) { |
| 265 const int offset = 20; | 263 const int offset = 20; |
| 266 const int bytes_available = 128; | 264 const int bytes_available = 128; |
| 267 base::RunLoop loop; | 265 base::RunLoop loop; |
| 268 scoped_refptr<StrictMock<MockInputStreamReader> > stream_reader = | 266 scoped_ptr<StrictMock<MockInputStreamReader> > stream_reader( |
| 269 new StrictMock<MockInputStreamReader>(); | 267 new StrictMock<MockInputStreamReader>()); |
| 270 EXPECT_CALL(*stream_reader, Seek(_)) | 268 EXPECT_CALL(*stream_reader, Seek(_)) |
| 271 .WillOnce(DoAll(InvokeWithoutArgs(&loop, &base::RunLoop::Quit), | 269 .WillOnce(DoAll(InvokeWithoutArgs(&loop, &base::RunLoop::Quit), |
| 272 Return(bytes_available))); | 270 Return(bytes_available))); |
| 273 ON_CALL(*stream_reader, ReadRawData(_, _)) | 271 ON_CALL(*stream_reader, ReadRawData(_, _)) |
| 274 .WillByDefault(Return(0)); | 272 .WillByDefault(Return(0)); |
| 275 | 273 |
| 276 SetUpTestJob(stream_reader); | 274 SetUpTestJob(stream_reader.PassAs<InputStreamReader>()); |
| 277 | 275 |
| 278 SetRange(req_.get(), offset, bytes_available); | 276 SetRange(req_.get(), offset, bytes_available); |
| 279 req_->Start(); | 277 req_->Start(); |
| 280 | 278 |
| 281 loop.Run(); | 279 loop.Run(); |
| 282 | 280 |
| 283 EXPECT_EQ(0, network_delegate_.completed_requests()); | 281 EXPECT_EQ(0, network_delegate_.completed_requests()); |
| 284 req_->Cancel(); | 282 req_->Cancel(); |
| 285 EXPECT_EQ(1, network_delegate_.completed_requests()); | 283 EXPECT_EQ(1, network_delegate_.completed_requests()); |
| 286 } | 284 } |
| 287 | 285 |
| 288 TEST_F(AndroidStreamReaderURLRequestJobTest, DeleteJobMidWayRead) { | 286 TEST_F(AndroidStreamReaderURLRequestJobTest, DeleteJobMidWayRead) { |
| 289 const int offset = 20; | 287 const int offset = 20; |
| 290 const int bytes_available = 128; | 288 const int bytes_available = 128; |
| 291 base::RunLoop loop; | 289 base::RunLoop loop; |
| 292 scoped_refptr<StrictMock<MockInputStreamReader> > stream_reader = | 290 scoped_ptr<StrictMock<MockInputStreamReader> > stream_reader( |
| 293 new StrictMock<MockInputStreamReader>(); | 291 new StrictMock<MockInputStreamReader>()); |
| 294 net::CompletionCallback read_completion_callback; | 292 net::CompletionCallback read_completion_callback; |
| 295 EXPECT_CALL(*stream_reader, Seek(_)) | 293 EXPECT_CALL(*stream_reader, Seek(_)) |
| 296 .WillOnce(Return(bytes_available)); | 294 .WillOnce(Return(bytes_available)); |
| 297 EXPECT_CALL(*stream_reader, ReadRawData(_, _)) | 295 EXPECT_CALL(*stream_reader, ReadRawData(_, _)) |
| 298 .WillOnce(DoAll(InvokeWithoutArgs(&loop, &base::RunLoop::Quit), | 296 .WillOnce(DoAll(InvokeWithoutArgs(&loop, &base::RunLoop::Quit), |
| 299 Return(bytes_available))); | 297 Return(bytes_available))); |
| 300 | 298 |
| 301 SetUpTestJob(stream_reader); | 299 SetUpTestJob(stream_reader.PassAs<InputStreamReader>()); |
| 302 | 300 |
| 303 SetRange(req_.get(), offset, bytes_available); | 301 SetRange(req_.get(), offset, bytes_available); |
| 304 req_->Start(); | 302 req_->Start(); |
| 305 | 303 |
| 306 loop.Run(); | 304 loop.Run(); |
| 307 | 305 |
| 308 EXPECT_EQ(0, network_delegate_.completed_requests()); | 306 EXPECT_EQ(0, network_delegate_.completed_requests()); |
| 309 req_->Cancel(); | 307 req_->Cancel(); |
| 310 EXPECT_EQ(1, network_delegate_.completed_requests()); | 308 EXPECT_EQ(1, network_delegate_.completed_requests()); |
| 311 } | 309 } |
| OLD | NEW |