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

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

Issue 1210693002: Move Handle in TeeTest and MockFetchDataLoaderClient to TestUtil (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 5 years, 6 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/Deque.h"
19 #include "wtf/PassRefPtr.h" 18 #include "wtf/PassRefPtr.h"
20 #include "wtf/RefPtr.h" 19 #include "wtf/RefPtr.h"
21 #include "wtf/ThreadSafeRefCounted.h"
22 #include "wtf/ThreadingPrimitives.h"
23 #include "wtf/Vector.h"
24 20
25 #include <gtest/gtest.h> 21 #include <gtest/gtest.h>
26 #include <string.h> 22 #include <string.h>
27 #include <v8.h> 23 #include <v8.h>
28 24
29 namespace blink { 25 namespace blink {
30 namespace { 26 namespace {
31 27
32 using Result = WebDataConsumerHandle::Result; 28 using Result = WebDataConsumerHandle::Result;
33 using Thread = DataConsumerHandleTestUtil::Thread; 29 using Thread = DataConsumerHandleTestUtil::Thread;
34 const WebDataConsumerHandle::Flags kNone = WebDataConsumerHandle::FlagNone; 30 const WebDataConsumerHandle::Flags kNone = WebDataConsumerHandle::FlagNone;
35 const Result kOk = WebDataConsumerHandle::Ok; 31 const Result kOk = WebDataConsumerHandle::Ok;
36 const Result kShouldWait = WebDataConsumerHandle::ShouldWait; 32 const Result kShouldWait = WebDataConsumerHandle::ShouldWait;
37 const Result kDone = WebDataConsumerHandle::Done; 33 const Result kDone = WebDataConsumerHandle::Done;
38 const Result kUnexpectedError = WebDataConsumerHandle::UnexpectedError; 34 const Result kUnexpectedError = WebDataConsumerHandle::UnexpectedError;
39 35
40 class Command final { 36 using Command = DataConsumerHandleTestUtil::Command;
41 public: 37 using Handle = DataConsumerHandleTestUtil::ReplayingHandle;
42 enum Name {
43 Data,
44 Done,
45 Error,
46 Wait,
47 };
48
49 Command(Name name) : m_name(name) { }
50 Command(Name name, const Vector<char>& body) : m_name(name), m_body(body) { }
51 Command(Name name, const char* body, size_t size) : m_name(name)
52 {
53 m_body.append(body, size);
54 }
55 Command(Name name, const char* body) : Command(name, body, strlen(body)) { }
56 Name name() const { return m_name; }
57 const Vector<char>& body() const { return m_body; }
58
59 private:
60 const Name m_name;
61 Vector<char> m_body;
62 };
63
64 // Handle stores commands via |add| and replays the stored commends when read.
65 class Handle final : public WebDataConsumerHandle {
66 public:
67 class Context final : public ThreadSafeRefCounted<Context> {
68 public:
69 static PassRefPtr<Context> create() { return adoptRef(new Context); }
70
71 // This function cannot be called after creating a tee.
72 void add(const Command& command)
73 {
74 MutexLocker locker(m_mutex);
75 m_commands.append(command);
76 }
77
78 void attachReader(WebDataConsumerHandle::Client* client)
79 {
80 MutexLocker locker(m_mutex);
81 ASSERT(!m_readerThread);
82 ASSERT(!m_client);
83 m_readerThread = Platform::current()->currentThread();
84 m_client = client;
85
86 if (m_client && !(isEmpty() && m_result == kShouldWait))
87 notify();
88 }
89 void detachReader()
90 {
91 MutexLocker locker(m_mutex);
92 ASSERT(m_readerThread && m_readerThread->isCurrentThread());
93 m_readerThread = nullptr;
94 m_client = nullptr;
95 if (!m_isHandleAttached)
96 m_detached->signal();
97 }
98
99 void detachHandle()
100 {
101 MutexLocker locker(m_mutex);
102 m_isHandleAttached = false;
103 if (!m_readerThread)
104 m_detached->signal();
105 }
106
107 Result beginRead(const void** buffer, Flags, size_t* available)
108 {
109 MutexLocker locker(m_mutex);
110 *buffer = nullptr;
111 *available = 0;
112 if (isEmpty())
113 return m_result;
114
115 const Command& command = top();
116 Result result = Ok;
117 switch (command.name()) {
118 case Command::Data: {
119 auto& body = command.body();
120 *available = body.size() - offset();
121 *buffer = body.data() + offset();
122 result = Ok;
123 break;
124 }
125 case Command::Done:
126 m_result = result = Done;
127 consume(0);
128 break;
129 case Command::Wait:
130 consume(0);
131 result = ShouldWait;
132 notify();
133 break;
134 case Command::Error:
135 m_result = result = UnexpectedError;
136 consume(0);
137 break;
138 }
139 return result;
140 }
141 Result endRead(size_t readSize)
142 {
143 MutexLocker locker(m_mutex);
144 consume(readSize);
145 return Ok;
146 }
147
148 WebWaitableEvent* detached() { return m_detached.get(); }
149
150 private:
151 Context()
152 : m_offset(0)
153 , m_readerThread(nullptr)
154 , m_client(nullptr)
155 , m_result(ShouldWait)
156 , m_isHandleAttached(true)
157 , m_detached(adoptPtr(Platform::current()->createWaitableEvent()))
158 {
159 }
160
161 bool isEmpty() const { return m_commands.isEmpty(); }
162 const Command& top()
163 {
164 ASSERT(!isEmpty());
165 return m_commands.first();
166 }
167
168 void consume(size_t size)
169 {
170 ASSERT(!isEmpty());
171 ASSERT(size + m_offset <= top().body().size());
172 bool fullyConsumed = (size + m_offset >= top().body().size());
173 if (fullyConsumed) {
174 m_offset = 0;
175 m_commands.removeFirst();
176 } else {
177 m_offset += size;
178 }
179 }
180
181 size_t offset() const { return m_offset; }
182
183 void notify()
184 {
185 if (!m_client)
186 return;
187 ASSERT(m_readerThread);
188 m_readerThread->postTask(FROM_HERE, new Task(threadSafeBind(&Context ::notifyInternal, this)));
189 }
190
191 void notifyInternal()
192 {
193 {
194 MutexLocker locker(m_mutex);
195 if (!m_client || !m_readerThread->isCurrentThread()) {
196 // There is no client, or a new reader is attached.
197 return;
198 }
199 }
200 // The reading thread is the current thread.
201 m_client->didGetReadable();
202 }
203
204 Deque<Command> m_commands;
205 size_t m_offset;
206 WebThread* m_readerThread;
207 Client* m_client;
208 Result m_result;
209 bool m_isHandleAttached;
210 Mutex m_mutex;
211 OwnPtr<WebWaitableEvent> m_detached;
212 };
213
214 class ReaderImpl final : public Reader {
215 public:
216 ReaderImpl(PassRefPtr<Context> context, Client* client)
217 : m_context(context)
218 {
219 m_context->attachReader(client);
220 }
221 ~ReaderImpl()
222 {
223 m_context->detachReader();
224 }
225
226 Result read(void* buffer, size_t size, Flags flags, size_t* readSize) ov erride
227 {
228 const void* src = nullptr;
229 Result result = beginRead(&src, flags, readSize);
230 if (result != Ok)
231 return result;
232 *readSize = std::min(*readSize, size);
233 memcpy(buffer, src, *readSize);
234 return endRead(*readSize);
235 }
236 Result beginRead(const void** buffer, Flags flags, size_t* available) ov erride
237 {
238 return m_context->beginRead(buffer, flags, available);
239 }
240 Result endRead(size_t readSize) override
241 {
242 return m_context->endRead(readSize);
243 }
244
245 private:
246 RefPtr<Context> m_context;
247 };
248
249 Handle() : m_context(Context::create()) { }
250 ~Handle()
251 {
252 m_context->detachHandle();
253 }
254
255 ReaderImpl* obtainReaderInternal(Client* client) override { return new Reade rImpl(m_context, client); }
256
257 // Add a command to this handle. This function must be called on the
258 // creator thread. This function must be called BEFORE any reader is
259 // obtained.
260 void add(const Command& command)
261 {
262 m_context->add(command);
263 }
264
265 Context* context() { return m_context.get(); };
266
267 private:
268 RefPtr<Context> m_context;
269 };
270 38
271 class HandleReader : public WebDataConsumerHandle::Client { 39 class HandleReader : public WebDataConsumerHandle::Client {
272 public: 40 public:
273 HandleReader() : m_finalResult(kOk) { } 41 HandleReader() : m_finalResult(kOk) { }
274 42
275 // Need to wait for the event signal after this function is called. 43 // Need to wait for the event signal after this function is called.
276 void start(PassOwnPtr<WebDataConsumerHandle> handle) 44 void start(PassOwnPtr<WebDataConsumerHandle> handle)
277 { 45 {
278 m_thread = adoptPtr(new Thread("reading thread")); 46 m_thread = adoptPtr(new Thread("reading thread"));
279 m_waitableEvent = adoptPtr(Platform::current()->createWaitableEvent()); 47 m_waitableEvent = adoptPtr(Platform::current()->createWaitableEvent());
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
387 DataConsumerTee::create(m_thread->executionContext(), src, dest1, dest2) ; 155 DataConsumerTee::create(m_thread->executionContext(), src, dest1, dest2) ;
388 m_waitableEvent->signal(); 156 m_waitableEvent->signal();
389 } 157 }
390 158
391 OwnPtr<Thread> m_thread; 159 OwnPtr<Thread> m_thread;
392 OwnPtr<WebWaitableEvent> m_waitableEvent; 160 OwnPtr<WebWaitableEvent> m_waitableEvent;
393 }; 161 };
394 162
395 TEST(DataConsumerTeeTest, CreateDone) 163 TEST(DataConsumerTeeTest, CreateDone)
396 { 164 {
397 OwnPtr<Handle> src(adoptPtr(new Handle)); 165 OwnPtr<Handle> src(Handle::create());
398 OwnPtr<WebDataConsumerHandle> dest1, dest2; 166 OwnPtr<WebDataConsumerHandle> dest1, dest2;
399 167
400 src->add(Command(Command::Done)); 168 src->add(Command(Command::Done));
401 169
402 OwnPtr<TeeCreationThread> t = adoptPtr(new TeeCreationThread()); 170 OwnPtr<TeeCreationThread> t = adoptPtr(new TeeCreationThread());
403 t->run(src.release(), &dest1, &dest2); 171 t->run(src.release(), &dest1, &dest2);
404 172
405 ASSERT_TRUE(dest1); 173 ASSERT_TRUE(dest1);
406 ASSERT_TRUE(dest2); 174 ASSERT_TRUE(dest2);
407 175
408 HandleReader r1, r2; 176 HandleReader r1, r2;
409 r1.start(dest1.release()); 177 r1.start(dest1.release());
410 r2.start(dest2.release()); 178 r2.start(dest2.release());
411 179
412 r1.waitableEvent()->wait(); 180 r1.waitableEvent()->wait();
413 r2.waitableEvent()->wait(); 181 r2.waitableEvent()->wait();
414 182
415 EXPECT_EQ(kDone, r1.finalResult()); 183 EXPECT_EQ(kDone, r1.finalResult());
416 EXPECT_EQ(String(), r1.readString()); 184 EXPECT_EQ(String(), r1.readString());
417 185
418 EXPECT_EQ(kDone, r2.finalResult()); 186 EXPECT_EQ(kDone, r2.finalResult());
419 EXPECT_EQ(String(), r2.readString()); 187 EXPECT_EQ(String(), r2.readString());
420 } 188 }
421 189
422 TEST(DataConsumerTeeTest, Read) 190 TEST(DataConsumerTeeTest, Read)
423 { 191 {
424 OwnPtr<Handle> src(adoptPtr(new Handle)); 192 OwnPtr<Handle> src(Handle::create());
425 OwnPtr<WebDataConsumerHandle> dest1, dest2; 193 OwnPtr<WebDataConsumerHandle> dest1, dest2;
426 194
427 src->add(Command(Command::Wait)); 195 src->add(Command(Command::Wait));
428 src->add(Command(Command::Data, "hello, ")); 196 src->add(Command(Command::Data, "hello, "));
429 src->add(Command(Command::Wait)); 197 src->add(Command(Command::Wait));
430 src->add(Command(Command::Data, "world")); 198 src->add(Command(Command::Data, "world"));
431 src->add(Command(Command::Wait)); 199 src->add(Command(Command::Wait));
432 src->add(Command(Command::Wait)); 200 src->add(Command(Command::Wait));
433 src->add(Command(Command::Done)); 201 src->add(Command(Command::Done));
434 202
(...skipping 12 matching lines...) Expand all
447 215
448 EXPECT_EQ(kDone, r1.finalResult()); 216 EXPECT_EQ(kDone, r1.finalResult());
449 EXPECT_EQ("hello, world", r1.readString()); 217 EXPECT_EQ("hello, world", r1.readString());
450 218
451 EXPECT_EQ(kDone, r2.finalResult()); 219 EXPECT_EQ(kDone, r2.finalResult());
452 EXPECT_EQ("hello, world", r2.readString()); 220 EXPECT_EQ("hello, world", r2.readString());
453 } 221 }
454 222
455 TEST(DataConsumerTeeTest, TwoPhaseRead) 223 TEST(DataConsumerTeeTest, TwoPhaseRead)
456 { 224 {
457 OwnPtr<Handle> src(adoptPtr(new Handle)); 225 OwnPtr<Handle> src(Handle::create());
458 OwnPtr<WebDataConsumerHandle> dest1, dest2; 226 OwnPtr<WebDataConsumerHandle> dest1, dest2;
459 227
460 src->add(Command(Command::Wait)); 228 src->add(Command(Command::Wait));
461 src->add(Command(Command::Data, "hello, ")); 229 src->add(Command(Command::Data, "hello, "));
462 src->add(Command(Command::Wait)); 230 src->add(Command(Command::Wait));
463 src->add(Command(Command::Wait)); 231 src->add(Command(Command::Wait));
464 src->add(Command(Command::Wait)); 232 src->add(Command(Command::Wait));
465 src->add(Command(Command::Data, "world")); 233 src->add(Command(Command::Data, "world"));
466 src->add(Command(Command::Wait)); 234 src->add(Command(Command::Wait));
467 src->add(Command(Command::Done)); 235 src->add(Command(Command::Done));
(...skipping 13 matching lines...) Expand all
481 249
482 EXPECT_EQ(kDone, r1.finalResult()); 250 EXPECT_EQ(kDone, r1.finalResult());
483 EXPECT_EQ("hello, world", r1.readString()); 251 EXPECT_EQ("hello, world", r1.readString());
484 252
485 EXPECT_EQ(kDone, r2.finalResult()); 253 EXPECT_EQ(kDone, r2.finalResult());
486 EXPECT_EQ("hello, world", r2.readString()); 254 EXPECT_EQ("hello, world", r2.readString());
487 } 255 }
488 256
489 TEST(DataConsumerTeeTest, Error) 257 TEST(DataConsumerTeeTest, Error)
490 { 258 {
491 OwnPtr<Handle> src(adoptPtr(new Handle)); 259 OwnPtr<Handle> src(Handle::create());
492 OwnPtr<WebDataConsumerHandle> dest1, dest2; 260 OwnPtr<WebDataConsumerHandle> dest1, dest2;
493 261
494 src->add(Command(Command::Data, "hello, ")); 262 src->add(Command(Command::Data, "hello, "));
495 src->add(Command(Command::Data, "world")); 263 src->add(Command(Command::Data, "world"));
496 src->add(Command(Command::Error)); 264 src->add(Command(Command::Error));
497 265
498 OwnPtr<TeeCreationThread> t = adoptPtr(new TeeCreationThread()); 266 OwnPtr<TeeCreationThread> t = adoptPtr(new TeeCreationThread());
499 t->run(src.release(), &dest1, &dest2); 267 t->run(src.release(), &dest1, &dest2);
500 268
501 ASSERT_TRUE(dest1); 269 ASSERT_TRUE(dest1);
(...skipping 10 matching lines...) Expand all
512 EXPECT_EQ(kUnexpectedError, r2.finalResult()); 280 EXPECT_EQ(kUnexpectedError, r2.finalResult());
513 } 281 }
514 282
515 void postStop(Thread* thread) 283 void postStop(Thread* thread)
516 { 284 {
517 thread->executionContext()->stopActiveDOMObjects(); 285 thread->executionContext()->stopActiveDOMObjects();
518 } 286 }
519 287
520 TEST(DataConsumerTeeTest, StopSource) 288 TEST(DataConsumerTeeTest, StopSource)
521 { 289 {
522 OwnPtr<Handle> src(adoptPtr(new Handle)); 290 OwnPtr<Handle> src(Handle::create());
523 OwnPtr<WebDataConsumerHandle> dest1, dest2; 291 OwnPtr<WebDataConsumerHandle> dest1, dest2;
524 292
525 src->add(Command(Command::Data, "hello, ")); 293 src->add(Command(Command::Data, "hello, "));
526 src->add(Command(Command::Data, "world")); 294 src->add(Command(Command::Data, "world"));
527 295
528 OwnPtr<TeeCreationThread> t = adoptPtr(new TeeCreationThread()); 296 OwnPtr<TeeCreationThread> t = adoptPtr(new TeeCreationThread());
529 t->run(src.release(), &dest1, &dest2); 297 t->run(src.release(), &dest1, &dest2);
530 298
531 ASSERT_TRUE(dest1); 299 ASSERT_TRUE(dest1);
532 ASSERT_TRUE(dest2); 300 ASSERT_TRUE(dest2);
533 301
534 HandleReader r1, r2; 302 HandleReader r1, r2;
535 r1.start(dest1.release()); 303 r1.start(dest1.release());
536 r2.start(dest2.release()); 304 r2.start(dest2.release());
537 305
538 // We can pass a raw pointer because the subsequent |wait| calls ensure 306 // We can pass a raw pointer because the subsequent |wait| calls ensure
539 // t->thread() is alive. 307 // t->thread() is alive.
540 t->thread()->thread()->postTask(FROM_HERE, new Task(threadSafeBind(postStop, AllowCrossThreadAccess(t->thread())))); 308 t->thread()->thread()->postTask(FROM_HERE, new Task(threadSafeBind(postStop, AllowCrossThreadAccess(t->thread()))));
541 309
542 r1.waitableEvent()->wait(); 310 r1.waitableEvent()->wait();
543 r2.waitableEvent()->wait(); 311 r2.waitableEvent()->wait();
544 312
545 EXPECT_EQ(kUnexpectedError, r1.finalResult()); 313 EXPECT_EQ(kUnexpectedError, r1.finalResult());
546 EXPECT_EQ(kUnexpectedError, r2.finalResult()); 314 EXPECT_EQ(kUnexpectedError, r2.finalResult());
547 } 315 }
548 316
549 TEST(DataConsumerTeeTest, DetachSource) 317 TEST(DataConsumerTeeTest, DetachSource)
550 { 318 {
551 OwnPtr<Handle> src(adoptPtr(new Handle)); 319 OwnPtr<Handle> src(Handle::create());
552 OwnPtr<WebDataConsumerHandle> dest1, dest2; 320 OwnPtr<WebDataConsumerHandle> dest1, dest2;
553 321
554 src->add(Command(Command::Data, "hello, ")); 322 src->add(Command(Command::Data, "hello, "));
555 src->add(Command(Command::Data, "world")); 323 src->add(Command(Command::Data, "world"));
556 324
557 OwnPtr<TeeCreationThread> t = adoptPtr(new TeeCreationThread()); 325 OwnPtr<TeeCreationThread> t = adoptPtr(new TeeCreationThread());
558 t->run(src.release(), &dest1, &dest2); 326 t->run(src.release(), &dest1, &dest2);
559 327
560 ASSERT_TRUE(dest1); 328 ASSERT_TRUE(dest1);
561 ASSERT_TRUE(dest2); 329 ASSERT_TRUE(dest2);
562 330
563 HandleReader r1, r2; 331 HandleReader r1, r2;
564 r1.start(dest1.release()); 332 r1.start(dest1.release());
565 r2.start(dest2.release()); 333 r2.start(dest2.release());
566 334
567 t = nullptr; 335 t = nullptr;
568 336
569 r1.waitableEvent()->wait(); 337 r1.waitableEvent()->wait();
570 r2.waitableEvent()->wait(); 338 r2.waitableEvent()->wait();
571 339
572 EXPECT_EQ(kUnexpectedError, r1.finalResult()); 340 EXPECT_EQ(kUnexpectedError, r1.finalResult());
573 EXPECT_EQ(kUnexpectedError, r2.finalResult()); 341 EXPECT_EQ(kUnexpectedError, r2.finalResult());
574 } 342 }
575 343
576 TEST(DataConsumerTeeTest, DetachSourceAfterReadingDone) 344 TEST(DataConsumerTeeTest, DetachSourceAfterReadingDone)
577 { 345 {
578 OwnPtr<Handle> src(adoptPtr(new Handle)); 346 OwnPtr<Handle> src(Handle::create());
579 OwnPtr<WebDataConsumerHandle> dest1, dest2; 347 OwnPtr<WebDataConsumerHandle> dest1, dest2;
580 348
581 src->add(Command(Command::Data, "hello, ")); 349 src->add(Command(Command::Data, "hello, "));
582 src->add(Command(Command::Data, "world")); 350 src->add(Command(Command::Data, "world"));
583 src->add(Command(Command::Done)); 351 src->add(Command(Command::Done));
584 352
585 OwnPtr<TeeCreationThread> t = adoptPtr(new TeeCreationThread()); 353 OwnPtr<TeeCreationThread> t = adoptPtr(new TeeCreationThread());
586 t->run(src.release(), &dest1, &dest2); 354 t->run(src.release(), &dest1, &dest2);
587 355
588 ASSERT_TRUE(dest1); 356 ASSERT_TRUE(dest1);
(...skipping 10 matching lines...) Expand all
599 367
600 r2.start(dest2.release()); 368 r2.start(dest2.release());
601 r2.waitableEvent()->wait(); 369 r2.waitableEvent()->wait();
602 370
603 EXPECT_EQ(kDone, r2.finalResult()); 371 EXPECT_EQ(kDone, r2.finalResult());
604 EXPECT_EQ("hello, world", r2.readString()); 372 EXPECT_EQ("hello, world", r2.readString());
605 } 373 }
606 374
607 TEST(DataConsumerTeeTest, DetachOneDestination) 375 TEST(DataConsumerTeeTest, DetachOneDestination)
608 { 376 {
609 OwnPtr<Handle> src(adoptPtr(new Handle)); 377 OwnPtr<Handle> src(Handle::create());
610 OwnPtr<WebDataConsumerHandle> dest1, dest2; 378 OwnPtr<WebDataConsumerHandle> dest1, dest2;
611 379
612 src->add(Command(Command::Data, "hello, ")); 380 src->add(Command(Command::Data, "hello, "));
613 src->add(Command(Command::Data, "world")); 381 src->add(Command(Command::Data, "world"));
614 src->add(Command(Command::Done)); 382 src->add(Command(Command::Done));
615 383
616 OwnPtr<TeeCreationThread> t = adoptPtr(new TeeCreationThread()); 384 OwnPtr<TeeCreationThread> t = adoptPtr(new TeeCreationThread());
617 t->run(src.release(), &dest1, &dest2); 385 t->run(src.release(), &dest1, &dest2);
618 386
619 ASSERT_TRUE(dest1); 387 ASSERT_TRUE(dest1);
620 ASSERT_TRUE(dest2); 388 ASSERT_TRUE(dest2);
621 389
622 dest1 = nullptr; 390 dest1 = nullptr;
623 391
624 HandleReader r2; 392 HandleReader r2;
625 r2.start(dest2.release()); 393 r2.start(dest2.release());
626 r2.waitableEvent()->wait(); 394 r2.waitableEvent()->wait();
627 395
628 EXPECT_EQ(kDone, r2.finalResult()); 396 EXPECT_EQ(kDone, r2.finalResult());
629 EXPECT_EQ("hello, world", r2.readString()); 397 EXPECT_EQ("hello, world", r2.readString());
630 } 398 }
631 399
632 TEST(DataConsumerTeeTest, DetachBothDestinationsShouldStopSourceReader) 400 TEST(DataConsumerTeeTest, DetachBothDestinationsShouldStopSourceReader)
633 { 401 {
634 OwnPtr<Handle> src(adoptPtr(new Handle)); 402 OwnPtr<Handle> src(Handle::create());
635 RefPtr<Handle::Context> context(src->context()); 403 RefPtr<Handle::Context> context(src->context());
636 OwnPtr<WebDataConsumerHandle> dest1, dest2; 404 OwnPtr<WebDataConsumerHandle> dest1, dest2;
637 405
638 src->add(Command(Command::Data, "hello, ")); 406 src->add(Command(Command::Data, "hello, "));
639 src->add(Command(Command::Data, "world")); 407 src->add(Command(Command::Data, "world"));
640 408
641 OwnPtr<TeeCreationThread> t = adoptPtr(new TeeCreationThread()); 409 OwnPtr<TeeCreationThread> t = adoptPtr(new TeeCreationThread());
642 t->run(src.release(), &dest1, &dest2); 410 t->run(src.release(), &dest1, &dest2);
643 411
644 ASSERT_TRUE(dest1); 412 ASSERT_TRUE(dest1);
645 ASSERT_TRUE(dest2); 413 ASSERT_TRUE(dest2);
646 414
647 dest1 = nullptr; 415 dest1 = nullptr;
648 dest2 = nullptr; 416 dest2 = nullptr;
649 417
650 // Collect garbage to finalize the source reader. 418 // Collect garbage to finalize the source reader.
651 Heap::collectAllGarbage(); 419 Heap::collectAllGarbage();
652 context->detached()->wait(); 420 context->detached()->wait();
653 } 421 }
654 422
655 } // namespace 423 } // namespace
656 } // namespace blink 424 } // namespace blink
OLDNEW
« no previous file with comments | « Source/modules/fetch/DataConsumerHandleTestUtil.cpp ('k') | Source/modules/fetch/FetchDataLoaderTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698