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