OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "modules/fetch/FetchBlobDataConsumerHandle.h" | 5 #include "modules/fetch/FetchBlobDataConsumerHandle.h" |
6 | 6 |
7 #include "core/dom/ExecutionContext.h" | 7 #include "core/dom/ExecutionContext.h" |
8 #include "core/fetch/ResourceLoaderOptions.h" | 8 #include "core/fetch/ResourceLoaderOptions.h" |
9 #include "core/loader/ThreadableLoader.h" | 9 #include "core/loader/ThreadableLoader.h" |
10 #include "core/loader/ThreadableLoaderClient.h" | 10 #include "core/loader/ThreadableLoaderClient.h" |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 using ::testing::DoAll; | 44 using ::testing::DoAll; |
45 using ::testing::InSequence; | 45 using ::testing::InSequence; |
46 using ::testing::Ref; | 46 using ::testing::Ref; |
47 using ::testing::Return; | 47 using ::testing::Return; |
48 using ::testing::SaveArg; | 48 using ::testing::SaveArg; |
49 using ::testing::StrictMock; | 49 using ::testing::StrictMock; |
50 using Checkpoint = StrictMock<::testing::MockFunction<void(int)>>; | 50 using Checkpoint = StrictMock<::testing::MockFunction<void(int)>>; |
51 | 51 |
52 class MockLoaderFactory : public FetchBlobDataConsumerHandle::LoaderFactory { | 52 class MockLoaderFactory : public FetchBlobDataConsumerHandle::LoaderFactory { |
53 public: | 53 public: |
54 MOCK_METHOD5(create, PassRefPtr<ThreadableLoader>(ExecutionContext&, Threada
bleLoaderClient*, const ResourceRequest&, const ThreadableLoaderOptions&, const
ResourceLoaderOptions&)); | 54 MOCK_METHOD4(create, PassRefPtr<ThreadableLoader>(ExecutionContext&, Threada
bleLoaderClient*, const ThreadableLoaderOptions&, const ResourceLoaderOptions&))
; |
55 }; | 55 }; |
56 | 56 |
57 class MockThreadableLoader : public ThreadableLoader { | 57 class MockThreadableLoader : public ThreadableLoader { |
58 public: | 58 public: |
59 static PassRefPtr<MockThreadableLoader> create() { return adoptRef(new Stric
tMock<MockThreadableLoader>); } | 59 static PassRefPtr<MockThreadableLoader> create() { return adoptRef(new Stric
tMock<MockThreadableLoader>); } |
60 | 60 |
| 61 MOCK_METHOD1(start, void(const ResourceRequest&)); |
61 MOCK_METHOD1(overrideTimeout, void(unsigned long)); | 62 MOCK_METHOD1(overrideTimeout, void(unsigned long)); |
62 MOCK_METHOD0(cancel, void()); | 63 MOCK_METHOD0(cancel, void()); |
63 | 64 |
64 protected: | 65 protected: |
65 MockThreadableLoader() = default; | 66 MockThreadableLoader() = default; |
66 }; | 67 }; |
67 | 68 |
68 PassRefPtr<BlobDataHandle> createBlobDataHandle(const char* s) | 69 PassRefPtr<BlobDataHandle> createBlobDataHandle(const char* s) |
69 { | 70 { |
70 OwnPtr<BlobData> data = BlobData::create(); | 71 OwnPtr<BlobData> data = BlobData::create(); |
(...skipping 30 matching lines...) Expand all Loading... |
101 Checkpoint checkpoint; | 102 Checkpoint checkpoint; |
102 | 103 |
103 ResourceRequest request; | 104 ResourceRequest request; |
104 ThreadableLoaderOptions options; | 105 ThreadableLoaderOptions options; |
105 ResourceLoaderOptions resourceLoaderOptions; | 106 ResourceLoaderOptions resourceLoaderOptions; |
106 | 107 |
107 RefPtr<MockThreadableLoader> loader = MockThreadableLoader::create(); | 108 RefPtr<MockThreadableLoader> loader = MockThreadableLoader::create(); |
108 | 109 |
109 InSequence s; | 110 InSequence s; |
110 EXPECT_CALL(checkpoint, Call(1)); | 111 EXPECT_CALL(checkpoint, Call(1)); |
111 EXPECT_CALL(*factory, create(Ref(document()), _, _, _, _)).WillOnce(DoAll( | 112 EXPECT_CALL(*factory, create(Ref(document()), _, _, _)).WillOnce(DoAll( |
112 SaveArg<2>(&request), | 113 SaveArg<2>(&options), |
113 SaveArg<3>(&options), | 114 SaveArg<3>(&resourceLoaderOptions), |
114 SaveArg<4>(&resourceLoaderOptions), | |
115 Return(loader.get()))); | 115 Return(loader.get()))); |
| 116 EXPECT_CALL(*loader, start(_)).WillOnce(SaveArg<0>(&request)); |
116 EXPECT_CALL(checkpoint, Call(2)); | 117 EXPECT_CALL(checkpoint, Call(2)); |
117 EXPECT_CALL(*loader, cancel()); | 118 EXPECT_CALL(*loader, cancel()); |
118 | 119 |
119 RefPtr<BlobDataHandle> blobDataHandle = createBlobDataHandle("Once upon a ti
me"); | 120 RefPtr<BlobDataHandle> blobDataHandle = createBlobDataHandle("Once upon a ti
me"); |
120 OwnPtr<WebDataConsumerHandle> handle | 121 OwnPtr<WebDataConsumerHandle> handle |
121 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto
ry); | 122 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto
ry); |
122 testing::runPendingTasks(); | 123 testing::runPendingTasks(); |
123 | 124 |
124 size_t size = 0; | 125 size_t size = 0; |
125 handle->obtainReader(nullptr)->read(nullptr, 0, kNone, &size); | 126 handle->obtainReader(nullptr)->read(nullptr, 0, kNone, &size); |
(...skipping 19 matching lines...) Expand all Loading... |
145 | 146 |
146 TEST_F(FetchBlobDataConsumerHandleTest, CancelLoaderWhenStopped) | 147 TEST_F(FetchBlobDataConsumerHandleTest, CancelLoaderWhenStopped) |
147 { | 148 { |
148 auto factory = new StrictMock<MockLoaderFactory>; | 149 auto factory = new StrictMock<MockLoaderFactory>; |
149 Checkpoint checkpoint; | 150 Checkpoint checkpoint; |
150 | 151 |
151 RefPtr<MockThreadableLoader> loader = MockThreadableLoader::create(); | 152 RefPtr<MockThreadableLoader> loader = MockThreadableLoader::create(); |
152 | 153 |
153 InSequence s; | 154 InSequence s; |
154 EXPECT_CALL(checkpoint, Call(1)); | 155 EXPECT_CALL(checkpoint, Call(1)); |
155 EXPECT_CALL(*factory, create(Ref(document()), _, _, _, _)).WillOnce(Return(l
oader.get())); | 156 EXPECT_CALL(*factory, create(Ref(document()), _, _, _)).WillOnce(Return(load
er.get())); |
| 157 EXPECT_CALL(*loader, start(_)); |
156 EXPECT_CALL(checkpoint, Call(2)); | 158 EXPECT_CALL(checkpoint, Call(2)); |
157 EXPECT_CALL(*loader, cancel()); | 159 EXPECT_CALL(*loader, cancel()); |
158 EXPECT_CALL(checkpoint, Call(3)); | 160 EXPECT_CALL(checkpoint, Call(3)); |
159 | 161 |
160 RefPtr<BlobDataHandle> blobDataHandle = createBlobDataHandle("Once upon a ti
me"); | 162 RefPtr<BlobDataHandle> blobDataHandle = createBlobDataHandle("Once upon a ti
me"); |
161 OwnPtr<WebDataConsumerHandle> handle | 163 OwnPtr<WebDataConsumerHandle> handle |
162 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto
ry); | 164 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto
ry); |
163 testing::runPendingTasks(); | 165 testing::runPendingTasks(); |
164 | 166 |
165 size_t size = 0; | 167 size_t size = 0; |
166 handle->obtainReader(nullptr)->read(nullptr, 0, kNone, &size); | 168 handle->obtainReader(nullptr)->read(nullptr, 0, kNone, &size); |
167 checkpoint.Call(1); | 169 checkpoint.Call(1); |
168 testing::runPendingTasks(); | 170 testing::runPendingTasks(); |
169 checkpoint.Call(2); | 171 checkpoint.Call(2); |
170 document().stopActiveDOMObjects(); | 172 document().stopActiveDOMObjects(); |
171 checkpoint.Call(3); | 173 checkpoint.Call(3); |
172 } | 174 } |
173 | 175 |
174 TEST_F(FetchBlobDataConsumerHandleTest, CancelLoaderWhenDestinationDetached) | 176 TEST_F(FetchBlobDataConsumerHandleTest, CancelLoaderWhenDestinationDetached) |
175 { | 177 { |
176 auto factory = new StrictMock<MockLoaderFactory>; | 178 auto factory = new StrictMock<MockLoaderFactory>; |
177 Checkpoint checkpoint; | 179 Checkpoint checkpoint; |
178 | 180 |
179 RefPtr<MockThreadableLoader> loader = MockThreadableLoader::create(); | 181 RefPtr<MockThreadableLoader> loader = MockThreadableLoader::create(); |
180 | 182 |
181 InSequence s; | 183 InSequence s; |
182 EXPECT_CALL(checkpoint, Call(1)); | 184 EXPECT_CALL(checkpoint, Call(1)); |
183 EXPECT_CALL(*factory, create(Ref(document()), _, _, _, _)).WillOnce(Return(l
oader.get())); | 185 EXPECT_CALL(*factory, create(Ref(document()), _, _, _)).WillOnce(Return(load
er.get())); |
| 186 EXPECT_CALL(*loader, start(_)); |
184 EXPECT_CALL(checkpoint, Call(2)); | 187 EXPECT_CALL(checkpoint, Call(2)); |
185 EXPECT_CALL(checkpoint, Call(3)); | 188 EXPECT_CALL(checkpoint, Call(3)); |
186 EXPECT_CALL(*loader, cancel()); | 189 EXPECT_CALL(*loader, cancel()); |
187 EXPECT_CALL(checkpoint, Call(4)); | 190 EXPECT_CALL(checkpoint, Call(4)); |
188 | 191 |
189 RefPtr<BlobDataHandle> blobDataHandle = createBlobDataHandle("Once upon a ti
me"); | 192 RefPtr<BlobDataHandle> blobDataHandle = createBlobDataHandle("Once upon a ti
me"); |
190 OwnPtr<WebDataConsumerHandle> handle | 193 OwnPtr<WebDataConsumerHandle> handle |
191 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto
ry); | 194 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto
ry); |
192 OwnPtr<WebDataConsumerHandle::Reader> reader = handle->obtainReader(nullptr)
; | 195 OwnPtr<WebDataConsumerHandle::Reader> reader = handle->obtainReader(nullptr)
; |
193 testing::runPendingTasks(); | 196 testing::runPendingTasks(); |
(...skipping 13 matching lines...) Expand all Loading... |
207 TEST_F(FetchBlobDataConsumerHandleTest, ReadTest) | 210 TEST_F(FetchBlobDataConsumerHandleTest, ReadTest) |
208 { | 211 { |
209 auto factory = new StrictMock<MockLoaderFactory>; | 212 auto factory = new StrictMock<MockLoaderFactory>; |
210 Checkpoint checkpoint; | 213 Checkpoint checkpoint; |
211 | 214 |
212 RefPtr<MockThreadableLoader> loader = MockThreadableLoader::create(); | 215 RefPtr<MockThreadableLoader> loader = MockThreadableLoader::create(); |
213 ThreadableLoaderClient* client = nullptr; | 216 ThreadableLoaderClient* client = nullptr; |
214 | 217 |
215 InSequence s; | 218 InSequence s; |
216 EXPECT_CALL(checkpoint, Call(1)); | 219 EXPECT_CALL(checkpoint, Call(1)); |
217 EXPECT_CALL(*factory, create(Ref(document()), _, _, _, _)).WillOnce(DoAll(Sa
veArg<1>(&client), Return(loader.get()))); | 220 EXPECT_CALL(*factory, create(Ref(document()), _, _, _)).WillOnce(DoAll(SaveA
rg<1>(&client), Return(loader.get()))); |
| 221 EXPECT_CALL(*loader, start(_)); |
218 EXPECT_CALL(checkpoint, Call(2)); | 222 EXPECT_CALL(checkpoint, Call(2)); |
219 EXPECT_CALL(*loader, cancel()); | 223 EXPECT_CALL(*loader, cancel()); |
220 | 224 |
221 RefPtr<BlobDataHandle> blobDataHandle = createBlobDataHandle("Once upon a ti
me"); | 225 RefPtr<BlobDataHandle> blobDataHandle = createBlobDataHandle("Once upon a ti
me"); |
222 OwnPtr<WebDataConsumerHandle> handle | 226 OwnPtr<WebDataConsumerHandle> handle |
223 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto
ry); | 227 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto
ry); |
224 | 228 |
225 OwnPtr<ReplayingHandle> src = ReplayingHandle::create(); | 229 OwnPtr<ReplayingHandle> src = ReplayingHandle::create(); |
226 src->add(Command(Command::Wait)); | 230 src->add(Command(Command::Wait)); |
227 src->add(Command(Command::Data, "hello, ")); | 231 src->add(Command(Command::Data, "hello, ")); |
(...skipping 16 matching lines...) Expand all Loading... |
244 TEST_F(FetchBlobDataConsumerHandleTest, TwoPhaseReadTest) | 248 TEST_F(FetchBlobDataConsumerHandleTest, TwoPhaseReadTest) |
245 { | 249 { |
246 auto factory = new StrictMock<MockLoaderFactory>; | 250 auto factory = new StrictMock<MockLoaderFactory>; |
247 Checkpoint checkpoint; | 251 Checkpoint checkpoint; |
248 | 252 |
249 RefPtr<MockThreadableLoader> loader = MockThreadableLoader::create(); | 253 RefPtr<MockThreadableLoader> loader = MockThreadableLoader::create(); |
250 ThreadableLoaderClient* client = nullptr; | 254 ThreadableLoaderClient* client = nullptr; |
251 | 255 |
252 InSequence s; | 256 InSequence s; |
253 EXPECT_CALL(checkpoint, Call(1)); | 257 EXPECT_CALL(checkpoint, Call(1)); |
254 EXPECT_CALL(*factory, create(Ref(document()), _, _, _, _)).WillOnce(DoAll(Sa
veArg<1>(&client), Return(loader.get()))); | 258 EXPECT_CALL(*factory, create(Ref(document()), _, _, _)).WillOnce(DoAll(SaveA
rg<1>(&client), Return(loader.get()))); |
| 259 EXPECT_CALL(*loader, start(_)); |
255 EXPECT_CALL(checkpoint, Call(2)); | 260 EXPECT_CALL(checkpoint, Call(2)); |
256 EXPECT_CALL(*loader, cancel()); | 261 EXPECT_CALL(*loader, cancel()); |
257 | 262 |
258 RefPtr<BlobDataHandle> blobDataHandle = createBlobDataHandle("Once upon a ti
me"); | 263 RefPtr<BlobDataHandle> blobDataHandle = createBlobDataHandle("Once upon a ti
me"); |
259 OwnPtr<WebDataConsumerHandle> handle | 264 OwnPtr<WebDataConsumerHandle> handle |
260 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto
ry); | 265 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto
ry); |
261 | 266 |
262 OwnPtr<ReplayingHandle> src = ReplayingHandle::create(); | 267 OwnPtr<ReplayingHandle> src = ReplayingHandle::create(); |
263 src->add(Command(Command::Wait)); | 268 src->add(Command(Command::Wait)); |
264 src->add(Command(Command::Data, "hello, ")); | 269 src->add(Command(Command::Data, "hello, ")); |
(...skipping 16 matching lines...) Expand all Loading... |
281 TEST_F(FetchBlobDataConsumerHandleTest, LoadErrorTest) | 286 TEST_F(FetchBlobDataConsumerHandleTest, LoadErrorTest) |
282 { | 287 { |
283 auto factory = new StrictMock<MockLoaderFactory>; | 288 auto factory = new StrictMock<MockLoaderFactory>; |
284 Checkpoint checkpoint; | 289 Checkpoint checkpoint; |
285 | 290 |
286 RefPtr<MockThreadableLoader> loader = MockThreadableLoader::create(); | 291 RefPtr<MockThreadableLoader> loader = MockThreadableLoader::create(); |
287 ThreadableLoaderClient* client = nullptr; | 292 ThreadableLoaderClient* client = nullptr; |
288 | 293 |
289 InSequence s; | 294 InSequence s; |
290 EXPECT_CALL(checkpoint, Call(1)); | 295 EXPECT_CALL(checkpoint, Call(1)); |
291 EXPECT_CALL(*factory, create(Ref(document()), _, _, _, _)).WillOnce(DoAll(Sa
veArg<1>(&client), Return(loader.get()))); | 296 EXPECT_CALL(*factory, create(Ref(document()), _, _, _)).WillOnce(DoAll(SaveA
rg<1>(&client), Return(loader.get()))); |
| 297 EXPECT_CALL(*loader, start(_)); |
292 EXPECT_CALL(checkpoint, Call(2)); | 298 EXPECT_CALL(checkpoint, Call(2)); |
293 | 299 |
294 RefPtr<BlobDataHandle> blobDataHandle = createBlobDataHandle("Once upon a ti
me"); | 300 RefPtr<BlobDataHandle> blobDataHandle = createBlobDataHandle("Once upon a ti
me"); |
295 OwnPtr<WebDataConsumerHandle> handle | 301 OwnPtr<WebDataConsumerHandle> handle |
296 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto
ry); | 302 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto
ry); |
297 | 303 |
298 size_t size = 0; | 304 size_t size = 0; |
299 handle->obtainReader(nullptr)->read(nullptr, 0, kNone, &size); | 305 handle->obtainReader(nullptr)->read(nullptr, 0, kNone, &size); |
300 checkpoint.Call(1); | 306 checkpoint.Call(1); |
301 testing::runPendingTasks(); | 307 testing::runPendingTasks(); |
302 checkpoint.Call(2); | 308 checkpoint.Call(2); |
303 client->didFail(ResourceError()); | 309 client->didFail(ResourceError()); |
304 HandleReaderRunner<HandleReader> runner(handle.release()); | 310 HandleReaderRunner<HandleReader> runner(handle.release()); |
305 OwnPtr<HandleReadResult> r = runner.wait(); | 311 OwnPtr<HandleReadResult> r = runner.wait(); |
306 EXPECT_EQ(kUnexpectedError, r->result()); | 312 EXPECT_EQ(kUnexpectedError, r->result()); |
307 } | 313 } |
308 | 314 |
309 TEST_F(FetchBlobDataConsumerHandleTest, BodyLoadErrorTest) | 315 TEST_F(FetchBlobDataConsumerHandleTest, BodyLoadErrorTest) |
310 { | 316 { |
311 auto factory = new StrictMock<MockLoaderFactory>; | 317 auto factory = new StrictMock<MockLoaderFactory>; |
312 Checkpoint checkpoint; | 318 Checkpoint checkpoint; |
313 | 319 |
314 RefPtr<MockThreadableLoader> loader = MockThreadableLoader::create(); | 320 RefPtr<MockThreadableLoader> loader = MockThreadableLoader::create(); |
315 ThreadableLoaderClient* client = nullptr; | 321 ThreadableLoaderClient* client = nullptr; |
316 | 322 |
317 InSequence s; | 323 InSequence s; |
318 EXPECT_CALL(checkpoint, Call(1)); | 324 EXPECT_CALL(checkpoint, Call(1)); |
319 EXPECT_CALL(*factory, create(Ref(document()), _, _, _, _)).WillOnce(DoAll(Sa
veArg<1>(&client), Return(loader.get()))); | 325 EXPECT_CALL(*factory, create(Ref(document()), _, _, _)).WillOnce(DoAll(SaveA
rg<1>(&client), Return(loader.get()))); |
| 326 EXPECT_CALL(*loader, start(_)); |
320 EXPECT_CALL(checkpoint, Call(2)); | 327 EXPECT_CALL(checkpoint, Call(2)); |
321 EXPECT_CALL(*loader, cancel()); | 328 EXPECT_CALL(*loader, cancel()); |
322 | 329 |
323 RefPtr<BlobDataHandle> blobDataHandle = createBlobDataHandle("Once upon a ti
me"); | 330 RefPtr<BlobDataHandle> blobDataHandle = createBlobDataHandle("Once upon a ti
me"); |
324 OwnPtr<WebDataConsumerHandle> handle | 331 OwnPtr<WebDataConsumerHandle> handle |
325 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto
ry); | 332 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto
ry); |
326 | 333 |
327 OwnPtr<ReplayingHandle> src = ReplayingHandle::create(); | 334 OwnPtr<ReplayingHandle> src = ReplayingHandle::create(); |
328 src->add(Command(Command::Wait)); | 335 src->add(Command(Command::Wait)); |
329 src->add(Command(Command::Data, "hello, ")); | 336 src->add(Command(Command::Data, "hello, ")); |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
415 OwnPtr<FetchDataConsumerHandle::Reader> reader = handle->obtainReader(nullpt
r); | 422 OwnPtr<FetchDataConsumerHandle::Reader> reader = handle->obtainReader(nullpt
r); |
416 | 423 |
417 const void* buffer; | 424 const void* buffer; |
418 size_t available; | 425 size_t available; |
419 EXPECT_EQ(kShouldWait, reader->beginRead(&buffer, kNone, &available)); | 426 EXPECT_EQ(kShouldWait, reader->beginRead(&buffer, kNone, &available)); |
420 EXPECT_FALSE(reader->drainAsBlobDataHandle()); | 427 EXPECT_FALSE(reader->drainAsBlobDataHandle()); |
421 } | 428 } |
422 | 429 |
423 } // namespace | 430 } // namespace |
424 } // namespace blink | 431 } // namespace blink |
OLD | NEW |