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 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
69 | 69 |
70 virtual scoped_ptr<InputStream> OpenInputStream( | 70 virtual scoped_ptr<InputStream> OpenInputStream( |
71 JNIEnv* env, | 71 JNIEnv* env, |
72 net::URLRequest* request) { | 72 net::URLRequest* request) { |
73 return make_scoped_ptr<InputStream>(new NotImplInputStream()); | 73 return make_scoped_ptr<InputStream>(new NotImplInputStream()); |
74 } | 74 } |
75 | 75 |
76 virtual bool GetMimeType( | 76 virtual bool GetMimeType( |
77 JNIEnv* env, | 77 JNIEnv* env, |
78 net::URLRequest* request, | 78 net::URLRequest* request, |
79 const android_webview::InputStream& stream, | 79 android_webview::InputStream* stream, |
80 std::string* mime_type) { | 80 std::string* mime_type) { |
81 return false; | 81 return false; |
82 } | 82 } |
83 | 83 |
84 virtual bool GetCharset( | 84 virtual bool GetCharset( |
85 JNIEnv* env, | 85 JNIEnv* env, |
86 net::URLRequest* request, | 86 net::URLRequest* request, |
87 const android_webview::InputStream& stream, | 87 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 |