Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(424)

Side by Side Diff: third_party/WebKit/Source/modules/fetch/FetchBlobDataConsumerHandleTest.cpp

Issue 2303753003: [Fetch API] Start reading blob only when the reader wants to read contents. (Closed)
Patch Set: fix tests Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/MockThreadableLoader.h" 9 #include "core/loader/MockThreadableLoader.h"
10 #include "core/loader/ThreadableLoaderClient.h" 10 #include "core/loader/ThreadableLoaderClient.h"
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 Return(loader.get()))); 105 Return(loader.get())));
106 EXPECT_CALL(*loader, start(_)).WillOnce(SaveArg<0>(&request)); 106 EXPECT_CALL(*loader, start(_)).WillOnce(SaveArg<0>(&request));
107 EXPECT_CALL(checkpoint, Call(2)); 107 EXPECT_CALL(checkpoint, Call(2));
108 EXPECT_CALL(*loader, cancel()); 108 EXPECT_CALL(*loader, cancel());
109 109
110 RefPtr<BlobDataHandle> blobDataHandle = createBlobDataHandle("Once upon a ti me"); 110 RefPtr<BlobDataHandle> blobDataHandle = createBlobDataHandle("Once upon a ti me");
111 std::unique_ptr<WebDataConsumerHandle> handle 111 std::unique_ptr<WebDataConsumerHandle> handle
112 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto ry); 112 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto ry);
113 testing::runPendingTasks(); 113 testing::runPendingTasks();
114 114
115 char buffer[1];
115 size_t size = 0; 116 size_t size = 0;
116 handle->obtainReader(nullptr)->read(nullptr, 0, kNone, &size); 117 ASSERT_EQ(kShouldWait, handle->obtainReader(nullptr)->read(buffer, sizeof(bu ffer), kNone, &size));
117 checkpoint.Call(1); 118 checkpoint.Call(1);
118 testing::runPendingTasks(); 119 testing::runPendingTasks();
119 checkpoint.Call(2); 120 checkpoint.Call(2);
120 121
121 EXPECT_TRUE(request.url().getString().startsWith("blob:")); 122 EXPECT_TRUE(request.url().getString().startsWith("blob:"));
122 EXPECT_TRUE(request.useStreamOnResponse()); 123 EXPECT_TRUE(request.useStreamOnResponse());
123 124
124 EXPECT_EQ(ConsiderPreflight, options.preflightPolicy); 125 EXPECT_EQ(ConsiderPreflight, options.preflightPolicy);
125 EXPECT_EQ(DenyCrossOriginRequests, options.crossOriginRequestPolicy); 126 EXPECT_EQ(DenyCrossOriginRequests, options.crossOriginRequestPolicy);
126 EXPECT_EQ(DoNotEnforceContentSecurityPolicy, options.contentSecurityPolicyEn forcement); 127 EXPECT_EQ(DoNotEnforceContentSecurityPolicy, options.contentSecurityPolicyEn forcement);
(...skipping 20 matching lines...) Expand all
147 EXPECT_CALL(*loader, start(_)); 148 EXPECT_CALL(*loader, start(_));
148 EXPECT_CALL(checkpoint, Call(2)); 149 EXPECT_CALL(checkpoint, Call(2));
149 EXPECT_CALL(*loader, cancel()); 150 EXPECT_CALL(*loader, cancel());
150 EXPECT_CALL(checkpoint, Call(3)); 151 EXPECT_CALL(checkpoint, Call(3));
151 152
152 RefPtr<BlobDataHandle> blobDataHandle = createBlobDataHandle("Once upon a ti me"); 153 RefPtr<BlobDataHandle> blobDataHandle = createBlobDataHandle("Once upon a ti me");
153 std::unique_ptr<WebDataConsumerHandle> handle 154 std::unique_ptr<WebDataConsumerHandle> handle
154 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto ry); 155 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto ry);
155 testing::runPendingTasks(); 156 testing::runPendingTasks();
156 157
158 char buffer[1];
157 size_t size = 0; 159 size_t size = 0;
158 handle->obtainReader(nullptr)->read(nullptr, 0, kNone, &size); 160 ASSERT_EQ(kShouldWait, handle->obtainReader(nullptr)->read(buffer, sizeof(bu ffer), kNone, &size));
159 checkpoint.Call(1); 161 checkpoint.Call(1);
160 testing::runPendingTasks(); 162 testing::runPendingTasks();
161 checkpoint.Call(2); 163 checkpoint.Call(2);
162 document().stopActiveDOMObjects(); 164 document().stopActiveDOMObjects();
163 checkpoint.Call(3); 165 checkpoint.Call(3);
164 } 166 }
165 167
166 TEST_F(FetchBlobDataConsumerHandleTest, CancelLoaderWhenDestinationDetached) 168 TEST_F(FetchBlobDataConsumerHandleTest, CancelLoaderWhenDestinationDetached)
167 { 169 {
168 auto factory = new StrictMock<MockLoaderFactory>; 170 auto factory = new StrictMock<MockLoaderFactory>;
169 Checkpoint checkpoint; 171 Checkpoint checkpoint;
170 172
171 Persistent<MockThreadableLoader> loader = MockThreadableLoader::create(); 173 Persistent<MockThreadableLoader> loader = MockThreadableLoader::create();
172 174
173 InSequence s; 175 InSequence s;
174 EXPECT_CALL(checkpoint, Call(1)); 176 EXPECT_CALL(checkpoint, Call(1));
175 EXPECT_CALL(*factory, create(Ref(document()), _, _, _)).WillOnce(Return(load er.get())); 177 EXPECT_CALL(*factory, create(Ref(document()), _, _, _)).WillOnce(Return(load er.get()));
176 EXPECT_CALL(*loader, start(_)); 178 EXPECT_CALL(*loader, start(_));
177 EXPECT_CALL(checkpoint, Call(2)); 179 EXPECT_CALL(checkpoint, Call(2));
178 EXPECT_CALL(checkpoint, Call(3)); 180 EXPECT_CALL(checkpoint, Call(3));
179 EXPECT_CALL(*loader, cancel()); 181 EXPECT_CALL(*loader, cancel());
180 EXPECT_CALL(checkpoint, Call(4)); 182 EXPECT_CALL(checkpoint, Call(4));
181 183
182 RefPtr<BlobDataHandle> blobDataHandle = createBlobDataHandle("Once upon a ti me"); 184 RefPtr<BlobDataHandle> blobDataHandle = createBlobDataHandle("Once upon a ti me");
183 std::unique_ptr<WebDataConsumerHandle> handle 185 std::unique_ptr<WebDataConsumerHandle> handle
184 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto ry); 186 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto ry);
185 std::unique_ptr<WebDataConsumerHandle::Reader> reader = handle->obtainReader (nullptr); 187 std::unique_ptr<WebDataConsumerHandle::Reader> reader = handle->obtainReader (nullptr);
186 testing::runPendingTasks(); 188 testing::runPendingTasks();
187 189
190 char buffer[1];
188 size_t size = 0; 191 size_t size = 0;
189 reader->read(nullptr, 0, kNone, &size); 192 ASSERT_EQ(kShouldWait, reader->read(buffer, sizeof(buffer), kNone, &size));
190 checkpoint.Call(1); 193 checkpoint.Call(1);
191 testing::runPendingTasks(); 194 testing::runPendingTasks();
192 checkpoint.Call(2); 195 checkpoint.Call(2);
193 handle = nullptr; 196 handle = nullptr;
194 reader = nullptr; 197 reader = nullptr;
195 checkpoint.Call(3); 198 checkpoint.Call(3);
196 ThreadHeap::collectAllGarbage(); 199 ThreadHeap::collectAllGarbage();
197 checkpoint.Call(4); 200 checkpoint.Call(4);
198 } 201 }
199 202
(...skipping 16 matching lines...) Expand all
216 std::unique_ptr<WebDataConsumerHandle> handle 219 std::unique_ptr<WebDataConsumerHandle> handle
217 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto ry); 220 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto ry);
218 221
219 std::unique_ptr<ReplayingHandle> src = ReplayingHandle::create(); 222 std::unique_ptr<ReplayingHandle> src = ReplayingHandle::create();
220 src->add(Command(Command::Wait)); 223 src->add(Command(Command::Wait));
221 src->add(Command(Command::Data, "hello, ")); 224 src->add(Command(Command::Data, "hello, "));
222 src->add(Command(Command::Data, "world")); 225 src->add(Command(Command::Data, "world"));
223 src->add(Command(Command::Wait)); 226 src->add(Command(Command::Wait));
224 src->add(Command(Command::Done)); 227 src->add(Command(Command::Done));
225 228
229 char buffer[1];
226 size_t size = 0; 230 size_t size = 0;
227 handle->obtainReader(nullptr)->read(nullptr, 0, kNone, &size); 231 ASSERT_EQ(kShouldWait, handle->obtainReader(nullptr)->read(buffer, sizeof(bu ffer), kNone, &size));
228 checkpoint.Call(1); 232 checkpoint.Call(1);
229 testing::runPendingTasks(); 233 testing::runPendingTasks();
230 checkpoint.Call(2); 234 checkpoint.Call(2);
231 client->didReceiveResponse(0, ResourceResponse(), std::move(src)); 235 client->didReceiveResponse(0, ResourceResponse(), std::move(src));
232 HandleReaderRunner<HandleReader> runner(std::move(handle)); 236 HandleReaderRunner<HandleReader> runner(std::move(handle));
233 std::unique_ptr<HandleReadResult> r = runner.wait(); 237 std::unique_ptr<HandleReadResult> r = runner.wait();
234 EXPECT_EQ(kDone, r->result()); 238 EXPECT_EQ(kDone, r->result());
235 EXPECT_EQ("hello, world", toString(r->data())); 239 EXPECT_EQ("hello, world", toString(r->data()));
236 } 240 }
237 241
(...skipping 16 matching lines...) Expand all
254 std::unique_ptr<WebDataConsumerHandle> handle 258 std::unique_ptr<WebDataConsumerHandle> handle
255 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto ry); 259 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto ry);
256 260
257 std::unique_ptr<ReplayingHandle> src = ReplayingHandle::create(); 261 std::unique_ptr<ReplayingHandle> src = ReplayingHandle::create();
258 src->add(Command(Command::Wait)); 262 src->add(Command(Command::Wait));
259 src->add(Command(Command::Data, "hello, ")); 263 src->add(Command(Command::Data, "hello, "));
260 src->add(Command(Command::Data, "world")); 264 src->add(Command(Command::Data, "world"));
261 src->add(Command(Command::Wait)); 265 src->add(Command(Command::Wait));
262 src->add(Command(Command::Done)); 266 src->add(Command(Command::Done));
263 267
268 char buffer[1];
264 size_t size = 0; 269 size_t size = 0;
265 handle->obtainReader(nullptr)->read(nullptr, 0, kNone, &size); 270 ASSERT_EQ(kShouldWait, handle->obtainReader(nullptr)->read(buffer, sizeof(bu ffer), kNone, &size));
266 checkpoint.Call(1); 271 checkpoint.Call(1);
267 testing::runPendingTasks(); 272 testing::runPendingTasks();
268 checkpoint.Call(2); 273 checkpoint.Call(2);
269 client->didReceiveResponse(0, ResourceResponse(), std::move(src)); 274 client->didReceiveResponse(0, ResourceResponse(), std::move(src));
270 HandleReaderRunner<HandleTwoPhaseReader> runner(std::move(handle)); 275 HandleReaderRunner<HandleTwoPhaseReader> runner(std::move(handle));
271 std::unique_ptr<HandleReadResult> r = runner.wait(); 276 std::unique_ptr<HandleReadResult> r = runner.wait();
272 EXPECT_EQ(kDone, r->result()); 277 EXPECT_EQ(kDone, r->result());
273 EXPECT_EQ("hello, world", toString(r->data())); 278 EXPECT_EQ("hello, world", toString(r->data()));
274 } 279 }
275 280
276 TEST_F(FetchBlobDataConsumerHandleTest, LoadErrorTest) 281 TEST_F(FetchBlobDataConsumerHandleTest, LoadErrorTest)
277 { 282 {
278 auto factory = new StrictMock<MockLoaderFactory>; 283 auto factory = new StrictMock<MockLoaderFactory>;
279 Checkpoint checkpoint; 284 Checkpoint checkpoint;
280 285
281 Persistent<MockThreadableLoader> loader = MockThreadableLoader::create(); 286 Persistent<MockThreadableLoader> loader = MockThreadableLoader::create();
282 ThreadableLoaderClient* client = nullptr; 287 ThreadableLoaderClient* client = nullptr;
283 288
284 InSequence s; 289 InSequence s;
285 EXPECT_CALL(checkpoint, Call(1)); 290 EXPECT_CALL(checkpoint, Call(1));
286 EXPECT_CALL(*factory, create(Ref(document()), _, _, _)).WillOnce(DoAll(SaveA rg<1>(&client), Return(loader.get()))); 291 EXPECT_CALL(*factory, create(Ref(document()), _, _, _)).WillOnce(DoAll(SaveA rg<1>(&client), Return(loader.get())));
287 EXPECT_CALL(*loader, start(_)); 292 EXPECT_CALL(*loader, start(_));
288 EXPECT_CALL(checkpoint, Call(2)); 293 EXPECT_CALL(checkpoint, Call(2));
289 294
290 RefPtr<BlobDataHandle> blobDataHandle = createBlobDataHandle("Once upon a ti me"); 295 RefPtr<BlobDataHandle> blobDataHandle = createBlobDataHandle("Once upon a ti me");
291 std::unique_ptr<WebDataConsumerHandle> handle 296 std::unique_ptr<WebDataConsumerHandle> handle
292 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto ry); 297 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto ry);
293 298
299 char buffer[1];
294 size_t size = 0; 300 size_t size = 0;
295 handle->obtainReader(nullptr)->read(nullptr, 0, kNone, &size); 301 ASSERT_EQ(kShouldWait, handle->obtainReader(nullptr)->read(buffer, sizeof(bu ffer), kNone, &size));
296 checkpoint.Call(1); 302 checkpoint.Call(1);
297 testing::runPendingTasks(); 303 testing::runPendingTasks();
298 checkpoint.Call(2); 304 checkpoint.Call(2);
299 client->didFail(ResourceError()); 305 client->didFail(ResourceError());
300 HandleReaderRunner<HandleReader> runner(std::move(handle)); 306 HandleReaderRunner<HandleReader> runner(std::move(handle));
301 std::unique_ptr<HandleReadResult> r = runner.wait(); 307 std::unique_ptr<HandleReadResult> r = runner.wait();
302 EXPECT_EQ(kUnexpectedError, r->result()); 308 EXPECT_EQ(kUnexpectedError, r->result());
303 } 309 }
304 310
305 TEST_F(FetchBlobDataConsumerHandleTest, BodyLoadErrorTest) 311 TEST_F(FetchBlobDataConsumerHandleTest, BodyLoadErrorTest)
(...skipping 13 matching lines...) Expand all
319 325
320 RefPtr<BlobDataHandle> blobDataHandle = createBlobDataHandle("Once upon a ti me"); 326 RefPtr<BlobDataHandle> blobDataHandle = createBlobDataHandle("Once upon a ti me");
321 std::unique_ptr<WebDataConsumerHandle> handle 327 std::unique_ptr<WebDataConsumerHandle> handle
322 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto ry); 328 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto ry);
323 329
324 std::unique_ptr<ReplayingHandle> src = ReplayingHandle::create(); 330 std::unique_ptr<ReplayingHandle> src = ReplayingHandle::create();
325 src->add(Command(Command::Wait)); 331 src->add(Command(Command::Wait));
326 src->add(Command(Command::Data, "hello, ")); 332 src->add(Command(Command::Data, "hello, "));
327 src->add(Command(Command::Error)); 333 src->add(Command(Command::Error));
328 334
335 char buffer[1];
329 size_t size = 0; 336 size_t size = 0;
330 handle->obtainReader(nullptr)->read(nullptr, 0, kNone, &size); 337 ASSERT_EQ(kShouldWait, handle->obtainReader(nullptr)->read(buffer, sizeof(bu ffer), kNone, &size));
331 checkpoint.Call(1); 338 checkpoint.Call(1);
332 testing::runPendingTasks(); 339 testing::runPendingTasks();
333 checkpoint.Call(2); 340 checkpoint.Call(2);
334 client->didReceiveResponse(0, ResourceResponse(), std::move(src)); 341 client->didReceiveResponse(0, ResourceResponse(), std::move(src));
335 HandleReaderRunner<HandleReader> runner(std::move(handle)); 342 HandleReaderRunner<HandleReader> runner(std::move(handle));
336 std::unique_ptr<HandleReadResult> r = runner.wait(); 343 std::unique_ptr<HandleReadResult> r = runner.wait();
337 EXPECT_EQ(kUnexpectedError, r->result()); 344 EXPECT_EQ(kUnexpectedError, r->result());
338 } 345 }
339 346
340 TEST_F(FetchBlobDataConsumerHandleTest, DrainAsBlobDataHandle) 347 TEST_F(FetchBlobDataConsumerHandleTest, DrainAsBlobDataHandle)
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
412 std::unique_ptr<FetchDataConsumerHandle::Reader> reader = handle->obtainFetc hDataReader(nullptr); 419 std::unique_ptr<FetchDataConsumerHandle::Reader> reader = handle->obtainFetc hDataReader(nullptr);
413 420
414 const void* buffer; 421 const void* buffer;
415 size_t available; 422 size_t available;
416 EXPECT_EQ(kShouldWait, reader->beginRead(&buffer, kNone, &available)); 423 EXPECT_EQ(kShouldWait, reader->beginRead(&buffer, kNone, &available));
417 EXPECT_FALSE(reader->drainAsBlobDataHandle()); 424 EXPECT_FALSE(reader->drainAsBlobDataHandle());
418 } 425 }
419 426
420 } // namespace 427 } // namespace
421 } // namespace blink 428 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698