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

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" 18 #include "wtf/Deque.h"
19 #include "wtf/PassRefPtr.h" 19 #include "wtf/PassRefPtr.h"
20 #include "wtf/RefPtr.h" 20 #include "wtf/RefPtr.h"
21 #include "wtf/ThreadSafeRefCounted.h" 21 #include "wtf/ThreadSafeRefCounted.h"
22 #include "wtf/ThreadingPrimitives.h" 22 #include "wtf/ThreadingPrimitives.h"
23 #include "wtf/Vector.h" 23 #include "wtf/Vector.h"
yhirano 2015/06/25 04:31:03 -Deque -Vector -ThreadingPrimitives -ThreadSafeRef
hiroshige 2015/06/25 05:33:57 Done.
24 24
25 #include <gtest/gtest.h> 25 #include <gtest/gtest.h>
26 #include <string.h> 26 #include <string.h>
27 #include <v8.h> 27 #include <v8.h>
28 28
29 namespace blink { 29 namespace blink {
30 namespace { 30 namespace {
31 31
32 using Result = WebDataConsumerHandle::Result; 32 using Result = WebDataConsumerHandle::Result;
33 using Thread = DataConsumerHandleTestUtil::Thread; 33 using Thread = DataConsumerHandleTestUtil::Thread;
34 const WebDataConsumerHandle::Flags kNone = WebDataConsumerHandle::FlagNone; 34 const WebDataConsumerHandle::Flags kNone = WebDataConsumerHandle::FlagNone;
35 const Result kOk = WebDataConsumerHandle::Ok; 35 const Result kOk = WebDataConsumerHandle::Ok;
36 const Result kShouldWait = WebDataConsumerHandle::ShouldWait; 36 const Result kShouldWait = WebDataConsumerHandle::ShouldWait;
37 const Result kDone = WebDataConsumerHandle::Done; 37 const Result kDone = WebDataConsumerHandle::Done;
38 const Result kUnexpectedError = WebDataConsumerHandle::UnexpectedError; 38 const Result kUnexpectedError = WebDataConsumerHandle::UnexpectedError;
39 39
40 class Command final { 40 using Command = DataConsumerHandleTestUtil::Command;
41 public: 41 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 42
271 class HandleReader : public WebDataConsumerHandle::Client { 43 class HandleReader : public WebDataConsumerHandle::Client {
272 public: 44 public:
273 HandleReader() : m_finalResult(kOk) { } 45 HandleReader() : m_finalResult(kOk) { }
274 46
275 // Need to wait for the event signal after this function is called. 47 // Need to wait for the event signal after this function is called.
276 void start(PassOwnPtr<WebDataConsumerHandle> handle) 48 void start(PassOwnPtr<WebDataConsumerHandle> handle)
277 { 49 {
278 m_thread = adoptPtr(new Thread("reading thread")); 50 m_thread = adoptPtr(new Thread("reading thread"));
279 m_waitableEvent = adoptPtr(Platform::current()->createWaitableEvent()); 51 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) ; 159 DataConsumerTee::create(m_thread->executionContext(), src, dest1, dest2) ;
388 m_waitableEvent->signal(); 160 m_waitableEvent->signal();
389 } 161 }
390 162
391 OwnPtr<Thread> m_thread; 163 OwnPtr<Thread> m_thread;
392 OwnPtr<WebWaitableEvent> m_waitableEvent; 164 OwnPtr<WebWaitableEvent> m_waitableEvent;
393 }; 165 };
394 166
395 TEST(DataConsumerTeeTest, CreateDone) 167 TEST(DataConsumerTeeTest, CreateDone)
396 { 168 {
397 OwnPtr<Handle> src(adoptPtr(new Handle)); 169 OwnPtr<Handle> src(Handle::create());
398 OwnPtr<WebDataConsumerHandle> dest1, dest2; 170 OwnPtr<WebDataConsumerHandle> dest1, dest2;
399 171
400 src->add(Command(Command::Done)); 172 src->add(Command(Command::Done));
401 173
402 OwnPtr<TeeCreationThread> t = adoptPtr(new TeeCreationThread()); 174 OwnPtr<TeeCreationThread> t = adoptPtr(new TeeCreationThread());
403 t->run(src.release(), &dest1, &dest2); 175 t->run(src.release(), &dest1, &dest2);
404 176
405 ASSERT_TRUE(dest1); 177 ASSERT_TRUE(dest1);
406 ASSERT_TRUE(dest2); 178 ASSERT_TRUE(dest2);
407 179
408 HandleReader r1, r2; 180 HandleReader r1, r2;
409 r1.start(dest1.release()); 181 r1.start(dest1.release());
410 r2.start(dest2.release()); 182 r2.start(dest2.release());
411 183
412 r1.waitableEvent()->wait(); 184 r1.waitableEvent()->wait();
413 r2.waitableEvent()->wait(); 185 r2.waitableEvent()->wait();
414 186
415 EXPECT_EQ(kDone, r1.finalResult()); 187 EXPECT_EQ(kDone, r1.finalResult());
416 EXPECT_EQ(String(), r1.readString()); 188 EXPECT_EQ(String(), r1.readString());
417 189
418 EXPECT_EQ(kDone, r2.finalResult()); 190 EXPECT_EQ(kDone, r2.finalResult());
419 EXPECT_EQ(String(), r2.readString()); 191 EXPECT_EQ(String(), r2.readString());
420 } 192 }
421 193
422 TEST(DataConsumerTeeTest, Read) 194 TEST(DataConsumerTeeTest, Read)
423 { 195 {
424 OwnPtr<Handle> src(adoptPtr(new Handle)); 196 OwnPtr<Handle> src(Handle::create());
425 OwnPtr<WebDataConsumerHandle> dest1, dest2; 197 OwnPtr<WebDataConsumerHandle> dest1, dest2;
426 198
427 src->add(Command(Command::Wait)); 199 src->add(Command(Command::Wait));
428 src->add(Command(Command::Data, "hello, ")); 200 src->add(Command(Command::Data, "hello, "));
429 src->add(Command(Command::Wait)); 201 src->add(Command(Command::Wait));
430 src->add(Command(Command::Data, "world")); 202 src->add(Command(Command::Data, "world"));
431 src->add(Command(Command::Wait)); 203 src->add(Command(Command::Wait));
432 src->add(Command(Command::Wait)); 204 src->add(Command(Command::Wait));
433 src->add(Command(Command::Done)); 205 src->add(Command(Command::Done));
434 206
(...skipping 12 matching lines...) Expand all
447 219
448 EXPECT_EQ(kDone, r1.finalResult()); 220 EXPECT_EQ(kDone, r1.finalResult());
449 EXPECT_EQ("hello, world", r1.readString()); 221 EXPECT_EQ("hello, world", r1.readString());
450 222
451 EXPECT_EQ(kDone, r2.finalResult()); 223 EXPECT_EQ(kDone, r2.finalResult());
452 EXPECT_EQ("hello, world", r2.readString()); 224 EXPECT_EQ("hello, world", r2.readString());
453 } 225 }
454 226
455 TEST(DataConsumerTeeTest, TwoPhaseRead) 227 TEST(DataConsumerTeeTest, TwoPhaseRead)
456 { 228 {
457 OwnPtr<Handle> src(adoptPtr(new Handle)); 229 OwnPtr<Handle> src(Handle::create());
458 OwnPtr<WebDataConsumerHandle> dest1, dest2; 230 OwnPtr<WebDataConsumerHandle> dest1, dest2;
459 231
460 src->add(Command(Command::Wait)); 232 src->add(Command(Command::Wait));
461 src->add(Command(Command::Data, "hello, ")); 233 src->add(Command(Command::Data, "hello, "));
462 src->add(Command(Command::Wait)); 234 src->add(Command(Command::Wait));
463 src->add(Command(Command::Wait)); 235 src->add(Command(Command::Wait));
464 src->add(Command(Command::Wait)); 236 src->add(Command(Command::Wait));
465 src->add(Command(Command::Data, "world")); 237 src->add(Command(Command::Data, "world"));
466 src->add(Command(Command::Wait)); 238 src->add(Command(Command::Wait));
467 src->add(Command(Command::Done)); 239 src->add(Command(Command::Done));
(...skipping 13 matching lines...) Expand all
481 253
482 EXPECT_EQ(kDone, r1.finalResult()); 254 EXPECT_EQ(kDone, r1.finalResult());
483 EXPECT_EQ("hello, world", r1.readString()); 255 EXPECT_EQ("hello, world", r1.readString());
484 256
485 EXPECT_EQ(kDone, r2.finalResult()); 257 EXPECT_EQ(kDone, r2.finalResult());
486 EXPECT_EQ("hello, world", r2.readString()); 258 EXPECT_EQ("hello, world", r2.readString());
487 } 259 }
488 260
489 TEST(DataConsumerTeeTest, Error) 261 TEST(DataConsumerTeeTest, Error)
490 { 262 {
491 OwnPtr<Handle> src(adoptPtr(new Handle)); 263 OwnPtr<Handle> src(Handle::create());
492 OwnPtr<WebDataConsumerHandle> dest1, dest2; 264 OwnPtr<WebDataConsumerHandle> dest1, dest2;
493 265
494 src->add(Command(Command::Data, "hello, ")); 266 src->add(Command(Command::Data, "hello, "));
495 src->add(Command(Command::Data, "world")); 267 src->add(Command(Command::Data, "world"));
496 src->add(Command(Command::Error)); 268 src->add(Command(Command::Error));
497 269
498 OwnPtr<TeeCreationThread> t = adoptPtr(new TeeCreationThread()); 270 OwnPtr<TeeCreationThread> t = adoptPtr(new TeeCreationThread());
499 t->run(src.release(), &dest1, &dest2); 271 t->run(src.release(), &dest1, &dest2);
500 272
501 ASSERT_TRUE(dest1); 273 ASSERT_TRUE(dest1);
(...skipping 10 matching lines...) Expand all
512 EXPECT_EQ(kUnexpectedError, r2.finalResult()); 284 EXPECT_EQ(kUnexpectedError, r2.finalResult());
513 } 285 }
514 286
515 void postStop(Thread* thread) 287 void postStop(Thread* thread)
516 { 288 {
517 thread->executionContext()->stopActiveDOMObjects(); 289 thread->executionContext()->stopActiveDOMObjects();
518 } 290 }
519 291
520 TEST(DataConsumerTeeTest, StopSource) 292 TEST(DataConsumerTeeTest, StopSource)
521 { 293 {
522 OwnPtr<Handle> src(adoptPtr(new Handle)); 294 OwnPtr<Handle> src(Handle::create());
523 OwnPtr<WebDataConsumerHandle> dest1, dest2; 295 OwnPtr<WebDataConsumerHandle> dest1, dest2;
524 296
525 src->add(Command(Command::Data, "hello, ")); 297 src->add(Command(Command::Data, "hello, "));
526 src->add(Command(Command::Data, "world")); 298 src->add(Command(Command::Data, "world"));
527 299
528 OwnPtr<TeeCreationThread> t = adoptPtr(new TeeCreationThread()); 300 OwnPtr<TeeCreationThread> t = adoptPtr(new TeeCreationThread());
529 t->run(src.release(), &dest1, &dest2); 301 t->run(src.release(), &dest1, &dest2);
530 302
531 ASSERT_TRUE(dest1); 303 ASSERT_TRUE(dest1);
532 ASSERT_TRUE(dest2); 304 ASSERT_TRUE(dest2);
533 305
534 HandleReader r1, r2; 306 HandleReader r1, r2;
535 r1.start(dest1.release()); 307 r1.start(dest1.release());
536 r2.start(dest2.release()); 308 r2.start(dest2.release());
537 309
538 // We can pass a raw pointer because the subsequent |wait| calls ensure 310 // We can pass a raw pointer because the subsequent |wait| calls ensure
539 // t->thread() is alive. 311 // t->thread() is alive.
540 t->thread()->thread()->postTask(FROM_HERE, new Task(threadSafeBind(postStop, AllowCrossThreadAccess(t->thread())))); 312 t->thread()->thread()->postTask(FROM_HERE, new Task(threadSafeBind(postStop, AllowCrossThreadAccess(t->thread()))));
541 313
542 r1.waitableEvent()->wait(); 314 r1.waitableEvent()->wait();
543 r2.waitableEvent()->wait(); 315 r2.waitableEvent()->wait();
544 316
545 EXPECT_EQ(kUnexpectedError, r1.finalResult()); 317 EXPECT_EQ(kUnexpectedError, r1.finalResult());
546 EXPECT_EQ(kUnexpectedError, r2.finalResult()); 318 EXPECT_EQ(kUnexpectedError, r2.finalResult());
547 } 319 }
548 320
549 TEST(DataConsumerTeeTest, DetachSource) 321 TEST(DataConsumerTeeTest, DetachSource)
550 { 322 {
551 OwnPtr<Handle> src(adoptPtr(new Handle)); 323 OwnPtr<Handle> src(Handle::create());
552 OwnPtr<WebDataConsumerHandle> dest1, dest2; 324 OwnPtr<WebDataConsumerHandle> dest1, dest2;
553 325
554 src->add(Command(Command::Data, "hello, ")); 326 src->add(Command(Command::Data, "hello, "));
555 src->add(Command(Command::Data, "world")); 327 src->add(Command(Command::Data, "world"));
556 328
557 OwnPtr<TeeCreationThread> t = adoptPtr(new TeeCreationThread()); 329 OwnPtr<TeeCreationThread> t = adoptPtr(new TeeCreationThread());
558 t->run(src.release(), &dest1, &dest2); 330 t->run(src.release(), &dest1, &dest2);
559 331
560 ASSERT_TRUE(dest1); 332 ASSERT_TRUE(dest1);
561 ASSERT_TRUE(dest2); 333 ASSERT_TRUE(dest2);
562 334
563 HandleReader r1, r2; 335 HandleReader r1, r2;
564 r1.start(dest1.release()); 336 r1.start(dest1.release());
565 r2.start(dest2.release()); 337 r2.start(dest2.release());
566 338
567 t = nullptr; 339 t = nullptr;
568 340
569 r1.waitableEvent()->wait(); 341 r1.waitableEvent()->wait();
570 r2.waitableEvent()->wait(); 342 r2.waitableEvent()->wait();
571 343
572 EXPECT_EQ(kUnexpectedError, r1.finalResult()); 344 EXPECT_EQ(kUnexpectedError, r1.finalResult());
573 EXPECT_EQ(kUnexpectedError, r2.finalResult()); 345 EXPECT_EQ(kUnexpectedError, r2.finalResult());
574 } 346 }
575 347
576 TEST(DataConsumerTeeTest, DetachSourceAfterReadingDone) 348 TEST(DataConsumerTeeTest, DetachSourceAfterReadingDone)
577 { 349 {
578 OwnPtr<Handle> src(adoptPtr(new Handle)); 350 OwnPtr<Handle> src(Handle::create());
579 OwnPtr<WebDataConsumerHandle> dest1, dest2; 351 OwnPtr<WebDataConsumerHandle> dest1, dest2;
580 352
581 src->add(Command(Command::Data, "hello, ")); 353 src->add(Command(Command::Data, "hello, "));
582 src->add(Command(Command::Data, "world")); 354 src->add(Command(Command::Data, "world"));
583 src->add(Command(Command::Done)); 355 src->add(Command(Command::Done));
584 356
585 OwnPtr<TeeCreationThread> t = adoptPtr(new TeeCreationThread()); 357 OwnPtr<TeeCreationThread> t = adoptPtr(new TeeCreationThread());
586 t->run(src.release(), &dest1, &dest2); 358 t->run(src.release(), &dest1, &dest2);
587 359
588 ASSERT_TRUE(dest1); 360 ASSERT_TRUE(dest1);
(...skipping 10 matching lines...) Expand all
599 371
600 r2.start(dest2.release()); 372 r2.start(dest2.release());
601 r2.waitableEvent()->wait(); 373 r2.waitableEvent()->wait();
602 374
603 EXPECT_EQ(kDone, r2.finalResult()); 375 EXPECT_EQ(kDone, r2.finalResult());
604 EXPECT_EQ("hello, world", r2.readString()); 376 EXPECT_EQ("hello, world", r2.readString());
605 } 377 }
606 378
607 TEST(DataConsumerTeeTest, DetachOneDestination) 379 TEST(DataConsumerTeeTest, DetachOneDestination)
608 { 380 {
609 OwnPtr<Handle> src(adoptPtr(new Handle)); 381 OwnPtr<Handle> src(Handle::create());
610 OwnPtr<WebDataConsumerHandle> dest1, dest2; 382 OwnPtr<WebDataConsumerHandle> dest1, dest2;
611 383
612 src->add(Command(Command::Data, "hello, ")); 384 src->add(Command(Command::Data, "hello, "));
613 src->add(Command(Command::Data, "world")); 385 src->add(Command(Command::Data, "world"));
614 src->add(Command(Command::Done)); 386 src->add(Command(Command::Done));
615 387
616 OwnPtr<TeeCreationThread> t = adoptPtr(new TeeCreationThread()); 388 OwnPtr<TeeCreationThread> t = adoptPtr(new TeeCreationThread());
617 t->run(src.release(), &dest1, &dest2); 389 t->run(src.release(), &dest1, &dest2);
618 390
619 ASSERT_TRUE(dest1); 391 ASSERT_TRUE(dest1);
620 ASSERT_TRUE(dest2); 392 ASSERT_TRUE(dest2);
621 393
622 dest1 = nullptr; 394 dest1 = nullptr;
623 395
624 HandleReader r2; 396 HandleReader r2;
625 r2.start(dest2.release()); 397 r2.start(dest2.release());
626 r2.waitableEvent()->wait(); 398 r2.waitableEvent()->wait();
627 399
628 EXPECT_EQ(kDone, r2.finalResult()); 400 EXPECT_EQ(kDone, r2.finalResult());
629 EXPECT_EQ("hello, world", r2.readString()); 401 EXPECT_EQ("hello, world", r2.readString());
630 } 402 }
631 403
632 TEST(DataConsumerTeeTest, DetachBothDestinationsShouldStopSourceReader) 404 TEST(DataConsumerTeeTest, DetachBothDestinationsShouldStopSourceReader)
633 { 405 {
634 OwnPtr<Handle> src(adoptPtr(new Handle)); 406 OwnPtr<Handle> src(Handle::create());
635 RefPtr<Handle::Context> context(src->context()); 407 RefPtr<Handle::Context> context(src->context());
636 OwnPtr<WebDataConsumerHandle> dest1, dest2; 408 OwnPtr<WebDataConsumerHandle> dest1, dest2;
637 409
638 src->add(Command(Command::Data, "hello, ")); 410 src->add(Command(Command::Data, "hello, "));
639 src->add(Command(Command::Data, "world")); 411 src->add(Command(Command::Data, "world"));
640 412
641 OwnPtr<TeeCreationThread> t = adoptPtr(new TeeCreationThread()); 413 OwnPtr<TeeCreationThread> t = adoptPtr(new TeeCreationThread());
642 t->run(src.release(), &dest1, &dest2); 414 t->run(src.release(), &dest1, &dest2);
643 415
644 ASSERT_TRUE(dest1); 416 ASSERT_TRUE(dest1);
645 ASSERT_TRUE(dest2); 417 ASSERT_TRUE(dest2);
646 418
647 dest1 = nullptr; 419 dest1 = nullptr;
648 dest2 = nullptr; 420 dest2 = nullptr;
649 421
650 // Collect garbage to finalize the source reader. 422 // Collect garbage to finalize the source reader.
651 Heap::collectAllGarbage(); 423 Heap::collectAllGarbage();
652 context->detached()->wait(); 424 context->detached()->wait();
653 } 425 }
654 426
655 } // namespace 427 } // namespace
656 } // namespace blink 428 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698