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

Side by Side Diff: Source/modules/fetch/DataConsumerTeeTest.cpp

Issue 1192913007: Change BodyStreamBuffer to be FetchDataConsumerHandle-based and enable backpressure in Fetch API (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: (temp) alternative to calling didGetReadable in sync. Created 5 years, 5 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 "config.h" 5 #include "config.h"
6 #include "modules/fetch/DataConsumerTee.h" 6 #include "modules/fetch/DataConsumerTee.h"
7 7
8 #include "core/testing/DummyPageHolder.h" 8 #include "core/testing/DummyPageHolder.h"
9 #include "core/testing/NullExecutionContext.h" 9 #include "core/testing/NullExecutionContext.h"
10 #include "modules/fetch/DataConsumerHandleTestUtil.h" 10 #include "modules/fetch/DataConsumerHandleTestUtil.h"
11 #include "platform/Task.h" 11 #include "platform/Task.h"
12 #include "platform/ThreadSafeFunctional.h" 12 #include "platform/ThreadSafeFunctional.h"
13 #include "platform/WebThreadSupportingGC.h" 13 #include "platform/WebThreadSupportingGC.h"
14 #include "public/platform/Platform.h" 14 #include "public/platform/Platform.h"
15 #include "public/platform/WebThread.h" 15 #include "public/platform/WebThread.h"
16 #include "public/platform/WebTraceLocation.h" 16 #include "public/platform/WebTraceLocation.h"
17 #include "public/platform/WebWaitableEvent.h" 17 #include "public/platform/WebWaitableEvent.h"
18 #include "wtf/PassRefPtr.h" 18 #include "wtf/PassRefPtr.h"
19 #include "wtf/RefPtr.h" 19 #include "wtf/RefPtr.h"
20 20
21 #include <gtest/gtest.h> 21 #include <gtest/gtest.h>
22 #include <string.h> 22 #include <string.h>
23 #include <v8.h> 23 #include <v8.h>
24 24
25 namespace blink { 25 namespace blink {
26 namespace { 26 namespace {
27 27
28 using ::testing::InSequence;
29 using ::testing::Return;
30 using ::testing::StrictMock;
31 using ::testing::_;
32 using Checkpoint = StrictMock<::testing::MockFunction<void(int)>>;
33
28 using Result = WebDataConsumerHandle::Result; 34 using Result = WebDataConsumerHandle::Result;
29 using Thread = DataConsumerHandleTestUtil::Thread; 35 using Thread = DataConsumerHandleTestUtil::Thread;
30 const WebDataConsumerHandle::Flags kNone = WebDataConsumerHandle::FlagNone; 36 const WebDataConsumerHandle::Flags kNone = WebDataConsumerHandle::FlagNone;
31 const Result kOk = WebDataConsumerHandle::Ok; 37 const Result kOk = WebDataConsumerHandle::Ok;
32 const Result kShouldWait = WebDataConsumerHandle::ShouldWait; 38 const Result kShouldWait = WebDataConsumerHandle::ShouldWait;
33 const Result kDone = WebDataConsumerHandle::Done; 39 const Result kDone = WebDataConsumerHandle::Done;
34 const Result kUnexpectedError = WebDataConsumerHandle::UnexpectedError; 40 const Result kUnexpectedError = WebDataConsumerHandle::UnexpectedError;
41 const FetchDataConsumerHandle::Reader::BlobSizePolicy kDisallowBlobWithInvalidSi ze = FetchDataConsumerHandle::Reader::DisallowBlobWithInvalidSize;
42 const FetchDataConsumerHandle::Reader::BlobSizePolicy kAllowBlobWithInvalidSize = FetchDataConsumerHandle::Reader::AllowBlobWithInvalidSize;
35 43
36 using Command = DataConsumerHandleTestUtil::Command; 44 using Command = DataConsumerHandleTestUtil::Command;
37 using Handle = DataConsumerHandleTestUtil::ReplayingHandle; 45 using Handle = DataConsumerHandleTestUtil::ReplayingHandle;
38 46
39 class HandleReader : public WebDataConsumerHandle::Client { 47 class HandleReader : public WebDataConsumerHandle::Client {
40 public: 48 public:
41 HandleReader() : m_finalResult(kOk) { } 49 HandleReader() : m_finalResult(kOk) { }
42 50
43 // Need to wait for the event signal after this function is called. 51 // Need to wait for the event signal after this function is called.
44 void start(PassOwnPtr<WebDataConsumerHandle> handle) 52 void start(PassOwnPtr<WebDataConsumerHandle> handle)
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
130 m_reader = handle->obtainReader(this); 138 m_reader = handle->obtainReader(this);
131 } 139 }
132 140
133 OwnPtr<Thread> m_thread; 141 OwnPtr<Thread> m_thread;
134 OwnPtr<WebDataConsumerHandle::Reader> m_reader; 142 OwnPtr<WebDataConsumerHandle::Reader> m_reader;
135 String m_readString; 143 String m_readString;
136 Result m_finalResult; 144 Result m_finalResult;
137 OwnPtr<WebWaitableEvent> m_waitableEvent; 145 OwnPtr<WebWaitableEvent> m_waitableEvent;
138 }; 146 };
139 147
148 template<typename Handle>
140 class TeeCreationThread { 149 class TeeCreationThread {
141 public: 150 public:
142 void run(PassOwnPtr<WebDataConsumerHandle> src, OwnPtr<WebDataConsumerHandle >* dest1, OwnPtr<WebDataConsumerHandle>* dest2) 151 void run(PassOwnPtr<Handle> src, OwnPtr<Handle>* dest1, OwnPtr<Handle>* dest 2)
143 { 152 {
144 m_thread = adoptPtr(new Thread("src thread", Thread::WithExecutionContex t)); 153 m_thread = adoptPtr(new Thread("src thread", Thread::WithExecutionContex t));
145 m_waitableEvent = adoptPtr(Platform::current()->createWaitableEvent()); 154 m_waitableEvent = adoptPtr(Platform::current()->createWaitableEvent());
146 m_thread->thread()->postTask(FROM_HERE, new Task(threadSafeBind(&TeeCrea tionThread::runInternal, AllowCrossThreadAccess(this), src, AllowCrossThreadAcce ss(dest1), AllowCrossThreadAccess(dest2)))); 155 m_thread->thread()->postTask(FROM_HERE, new Task(threadSafeBind(&TeeCrea tionThread<Handle>::runInternal, AllowCrossThreadAccess(this), src, AllowCrossTh readAccess(dest1), AllowCrossThreadAccess(dest2))));
147 m_waitableEvent->wait(); 156 m_waitableEvent->wait();
148 } 157 }
149 158
150 Thread* thread() { return m_thread.get(); } 159 Thread* thread() { return m_thread.get(); }
151 160
152 private: 161 private:
153 void runInternal(PassOwnPtr<WebDataConsumerHandle> src, OwnPtr<WebDataConsum erHandle>* dest1, OwnPtr<WebDataConsumerHandle>* dest2) 162 void runInternal(PassOwnPtr<Handle> src, OwnPtr<Handle>* dest1, OwnPtr<Handl e>* dest2)
154 { 163 {
155 DataConsumerTee::create(m_thread->executionContext(), src, dest1, dest2) ; 164 DataConsumerTee::create(m_thread->executionContext(), src, dest1, dest2) ;
156 m_waitableEvent->signal(); 165 m_waitableEvent->signal();
157 } 166 }
158 167
159 OwnPtr<Thread> m_thread; 168 OwnPtr<Thread> m_thread;
160 OwnPtr<WebWaitableEvent> m_waitableEvent; 169 OwnPtr<WebWaitableEvent> m_waitableEvent;
161 }; 170 };
162 171
172 // TODO(hiroshige): Merge similar classes into DataConsumerHandleTestUtil.h/cpp.
173 class MockFetchDataConsumerHandle : public FetchDataConsumerHandle {
174 public:
175 static PassOwnPtr<StrictMock<MockFetchDataConsumerHandle>> create() { return adoptPtr(new StrictMock<MockFetchDataConsumerHandle>); }
176 MOCK_METHOD1(obtainReaderInternal, Reader*(Client*));
177 };
178
179 class MockFetchDataConsumerReader : public FetchDataConsumerHandle::Reader {
180 public:
181 static PassOwnPtr<StrictMock<MockFetchDataConsumerReader>> create() { return adoptPtr(new StrictMock<MockFetchDataConsumerReader>); }
182
183 using Result = WebDataConsumerHandle::Result;
184 using Flags = WebDataConsumerHandle::Flags;
185 MOCK_METHOD4(read, Result(void*, size_t, Flags, size_t*));
186 MOCK_METHOD3(beginRead, Result(const void**, Flags, size_t*));
187 MOCK_METHOD1(endRead, Result(size_t));
188 MOCK_METHOD1(drainAsBlobDataHandle, PassRefPtr<BlobDataHandle>(BlobSizePolic y));
189
190 ~MockFetchDataConsumerReader() override
191 {
192 destruct();
193 }
194 MOCK_METHOD0(destruct, void());
195 };
196
163 TEST(DataConsumerTeeTest, CreateDone) 197 TEST(DataConsumerTeeTest, CreateDone)
164 { 198 {
165 OwnPtr<Handle> src(Handle::create()); 199 OwnPtr<Handle> src(Handle::create());
166 OwnPtr<WebDataConsumerHandle> dest1, dest2; 200 OwnPtr<WebDataConsumerHandle> dest1, dest2;
167 201
168 src->add(Command(Command::Done)); 202 src->add(Command(Command::Done));
169 203
170 OwnPtr<TeeCreationThread> t = adoptPtr(new TeeCreationThread()); 204 OwnPtr<TeeCreationThread<WebDataConsumerHandle>> t = adoptPtr(new TeeCreatio nThread<WebDataConsumerHandle>());
171 t->run(src.release(), &dest1, &dest2); 205 t->run(src.release(), &dest1, &dest2);
172 206
173 ASSERT_TRUE(dest1); 207 ASSERT_TRUE(dest1);
174 ASSERT_TRUE(dest2); 208 ASSERT_TRUE(dest2);
175 209
176 HandleReader r1, r2; 210 HandleReader r1, r2;
177 r1.start(dest1.release()); 211 r1.start(dest1.release());
178 r2.start(dest2.release()); 212 r2.start(dest2.release());
179 213
180 r1.waitableEvent()->wait(); 214 r1.waitableEvent()->wait();
(...skipping 12 matching lines...) Expand all
193 OwnPtr<WebDataConsumerHandle> dest1, dest2; 227 OwnPtr<WebDataConsumerHandle> dest1, dest2;
194 228
195 src->add(Command(Command::Wait)); 229 src->add(Command(Command::Wait));
196 src->add(Command(Command::Data, "hello, ")); 230 src->add(Command(Command::Data, "hello, "));
197 src->add(Command(Command::Wait)); 231 src->add(Command(Command::Wait));
198 src->add(Command(Command::Data, "world")); 232 src->add(Command(Command::Data, "world"));
199 src->add(Command(Command::Wait)); 233 src->add(Command(Command::Wait));
200 src->add(Command(Command::Wait)); 234 src->add(Command(Command::Wait));
201 src->add(Command(Command::Done)); 235 src->add(Command(Command::Done));
202 236
203 OwnPtr<TeeCreationThread> t = adoptPtr(new TeeCreationThread()); 237 OwnPtr<TeeCreationThread<WebDataConsumerHandle>> t = adoptPtr(new TeeCreatio nThread<WebDataConsumerHandle>());
204 t->run(src.release(), &dest1, &dest2); 238 t->run(src.release(), &dest1, &dest2);
205 239
206 ASSERT_TRUE(dest1); 240 ASSERT_TRUE(dest1);
207 ASSERT_TRUE(dest2); 241 ASSERT_TRUE(dest2);
208 242
209 HandleReader r1, r2; 243 HandleReader r1, r2;
210 r1.start(dest1.release()); 244 r1.start(dest1.release());
211 r2.start(dest2.release()); 245 r2.start(dest2.release());
212 246
213 r1.waitableEvent()->wait(); 247 r1.waitableEvent()->wait();
(...skipping 13 matching lines...) Expand all
227 261
228 src->add(Command(Command::Wait)); 262 src->add(Command(Command::Wait));
229 src->add(Command(Command::Data, "hello, ")); 263 src->add(Command(Command::Data, "hello, "));
230 src->add(Command(Command::Wait)); 264 src->add(Command(Command::Wait));
231 src->add(Command(Command::Wait)); 265 src->add(Command(Command::Wait));
232 src->add(Command(Command::Wait)); 266 src->add(Command(Command::Wait));
233 src->add(Command(Command::Data, "world")); 267 src->add(Command(Command::Data, "world"));
234 src->add(Command(Command::Wait)); 268 src->add(Command(Command::Wait));
235 src->add(Command(Command::Done)); 269 src->add(Command(Command::Done));
236 270
237 OwnPtr<TeeCreationThread> t = adoptPtr(new TeeCreationThread()); 271 OwnPtr<TeeCreationThread<WebDataConsumerHandle>> t = adoptPtr(new TeeCreatio nThread<WebDataConsumerHandle>());
238 t->run(src.release(), &dest1, &dest2); 272 t->run(src.release(), &dest1, &dest2);
239 273
240 ASSERT_TRUE(dest1); 274 ASSERT_TRUE(dest1);
241 ASSERT_TRUE(dest2); 275 ASSERT_TRUE(dest2);
242 276
243 HandleTwoPhaseReader r1, r2; 277 HandleTwoPhaseReader r1, r2;
244 r1.start(dest1.release()); 278 r1.start(dest1.release());
245 r2.start(dest2.release()); 279 r2.start(dest2.release());
246 280
247 r1.waitableEvent()->wait(); 281 r1.waitableEvent()->wait();
248 r2.waitableEvent()->wait(); 282 r2.waitableEvent()->wait();
249 283
250 EXPECT_EQ(kDone, r1.finalResult()); 284 EXPECT_EQ(kDone, r1.finalResult());
251 EXPECT_EQ("hello, world", r1.readString()); 285 EXPECT_EQ("hello, world", r1.readString());
252 286
253 EXPECT_EQ(kDone, r2.finalResult()); 287 EXPECT_EQ(kDone, r2.finalResult());
254 EXPECT_EQ("hello, world", r2.readString()); 288 EXPECT_EQ("hello, world", r2.readString());
255 } 289 }
256 290
257 TEST(DataConsumerTeeTest, Error) 291 TEST(DataConsumerTeeTest, Error)
258 { 292 {
259 OwnPtr<Handle> src(Handle::create()); 293 OwnPtr<Handle> src(Handle::create());
260 OwnPtr<WebDataConsumerHandle> dest1, dest2; 294 OwnPtr<WebDataConsumerHandle> dest1, dest2;
261 295
262 src->add(Command(Command::Data, "hello, ")); 296 src->add(Command(Command::Data, "hello, "));
263 src->add(Command(Command::Data, "world")); 297 src->add(Command(Command::Data, "world"));
264 src->add(Command(Command::Error)); 298 src->add(Command(Command::Error));
265 299
266 OwnPtr<TeeCreationThread> t = adoptPtr(new TeeCreationThread()); 300 OwnPtr<TeeCreationThread<WebDataConsumerHandle>> t = adoptPtr(new TeeCreatio nThread<WebDataConsumerHandle>());
267 t->run(src.release(), &dest1, &dest2); 301 t->run(src.release(), &dest1, &dest2);
268 302
269 ASSERT_TRUE(dest1); 303 ASSERT_TRUE(dest1);
270 ASSERT_TRUE(dest2); 304 ASSERT_TRUE(dest2);
271 305
272 HandleReader r1, r2; 306 HandleReader r1, r2;
273 r1.start(dest1.release()); 307 r1.start(dest1.release());
274 r2.start(dest2.release()); 308 r2.start(dest2.release());
275 309
276 r1.waitableEvent()->wait(); 310 r1.waitableEvent()->wait();
277 r2.waitableEvent()->wait(); 311 r2.waitableEvent()->wait();
278 312
279 EXPECT_EQ(kUnexpectedError, r1.finalResult()); 313 EXPECT_EQ(kUnexpectedError, r1.finalResult());
280 EXPECT_EQ(kUnexpectedError, r2.finalResult()); 314 EXPECT_EQ(kUnexpectedError, r2.finalResult());
281 } 315 }
282 316
283 void postStop(Thread* thread) 317 void postStop(Thread* thread)
284 { 318 {
285 thread->executionContext()->stopActiveDOMObjects(); 319 thread->executionContext()->stopActiveDOMObjects();
286 } 320 }
287 321
288 TEST(DataConsumerTeeTest, StopSource) 322 TEST(DataConsumerTeeTest, StopSource)
289 { 323 {
290 OwnPtr<Handle> src(Handle::create()); 324 OwnPtr<Handle> src(Handle::create());
291 OwnPtr<WebDataConsumerHandle> dest1, dest2; 325 OwnPtr<WebDataConsumerHandle> dest1, dest2;
292 326
293 src->add(Command(Command::Data, "hello, ")); 327 src->add(Command(Command::Data, "hello, "));
294 src->add(Command(Command::Data, "world")); 328 src->add(Command(Command::Data, "world"));
295 329
296 OwnPtr<TeeCreationThread> t = adoptPtr(new TeeCreationThread()); 330 OwnPtr<TeeCreationThread<WebDataConsumerHandle>> t = adoptPtr(new TeeCreatio nThread<WebDataConsumerHandle>());
297 t->run(src.release(), &dest1, &dest2); 331 t->run(src.release(), &dest1, &dest2);
298 332
299 ASSERT_TRUE(dest1); 333 ASSERT_TRUE(dest1);
300 ASSERT_TRUE(dest2); 334 ASSERT_TRUE(dest2);
301 335
302 HandleReader r1, r2; 336 HandleReader r1, r2;
303 r1.start(dest1.release()); 337 r1.start(dest1.release());
304 r2.start(dest2.release()); 338 r2.start(dest2.release());
305 339
306 // We can pass a raw pointer because the subsequent |wait| calls ensure 340 // We can pass a raw pointer because the subsequent |wait| calls ensure
307 // t->thread() is alive. 341 // t->thread() is alive.
308 t->thread()->thread()->postTask(FROM_HERE, new Task(threadSafeBind(postStop, AllowCrossThreadAccess(t->thread())))); 342 t->thread()->thread()->postTask(FROM_HERE, new Task(threadSafeBind(postStop, AllowCrossThreadAccess(t->thread()))));
309 343
310 r1.waitableEvent()->wait(); 344 r1.waitableEvent()->wait();
311 r2.waitableEvent()->wait(); 345 r2.waitableEvent()->wait();
312 346
313 EXPECT_EQ(kUnexpectedError, r1.finalResult()); 347 EXPECT_EQ(kUnexpectedError, r1.finalResult());
314 EXPECT_EQ(kUnexpectedError, r2.finalResult()); 348 EXPECT_EQ(kUnexpectedError, r2.finalResult());
315 } 349 }
316 350
317 TEST(DataConsumerTeeTest, DetachSource) 351 TEST(DataConsumerTeeTest, DetachSource)
318 { 352 {
319 OwnPtr<Handle> src(Handle::create()); 353 OwnPtr<Handle> src(Handle::create());
320 OwnPtr<WebDataConsumerHandle> dest1, dest2; 354 OwnPtr<WebDataConsumerHandle> dest1, dest2;
321 355
322 src->add(Command(Command::Data, "hello, ")); 356 src->add(Command(Command::Data, "hello, "));
323 src->add(Command(Command::Data, "world")); 357 src->add(Command(Command::Data, "world"));
324 358
325 OwnPtr<TeeCreationThread> t = adoptPtr(new TeeCreationThread()); 359 OwnPtr<TeeCreationThread<WebDataConsumerHandle>> t = adoptPtr(new TeeCreatio nThread<WebDataConsumerHandle>());
326 t->run(src.release(), &dest1, &dest2); 360 t->run(src.release(), &dest1, &dest2);
327 361
328 ASSERT_TRUE(dest1); 362 ASSERT_TRUE(dest1);
329 ASSERT_TRUE(dest2); 363 ASSERT_TRUE(dest2);
330 364
331 HandleReader r1, r2; 365 HandleReader r1, r2;
332 r1.start(dest1.release()); 366 r1.start(dest1.release());
333 r2.start(dest2.release()); 367 r2.start(dest2.release());
334 368
335 t = nullptr; 369 t = nullptr;
336 370
337 r1.waitableEvent()->wait(); 371 r1.waitableEvent()->wait();
338 r2.waitableEvent()->wait(); 372 r2.waitableEvent()->wait();
339 373
340 EXPECT_EQ(kUnexpectedError, r1.finalResult()); 374 EXPECT_EQ(kUnexpectedError, r1.finalResult());
341 EXPECT_EQ(kUnexpectedError, r2.finalResult()); 375 EXPECT_EQ(kUnexpectedError, r2.finalResult());
342 } 376 }
343 377
344 TEST(DataConsumerTeeTest, DetachSourceAfterReadingDone) 378 TEST(DataConsumerTeeTest, DetachSourceAfterReadingDone)
345 { 379 {
346 OwnPtr<Handle> src(Handle::create()); 380 OwnPtr<Handle> src(Handle::create());
347 OwnPtr<WebDataConsumerHandle> dest1, dest2; 381 OwnPtr<WebDataConsumerHandle> dest1, dest2;
348 382
349 src->add(Command(Command::Data, "hello, ")); 383 src->add(Command(Command::Data, "hello, "));
350 src->add(Command(Command::Data, "world")); 384 src->add(Command(Command::Data, "world"));
351 src->add(Command(Command::Done)); 385 src->add(Command(Command::Done));
352 386
353 OwnPtr<TeeCreationThread> t = adoptPtr(new TeeCreationThread()); 387 OwnPtr<TeeCreationThread<WebDataConsumerHandle>> t = adoptPtr(new TeeCreatio nThread<WebDataConsumerHandle>());
354 t->run(src.release(), &dest1, &dest2); 388 t->run(src.release(), &dest1, &dest2);
355 389
356 ASSERT_TRUE(dest1); 390 ASSERT_TRUE(dest1);
357 ASSERT_TRUE(dest2); 391 ASSERT_TRUE(dest2);
358 392
359 HandleReader r1, r2; 393 HandleReader r1, r2;
360 r1.start(dest1.release()); 394 r1.start(dest1.release());
361 r1.waitableEvent()->wait(); 395 r1.waitableEvent()->wait();
362 396
363 EXPECT_EQ(kDone, r1.finalResult()); 397 EXPECT_EQ(kDone, r1.finalResult());
(...skipping 10 matching lines...) Expand all
374 408
375 TEST(DataConsumerTeeTest, DetachOneDestination) 409 TEST(DataConsumerTeeTest, DetachOneDestination)
376 { 410 {
377 OwnPtr<Handle> src(Handle::create()); 411 OwnPtr<Handle> src(Handle::create());
378 OwnPtr<WebDataConsumerHandle> dest1, dest2; 412 OwnPtr<WebDataConsumerHandle> dest1, dest2;
379 413
380 src->add(Command(Command::Data, "hello, ")); 414 src->add(Command(Command::Data, "hello, "));
381 src->add(Command(Command::Data, "world")); 415 src->add(Command(Command::Data, "world"));
382 src->add(Command(Command::Done)); 416 src->add(Command(Command::Done));
383 417
384 OwnPtr<TeeCreationThread> t = adoptPtr(new TeeCreationThread()); 418 OwnPtr<TeeCreationThread<WebDataConsumerHandle>> t = adoptPtr(new TeeCreatio nThread<WebDataConsumerHandle>());
385 t->run(src.release(), &dest1, &dest2); 419 t->run(src.release(), &dest1, &dest2);
386 420
387 ASSERT_TRUE(dest1); 421 ASSERT_TRUE(dest1);
388 ASSERT_TRUE(dest2); 422 ASSERT_TRUE(dest2);
389 423
390 dest1 = nullptr; 424 dest1 = nullptr;
391 425
392 HandleReader r2; 426 HandleReader r2;
393 r2.start(dest2.release()); 427 r2.start(dest2.release());
394 r2.waitableEvent()->wait(); 428 r2.waitableEvent()->wait();
395 429
396 EXPECT_EQ(kDone, r2.finalResult()); 430 EXPECT_EQ(kDone, r2.finalResult());
397 EXPECT_EQ("hello, world", r2.readString()); 431 EXPECT_EQ("hello, world", r2.readString());
398 } 432 }
399 433
400 TEST(DataConsumerTeeTest, DetachBothDestinationsShouldStopSourceReader) 434 TEST(DataConsumerTeeTest, DetachBothDestinationsShouldStopSourceReader)
401 { 435 {
402 OwnPtr<Handle> src(Handle::create()); 436 OwnPtr<Handle> src(Handle::create());
403 RefPtr<Handle::Context> context(src->context()); 437 RefPtr<Handle::Context> context(src->context());
404 OwnPtr<WebDataConsumerHandle> dest1, dest2; 438 OwnPtr<WebDataConsumerHandle> dest1, dest2;
405 439
406 src->add(Command(Command::Data, "hello, ")); 440 src->add(Command(Command::Data, "hello, "));
407 src->add(Command(Command::Data, "world")); 441 src->add(Command(Command::Data, "world"));
408 442
409 OwnPtr<TeeCreationThread> t = adoptPtr(new TeeCreationThread()); 443 OwnPtr<TeeCreationThread<WebDataConsumerHandle>> t = adoptPtr(new TeeCreatio nThread<WebDataConsumerHandle>());
410 t->run(src.release(), &dest1, &dest2); 444 t->run(src.release(), &dest1, &dest2);
411 445
412 ASSERT_TRUE(dest1); 446 ASSERT_TRUE(dest1);
413 ASSERT_TRUE(dest2); 447 ASSERT_TRUE(dest2);
414 448
415 dest1 = nullptr; 449 dest1 = nullptr;
416 dest2 = nullptr; 450 dest2 = nullptr;
417 451
418 // Collect garbage to finalize the source reader. 452 // Collect garbage to finalize the source reader.
419 Heap::collectAllGarbage(); 453 Heap::collectAllGarbage();
420 context->detached()->wait(); 454 context->detached()->wait();
421 } 455 }
422 456
457 TEST(FetchDataConsumerTeeTest, Create)
458 {
459 RefPtr<BlobDataHandle> blobDataHandle = BlobDataHandle::create();
460 OwnPtr<MockFetchDataConsumerHandle> src(MockFetchDataConsumerHandle::create( ));
461 OwnPtr<MockFetchDataConsumerReader> reader(MockFetchDataConsumerReader::crea te());
462
463 Checkpoint checkpoint;
464 InSequence s;
465 EXPECT_CALL(checkpoint, Call(1));
466 EXPECT_CALL(*src, obtainReaderInternal(_)).WillOnce(Return(reader.get()));
467 EXPECT_CALL(*reader, drainAsBlobDataHandle(kAllowBlobWithInvalidSize)).WillO nce(Return(blobDataHandle));
468 EXPECT_CALL(*reader, destruct());
469 EXPECT_CALL(checkpoint, Call(2));
470
471 // |reader| is adopted by |obtainReader|.
472 ASSERT_TRUE(reader.leakPtr());
473
474 OwnPtr<FetchDataConsumerHandle> dest1, dest2;
475 OwnPtr<TeeCreationThread<FetchDataConsumerHandle>> t = adoptPtr(new TeeCreat ionThread<FetchDataConsumerHandle>());
476
477 checkpoint.Call(1);
478 t->run(src.release(), &dest1, &dest2);
479 checkpoint.Call(2);
480
481 ASSERT_TRUE(dest1);
482 ASSERT_TRUE(dest2);
483 EXPECT_EQ(blobDataHandle, dest1->obtainReader(nullptr)->drainAsBlobDataHandl e(kAllowBlobWithInvalidSize));
484 EXPECT_EQ(blobDataHandle, dest2->obtainReader(nullptr)->drainAsBlobDataHandl e(kAllowBlobWithInvalidSize));
485 }
486
487 TEST(FetchDataConsumerTeeTest, CreateFromBlobWithInvalidSize)
488 {
489 RefPtr<BlobDataHandle> blobDataHandle = BlobDataHandle::create(BlobData::cre ate(), -1);
490 OwnPtr<MockFetchDataConsumerHandle> src(MockFetchDataConsumerHandle::create( ));
491 OwnPtr<MockFetchDataConsumerReader> reader(MockFetchDataConsumerReader::crea te());
492
493 Checkpoint checkpoint;
494 InSequence s;
495 EXPECT_CALL(checkpoint, Call(1));
496 EXPECT_CALL(*src, obtainReaderInternal(_)).WillOnce(Return(reader.get()));
497 EXPECT_CALL(*reader, drainAsBlobDataHandle(kAllowBlobWithInvalidSize)).WillO nce(Return(blobDataHandle));
498 EXPECT_CALL(*reader, destruct());
499 EXPECT_CALL(checkpoint, Call(2));
500
501 // |reader| is adopted by |obtainReader|.
502 ASSERT_TRUE(reader.leakPtr());
503
504 OwnPtr<FetchDataConsumerHandle> dest1, dest2;
505 OwnPtr<TeeCreationThread<FetchDataConsumerHandle>> t = adoptPtr(new TeeCreat ionThread<FetchDataConsumerHandle>());
506
507 checkpoint.Call(1);
508 t->run(src.release(), &dest1, &dest2);
509 checkpoint.Call(2);
510
511 ASSERT_TRUE(dest1);
512 ASSERT_TRUE(dest2);
513 EXPECT_FALSE(dest1->obtainReader(nullptr)->drainAsBlobDataHandle(kDisallowBl obWithInvalidSize));
514 EXPECT_EQ(blobDataHandle, dest1->obtainReader(nullptr)->drainAsBlobDataHandl e(kAllowBlobWithInvalidSize));
515 EXPECT_FALSE(dest2->obtainReader(nullptr)->drainAsBlobDataHandle(kDisallowBl obWithInvalidSize));
516 EXPECT_EQ(blobDataHandle, dest2->obtainReader(nullptr)->drainAsBlobDataHandl e(kAllowBlobWithInvalidSize));
517 }
518
519 TEST(FetchDataConsumerTeeTest, CreateDone)
520 {
521 OwnPtr<Handle> src(Handle::create());
522 OwnPtr<FetchDataConsumerHandle> dest1, dest2;
523
524 src->add(Command(Command::Done));
525
526 OwnPtr<TeeCreationThread<FetchDataConsumerHandle>> t = adoptPtr(new TeeCreat ionThread<FetchDataConsumerHandle>());
527 t->run(createFetchDataConsumerHandleFromWebHandle(src.release()), &dest1, &d est2);
528
529 ASSERT_TRUE(dest1);
530 ASSERT_TRUE(dest2);
531
532 EXPECT_FALSE(dest1->obtainReader(nullptr)->drainAsBlobDataHandle(kAllowBlobW ithInvalidSize));
533 EXPECT_FALSE(dest2->obtainReader(nullptr)->drainAsBlobDataHandle(kAllowBlobW ithInvalidSize));
534
535 HandleReader r1, r2;
536 r1.start(dest1.release());
537 r2.start(dest2.release());
538
539 r1.waitableEvent()->wait();
540 r2.waitableEvent()->wait();
541
542 EXPECT_EQ(kDone, r1.finalResult());
543 EXPECT_EQ(String(), r1.readString());
544
545 EXPECT_EQ(kDone, r2.finalResult());
546 EXPECT_EQ(String(), r2.readString());
547 }
548
423 } // namespace 549 } // namespace
424 } // namespace blink 550 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698