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

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

Issue 1176243004: Add FetchDataConsumerHandle and utility functions/classes (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/CompositeDataConsumerHandle.h" 6 #include "modules/fetch/CompositeDataConsumerHandle.h"
7 7
8 #include "modules/fetch/DataConsumerHandleUtilTest.h"
8 #include "platform/Task.h" 9 #include "platform/Task.h"
9 #include "platform/ThreadSafeFunctional.h" 10 #include "platform/ThreadSafeFunctional.h"
10 #include "platform/heap/Handle.h" 11 #include "platform/heap/Handle.h"
11 #include "public/platform/Platform.h" 12 #include "public/platform/Platform.h"
12 #include "public/platform/WebThread.h" 13 #include "public/platform/WebThread.h"
13 #include "public/platform/WebTraceLocation.h" 14 #include "public/platform/WebTraceLocation.h"
14 #include "public/platform/WebWaitableEvent.h" 15 #include "public/platform/WebWaitableEvent.h"
15 #include "wtf/Locker.h" 16 #include "wtf/Locker.h"
16 17
17 #include <gmock/gmock.h> 18 #include <gmock/gmock.h>
18 #include <gtest/gtest.h> 19 #include <gtest/gtest.h>
19 20
20 namespace blink { 21 namespace blink {
21 22
22 namespace { 23 namespace {
23 24
24 using Result = WebDataConsumerHandle::Result;
25 using Flags = WebDataConsumerHandle::Flags;
26 using ::testing::InSequence;
27 using ::testing::Return;
28 using ::testing::StrictMock;
29 using Checkpoint = StrictMock<::testing::MockFunction<void(int)>>;
30
31 const Result kShouldWait = WebDataConsumerHandle::ShouldWait;
32 const Result kDone = WebDataConsumerHandle::Done;
33 const Result kOk = WebDataConsumerHandle::Ok;
34 const Result kUnexpectedError = WebDataConsumerHandle::UnexpectedError;
35 const Flags kNone = WebDataConsumerHandle::FlagNone;
36
37 class NoopClient final : public WebDataConsumerHandle::Client {
38 public:
39 void didGetReadable() override { }
40 };
41
42 class MockReader : public WebDataConsumerHandle::Reader {
43 public:
44 static PassOwnPtr<StrictMock<MockReader>> create() { return adoptPtr(new Str ictMock<MockReader>); }
45
46 MOCK_METHOD4(read, Result(void*, size_t, Flags, size_t*));
47 MOCK_METHOD3(beginRead, Result(const void**, Flags, size_t*));
48 MOCK_METHOD1(endRead, Result(size_t));
49 };
50
51 class MockHandle : public WebDataConsumerHandle {
52 public:
53 static PassOwnPtr<StrictMock<MockHandle>> create() { return adoptPtr(new Str ictMock<MockHandle>); }
54
55 MOCK_METHOD1(obtainReaderInternal, Reader*(Client*));
56 };
57
58 class ThreadingTestBase : public ThreadSafeRefCounted<ThreadingTestBase> {
59 public:
60 class Context : public ThreadSafeRefCounted<Context> {
61 public:
62 static PassRefPtr<Context> create() { return adoptRef(new Context); }
63 void recordAttach(const String& handle)
64 {
65 MutexLocker locker(m_loggingMutex);
66 m_result.append("A reader is attached to " + handle + " on " + curre ntThreadName() + ".\n");
67 }
68 void recordDetach(const String& handle)
69 {
70 MutexLocker locker(m_loggingMutex);
71 m_result.append("A reader is detached from " + handle + " on " + cur rentThreadName() + ".\n");
72 }
73
74 const String& result()
75 {
76 MutexLocker locker(m_loggingMutex);
77 return m_result;
78 }
79 WebThread* readingThread() { return m_readingThread.get(); }
80 WebThread* updatingThread() { return m_updatingThread.get(); }
81
82 private:
83 Context()
84 : m_readingThread(adoptPtr(Platform::current()->createThread("readin g thread")))
85 , m_updatingThread(adoptPtr(Platform::current()->createThread("updat ing thread")))
86 {
87 }
88 String currentThreadName()
89 {
90 if (m_readingThread->isCurrentThread())
91 return "the reading thread";
92 if (m_updatingThread->isCurrentThread())
93 return "the updating thread";
94 return "an unknown thread";
95 }
96
97 OwnPtr<WebThread> m_readingThread;
98 OwnPtr<WebThread> m_updatingThread;
99 Mutex m_loggingMutex;
100 String m_result;
101 };
102
103 class ReaderImpl final : public WebDataConsumerHandle::Reader {
104 public:
105 ReaderImpl(const String& name, PassRefPtr<Context> context) : m_name(nam e.isolatedCopy()), m_context(context)
106 {
107 m_context->recordAttach(m_name.isolatedCopy());
108 }
109 ~ReaderImpl() override { m_context->recordDetach(m_name.isolatedCopy()); }
110 Result read(void*, size_t, Flags, size_t*) override { return kShouldWait ; }
111 Result beginRead(const void**, Flags, size_t*) override { return kShould Wait; }
112 Result endRead(size_t) override { return kUnexpectedError; }
113
114 private:
115 const String m_name;
116 RefPtr<Context> m_context;
117 };
118 class DataConsumerHandle final : public WebDataConsumerHandle {
119 public:
120 DataConsumerHandle(const String& name, PassRefPtr<Context> context) : m_ name(name.isolatedCopy()), m_context(context) { }
121
122 private:
123 Reader* obtainReaderInternal(Client*) { return new ReaderImpl(m_name, m_ context); }
124 const String m_name;
125 RefPtr<Context> m_context;
126 };
127
128 void resetReader() { m_reader = nullptr; }
129 void signalDone() { m_waitableEvent->signal(); }
130 const String& result() { return m_context->result(); }
131 WebThread* readingThread() { return m_context->readingThread(); }
132 WebThread* updatingThread() { return m_context->updatingThread(); }
133
134 protected:
135 RefPtr<Context> m_context;
136 OwnPtr<CompositeDataConsumerHandle> m_handle;
137 OwnPtr<WebDataConsumerHandle::Reader> m_reader;
138 OwnPtr<WebWaitableEvent> m_waitableEvent;
139 NoopClient m_client;
140 };
141
142 class ThreadingRegistrationTest : public ThreadingTestBase { 25 class ThreadingRegistrationTest : public ThreadingTestBase {
143 public: 26 public:
144 using Self = ThreadingRegistrationTest; 27 using Self = ThreadingRegistrationTest;
145 void run() 28 void run()
146 { 29 {
147 m_context = Context::create(); 30 m_context = Context::create();
148 m_waitableEvent = adoptPtr(Platform::current()->createWaitableEvent()); 31 m_waitableEvent = adoptPtr(Platform::current()->createWaitableEvent());
149 m_handle = CompositeDataConsumerHandle::create(adoptPtr(new DataConsumer Handle("handle1", m_context))); 32 m_handle = CompositeDataConsumerHandle::create(adoptPtr(new DataConsumer Handle("handle1", m_context)));
150 33
151 readingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::obta inReader, this))); 34 readingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::obta inReader, this)));
152 35
153 m_waitableEvent->wait(); 36 m_waitableEvent->wait();
154 } 37 }
155 38
156 private: 39 private:
157 void obtainReader() 40 void obtainReader()
158 { 41 {
159 m_reader = m_handle->obtainReader(&m_client); 42 m_reader = m_handle->obtainReader(&m_client);
160 updatingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::upd ate, this))); 43 updatingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::upd ate, this)));
161 } 44 }
162 void update() 45 void update()
163 { 46 {
164 m_handle->update(adoptPtr(new DataConsumerHandle("handle2", m_context))) ; 47 m_handle->update(adoptPtr(new DataConsumerHandle("handle2", m_context))) ;
165 readingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::rese tReader, this))); 48 readingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::rese tReader, this)));
166 readingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::sign alDone, this))); 49 readingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::sign alDone, this)));
167 } 50 }
51
52 OwnPtr<CompositeDataConsumerHandle> m_handle;
168 }; 53 };
169 54
170 class ThreadingRegistrationDeleteHandleTest : public ThreadingTestBase { 55 class ThreadingRegistrationDeleteHandleTest : public ThreadingTestBase {
171 public: 56 public:
172 using Self = ThreadingRegistrationDeleteHandleTest; 57 using Self = ThreadingRegistrationDeleteHandleTest;
173 void run() 58 void run()
174 { 59 {
175 m_context = Context::create(); 60 m_context = Context::create();
176 m_waitableEvent = adoptPtr(Platform::current()->createWaitableEvent()); 61 m_waitableEvent = adoptPtr(Platform::current()->createWaitableEvent());
177 m_handle = CompositeDataConsumerHandle::create(adoptPtr(new DataConsumer Handle("handle1", m_context))); 62 m_handle = CompositeDataConsumerHandle::create(adoptPtr(new DataConsumer Handle("handle1", m_context)));
178 63
179 readingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::obta inReader, this))); 64 readingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::obta inReader, this)));
180 65
181 m_waitableEvent->wait(); 66 m_waitableEvent->wait();
182 } 67 }
183 68
184 private: 69 private:
185 void obtainReader() 70 void obtainReader()
186 { 71 {
187 m_reader = m_handle->obtainReader(&m_client); 72 m_reader = m_handle->obtainReader(&m_client);
188 updatingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::upd ate, this))); 73 updatingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::upd ate, this)));
189 } 74 }
190 void update() 75 void update()
191 { 76 {
192 m_handle->update(adoptPtr(new DataConsumerHandle("handle2", m_context))) ; 77 m_handle->update(adoptPtr(new DataConsumerHandle("handle2", m_context))) ;
193 m_handle = nullptr; 78 m_handle = nullptr;
194 readingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::rese tReader, this))); 79 readingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::rese tReader, this)));
195 readingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::sign alDone, this))); 80 readingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::sign alDone, this)));
196 } 81 }
82
83 OwnPtr<CompositeDataConsumerHandle> m_handle;
197 }; 84 };
198 85
199 class ThreadingRegistrationDeleteReaderTest : public ThreadingTestBase { 86 class ThreadingRegistrationDeleteReaderTest : public ThreadingTestBase {
200 public: 87 public:
201 using Self = ThreadingRegistrationDeleteReaderTest; 88 using Self = ThreadingRegistrationDeleteReaderTest;
202 void run() 89 void run()
203 { 90 {
204 m_context = Context::create(); 91 m_context = Context::create();
205 m_waitableEvent = adoptPtr(Platform::current()->createWaitableEvent()); 92 m_waitableEvent = adoptPtr(Platform::current()->createWaitableEvent());
206 m_handle = CompositeDataConsumerHandle::create(adoptPtr(new DataConsumer Handle("handle1", m_context))); 93 m_handle = CompositeDataConsumerHandle::create(adoptPtr(new DataConsumer Handle("handle1", m_context)));
207 94
208 readingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::obta inReader, this))); 95 readingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::obta inReader, this)));
209 96
210 m_waitableEvent->wait(); 97 m_waitableEvent->wait();
211 } 98 }
212 99
213 private: 100 private:
214 void obtainReader() 101 void obtainReader()
215 { 102 {
216 m_reader = m_handle->obtainReader(&m_client); 103 m_reader = m_handle->obtainReader(&m_client);
217 updatingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::upd ate, this))); 104 updatingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::upd ate, this)));
218 } 105 }
219 void update() 106 void update()
220 { 107 {
221 readingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::rese tReader, this))); 108 readingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::rese tReader, this)));
222 m_handle->update(adoptPtr(new DataConsumerHandle("handle2", m_context))) ; 109 m_handle->update(adoptPtr(new DataConsumerHandle("handle2", m_context))) ;
223 readingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::rese tReader, this))); 110 readingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::rese tReader, this)));
224 readingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::sign alDone, this))); 111 readingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::sign alDone, this)));
225 } 112 }
113
114 OwnPtr<CompositeDataConsumerHandle> m_handle;
226 }; 115 };
227 116
228 class ThreadingUpdatingReaderWhileUpdatingTest : public ThreadingTestBase { 117 class ThreadingUpdatingReaderWhileUpdatingTest : public ThreadingTestBase {
229 public: 118 public:
230 using Self = ThreadingUpdatingReaderWhileUpdatingTest; 119 using Self = ThreadingUpdatingReaderWhileUpdatingTest;
231 void run() 120 void run()
232 { 121 {
233 m_context = Context::create(); 122 m_context = Context::create();
234 m_waitableEvent = adoptPtr(Platform::current()->createWaitableEvent()); 123 m_waitableEvent = adoptPtr(Platform::current()->createWaitableEvent());
235 m_updateEvent = adoptPtr(Platform::current()->createWaitableEvent()); 124 m_updateEvent = adoptPtr(Platform::current()->createWaitableEvent());
(...skipping 20 matching lines...) Expand all
256 readingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::sign alDone, this))); 145 readingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::sign alDone, this)));
257 m_updateEvent->signal(); 146 m_updateEvent->signal();
258 } 147 }
259 148
260 void reobtainReader() 149 void reobtainReader()
261 { 150 {
262 m_reader = nullptr; 151 m_reader = nullptr;
263 m_reader = m_handle->obtainReader(&m_client); 152 m_reader = m_handle->obtainReader(&m_client);
264 } 153 }
265 154
155 OwnPtr<CompositeDataConsumerHandle> m_handle;
266 OwnPtr<WebWaitableEvent> m_updateEvent; 156 OwnPtr<WebWaitableEvent> m_updateEvent;
267 }; 157 };
268 158
269 class ThreadingRegistrationUpdateTwiceAtOneTimeTest : public ThreadingTestBase { 159 class ThreadingRegistrationUpdateTwiceAtOneTimeTest : public ThreadingTestBase {
270 public: 160 public:
271 using Self = ThreadingRegistrationUpdateTwiceAtOneTimeTest; 161 using Self = ThreadingRegistrationUpdateTwiceAtOneTimeTest;
272 void run() 162 void run()
273 { 163 {
274 m_context = Context::create(); 164 m_context = Context::create();
275 m_waitableEvent = adoptPtr(Platform::current()->createWaitableEvent()); 165 m_waitableEvent = adoptPtr(Platform::current()->createWaitableEvent());
(...skipping 10 matching lines...) Expand all
286 m_reader = m_handle->obtainReader(&m_client); 176 m_reader = m_handle->obtainReader(&m_client);
287 updatingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::upd ate, this))); 177 updatingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::upd ate, this)));
288 } 178 }
289 void update() 179 void update()
290 { 180 {
291 m_handle->update(adoptPtr(new DataConsumerHandle("handle2", m_context))) ; 181 m_handle->update(adoptPtr(new DataConsumerHandle("handle2", m_context))) ;
292 m_handle->update(adoptPtr(new DataConsumerHandle("handle3", m_context))) ; 182 m_handle->update(adoptPtr(new DataConsumerHandle("handle3", m_context))) ;
293 readingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::rese tReader, this))); 183 readingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::rese tReader, this)));
294 readingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::sign alDone, this))); 184 readingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::sign alDone, this)));
295 } 185 }
186
187 OwnPtr<CompositeDataConsumerHandle> m_handle;
296 }; 188 };
297 189
298 class ThreadingDoneHandleNotificationTest : public ThreadingTestBase, public Web DataConsumerHandle::Client {
299 public:
300 using Self = ThreadingDoneHandleNotificationTest;
301 void run()
302 {
303 m_context = Context::create();
304 m_waitableEvent = adoptPtr(Platform::current()->createWaitableEvent());
305 m_handle = CompositeDataConsumerHandle::create(CompositeDataConsumerHand le::createDoneHandle());
306
307 readingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::obta inReader, this)));
308
309 m_waitableEvent->wait();
310 }
311
312 private:
313 void obtainReader()
314 {
315 m_reader = m_handle->obtainReader(this);
316 }
317 void didGetReadable() override
318 {
319 readingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::rese tReader, this)));
320 readingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::sign alDone, this)));
321 }
322 };
323
324 class ThreadingDoneHandleNoNotificationTest : public ThreadingTestBase, public W ebDataConsumerHandle::Client {
325 public:
326 using Self = ThreadingDoneHandleNoNotificationTest;
327 void run()
328 {
329 m_context = Context::create();
330 m_waitableEvent = adoptPtr(Platform::current()->createWaitableEvent());
331 m_handle = CompositeDataConsumerHandle::create(CompositeDataConsumerHand le::createDoneHandle());
332
333 readingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::obta inReader, this)));
334
335 m_waitableEvent->wait();
336 }
337
338 private:
339 void obtainReader()
340 {
341 m_reader = m_handle->obtainReader(this);
342 m_reader = nullptr;
343 readingThread()->postTask(FROM_HERE, new Task(threadSafeBind(&Self::sign alDone, this)));
344 }
345 void didGetReadable() override
346 {
347 ASSERT_NOT_REACHED();
348 }
349 };
350
351 TEST(CompositeDataConsumerHandleTest, CreateWaitingHandle)
352 {
353 char buffer[20];
354 const void* p = nullptr;
355 size_t size = 0;
356 OwnPtr<WebDataConsumerHandle> handle = CompositeDataConsumerHandle::createWa itingHandle();
357 OwnPtr<WebDataConsumerHandle::Reader> reader = handle->obtainReader(nullptr) ;
358
359 EXPECT_EQ(kShouldWait, reader->read(buffer, sizeof(buffer), kNone, &size));
360 EXPECT_EQ(kShouldWait, reader->beginRead(&p, kNone, &size));
361 EXPECT_EQ(kUnexpectedError, reader->endRead(99));
362 }
363
364 TEST(CompositeDataConsumerHandleTest, CreateDoneHandle)
365 {
366 char buffer[20];
367 const void* p = nullptr;
368 size_t size = 0;
369 OwnPtr<WebDataConsumerHandle> handle = CompositeDataConsumerHandle::createDo neHandle();
370 OwnPtr<WebDataConsumerHandle::Reader> reader = handle->obtainReader(nullptr) ;
371
372 EXPECT_EQ(kDone, reader->read(buffer, sizeof(buffer), kNone, &size));
373 EXPECT_EQ(kDone, reader->beginRead(&p, kNone, &size));
374 EXPECT_EQ(kUnexpectedError, reader->endRead(99));
375 }
376
377 TEST(CompositeDataConsumerHandleTest, Read) 190 TEST(CompositeDataConsumerHandleTest, Read)
378 { 191 {
379 char buffer[20]; 192 char buffer[20];
380 size_t size = 0; 193 size_t size = 0;
381 NoopClient client; 194 NoopClient client;
382 Checkpoint checkpoint; 195 Checkpoint checkpoint;
383 196
384 OwnPtr<MockHandle> handle1 = MockHandle::create(); 197 OwnPtr<MockHandle> handle1 = MockHandle::create();
385 OwnPtr<MockHandle> handle2 = MockHandle::create(); 198 OwnPtr<MockHandle> handle2 = MockHandle::create();
386 OwnPtr<MockReader> reader1 = MockReader::create(); 199 OwnPtr<MockReader> reader1 = MockReader::create();
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
574 EXPECT_EQ( 387 EXPECT_EQ(
575 "A reader is attached to handle1 on the reading thread.\n" 388 "A reader is attached to handle1 on the reading thread.\n"
576 "A reader is detached from handle1 on the reading thread.\n" 389 "A reader is detached from handle1 on the reading thread.\n"
577 "A reader is attached to handle3 on the reading thread.\n" 390 "A reader is attached to handle3 on the reading thread.\n"
578 "A reader is detached from handle3 on the reading thread.\n", 391 "A reader is detached from handle3 on the reading thread.\n",
579 test.result()); 392 test.result());
580 } 393 }
581 394
582 TEST(CompositeDataConsumerHandleTest, DoneHandleNotification) 395 TEST(CompositeDataConsumerHandleTest, DoneHandleNotification)
583 { 396 {
584 ThreadingDoneHandleNotificationTest test; 397 ThreadingHandleNotificationTest test;
585 // Test this function returns. 398 // Test this function returns.
586 test.run(); 399 test.run(CompositeDataConsumerHandle::create(createDoneHandle()));
587 } 400 }
588 401
589 TEST(CompositeDataConsumerHandleTest, DoneHandleNoNotification) 402 TEST(CompositeDataConsumerHandleTest, DoneHandleNoNotification)
590 { 403 {
591 ThreadingDoneHandleNoNotificationTest test; 404 ThreadingHandleNoNotificationTest test;
592 // Test this function doesn't crash. 405 // Test this function doesn't crash.
593 test.run(); 406 test.run(CompositeDataConsumerHandle::create(createDoneHandle()));
594 } 407 }
595 408
596 } // namespace 409 } // namespace
597 410
598 } // namespace blink 411 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698