| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "modules/fetch/FetchFormDataConsumerHandle.h" | |
| 6 | |
| 7 #include "core/dom/DOMTypedArray.h" | |
| 8 #include "core/html/FormData.h" | |
| 9 #include "core/loader/MockThreadableLoader.h" | |
| 10 #include "core/loader/ThreadableLoaderClient.h" | |
| 11 #include "core/testing/DummyPageHolder.h" | |
| 12 #include "modules/fetch/DataConsumerHandleTestUtil.h" | |
| 13 #include "platform/network/ResourceResponse.h" | |
| 14 #include "platform/testing/UnitTestHelpers.h" | |
| 15 #include "platform/weborigin/KURL.h" | |
| 16 #include "testing/gmock/include/gmock/gmock.h" | |
| 17 #include "testing/gtest/include/gtest/gtest.h" | |
| 18 #include "wtf/PassRefPtr.h" | |
| 19 #include "wtf/RefPtr.h" | |
| 20 #include "wtf/Vector.h" | |
| 21 #include "wtf/text/TextEncoding.h" | |
| 22 #include "wtf/text/WTFString.h" | |
| 23 #include <memory> | |
| 24 #include <string.h> | |
| 25 | |
| 26 namespace blink { | |
| 27 namespace { | |
| 28 | |
| 29 using Result = WebDataConsumerHandle::Result; | |
| 30 const Result kOk = WebDataConsumerHandle::Ok; | |
| 31 const Result kDone = WebDataConsumerHandle::Done; | |
| 32 const Result kShouldWait = WebDataConsumerHandle::ShouldWait; | |
| 33 const WebDataConsumerHandle::Flags kNone = WebDataConsumerHandle::FlagNone; | |
| 34 using HandleReader = DataConsumerHandleTestUtil::HandleReader; | |
| 35 using HandleTwoPhaseReader = DataConsumerHandleTestUtil::HandleTwoPhaseReader; | |
| 36 using HandleReadResult = DataConsumerHandleTestUtil::HandleReadResult; | |
| 37 template <typename T> | |
| 38 using HandleReaderRunner = DataConsumerHandleTestUtil::HandleReaderRunner<T>; | |
| 39 using ReplayingHandle = DataConsumerHandleTestUtil::ReplayingHandle; | |
| 40 using Command = DataConsumerHandleTestUtil::Command; | |
| 41 | |
| 42 using ::testing::_; | |
| 43 using ::testing::InvokeWithoutArgs; | |
| 44 | |
| 45 String toString(const Vector<char>& data) | |
| 46 { | |
| 47 return String(data.data(), data.size()); | |
| 48 } | |
| 49 | |
| 50 class LoaderFactory : public FetchBlobDataConsumerHandle::LoaderFactory { | |
| 51 public: | |
| 52 explicit LoaderFactory(std::unique_ptr<WebDataConsumerHandle> handle) | |
| 53 : m_client(nullptr) | |
| 54 , m_handle(std::move(handle)) {} | |
| 55 ThreadableLoader* create(ExecutionContext&, ThreadableLoaderClient* client,
const ThreadableLoaderOptions&, const ResourceLoaderOptions&) override | |
| 56 { | |
| 57 m_client = client; | |
| 58 | |
| 59 MockThreadableLoader* loader = MockThreadableLoader::create(); | |
| 60 EXPECT_CALL(*loader, start(_)).WillOnce(InvokeWithoutArgs(this, &LoaderF
actory::handleDidReceiveResponse)); | |
| 61 EXPECT_CALL(*loader, cancel()).Times(1); | |
| 62 return loader; | |
| 63 } | |
| 64 | |
| 65 private: | |
| 66 void handleDidReceiveResponse() | |
| 67 { | |
| 68 m_client->didReceiveResponse(0, ResourceResponse(), std::move(m_handle))
; | |
| 69 } | |
| 70 | |
| 71 ThreadableLoaderClient* m_client; | |
| 72 std::unique_ptr<WebDataConsumerHandle> m_handle; | |
| 73 }; | |
| 74 | |
| 75 class FetchFormDataConsumerHandleTest : public ::testing::Test { | |
| 76 public: | |
| 77 FetchFormDataConsumerHandleTest() : m_page(DummyPageHolder::create(IntSize(1
, 1))) {} | |
| 78 | |
| 79 protected: | |
| 80 Document* getDocument() { return &m_page->document(); } | |
| 81 | |
| 82 std::unique_ptr<DummyPageHolder> m_page; | |
| 83 }; | |
| 84 | |
| 85 PassRefPtr<EncodedFormData> complexFormData() | |
| 86 { | |
| 87 RefPtr<EncodedFormData> data = EncodedFormData::create(); | |
| 88 | |
| 89 data->appendData("foo", 3); | |
| 90 data->appendFileRange("/foo/bar/baz", 3, 4, 5); | |
| 91 data->appendFileSystemURLRange(KURL(KURL(), "file:///foo/bar/baz"), 6, 7, 8)
; | |
| 92 std::unique_ptr<BlobData> blobData = BlobData::create(); | |
| 93 blobData->appendText("hello", false); | |
| 94 auto size = blobData->length(); | |
| 95 RefPtr<BlobDataHandle> blobDataHandle = BlobDataHandle::create(std::move(blo
bData), size); | |
| 96 data->appendBlob(blobDataHandle->uuid(), blobDataHandle); | |
| 97 Vector<char> boundary; | |
| 98 boundary.append("\0", 1); | |
| 99 data->setBoundary(boundary); | |
| 100 return data.release(); | |
| 101 } | |
| 102 | |
| 103 void verifyComplexFormData(EncodedFormData* data) | |
| 104 { | |
| 105 const auto& elements = data->elements(); | |
| 106 if (4 != elements.size()) { | |
| 107 FAIL() << "data->elements().size() should be 4, but is " << data->elemen
ts().size() << "."; | |
| 108 } | |
| 109 EXPECT_EQ(FormDataElement::data, elements[0].m_type); | |
| 110 EXPECT_EQ("foo", String(elements[0].m_data.data(), elements[0].m_data.size()
)); | |
| 111 | |
| 112 EXPECT_EQ(FormDataElement::encodedFile, elements[1].m_type); | |
| 113 EXPECT_EQ("/foo/bar/baz", elements[1].m_filename); | |
| 114 EXPECT_EQ(3, elements[1].m_fileStart); | |
| 115 EXPECT_EQ(4, elements[1].m_fileLength); | |
| 116 EXPECT_EQ(5, elements[1].m_expectedFileModificationTime); | |
| 117 | |
| 118 EXPECT_EQ(FormDataElement::encodedFileSystemURL, elements[2].m_type); | |
| 119 EXPECT_EQ(KURL(KURL(), "file:///foo/bar/baz"), elements[2].m_fileSystemURL); | |
| 120 EXPECT_EQ(6, elements[2].m_fileStart); | |
| 121 EXPECT_EQ(7, elements[2].m_fileLength); | |
| 122 EXPECT_EQ(8, elements[2].m_expectedFileModificationTime); | |
| 123 | |
| 124 EXPECT_EQ(FormDataElement::encodedBlob, elements[3].m_type); | |
| 125 if (!elements[3].m_optionalBlobDataHandle) { | |
| 126 FAIL() << "optional BlobDataHandle must be set."; | |
| 127 } | |
| 128 EXPECT_EQ(elements[3].m_blobUUID, elements[3].m_optionalBlobDataHandle->uuid
()); | |
| 129 EXPECT_EQ(5u, elements[3].m_optionalBlobDataHandle->size()); | |
| 130 } | |
| 131 | |
| 132 TEST_F(FetchFormDataConsumerHandleTest, ReadFromString) | |
| 133 { | |
| 134 std::unique_ptr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandl
e::create(String("hello, world")); | |
| 135 HandleReaderRunner<HandleReader> runner(std::move(handle)); | |
| 136 std::unique_ptr<HandleReadResult> r = runner.wait(); | |
| 137 EXPECT_EQ(kDone, r->result()); | |
| 138 EXPECT_EQ("hello, world", toString(r->data())); | |
| 139 } | |
| 140 | |
| 141 TEST_F(FetchFormDataConsumerHandleTest, TwoPhaseReadFromString) | |
| 142 { | |
| 143 std::unique_ptr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandl
e::create(String("hello, world")); | |
| 144 HandleReaderRunner<HandleTwoPhaseReader> runner(std::move(handle)); | |
| 145 std::unique_ptr<HandleReadResult> r = runner.wait(); | |
| 146 EXPECT_EQ(kDone, r->result()); | |
| 147 EXPECT_EQ("hello, world", toString(r->data())); | |
| 148 } | |
| 149 | |
| 150 TEST_F(FetchFormDataConsumerHandleTest, ReadFromStringNonLatin) | |
| 151 { | |
| 152 UChar cs[] = {0x3042, 0}; | |
| 153 std::unique_ptr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandl
e::create(String(cs)); | |
| 154 HandleReaderRunner<HandleReader> runner(std::move(handle)); | |
| 155 std::unique_ptr<HandleReadResult> r = runner.wait(); | |
| 156 EXPECT_EQ(kDone, r->result()); | |
| 157 EXPECT_EQ("\xe3\x81\x82", toString(r->data())); | |
| 158 } | |
| 159 | |
| 160 TEST_F(FetchFormDataConsumerHandleTest, ReadFromArrayBuffer) | |
| 161 { | |
| 162 const unsigned char data[] = { 0x21, 0xfe, 0x00, 0x00, 0xff, 0xa3, 0x42, 0x3
0, 0x42, 0x99, 0x88 }; | |
| 163 DOMArrayBuffer* buffer = DOMArrayBuffer::create(data, WTF_ARRAY_LENGTH(data)
); | |
| 164 std::unique_ptr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandl
e::create(buffer); | |
| 165 HandleReaderRunner<HandleReader> runner(std::move(handle)); | |
| 166 std::unique_ptr<HandleReadResult> r = runner.wait(); | |
| 167 EXPECT_EQ(kDone, r->result()); | |
| 168 Vector<char> expected; | |
| 169 expected.append(data, WTF_ARRAY_LENGTH(data)); | |
| 170 EXPECT_EQ(expected, r->data()); | |
| 171 } | |
| 172 | |
| 173 TEST_F(FetchFormDataConsumerHandleTest, ReadFromArrayBufferView) | |
| 174 { | |
| 175 const unsigned char data[] = { 0x21, 0xfe, 0x00, 0x00, 0xff, 0xa3, 0x42, 0x3
0, 0x42, 0x99, 0x88 }; | |
| 176 const size_t offset = 1, size = 4; | |
| 177 DOMArrayBuffer* buffer = DOMArrayBuffer::create(data, WTF_ARRAY_LENGTH(data)
); | |
| 178 std::unique_ptr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandl
e::create(DOMUint8Array::create(buffer, offset, size)); | |
| 179 HandleReaderRunner<HandleReader> runner(std::move(handle)); | |
| 180 std::unique_ptr<HandleReadResult> r = runner.wait(); | |
| 181 EXPECT_EQ(kDone, r->result()); | |
| 182 Vector<char> expected; | |
| 183 expected.append(data + offset, size); | |
| 184 EXPECT_EQ(expected, r->data()); | |
| 185 } | |
| 186 | |
| 187 TEST_F(FetchFormDataConsumerHandleTest, ReadFromSimplFormData) | |
| 188 { | |
| 189 RefPtr<EncodedFormData> data = EncodedFormData::create(); | |
| 190 data->appendData("foo", 3); | |
| 191 data->appendData("hoge", 4); | |
| 192 | |
| 193 std::unique_ptr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandl
e::create(getDocument(), data); | |
| 194 HandleReaderRunner<HandleReader> runner(std::move(handle)); | |
| 195 testing::runPendingTasks(); | |
| 196 std::unique_ptr<HandleReadResult> r = runner.wait(); | |
| 197 EXPECT_EQ(kDone, r->result()); | |
| 198 EXPECT_EQ("foohoge", toString(r->data())); | |
| 199 } | |
| 200 | |
| 201 TEST_F(FetchFormDataConsumerHandleTest, ReadFromComplexFormData) | |
| 202 { | |
| 203 RefPtr<EncodedFormData> data = complexFormData(); | |
| 204 std::unique_ptr<ReplayingHandle> src = ReplayingHandle::create(); | |
| 205 src->add(Command(Command::Data, "bar")); | |
| 206 src->add(Command(Command::Done)); | |
| 207 std::unique_ptr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandl
e::createForTest(getDocument(), data, new LoaderFactory(std::move(src))); | |
| 208 char c; | |
| 209 size_t readSize; | |
| 210 EXPECT_EQ(kShouldWait, handle->obtainReader(nullptr)->read(&c, 1, kNone, &re
adSize)); | |
| 211 | |
| 212 HandleReaderRunner<HandleReader> runner(std::move(handle)); | |
| 213 testing::runPendingTasks(); | |
| 214 std::unique_ptr<HandleReadResult> r = runner.wait(); | |
| 215 EXPECT_EQ(kDone, r->result()); | |
| 216 EXPECT_EQ("bar", toString(r->data())); | |
| 217 } | |
| 218 | |
| 219 TEST_F(FetchFormDataConsumerHandleTest, TwoPhaseReadFromComplexFormData) | |
| 220 { | |
| 221 RefPtr<EncodedFormData> data = complexFormData(); | |
| 222 std::unique_ptr<ReplayingHandle> src = ReplayingHandle::create(); | |
| 223 src->add(Command(Command::Data, "bar")); | |
| 224 src->add(Command(Command::Done)); | |
| 225 std::unique_ptr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandl
e::createForTest(getDocument(), data, new LoaderFactory(std::move(src))); | |
| 226 char c; | |
| 227 size_t readSize; | |
| 228 EXPECT_EQ(kShouldWait, handle->obtainReader(nullptr)->read(&c, 1, kNone, &re
adSize)); | |
| 229 | |
| 230 HandleReaderRunner<HandleTwoPhaseReader> runner(std::move(handle)); | |
| 231 testing::runPendingTasks(); | |
| 232 std::unique_ptr<HandleReadResult> r = runner.wait(); | |
| 233 EXPECT_EQ(kDone, r->result()); | |
| 234 EXPECT_EQ("bar", toString(r->data())); | |
| 235 } | |
| 236 | |
| 237 TEST_F(FetchFormDataConsumerHandleTest, DrainAsBlobDataHandleFromString) | |
| 238 { | |
| 239 std::unique_ptr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandl
e::create(String("hello, world")); | |
| 240 std::unique_ptr<FetchDataConsumerHandle::Reader> reader = handle->obtainFetc
hDataReader(nullptr); | |
| 241 RefPtr<BlobDataHandle> blobDataHandle = reader->drainAsBlobDataHandle(); | |
| 242 ASSERT_TRUE(blobDataHandle); | |
| 243 | |
| 244 EXPECT_EQ(String(), blobDataHandle->type()); | |
| 245 EXPECT_EQ(12u, blobDataHandle->size()); | |
| 246 EXPECT_EQ(nullptr, reader->drainAsFormData()); | |
| 247 char c; | |
| 248 size_t readSize; | |
| 249 EXPECT_EQ(kDone, reader->read(&c, 1, kNone, &readSize)); | |
| 250 } | |
| 251 | |
| 252 TEST_F(FetchFormDataConsumerHandleTest, DrainAsBlobDataHandleFromArrayBuffer) | |
| 253 { | |
| 254 std::unique_ptr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandl
e::create(DOMArrayBuffer::create("foo", 3)); | |
| 255 std::unique_ptr<FetchDataConsumerHandle::Reader> reader = handle->obtainFetc
hDataReader(nullptr); | |
| 256 RefPtr<BlobDataHandle> blobDataHandle = reader->drainAsBlobDataHandle(); | |
| 257 ASSERT_TRUE(blobDataHandle); | |
| 258 | |
| 259 EXPECT_EQ(String(), blobDataHandle->type()); | |
| 260 EXPECT_EQ(3u, blobDataHandle->size()); | |
| 261 EXPECT_EQ(nullptr, reader->drainAsFormData()); | |
| 262 char c; | |
| 263 size_t readSize; | |
| 264 EXPECT_EQ(kDone, reader->read(&c, 1, kNone, &readSize)); | |
| 265 } | |
| 266 | |
| 267 TEST_F(FetchFormDataConsumerHandleTest, DrainAsBlobDataHandleFromSimpleFormData) | |
| 268 { | |
| 269 FormData* data = FormData::create(UTF8Encoding()); | |
| 270 data->append("name1", "value1"); | |
| 271 data->append("name2", "value2"); | |
| 272 RefPtr<EncodedFormData> inputFormData = data->encodeMultiPartFormData(); | |
| 273 | |
| 274 std::unique_ptr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandl
e::create(getDocument(), inputFormData); | |
| 275 std::unique_ptr<FetchDataConsumerHandle::Reader> reader = handle->obtainFetc
hDataReader(nullptr); | |
| 276 RefPtr<BlobDataHandle> blobDataHandle = reader->drainAsBlobDataHandle(); | |
| 277 ASSERT_TRUE(blobDataHandle); | |
| 278 | |
| 279 EXPECT_EQ(String(), blobDataHandle->type()); | |
| 280 EXPECT_EQ(inputFormData->flattenToString().utf8().length(), blobDataHandle->
size()); | |
| 281 EXPECT_EQ(nullptr, reader->drainAsFormData()); | |
| 282 char c; | |
| 283 size_t readSize; | |
| 284 EXPECT_EQ(kDone, reader->read(&c, 1, kNone, &readSize)); | |
| 285 } | |
| 286 | |
| 287 TEST_F(FetchFormDataConsumerHandleTest, DrainAsBlobDataHandleFromComplexFormData
) | |
| 288 { | |
| 289 RefPtr<EncodedFormData> inputFormData = complexFormData(); | |
| 290 | |
| 291 std::unique_ptr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandl
e::create(getDocument(), inputFormData); | |
| 292 std::unique_ptr<FetchDataConsumerHandle::Reader> reader = handle->obtainFetc
hDataReader(nullptr); | |
| 293 RefPtr<BlobDataHandle> blobDataHandle = reader->drainAsBlobDataHandle(); | |
| 294 ASSERT_TRUE(blobDataHandle); | |
| 295 | |
| 296 EXPECT_EQ(nullptr, reader->drainAsFormData()); | |
| 297 char c; | |
| 298 size_t readSize; | |
| 299 EXPECT_EQ(kDone, reader->read(&c, 1, kNone, &readSize)); | |
| 300 } | |
| 301 | |
| 302 TEST_F(FetchFormDataConsumerHandleTest, DrainAsFormDataFromString) | |
| 303 { | |
| 304 std::unique_ptr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandl
e::create(String("hello, world")); | |
| 305 std::unique_ptr<FetchDataConsumerHandle::Reader> reader = handle->obtainFetc
hDataReader(nullptr); | |
| 306 RefPtr<EncodedFormData> formData = reader->drainAsFormData(); | |
| 307 ASSERT_TRUE(formData); | |
| 308 EXPECT_TRUE(formData->isSafeToSendToAnotherThread()); | |
| 309 EXPECT_EQ("hello, world", formData->flattenToString()); | |
| 310 | |
| 311 const void* buffer = nullptr; | |
| 312 size_t size; | |
| 313 EXPECT_EQ(kDone, reader->read(nullptr, 0, kNone, &size)); | |
| 314 EXPECT_EQ(kDone, reader->beginRead(&buffer, kNone, &size)); | |
| 315 } | |
| 316 | |
| 317 TEST_F(FetchFormDataConsumerHandleTest, DrainAsFormDataFromArrayBuffer) | |
| 318 { | |
| 319 std::unique_ptr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandl
e::create(DOMArrayBuffer::create("foo", 3)); | |
| 320 std::unique_ptr<FetchDataConsumerHandle::Reader> reader = handle->obtainFetc
hDataReader(nullptr); | |
| 321 RefPtr<EncodedFormData> formData = reader->drainAsFormData(); | |
| 322 ASSERT_TRUE(formData); | |
| 323 EXPECT_TRUE(formData->isSafeToSendToAnotherThread()); | |
| 324 EXPECT_EQ("foo", formData->flattenToString()); | |
| 325 } | |
| 326 | |
| 327 TEST_F(FetchFormDataConsumerHandleTest, DrainAsFormDataFromSimpleFormData) | |
| 328 { | |
| 329 FormData* data = FormData::create(UTF8Encoding()); | |
| 330 data->append("name1", "value1"); | |
| 331 data->append("name2", "value2"); | |
| 332 RefPtr<EncodedFormData> inputFormData = data->encodeMultiPartFormData(); | |
| 333 | |
| 334 std::unique_ptr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandl
e::create(getDocument(), inputFormData); | |
| 335 std::unique_ptr<FetchDataConsumerHandle::Reader> reader = handle->obtainFetc
hDataReader(nullptr); | |
| 336 RefPtr<EncodedFormData> outputFormData = reader->drainAsFormData(); | |
| 337 ASSERT_TRUE(outputFormData); | |
| 338 EXPECT_TRUE(outputFormData->isSafeToSendToAnotherThread()); | |
| 339 EXPECT_NE(outputFormData.get(), inputFormData.get()); | |
| 340 EXPECT_EQ(inputFormData->flattenToString(), outputFormData->flattenToString(
)); | |
| 341 } | |
| 342 | |
| 343 TEST_F(FetchFormDataConsumerHandleTest, DrainAsFormDataFromComplexFormData) | |
| 344 { | |
| 345 RefPtr<EncodedFormData> inputFormData = complexFormData(); | |
| 346 | |
| 347 std::unique_ptr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandl
e::create(getDocument(), inputFormData); | |
| 348 std::unique_ptr<FetchDataConsumerHandle::Reader> reader = handle->obtainFetc
hDataReader(nullptr); | |
| 349 RefPtr<EncodedFormData> outputFormData = reader->drainAsFormData(); | |
| 350 ASSERT_TRUE(outputFormData); | |
| 351 EXPECT_TRUE(outputFormData->isSafeToSendToAnotherThread()); | |
| 352 EXPECT_NE(outputFormData.get(), inputFormData.get()); | |
| 353 verifyComplexFormData(outputFormData.get()); | |
| 354 } | |
| 355 | |
| 356 TEST_F(FetchFormDataConsumerHandleTest, ZeroByteReadDoesNotAffectDraining) | |
| 357 { | |
| 358 std::unique_ptr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandl
e::create(String("hello, world")); | |
| 359 std::unique_ptr<FetchDataConsumerHandle::Reader> reader = handle->obtainFetc
hDataReader(nullptr); | |
| 360 size_t readSize; | |
| 361 EXPECT_EQ(kOk, reader->read(nullptr, 0, kNone, &readSize)); | |
| 362 RefPtr<EncodedFormData> formData = reader->drainAsFormData(); | |
| 363 ASSERT_TRUE(formData); | |
| 364 EXPECT_TRUE(formData->isSafeToSendToAnotherThread()); | |
| 365 EXPECT_EQ("hello, world", formData->flattenToString()); | |
| 366 } | |
| 367 | |
| 368 TEST_F(FetchFormDataConsumerHandleTest, OneByteReadAffectsDraining) | |
| 369 { | |
| 370 char c; | |
| 371 std::unique_ptr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandl
e::create(String("hello, world")); | |
| 372 std::unique_ptr<FetchDataConsumerHandle::Reader> reader = handle->obtainFetc
hDataReader(nullptr); | |
| 373 size_t readSize; | |
| 374 EXPECT_EQ(kOk, reader->read(&c, 1, kNone, &readSize)); | |
| 375 EXPECT_EQ(1u, readSize); | |
| 376 EXPECT_EQ('h', c); | |
| 377 EXPECT_FALSE(reader->drainAsFormData()); | |
| 378 } | |
| 379 | |
| 380 TEST_F(FetchFormDataConsumerHandleTest, BeginReadAffectsDraining) | |
| 381 { | |
| 382 const void* buffer = nullptr; | |
| 383 std::unique_ptr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandl
e::create(String("hello, world")); | |
| 384 std::unique_ptr<FetchDataConsumerHandle::Reader> reader = handle->obtainFetc
hDataReader(nullptr); | |
| 385 size_t available; | |
| 386 EXPECT_EQ(kOk, reader->beginRead(&buffer, kNone, &available)); | |
| 387 ASSERT_TRUE(buffer); | |
| 388 EXPECT_EQ("hello, world", String(static_cast<const char*>(buffer), available
)); | |
| 389 EXPECT_FALSE(reader->drainAsFormData()); | |
| 390 reader->endRead(0); | |
| 391 EXPECT_FALSE(reader->drainAsFormData()); | |
| 392 } | |
| 393 | |
| 394 TEST_F(FetchFormDataConsumerHandleTest, ZeroByteReadDoesNotAffectDrainingForComp
lexFormData) | |
| 395 { | |
| 396 std::unique_ptr<ReplayingHandle> src = ReplayingHandle::create(); | |
| 397 src->add(Command(Command::Data, "bar")); | |
| 398 src->add(Command(Command::Done)); | |
| 399 std::unique_ptr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandl
e::createForTest(getDocument(), complexFormData(), new LoaderFactory(std::move(s
rc))); | |
| 400 std::unique_ptr<FetchDataConsumerHandle::Reader> reader = handle->obtainFetc
hDataReader(nullptr); | |
| 401 size_t readSize; | |
| 402 EXPECT_EQ(kShouldWait, reader->read(nullptr, 0, kNone, &readSize)); | |
| 403 testing::runPendingTasks(); | |
| 404 RefPtr<EncodedFormData> formData = reader->drainAsFormData(); | |
| 405 ASSERT_TRUE(formData); | |
| 406 EXPECT_TRUE(formData->isSafeToSendToAnotherThread()); | |
| 407 verifyComplexFormData(formData.get()); | |
| 408 } | |
| 409 | |
| 410 TEST_F(FetchFormDataConsumerHandleTest, OneByteReadAffectsDrainingForComplexForm
Data) | |
| 411 { | |
| 412 std::unique_ptr<ReplayingHandle> src = ReplayingHandle::create(); | |
| 413 src->add(Command(Command::Data, "bar")); | |
| 414 src->add(Command(Command::Done)); | |
| 415 std::unique_ptr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandl
e::createForTest(getDocument(), complexFormData(), new LoaderFactory(std::move(s
rc))); | |
| 416 std::unique_ptr<FetchDataConsumerHandle::Reader> reader = handle->obtainFetc
hDataReader(nullptr); | |
| 417 char c; | |
| 418 size_t readSize; | |
| 419 EXPECT_EQ(kShouldWait, reader->read(&c, 1, kNone, &readSize)); | |
| 420 testing::runPendingTasks(); | |
| 421 EXPECT_EQ(kOk, reader->read(&c, 1, kNone, &readSize)); | |
| 422 EXPECT_EQ(1u, readSize); | |
| 423 EXPECT_EQ('b', c); | |
| 424 EXPECT_FALSE(reader->drainAsFormData()); | |
| 425 } | |
| 426 | |
| 427 TEST_F(FetchFormDataConsumerHandleTest, BeginReadAffectsDrainingForComplexFormDa
ta) | |
| 428 { | |
| 429 std::unique_ptr<ReplayingHandle> src = ReplayingHandle::create(); | |
| 430 src->add(Command(Command::Data, "bar")); | |
| 431 src->add(Command(Command::Done)); | |
| 432 const void* buffer = nullptr; | |
| 433 std::unique_ptr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandl
e::createForTest(getDocument(), complexFormData(), new LoaderFactory(std::move(s
rc))); | |
| 434 std::unique_ptr<FetchDataConsumerHandle::Reader> reader = handle->obtainFetc
hDataReader(nullptr); | |
| 435 size_t available; | |
| 436 EXPECT_EQ(kShouldWait, reader->beginRead(&buffer, kNone, &available)); | |
| 437 testing::runPendingTasks(); | |
| 438 EXPECT_EQ(kOk, reader->beginRead(&buffer, kNone, &available)); | |
| 439 EXPECT_FALSE(reader->drainAsFormData()); | |
| 440 reader->endRead(0); | |
| 441 EXPECT_FALSE(reader->drainAsFormData()); | |
| 442 } | |
| 443 | |
| 444 } // namespace | |
| 445 } // namespace blink | |
| OLD | NEW |