blob: 0831dd9831b72fb952e864c40caefc45a74beeb5 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "modules/fetch/FetchDataLoader.h"
#include "modules/fetch/DataConsumerHandleTestUtil.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace blink {
namespace {
using ::testing::InSequence;
using ::testing::Return;
using ::testing::DoAll;
using ::testing::StrictMock;
using ::testing::_;
using ::testing::SaveArg;
using ::testing::SetArgPointee;
using Checkpoint = StrictMock<::testing::MockFunction<void(int)>>;
using MockFetchDataLoaderClient = DataConsumerHandleTestUtil::MockFetchDataLoaderClient;
using MockHandle = DataConsumerHandleTestUtil::MockFetchDataConsumerHandle;
using MockReader = DataConsumerHandleTestUtil::MockFetchDataConsumerReader;
const WebDataConsumerHandle::Result kOk = WebDataConsumerHandle::Ok;
const WebDataConsumerHandle::Result kUnexpectedError = WebDataConsumerHandle::UnexpectedError;
const WebDataConsumerHandle::Result kDone = WebDataConsumerHandle::Done;
const WebDataConsumerHandle::Flags kNone = WebDataConsumerHandle::FlagNone;
const FetchDataConsumerHandle::Reader::BlobSizePolicy kDisallowBlobWithInvalidSize = FetchDataConsumerHandle::Reader::DisallowBlobWithInvalidSize;
const char kQuickBrownFox[] = "Quick brown fox";
const size_t kQuickBrownFoxLength = 15;
const size_t kQuickBrownFoxLengthWithTerminatingNull = 16;
TEST(FetchDataLoaderTest, LoadAsBlob)
{
WebDataConsumerHandle::Client *client = nullptr;
Checkpoint checkpoint;
OwnPtr<MockHandle> handle = MockHandle::create();
OwnPtr<MockReader> reader = MockReader::create();
FetchDataLoader* fetchDataLoader = FetchDataLoader::createLoaderAsBlobHandle("text/test");
MockFetchDataLoaderClient* fetchDataLoaderClient = MockFetchDataLoaderClient::create();
RefPtr<BlobDataHandle> blobDataHandle;
InSequence s;
EXPECT_CALL(checkpoint, Call(1));
EXPECT_CALL(*handle, obtainReaderInternal(_)).WillOnce(DoAll(SaveArg<0>(&client), Return(reader.get())));
EXPECT_CALL(*reader, drainAsBlobDataHandle(kDisallowBlobWithInvalidSize)).WillOnce(Return(nullptr));
EXPECT_CALL(checkpoint, Call(2));
EXPECT_CALL(*reader, beginRead(_, kNone, _)).WillOnce(DoAll(SetArgPointee<0>(static_cast<const void*>(kQuickBrownFox)), SetArgPointee<2>(kQuickBrownFoxLengthWithTerminatingNull), Return(kOk)));
EXPECT_CALL(*reader, endRead(kQuickBrownFoxLengthWithTerminatingNull)).WillOnce(Return(kOk));
EXPECT_CALL(*reader, beginRead(_, kNone, _)).WillOnce(Return(kDone));
EXPECT_CALL(*reader, destruct());
EXPECT_CALL(*fetchDataLoaderClient, didFetchDataLoadedBlobHandleMock(_)).WillOnce(SaveArg<0>(&blobDataHandle));
EXPECT_CALL(checkpoint, Call(3));
EXPECT_CALL(checkpoint, Call(4));
// |reader| is adopted by |obtainReader|.
ASSERT_TRUE(reader.leakPtr());
checkpoint.Call(1);
fetchDataLoader->start(handle.get(), fetchDataLoaderClient);
checkpoint.Call(2);
ASSERT_TRUE(client);
client->didGetReadable();
checkpoint.Call(3);
fetchDataLoader->cancel();
checkpoint.Call(4);
ASSERT_TRUE(blobDataHandle);
EXPECT_EQ(kQuickBrownFoxLengthWithTerminatingNull, blobDataHandle->size());
EXPECT_EQ(String("text/test"), blobDataHandle->type());
}
TEST(FetchDataLoaderTest, LoadAsBlobFailed)
{
WebDataConsumerHandle::Client *client = nullptr;
Checkpoint checkpoint;
OwnPtr<MockHandle> handle = MockHandle::create();
OwnPtr<MockReader> reader = MockReader::create();
FetchDataLoader* fetchDataLoader = FetchDataLoader::createLoaderAsBlobHandle("text/test");
MockFetchDataLoaderClient* fetchDataLoaderClient = MockFetchDataLoaderClient::create();
InSequence s;
EXPECT_CALL(checkpoint, Call(1));
EXPECT_CALL(*handle, obtainReaderInternal(_)).WillOnce(DoAll(SaveArg<0>(&client), Return(reader.get())));
EXPECT_CALL(*reader, drainAsBlobDataHandle(kDisallowBlobWithInvalidSize)).WillOnce(Return(nullptr));
EXPECT_CALL(checkpoint, Call(2));
EXPECT_CALL(*reader, beginRead(_, kNone, _)).WillOnce(DoAll(SetArgPointee<0>(static_cast<const void*>(kQuickBrownFox)), SetArgPointee<2>(kQuickBrownFoxLengthWithTerminatingNull), Return(kOk)));
EXPECT_CALL(*reader, endRead(kQuickBrownFoxLengthWithTerminatingNull)).WillOnce(Return(kOk));
EXPECT_CALL(*reader, beginRead(_, kNone, _)).WillOnce(Return(kUnexpectedError));
EXPECT_CALL(*reader, destruct());
EXPECT_CALL(*fetchDataLoaderClient, didFetchDataLoadFailed());
EXPECT_CALL(checkpoint, Call(3));
EXPECT_CALL(checkpoint, Call(4));
// |reader| is adopted by |obtainReader|.
ASSERT_TRUE(reader.leakPtr());
checkpoint.Call(1);
fetchDataLoader->start(handle.get(), fetchDataLoaderClient);
checkpoint.Call(2);
ASSERT_TRUE(client);
client->didGetReadable();
checkpoint.Call(3);
fetchDataLoader->cancel();
checkpoint.Call(4);
}
TEST(FetchDataLoaderTest, LoadAsBlobCancel)
{
Checkpoint checkpoint;
OwnPtr<MockHandle> handle = MockHandle::create();
OwnPtr<MockReader> reader = MockReader::create();
FetchDataLoader* fetchDataLoader = FetchDataLoader::createLoaderAsBlobHandle("text/test");
MockFetchDataLoaderClient* fetchDataLoaderClient = MockFetchDataLoaderClient::create();
InSequence s;
EXPECT_CALL(checkpoint, Call(1));
EXPECT_CALL(*handle, obtainReaderInternal(_)).WillOnce(Return(reader.get()));
EXPECT_CALL(*reader, drainAsBlobDataHandle(kDisallowBlobWithInvalidSize)).WillOnce(Return(nullptr));
EXPECT_CALL(checkpoint, Call(2));
EXPECT_CALL(*reader, destruct());
EXPECT_CALL(checkpoint, Call(3));
// |reader| is adopted by |obtainReader|.
ASSERT_TRUE(reader.leakPtr());
checkpoint.Call(1);
fetchDataLoader->start(handle.get(), fetchDataLoaderClient);
checkpoint.Call(2);
fetchDataLoader->cancel();
checkpoint.Call(3);
}
TEST(FetchDataLoaderTest, LoadAsBlobViaDrainAsBlobDataHandleWithSameContentType)
{
OwnPtr<BlobData> blobData = BlobData::create();
blobData->appendBytes(kQuickBrownFox, kQuickBrownFoxLengthWithTerminatingNull);
blobData->setContentType("text/test");
RefPtr<BlobDataHandle> inputBlobDataHandle = BlobDataHandle::create(blobData.release(), kQuickBrownFoxLengthWithTerminatingNull);
Checkpoint checkpoint;
OwnPtr<MockHandle> handle = MockHandle::create();
OwnPtr<MockReader> reader = MockReader::create();
FetchDataLoader* fetchDataLoader = FetchDataLoader::createLoaderAsBlobHandle("text/test");
MockFetchDataLoaderClient* fetchDataLoaderClient = MockFetchDataLoaderClient::create();
RefPtr<BlobDataHandle> blobDataHandle;
InSequence s;
EXPECT_CALL(checkpoint, Call(1));
EXPECT_CALL(*handle, obtainReaderInternal(_)).WillOnce(Return(reader.get()));
EXPECT_CALL(*reader, drainAsBlobDataHandle(kDisallowBlobWithInvalidSize)).WillOnce(Return(inputBlobDataHandle));
EXPECT_CALL(*reader, destruct());
EXPECT_CALL(*fetchDataLoaderClient, didFetchDataLoadedBlobHandleMock(_)).WillOnce(SaveArg<0>(&blobDataHandle));
EXPECT_CALL(checkpoint, Call(2));
EXPECT_CALL(checkpoint, Call(3));
// |reader| is adopted by |obtainReader|.
ASSERT_TRUE(reader.leakPtr());
checkpoint.Call(1);
fetchDataLoader->start(handle.get(), fetchDataLoaderClient);
checkpoint.Call(2);
fetchDataLoader->cancel();
checkpoint.Call(3);
ASSERT_TRUE(blobDataHandle);
EXPECT_EQ(inputBlobDataHandle, blobDataHandle);
EXPECT_EQ(kQuickBrownFoxLengthWithTerminatingNull, blobDataHandle->size());
EXPECT_EQ(String("text/test"), blobDataHandle->type());
}
TEST(FetchDataLoaderTest, LoadAsBlobViaDrainAsBlobDataHandleWithDifferentContentType)
{
OwnPtr<BlobData> blobData = BlobData::create();
blobData->appendBytes(kQuickBrownFox, kQuickBrownFoxLengthWithTerminatingNull);
blobData->setContentType("text/different");
RefPtr<BlobDataHandle> inputBlobDataHandle = BlobDataHandle::create(blobData.release(), kQuickBrownFoxLengthWithTerminatingNull);
Checkpoint checkpoint;
OwnPtr<MockHandle> handle = MockHandle::create();
OwnPtr<MockReader> reader = MockReader::create();
FetchDataLoader* fetchDataLoader = FetchDataLoader::createLoaderAsBlobHandle("text/test");
MockFetchDataLoaderClient* fetchDataLoaderClient = MockFetchDataLoaderClient::create();
RefPtr<BlobDataHandle> blobDataHandle;
InSequence s;
EXPECT_CALL(checkpoint, Call(1));
EXPECT_CALL(*handle, obtainReaderInternal(_)).WillOnce(Return(reader.get()));
EXPECT_CALL(*reader, drainAsBlobDataHandle(kDisallowBlobWithInvalidSize)).WillOnce(Return(inputBlobDataHandle));
EXPECT_CALL(*reader, destruct());
EXPECT_CALL(*fetchDataLoaderClient, didFetchDataLoadedBlobHandleMock(_)).WillOnce(SaveArg<0>(&blobDataHandle));
EXPECT_CALL(checkpoint, Call(2));
EXPECT_CALL(checkpoint, Call(3));
// |reader| is adopted by |obtainReader|.
ASSERT_TRUE(reader.leakPtr());
checkpoint.Call(1);
fetchDataLoader->start(handle.get(), fetchDataLoaderClient);
checkpoint.Call(2);
fetchDataLoader->cancel();
checkpoint.Call(3);
ASSERT_TRUE(blobDataHandle);
EXPECT_NE(inputBlobDataHandle, blobDataHandle);
EXPECT_EQ(kQuickBrownFoxLengthWithTerminatingNull, blobDataHandle->size());
EXPECT_EQ(String("text/test"), blobDataHandle->type());
}
TEST(FetchDataLoaderTest, LoadAsArrayBuffer)
{
WebDataConsumerHandle::Client *client = nullptr;
Checkpoint checkpoint;
OwnPtr<MockHandle> handle = MockHandle::create();
OwnPtr<MockReader> reader = MockReader::create();
FetchDataLoader* fetchDataLoader = FetchDataLoader::createLoaderAsArrayBuffer();
MockFetchDataLoaderClient* fetchDataLoaderClient = MockFetchDataLoaderClient::create();
DOMArrayBuffer* arrayBuffer = nullptr;
InSequence s;
EXPECT_CALL(checkpoint, Call(1));
EXPECT_CALL(*handle, obtainReaderInternal(_)).WillOnce(DoAll(SaveArg<0>(&client), Return(reader.get())));
EXPECT_CALL(checkpoint, Call(2));
EXPECT_CALL(*reader, beginRead(_, kNone, _)).WillOnce(DoAll(SetArgPointee<0>(static_cast<const void*>(kQuickBrownFox)), SetArgPointee<2>(kQuickBrownFoxLengthWithTerminatingNull), Return(kOk)));
EXPECT_CALL(*reader, endRead(kQuickBrownFoxLengthWithTerminatingNull)).WillOnce(Return(kOk));
EXPECT_CALL(*reader, beginRead(_, kNone, _)).WillOnce(Return(kDone));
EXPECT_CALL(*reader, destruct());
EXPECT_CALL(*fetchDataLoaderClient, didFetchDataLoadedArrayBufferMock(_)).WillOnce(SaveArg<0>(&arrayBuffer));
EXPECT_CALL(checkpoint, Call(3));
EXPECT_CALL(checkpoint, Call(4));
// |reader| is adopted by |obtainReader|.
ASSERT_TRUE(reader.leakPtr());
checkpoint.Call(1);
fetchDataLoader->start(handle.get(), fetchDataLoaderClient);
checkpoint.Call(2);
ASSERT_TRUE(client);
client->didGetReadable();
checkpoint.Call(3);
fetchDataLoader->cancel();
checkpoint.Call(4);
ASSERT_TRUE(arrayBuffer);
ASSERT_EQ(kQuickBrownFoxLengthWithTerminatingNull, arrayBuffer->byteLength());
EXPECT_STREQ(kQuickBrownFox, static_cast<const char*>(arrayBuffer->data()));
}
TEST(FetchDataLoaderTest, LoadAsArrayBufferFailed)
{
WebDataConsumerHandle::Client *client = nullptr;
Checkpoint checkpoint;
OwnPtr<MockHandle> handle = MockHandle::create();
OwnPtr<MockReader> reader = MockReader::create();
FetchDataLoader* fetchDataLoader = FetchDataLoader::createLoaderAsArrayBuffer();
MockFetchDataLoaderClient* fetchDataLoaderClient = MockFetchDataLoaderClient::create();
InSequence s;
EXPECT_CALL(checkpoint, Call(1));
EXPECT_CALL(*handle, obtainReaderInternal(_)).WillOnce(DoAll(SaveArg<0>(&client), Return(reader.get())));
EXPECT_CALL(checkpoint, Call(2));
EXPECT_CALL(*reader, beginRead(_, kNone, _)).WillOnce(DoAll(SetArgPointee<0>(static_cast<const void*>(kQuickBrownFox)), SetArgPointee<2>(kQuickBrownFoxLengthWithTerminatingNull), Return(kOk)));
EXPECT_CALL(*reader, endRead(kQuickBrownFoxLengthWithTerminatingNull)).WillOnce(Return(kOk));
EXPECT_CALL(*reader, beginRead(_, kNone, _)).WillOnce(Return(kUnexpectedError));
EXPECT_CALL(*reader, destruct());
EXPECT_CALL(*fetchDataLoaderClient, didFetchDataLoadFailed());
EXPECT_CALL(checkpoint, Call(3));
EXPECT_CALL(checkpoint, Call(4));
// |reader| is adopted by |obtainReader|.
ASSERT_TRUE(reader.leakPtr());
checkpoint.Call(1);
fetchDataLoader->start(handle.get(), fetchDataLoaderClient);
checkpoint.Call(2);
ASSERT_TRUE(client);
client->didGetReadable();
checkpoint.Call(3);
fetchDataLoader->cancel();
checkpoint.Call(4);
}
TEST(FetchDataLoaderTest, LoadAsArrayBufferCancel)
{
Checkpoint checkpoint;
OwnPtr<MockHandle> handle = MockHandle::create();
OwnPtr<MockReader> reader = MockReader::create();
FetchDataLoader* fetchDataLoader = FetchDataLoader::createLoaderAsArrayBuffer();
MockFetchDataLoaderClient* fetchDataLoaderClient = MockFetchDataLoaderClient::create();
InSequence s;
EXPECT_CALL(checkpoint, Call(1));
EXPECT_CALL(*handle, obtainReaderInternal(_)).WillOnce(Return(reader.get()));
EXPECT_CALL(checkpoint, Call(2));
EXPECT_CALL(*reader, destruct());
EXPECT_CALL(checkpoint, Call(3));
// |reader| is adopted by |obtainReader|.
ASSERT_TRUE(reader.leakPtr());
checkpoint.Call(1);
fetchDataLoader->start(handle.get(), fetchDataLoaderClient);
checkpoint.Call(2);
fetchDataLoader->cancel();
checkpoint.Call(3);
}
TEST(FetchDataLoaderTest, LoadAsString)
{
WebDataConsumerHandle::Client *client = nullptr;
Checkpoint checkpoint;
OwnPtr<MockHandle> handle = MockHandle::create();
OwnPtr<MockReader> reader = MockReader::create();
FetchDataLoader* fetchDataLoader = FetchDataLoader::createLoaderAsString();
MockFetchDataLoaderClient* fetchDataLoaderClient = MockFetchDataLoaderClient::create();
InSequence s;
EXPECT_CALL(checkpoint, Call(1));
EXPECT_CALL(*handle, obtainReaderInternal(_)).WillOnce(DoAll(SaveArg<0>(&client), Return(reader.get())));
EXPECT_CALL(checkpoint, Call(2));
EXPECT_CALL(*reader, beginRead(_, kNone, _)).WillOnce(DoAll(SetArgPointee<0>(static_cast<const void*>(kQuickBrownFox)), SetArgPointee<2>(kQuickBrownFoxLength), Return(kOk)));
EXPECT_CALL(*reader, endRead(kQuickBrownFoxLength)).WillOnce(Return(kOk));
EXPECT_CALL(*reader, beginRead(_, kNone, _)).WillOnce(Return(kDone));
EXPECT_CALL(*reader, destruct());
EXPECT_CALL(*fetchDataLoaderClient, didFetchDataLoadedString(String(kQuickBrownFox)));
EXPECT_CALL(checkpoint, Call(3));
EXPECT_CALL(checkpoint, Call(4));
// |reader| is adopted by |obtainReader|.
ASSERT_TRUE(reader.leakPtr());
checkpoint.Call(1);
fetchDataLoader->start(handle.get(), fetchDataLoaderClient);
checkpoint.Call(2);
ASSERT_TRUE(client);
client->didGetReadable();
checkpoint.Call(3);
fetchDataLoader->cancel();
checkpoint.Call(4);
}
TEST(FetchDataLoaderTest, LoadAsStringWithNullBytes)
{
WebDataConsumerHandle::Client *client = nullptr;
Checkpoint checkpoint;
OwnPtr<MockHandle> handle = MockHandle::create();
OwnPtr<MockReader> reader = MockReader::create();
FetchDataLoader* fetchDataLoader = FetchDataLoader::createLoaderAsString();
MockFetchDataLoaderClient* fetchDataLoaderClient = MockFetchDataLoaderClient::create();
InSequence s;
EXPECT_CALL(checkpoint, Call(1));
EXPECT_CALL(*handle, obtainReaderInternal(_)).WillOnce(DoAll(SaveArg<0>(&client), Return(reader.get())));
EXPECT_CALL(checkpoint, Call(2));
EXPECT_CALL(*reader, beginRead(_, kNone, _)).WillOnce(DoAll(SetArgPointee<0>(static_cast<const void*>("Quick\0brown\0fox")), SetArgPointee<2>(16), Return(kOk)));
EXPECT_CALL(*reader, endRead(kQuickBrownFoxLengthWithTerminatingNull)).WillOnce(Return(kOk));
EXPECT_CALL(*reader, beginRead(_, kNone, _)).WillOnce(Return(kDone));
EXPECT_CALL(*reader, destruct());
EXPECT_CALL(*fetchDataLoaderClient, didFetchDataLoadedString(String("Quick\0brown\0fox", 16)));
EXPECT_CALL(checkpoint, Call(3));
EXPECT_CALL(checkpoint, Call(4));
// |reader| is adopted by |obtainReader|.
ASSERT_TRUE(reader.leakPtr());
checkpoint.Call(1);
fetchDataLoader->start(handle.get(), fetchDataLoaderClient);
checkpoint.Call(2);
ASSERT_TRUE(client);
client->didGetReadable();
checkpoint.Call(3);
fetchDataLoader->cancel();
checkpoint.Call(4);
}
TEST(FetchDataLoaderTest, LoadAsStringError)
{
WebDataConsumerHandle::Client *client = nullptr;
Checkpoint checkpoint;
OwnPtr<MockHandle> handle = MockHandle::create();
OwnPtr<MockReader> reader = MockReader::create();
FetchDataLoader* fetchDataLoader = FetchDataLoader::createLoaderAsString();
MockFetchDataLoaderClient* fetchDataLoaderClient = MockFetchDataLoaderClient::create();
InSequence s;
EXPECT_CALL(checkpoint, Call(1));
EXPECT_CALL(*handle, obtainReaderInternal(_)).WillOnce(DoAll(SaveArg<0>(&client), Return(reader.get())));
EXPECT_CALL(checkpoint, Call(2));
EXPECT_CALL(*reader, beginRead(_, kNone, _)).WillOnce(DoAll(SetArgPointee<0>(static_cast<const void*>(kQuickBrownFox)), SetArgPointee<2>(kQuickBrownFoxLength), Return(kOk)));
EXPECT_CALL(*reader, endRead(kQuickBrownFoxLength)).WillOnce(Return(kOk));
EXPECT_CALL(*reader, beginRead(_, kNone, _)).WillOnce(Return(kUnexpectedError));
EXPECT_CALL(*reader, destruct());
EXPECT_CALL(*fetchDataLoaderClient, didFetchDataLoadFailed());
EXPECT_CALL(checkpoint, Call(3));
EXPECT_CALL(checkpoint, Call(4));
// |reader| is adopted by |obtainReader|.
ASSERT_TRUE(reader.leakPtr());
checkpoint.Call(1);
fetchDataLoader->start(handle.get(), fetchDataLoaderClient);
checkpoint.Call(2);
ASSERT_TRUE(client);
client->didGetReadable();
checkpoint.Call(3);
fetchDataLoader->cancel();
checkpoint.Call(4);
}
TEST(FetchDataLoaderTest, LoadAsStringCancel)
{
Checkpoint checkpoint;
OwnPtr<MockHandle> handle = MockHandle::create();
OwnPtr<MockReader> reader = MockReader::create();
FetchDataLoader* fetchDataLoader = FetchDataLoader::createLoaderAsString();
MockFetchDataLoaderClient* fetchDataLoaderClient = MockFetchDataLoaderClient::create();
InSequence s;
EXPECT_CALL(checkpoint, Call(1));
EXPECT_CALL(*handle, obtainReaderInternal(_)).WillOnce(Return(reader.get()));
EXPECT_CALL(checkpoint, Call(2));
EXPECT_CALL(*reader, destruct());
EXPECT_CALL(checkpoint, Call(3));
// |reader| is adopted by |obtainReader|.
ASSERT_TRUE(reader.leakPtr());
checkpoint.Call(1);
fetchDataLoader->start(handle.get(), fetchDataLoaderClient);
checkpoint.Call(2);
fetchDataLoader->cancel();
checkpoint.Call(3);
}
} // namespace
} // namespace blink