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

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
« no previous file with comments | « third_party/WebKit/Source/modules/fetch/FormDataBytesConsumer.cpp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/gmock/include/gmock/gmock.h"
16 #include "testing/gtest/include/gtest/gtest.h"
17 #include "wtf/RefPtr.h"
18 #include "wtf/Vector.h"
19 #include "wtf/text/WTFString.h"
20
21 namespace blink {
22 namespace {
23
24 using Result = BytesConsumer::Result;
25 using ::testing::_;
26 using ::testing::DoAll;
27 using ::testing::InSequence;
28 using ::testing::Return;
29 using Checkpoint = ::testing::StrictMock<::testing::MockFunction<void(int)>>;
30
31 String toString(const Vector<char>& v)
32 {
33 return String(v.data(), v.size());
34 }
35
36 PassRefPtr<EncodedFormData> complexFormData()
37 {
38 RefPtr<EncodedFormData> data = EncodedFormData::create();
39
40 data->appendData("foo", 3);
41 data->appendFileRange("/foo/bar/baz", 3, 4, 5);
42 data->appendFileSystemURLRange(KURL(KURL(), "file:///foo/bar/baz"), 6, 7, 8) ;
43 std::unique_ptr<BlobData> blobData = BlobData::create();
44 blobData->appendText("hello", false);
45 auto size = blobData->length();
46 RefPtr<BlobDataHandle> blobDataHandle = BlobDataHandle::create(std::move(blo bData), size);
47 data->appendBlob(blobDataHandle->uuid(), blobDataHandle);
48 Vector<char> boundary;
49 boundary.append("\0", 1);
50 data->setBoundary(boundary);
51 return data.release();
52 }
53
54 class NoopClient final : public GarbageCollectedFinalized<NoopClient>, public By tesConsumer::Client {
55 USING_GARBAGE_COLLECTED_MIXIN(NoopClient);
56 public:
57 void onStateChange() override {}
58 };
59
60 class MockBytesConsumer : public BytesConsumer {
61 public:
62 static MockBytesConsumer* create() { return new ::testing::StrictMock<MockBy tesConsumer>(); }
63
64 MOCK_METHOD2(beginRead, Result(const char**, size_t*));
65 MOCK_METHOD1(endRead, Result(size_t));
66 MOCK_METHOD1(setClient, void(Client*));
67 MOCK_METHOD0(clearClient, void());
68 MOCK_METHOD0(cancel, void());
69 MOCK_CONST_METHOD0(getPublicState, PublicState());
70 MOCK_CONST_METHOD0(getError, Error());
71
72 String debugName() const override { return "MockBytesConsumer"; }
73
74 protected:
75 MockBytesConsumer() = default;
76 };
77
78 class FormDataBytesConsumerTest : public ::testing::Test {
79 public:
80 FormDataBytesConsumerTest() : m_page(DummyPageHolder::create()) {}
81
82 protected:
83 Document* getDocument() { return &m_page->document(); }
84
85 std::unique_ptr<DummyPageHolder> m_page;
86 };
87
88 TEST_F(FormDataBytesConsumerTest, TwoPhaseReadFromString)
89 {
90 auto result = (new BytesConsumerTestUtil::TwoPhaseReader(new FormDataBytesCo nsumer("hello, world")))->run();
91 EXPECT_EQ(Result::Done, result.first);
92 EXPECT_EQ("hello, world", toString(result.second));
93 }
94
95 TEST_F(FormDataBytesConsumerTest, TwoPhaseReadFromStringNonLatin)
96 {
97 constexpr UChar cs[] = {0x3042, 0};
98 auto result = (new BytesConsumerTestUtil::TwoPhaseReader(new FormDataBytesCo nsumer(String(cs))))->run();
99 EXPECT_EQ(Result::Done, result.first);
100 EXPECT_EQ("\xe3\x81\x82", toString(result.second));
101 }
102
103 TEST_F(FormDataBytesConsumerTest, TwoPhaseReadFromArrayBuffer)
104 {
105 constexpr unsigned char data[] = { 0x21, 0xfe, 0x00, 0x00, 0xff, 0xa3, 0x42, 0x30, 0x42, 0x99, 0x88 };
106 DOMArrayBuffer* buffer = DOMArrayBuffer::create(data, WTF_ARRAY_LENGTH(data) );
107 auto result = (new BytesConsumerTestUtil::TwoPhaseReader(new FormDataBytesCo nsumer(buffer)))->run();
108 Vector<char> expected;
109 expected.append(data, WTF_ARRAY_LENGTH(data));
110
111 EXPECT_EQ(Result::Done, result.first);
112 EXPECT_EQ(expected, result.second);
113 }
114
115 TEST_F(FormDataBytesConsumerTest, TwoPhaseReadFromArrayBufferView)
116 {
117 constexpr unsigned char data[] = { 0x21, 0xfe, 0x00, 0x00, 0xff, 0xa3, 0x42, 0x30, 0x42, 0x99, 0x88 };
118 constexpr size_t offset = 1, size = 4;
119 DOMArrayBuffer* buffer = DOMArrayBuffer::create(data, WTF_ARRAY_LENGTH(data) );
120 auto result = (new BytesConsumerTestUtil::TwoPhaseReader(new FormDataBytesCo nsumer(DOMUint8Array::create(buffer, offset, size))))->run();
121 Vector<char> expected;
122 expected.append(data + offset, size);
123
124 EXPECT_EQ(Result::Done, result.first);
125 EXPECT_EQ(expected, result.second);
126 }
127
128 TEST_F(FormDataBytesConsumerTest, TwoPhaseReadFromSimpleFormData)
129 {
130 RefPtr<EncodedFormData> data = EncodedFormData::create();
131 data->appendData("foo", 3);
132 data->appendData("hoge", 4);
133
134 auto result = (new BytesConsumerTestUtil::TwoPhaseReader(new FormDataBytesCo nsumer(getDocument(), data)))->run();
135 EXPECT_EQ(Result::Done, result.first);
136 EXPECT_EQ("foohoge", toString(result.second));
137 }
138
139 TEST_F(FormDataBytesConsumerTest, TwoPhaseReadFromComplexFormData)
140 {
141 RefPtr<EncodedFormData> data = complexFormData();
142 MockBytesConsumer* underlying = MockBytesConsumer::create();
143 BytesConsumer* consumer = FormDataBytesConsumer::createForTesting(getDocumen t(), data, underlying);
144 Checkpoint checkpoint;
145
146 const char* buffer = nullptr;
147 size_t available = 0;
148
149 InSequence s;
150 EXPECT_CALL(checkpoint, Call(1));
151 EXPECT_CALL(*underlying, beginRead(&buffer, &available)).WillOnce(Return(Res ult::Ok));
152 EXPECT_CALL(checkpoint, Call(2));
153 EXPECT_CALL(*underlying, endRead(0)).WillOnce(Return(Result::Ok));
154 EXPECT_CALL(checkpoint, Call(3));
155
156 checkpoint.Call(1);
157 ASSERT_EQ(Result::Ok, consumer->beginRead(&buffer, &available));
158 checkpoint.Call(2);
159 EXPECT_EQ(Result::Ok, consumer->endRead(0));
160 checkpoint.Call(3);
161 }
162
163 TEST_F(FormDataBytesConsumerTest, EndReadCanReturnDone)
164 {
165 BytesConsumer* consumer = new FormDataBytesConsumer("hello, world");
166 const char* buffer = nullptr;
167 size_t available = 0;
168 ASSERT_EQ(Result::Ok, consumer->beginRead(&buffer, &available));
169 ASSERT_EQ(12u, available);
170 EXPECT_EQ("hello, world", String(buffer, available));
171 EXPECT_EQ(BytesConsumer::PublicState::ReadableOrWaiting, consumer->getPublic State());
172 EXPECT_EQ(Result::Done, consumer->endRead(available));
173 EXPECT_EQ(BytesConsumer::PublicState::Closed, consumer->getPublicState());
174 }
175
176 TEST_F(FormDataBytesConsumerTest, DrainAsBlobDataHandleFromString)
177 {
178 BytesConsumer* consumer = new FormDataBytesConsumer("hello, world");
179 RefPtr<BlobDataHandle> blobDataHandle = consumer->drainAsBlobDataHandle();
180 ASSERT_TRUE(blobDataHandle);
181
182 EXPECT_EQ(String(), blobDataHandle->type());
183 EXPECT_EQ(12u, blobDataHandle->size());
184 EXPECT_FALSE(consumer->drainAsFormData());
185 const char* buffer = nullptr;
186 size_t available = 0;
187 EXPECT_EQ(Result::Done, consumer->beginRead(&buffer, &available));
188 EXPECT_EQ(BytesConsumer::PublicState::Closed, consumer->getPublicState());
189 }
190
191 TEST_F(FormDataBytesConsumerTest, DrainAsBlobDataHandleFromArrayBuffer)
192 {
193 BytesConsumer* consumer = new FormDataBytesConsumer(DOMArrayBuffer::create(" foo", 3));
194 RefPtr<BlobDataHandle> blobDataHandle = consumer->drainAsBlobDataHandle();
195 ASSERT_TRUE(blobDataHandle);
196
197 EXPECT_EQ(String(), blobDataHandle->type());
198 EXPECT_EQ(3u, blobDataHandle->size());
199 EXPECT_FALSE(consumer->drainAsFormData());
200 const char* buffer = nullptr;
201 size_t available = 0;
202 EXPECT_EQ(Result::Done, consumer->beginRead(&buffer, &available));
203 EXPECT_EQ(BytesConsumer::PublicState::Closed, consumer->getPublicState());
204 }
205
206 TEST_F(FormDataBytesConsumerTest, DrainAsBlobDataHandleFromSimpleFormData)
207 {
208 FormData* data = FormData::create(UTF8Encoding());
209 data->append("name1", "value1");
210 data->append("name2", "value2");
211 RefPtr<EncodedFormData> inputFormData = data->encodeMultiPartFormData();
212
213 BytesConsumer* consumer = new FormDataBytesConsumer(getDocument(), inputForm Data);
214 RefPtr<BlobDataHandle> blobDataHandle = consumer->drainAsBlobDataHandle();
215 ASSERT_TRUE(blobDataHandle);
216
217 EXPECT_EQ(String(), blobDataHandle->type());
218 EXPECT_EQ(inputFormData->flattenToString().utf8().length(), blobDataHandle-> size());
219 EXPECT_FALSE(consumer->drainAsFormData());
220 const char* buffer = nullptr;
221 size_t available = 0;
222 EXPECT_EQ(Result::Done, consumer->beginRead(&buffer, &available));
223 EXPECT_EQ(BytesConsumer::PublicState::Closed, consumer->getPublicState());
224 }
225
226 TEST_F(FormDataBytesConsumerTest, DrainAsBlobDataHandleFromComplexFormData)
227 {
228 RefPtr<EncodedFormData> inputFormData = complexFormData();
229
230 BytesConsumer* consumer = new FormDataBytesConsumer(getDocument(), inputForm Data);
231 RefPtr<BlobDataHandle> blobDataHandle = consumer->drainAsBlobDataHandle();
232 ASSERT_TRUE(blobDataHandle);
233
234 EXPECT_FALSE(consumer->drainAsFormData());
235 const char* buffer = nullptr;
236 size_t available = 0;
237 EXPECT_EQ(Result::Done, consumer->beginRead(&buffer, &available));
238 EXPECT_EQ(BytesConsumer::PublicState::Closed, consumer->getPublicState());
239 }
240
241 TEST_F(FormDataBytesConsumerTest, DrainAsFormDataFromString)
242 {
243 BytesConsumer* consumer = new FormDataBytesConsumer("hello, world");
244 RefPtr<EncodedFormData> formData = consumer->drainAsFormData();
245 ASSERT_TRUE(formData);
246 EXPECT_EQ("hello, world", formData->flattenToString());
247
248 EXPECT_FALSE(consumer->drainAsBlobDataHandle());
249 const char* buffer = nullptr;
250 size_t available = 0;
251 EXPECT_EQ(Result::Done, consumer->beginRead(&buffer, &available));
252 EXPECT_EQ(BytesConsumer::PublicState::Closed, consumer->getPublicState());
253 }
254
255 TEST_F(FormDataBytesConsumerTest, DrainAsFormDataFromArrayBuffer)
256 {
257 BytesConsumer* consumer = new FormDataBytesConsumer(DOMArrayBuffer::create(" foo", 3));
258 RefPtr<EncodedFormData> formData = consumer->drainAsFormData();
259 ASSERT_TRUE(formData);
260 EXPECT_TRUE(formData->isSafeToSendToAnotherThread());
261 EXPECT_EQ("foo", formData->flattenToString());
262
263 EXPECT_FALSE(consumer->drainAsBlobDataHandle());
264 const char* buffer = nullptr;
265 size_t available = 0;
266 EXPECT_EQ(Result::Done, consumer->beginRead(&buffer, &available));
267 EXPECT_EQ(BytesConsumer::PublicState::Closed, consumer->getPublicState());
268 }
269
270 TEST_F(FormDataBytesConsumerTest, DrainAsFormDataFromSimpleFormData)
271 {
272 FormData* data = FormData::create(UTF8Encoding());
273 data->append("name1", "value1");
274 data->append("name2", "value2");
275 RefPtr<EncodedFormData> inputFormData = data->encodeMultiPartFormData();
276
277 BytesConsumer* consumer = new FormDataBytesConsumer(getDocument(), inputForm Data);
278 EXPECT_EQ(inputFormData, consumer->drainAsFormData());
279 EXPECT_FALSE(consumer->drainAsBlobDataHandle());
280 const char* buffer = nullptr;
281 size_t available = 0;
282 EXPECT_EQ(Result::Done, consumer->beginRead(&buffer, &available));
283 EXPECT_EQ(BytesConsumer::PublicState::Closed, consumer->getPublicState());
284 }
285
286 TEST_F(FormDataBytesConsumerTest, DrainAsFormDataFromComplexFormData)
287 {
288 RefPtr<EncodedFormData> inputFormData = complexFormData();
289
290 BytesConsumer* consumer = new FormDataBytesConsumer(getDocument(), inputForm Data);
291 EXPECT_EQ(inputFormData, consumer->drainAsFormData());
292 EXPECT_FALSE(consumer->drainAsBlobDataHandle());
293 const char* buffer = nullptr;
294 size_t available = 0;
295 EXPECT_EQ(Result::Done, consumer->beginRead(&buffer, &available));
296 EXPECT_EQ(BytesConsumer::PublicState::Closed, consumer->getPublicState());
297 }
298
299 TEST_F(FormDataBytesConsumerTest, BeginReadAffectsDraining)
300 {
301 const char* buffer = nullptr;
302 size_t available = 0;
303 BytesConsumer* consumer = new FormDataBytesConsumer("hello, world");
304 ASSERT_EQ(Result::Ok, consumer->beginRead(&buffer, &available));
305 EXPECT_EQ("hello, world", String(buffer, available));
306
307 ASSERT_EQ(Result::Ok, consumer->endRead(0));
308 EXPECT_FALSE(consumer->drainAsFormData());
309 EXPECT_FALSE(consumer->drainAsBlobDataHandle());
310 EXPECT_EQ(BytesConsumer::PublicState::ReadableOrWaiting, consumer->getPublic State());
311 }
312
313 TEST_F(FormDataBytesConsumerTest, BeginReadAffectsDrainingWithComplexFormData)
314 {
315 MockBytesConsumer* underlying = MockBytesConsumer::create();
316 BytesConsumer* consumer = FormDataBytesConsumer::createForTesting(getDocumen t(), complexFormData(), underlying);
317
318 const char* buffer = nullptr;
319 size_t available = 0;
320 Checkpoint checkpoint;
321
322 InSequence s;
323 EXPECT_CALL(checkpoint, Call(1));
324 EXPECT_CALL(*underlying, beginRead(&buffer, &available)).WillOnce(Return(Res ult::Ok));
325 EXPECT_CALL(*underlying, endRead(0)).WillOnce(Return(Result::Ok));
326 EXPECT_CALL(checkpoint, Call(2));
327 // drainAsFormData / drainAsBlobDataHandle should not be called here.
328 EXPECT_CALL(checkpoint, Call(3));
329 // |consumer| delegates the getPublicState call to |underlying|.
330 EXPECT_CALL(*underlying, getPublicState()).WillOnce(Return(BytesConsumer::Pu blicState::ReadableOrWaiting));
331 EXPECT_CALL(checkpoint, Call(4));
332
333 checkpoint.Call(1);
334 ASSERT_EQ(Result::Ok, consumer->beginRead(&buffer, &available));
335 ASSERT_EQ(Result::Ok, consumer->endRead(0));
336 checkpoint.Call(2);
337 EXPECT_FALSE(consumer->drainAsFormData());
338 EXPECT_FALSE(consumer->drainAsBlobDataHandle());
339 checkpoint.Call(3);
340 EXPECT_EQ(BytesConsumer::PublicState::ReadableOrWaiting, consumer->getPublic State());
341 checkpoint.Call(4);
342 }
343
344 TEST_F(FormDataBytesConsumerTest, SetClientWithComplexFormData)
345 {
346 RefPtr<EncodedFormData> inputFormData = complexFormData();
347
348 MockBytesConsumer* underlying = MockBytesConsumer::create();
349 BytesConsumer* consumer = FormDataBytesConsumer::createForTesting(getDocumen t(), inputFormData, underlying);
350 Checkpoint checkpoint;
351
352 InSequence s;
353 EXPECT_CALL(checkpoint, Call(1));
354 EXPECT_CALL(*underlying, setClient(_));
355 EXPECT_CALL(checkpoint, Call(2));
356 EXPECT_CALL(*underlying, clearClient());
357 EXPECT_CALL(checkpoint, Call(3));
358
359 checkpoint.Call(1);
360 consumer->setClient(new NoopClient());
361 checkpoint.Call(2);
362 consumer->clearClient();
363 checkpoint.Call(3);
364 }
365
366 TEST_F(FormDataBytesConsumerTest, CancelWithComplexFormData)
367 {
368 RefPtr<EncodedFormData> inputFormData = complexFormData();
369
370 MockBytesConsumer* underlying = MockBytesConsumer::create();
371 BytesConsumer* consumer = FormDataBytesConsumer::createForTesting(getDocumen t(), inputFormData, underlying);
372 Checkpoint checkpoint;
373
374 InSequence s;
375 EXPECT_CALL(checkpoint, Call(1));
376 EXPECT_CALL(*underlying, cancel());
377 EXPECT_CALL(checkpoint, Call(2));
378
379 checkpoint.Call(1);
380 consumer->cancel();
381 checkpoint.Call(2);
382 }
383
384 } // namespace
385 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/modules/fetch/FormDataBytesConsumer.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698