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

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

Issue 2342023002: Introduce FormDataBytesConsumer (Closed)
Patch Set: fix Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "modules/fetch/FormDataBytesConsumer.h"
6
7 #include "core/dom/DOMArrayBuffer.h"
8 #include "core/dom/DOMTypedArray.h"
9 #include "core/dom/Document.h"
10 #include "core/html/FormData.h"
11 #include "core/testing/DummyPageHolder.h"
12 #include "modules/fetch/BytesConsumerTestUtil.h"
13 #include "platform/blob/BlobData.h"
14 #include "platform/network/EncodedFormData.h"
15 #include "testing/gtest/include/gtest/gtest.h"
16 #include "wtf/RefPtr.h"
17 #include "wtf/Vector.h"
18 #include "wtf/text/WTFString.h"
19
20 namespace blink {
21 namespace {
22
23 using Result = BytesConsumer::Result;
24
25 String toString(const Vector<char>& v)
26 {
27 return String(v.data(), v.size());
28 }
29
30 PassRefPtr<EncodedFormData> complexFormData()
31 {
32 RefPtr<EncodedFormData> data = EncodedFormData::create();
33
34 data->appendData("foo", 3);
35 data->appendFileRange("/foo/bar/baz", 3, 4, 5);
36 data->appendFileSystemURLRange(KURL(KURL(), "file:///foo/bar/baz"), 6, 7, 8) ;
37 std::unique_ptr<BlobData> blobData = BlobData::create();
38 blobData->appendText("hello", false);
39 auto size = blobData->length();
40 RefPtr<BlobDataHandle> blobDataHandle = BlobDataHandle::create(std::move(blo bData), size);
41 data->appendBlob(blobDataHandle->uuid(), blobDataHandle);
42 Vector<char> boundary;
43 boundary.append("\0", 1);
44 data->setBoundary(boundary);
45 return data.release();
46 }
47
48 class NoopClient final : public GarbageCollectedFinalized<NoopClient>, public By tesConsumer::Client {
49 USING_GARBAGE_COLLECTED_MIXIN(NoopClient);
50 public:
51 void onStateChange() override {}
52 };
53
54 class StubBytesConsumer final : public BytesConsumer {
hiroshige 2016/09/15 09:47:33 optional: How about creating a class with gmock an
yhirano 2016/09/16 03:10:32 Done.
55 public:
56 // BytesConsumer implementation
57 Result beginRead(const char** buffer, size_t* available) override
58 {
59 ++m_numBeginReadCalled;
60 *buffer = nullptr;
61 *available = 0;
62 return Result::Ok;
63 }
64 Result endRead(size_t readSize) override
65 {
66 ++m_numEndReadCalled;
67 return Result::Ok;
68 }
69 void setClient(BytesConsumer::Client* client) override
70 {
71 ++m_numSetClientCalled;
72 }
73 void clearClient() override
74 {
75 ++m_numClearClientCalled;
76 }
77 void cancel() override
78 {
79 m_isCancelled = true;
80 }
81 PublicState getPublicState() const override
82 {
83 return PublicState::ReadableOrWaiting;
84 }
85 Error getError() const override
86 {
87 NOTREACHED();
88 return Error();
89 }
90 String debugName() const override
91 {
92 return "StubBytesConsumer";
93 }
94
95 int numBeginReadCalled() const { return m_numBeginReadCalled; }
96 int numEndReadCalled() const { return m_numEndReadCalled; }
97 int numSetClientCalled() const { return m_numSetClientCalled; }
98 int numClearClientCalled() const { return m_numClearClientCalled; }
99 bool isCancelled() const { return m_isCancelled; }
100
101 private:
102 int m_numBeginReadCalled = 0;
103 int m_numEndReadCalled = 0;
104 int m_numSetClientCalled = 0;
105 int m_numClearClientCalled = 0;
106 bool m_isCancelled = false;
107 };
108
109 class FormDataBytesConsumerTest : public ::testing::Test {
110 public:
111 FormDataBytesConsumerTest() : m_page(DummyPageHolder::create()) {}
112
113 protected:
114 Document* getDocument() { return &m_page->document(); }
115
116 std::unique_ptr<DummyPageHolder> m_page;
117 };
118
119 TEST_F(FormDataBytesConsumerTest, ReadFromString)
120 {
121 auto result = (new BytesConsumerTestUtil::Reader(new FormDataBytesConsumer(" hello, world")))->run();
122 EXPECT_EQ(Result::Done, result.first);
123 EXPECT_EQ("hello, world", toString(result.second));
124 }
125
126 TEST_F(FormDataBytesConsumerTest, TwoPhaseReadFromString)
127 {
128 auto result = (new BytesConsumerTestUtil::TwoPhaseReader(new FormDataBytesCo nsumer("hello, world")))->run();
129 EXPECT_EQ(Result::Done, result.first);
130 EXPECT_EQ("hello, world", toString(result.second));
131 }
132
133 TEST_F(FormDataBytesConsumerTest, ReadFromStringNonLatin)
134 {
135 constexpr UChar cs[] = {0x3042, 0};
136 auto result = (new BytesConsumerTestUtil::Reader(new FormDataBytesConsumer(S tring(cs))))->run();
137 EXPECT_EQ(Result::Done, result.first);
138 EXPECT_EQ("\xe3\x81\x82", toString(result.second));
139 }
140
141 TEST_F(FormDataBytesConsumerTest, ReadFromArrayBuffer)
142 {
143 constexpr unsigned char data[] = { 0x21, 0xfe, 0x00, 0x00, 0xff, 0xa3, 0x42, 0x30, 0x42, 0x99, 0x88 };
144 DOMArrayBuffer* buffer = DOMArrayBuffer::create(data, WTF_ARRAY_LENGTH(data) );
145 auto result = (new BytesConsumerTestUtil::Reader(new FormDataBytesConsumer(b uffer)))->run();
146 Vector<char> expected;
147 expected.append(data, WTF_ARRAY_LENGTH(data));
148
149 EXPECT_EQ(Result::Done, result.first);
150 EXPECT_EQ(expected, result.second);
151 }
152
153 TEST_F(FormDataBytesConsumerTest, ReadFromArrayBufferView)
154 {
155 constexpr unsigned char data[] = { 0x21, 0xfe, 0x00, 0x00, 0xff, 0xa3, 0x42, 0x30, 0x42, 0x99, 0x88 };
156 constexpr size_t offset = 1, size = 4;
157 DOMArrayBuffer* buffer = DOMArrayBuffer::create(data, WTF_ARRAY_LENGTH(data) );
158 auto result = (new BytesConsumerTestUtil::Reader(new FormDataBytesConsumer(D OMUint8Array::create(buffer, offset, size))))->run();
159 Vector<char> expected;
160 expected.append(data + offset, size);
161
162 EXPECT_EQ(Result::Done, result.first);
163 EXPECT_EQ(expected, result.second);
164 }
165
166 TEST_F(FormDataBytesConsumerTest, ReadFromSimplFormData)
hiroshige 2016/09/15 09:47:33 nit: s/Simpl/Simple/
yhirano 2016/09/16 03:10:32 Done.
167 {
168 RefPtr<EncodedFormData> data = EncodedFormData::create();
169 data->appendData("foo", 3);
170 data->appendData("hoge", 4);
171
172 auto result = (new BytesConsumerTestUtil::Reader(new FormDataBytesConsumer(g etDocument(), data)))->run();
173 EXPECT_EQ(Result::Done, result.first);
174 EXPECT_EQ("foohoge", toString(result.second));
175 }
176
177 TEST_F(FormDataBytesConsumerTest, ReadFromComplexFormData)
178 {
179 RefPtr<EncodedFormData> data = complexFormData();
180 StubBytesConsumer* underlying = new StubBytesConsumer();
181 BytesConsumer* consumer = FormDataBytesConsumer::createForTesting(getDocumen t(), data, underlying);
182
183 char c;
184 size_t read = 0;
185 EXPECT_EQ(Result::Ok, consumer->read(&c, 1, &read));
186 EXPECT_EQ(1, underlying->numBeginReadCalled());
187 EXPECT_EQ(1, underlying->numEndReadCalled());
188 EXPECT_FALSE(underlying->isCancelled());
189 EXPECT_EQ(0, underlying->numSetClientCalled());
190 }
191
192 TEST_F(FormDataBytesConsumerTest, TwoPhaseReadFromComplexFormData)
193 {
194 RefPtr<EncodedFormData> data = complexFormData();
195 StubBytesConsumer* underlying = new StubBytesConsumer();
196 BytesConsumer* consumer = FormDataBytesConsumer::createForTesting(getDocumen t(), data, underlying);
197
198 const char* buffer = nullptr;
199 size_t available = 0;
200 ASSERT_EQ(Result::Ok, consumer->beginRead(&buffer, &available));
201 EXPECT_EQ(1, underlying->numBeginReadCalled());
202 EXPECT_EQ(0, underlying->numEndReadCalled());
203
204 EXPECT_EQ(Result::Ok, consumer->endRead(0));
205 EXPECT_EQ(1, underlying->numBeginReadCalled());
206 EXPECT_EQ(1, underlying->numEndReadCalled());
207 EXPECT_FALSE(underlying->isCancelled());
208 EXPECT_EQ(0, underlying->numSetClientCalled());
209 }
210
211 TEST_F(FormDataBytesConsumerTest, DrainAsBlobDataHandleFromString)
212 {
213 BytesConsumer* consumer = new FormDataBytesConsumer("hello, world");
214 RefPtr<BlobDataHandle> blobDataHandle = consumer->drainAsBlobDataHandle();
215 ASSERT_TRUE(blobDataHandle);
216
217 EXPECT_EQ(String(), blobDataHandle->type());
218 EXPECT_EQ(12u, blobDataHandle->size());
219 EXPECT_FALSE(consumer->drainAsFormData());
220 char c;
221 size_t readSize;
222 EXPECT_EQ(Result::Done, consumer->read(&c, 1, &readSize));
hiroshige 2016/09/15 09:47:33 Could you also test getPublicState()?
yhirano 2016/09/16 03:10:32 Done.
223 }
224
225 TEST_F(FormDataBytesConsumerTest, DrainAsBlobDataHandleFromArrayBuffer)
226 {
227 BytesConsumer* consumer = new FormDataBytesConsumer(DOMArrayBuffer::create(" foo", 3));
228 RefPtr<BlobDataHandle> blobDataHandle = consumer->drainAsBlobDataHandle();
229 ASSERT_TRUE(blobDataHandle);
230
231 EXPECT_EQ(String(), blobDataHandle->type());
232 EXPECT_EQ(3u, blobDataHandle->size());
233 EXPECT_FALSE(consumer->drainAsFormData());
234 char c;
235 size_t readSize;
236 EXPECT_EQ(Result::Done, consumer->read(&c, 1, &readSize));
hiroshige 2016/09/15 09:47:33 ditto.
yhirano 2016/09/16 03:10:32 Done.
237 }
238
239 TEST_F(FormDataBytesConsumerTest, DrainAsBlobDataHandleFromSimpleFormData)
240 {
241 FormData* data = FormData::create(UTF8Encoding());
242 data->append("name1", "value1");
243 data->append("name2", "value2");
244 RefPtr<EncodedFormData> inputFormData = data->encodeMultiPartFormData();
245
246 BytesConsumer* consumer = new FormDataBytesConsumer(getDocument(), inputForm Data);
247 RefPtr<BlobDataHandle> blobDataHandle = consumer->drainAsBlobDataHandle();
248 ASSERT_TRUE(blobDataHandle);
249
250 EXPECT_EQ(String(), blobDataHandle->type());
251 EXPECT_EQ(inputFormData->flattenToString().utf8().length(), blobDataHandle-> size());
252 EXPECT_FALSE(consumer->drainAsFormData());
253 char c;
254 size_t readSize;
255 EXPECT_EQ(Result::Done, consumer->read(&c, 1, &readSize));
hiroshige 2016/09/15 09:47:33 ditto.
yhirano 2016/09/16 03:10:32 Done.
256 }
257
258 TEST_F(FormDataBytesConsumerTest, DrainAsBlobDataHandleFromComplexFormData)
259 {
260 RefPtr<EncodedFormData> inputFormData = complexFormData();
261
262 BytesConsumer* consumer = new FormDataBytesConsumer(getDocument(), inputForm Data);
263 RefPtr<BlobDataHandle> blobDataHandle = consumer->drainAsBlobDataHandle();
264 ASSERT_TRUE(blobDataHandle);
265
266 EXPECT_FALSE(consumer->drainAsFormData());
267 char c;
268 size_t readSize;
269 EXPECT_EQ(Result::Done, consumer->read(&c, 1, &readSize));
hiroshige 2016/09/15 09:47:33 ditto.
yhirano 2016/09/16 03:10:32 Done.
270 }
271
272 TEST_F(FormDataBytesConsumerTest, DrainAsFormDataFromString)
273 {
274 BytesConsumer* consumer = new FormDataBytesConsumer("hello, world");
275 RefPtr<EncodedFormData> formData = consumer->drainAsFormData();
276 ASSERT_TRUE(formData);
277 EXPECT_EQ("hello, world", formData->flattenToString());
278
279 EXPECT_FALSE(consumer->drainAsBlobDataHandle());
280 const char* buffer = nullptr;
281 size_t size;
282 EXPECT_EQ(Result::Done, consumer->read(nullptr, 0, &size));
283 EXPECT_EQ(Result::Done, consumer->beginRead(&buffer, &size));
hiroshige 2016/09/15 09:47:33 ditto.
yhirano 2016/09/16 03:10:32 Done.
284 }
285
286 TEST_F(FormDataBytesConsumerTest, DrainAsFormDataFromArrayBuffer)
287 {
288 BytesConsumer* consumer = new FormDataBytesConsumer(DOMArrayBuffer::create(" foo", 3));
289 RefPtr<EncodedFormData> formData = consumer->drainAsFormData();
290 ASSERT_TRUE(formData);
291 EXPECT_TRUE(formData->isSafeToSendToAnotherThread());
292 EXPECT_EQ("foo", formData->flattenToString());
293
294 EXPECT_FALSE(consumer->drainAsBlobDataHandle());
295 const char* buffer = nullptr;
296 size_t size;
297 EXPECT_EQ(Result::Done, consumer->read(nullptr, 0, &size));
298 EXPECT_EQ(Result::Done, consumer->beginRead(&buffer, &size));
hiroshige 2016/09/15 09:47:33 ditto.
yhirano 2016/09/16 03:10:32 Done.
299 }
300
301 TEST_F(FormDataBytesConsumerTest, DrainAsFormDataFromSimpleFormData)
302 {
303 FormData* data = FormData::create(UTF8Encoding());
304 data->append("name1", "value1");
305 data->append("name2", "value2");
306 RefPtr<EncodedFormData> inputFormData = data->encodeMultiPartFormData();
307
308 BytesConsumer* consumer = new FormDataBytesConsumer(getDocument(), inputForm Data);
309 EXPECT_EQ(inputFormData, consumer->drainAsFormData());
310 EXPECT_FALSE(consumer->drainAsBlobDataHandle());
311 const char* buffer = nullptr;
312 size_t size;
313 EXPECT_EQ(Result::Done, consumer->read(nullptr, 0, &size));
314 EXPECT_EQ(Result::Done, consumer->beginRead(&buffer, &size));
hiroshige 2016/09/15 09:47:33 ditto.
yhirano 2016/09/16 03:10:32 Done.
315 }
316
317 TEST_F(FormDataBytesConsumerTest, DrainAsFormDataFromComplexFormData)
318 {
319 RefPtr<EncodedFormData> inputFormData = complexFormData();
320
321 BytesConsumer* consumer = new FormDataBytesConsumer(getDocument(), inputForm Data);
322 EXPECT_EQ(inputFormData, consumer->drainAsFormData());
323 EXPECT_FALSE(consumer->drainAsBlobDataHandle());
324 const char* buffer = nullptr;
325 size_t size;
326 EXPECT_EQ(Result::Done, consumer->read(nullptr, 0, &size));
327 EXPECT_EQ(Result::Done, consumer->beginRead(&buffer, &size));
hiroshige 2016/09/15 09:47:33 ditto.
yhirano 2016/09/16 03:10:32 Done.
328 }
329
330 TEST_F(FormDataBytesConsumerTest, ReadAffectsDraining)
331 {
332 char c;
333 size_t readSize = 0;
334 BytesConsumer* consumer = new FormDataBytesConsumer("hello, world");
335 EXPECT_EQ(Result::Ok, consumer->read(&c, 0, &readSize));
336 EXPECT_EQ(0u, readSize);
337 EXPECT_FALSE(consumer->drainAsFormData());
hiroshige 2016/09/15 09:47:33 Could you also test drainAsBlobDataHandle()?
yhirano 2016/09/16 03:10:32 Done.
338 }
339
340 TEST_F(FormDataBytesConsumerTest, BeginReadAffectsDraining)
341 {
342 const char* buffer = nullptr;
343 size_t available = 0;
344 BytesConsumer* consumer = new FormDataBytesConsumer("hello, world");
345 ASSERT_EQ(Result::Ok, consumer->beginRead(&buffer, &available));
346 EXPECT_EQ("hello, world", String(buffer, available));
347
348 ASSERT_EQ(Result::Ok, consumer->endRead(0));
349 EXPECT_FALSE(consumer->drainAsFormData());
hiroshige 2016/09/15 09:47:33 ditto.
yhirano 2016/09/16 03:10:32 Done.
350 }
351
hiroshige 2016/09/15 09:47:33 Could you also test ReadAffectsDraining/BeginReadA
yhirano 2016/09/16 03:10:32 Done.
352 TEST_F(FormDataBytesConsumerTest, SetClientWithComplexFormData)
353 {
354 RefPtr<EncodedFormData> inputFormData = complexFormData();
355
356 StubBytesConsumer* underlying = new StubBytesConsumer();
357 BytesConsumer* consumer = FormDataBytesConsumer::createForTesting(getDocumen t(), inputFormData, underlying);
358
359 EXPECT_EQ(0, underlying->numSetClientCalled());
360 EXPECT_EQ(0, underlying->numClearClientCalled());
361
362 consumer->setClient(new NoopClient());
363
364 EXPECT_EQ(1, underlying->numSetClientCalled());
365 EXPECT_EQ(0, underlying->numClearClientCalled());
366
367 consumer->clearClient();
368
369 EXPECT_EQ(1, underlying->numSetClientCalled());
370 EXPECT_EQ(1, underlying->numClearClientCalled());
371 }
372
373 } // namespace
374 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698