blob: c6505181f2bfc6f29a1be84bfbe03c4d5b175acf [file] [log] [blame]
// Copyright 2020 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 "third_party/blink/renderer/platform/loader/fetch/fetch_api_request_body_mojom_traits.h"
#include "base/test/task_environment.h"
#include "mojo/public/cpp/base/file_mojom_traits.h"
#include "mojo/public/cpp/base/file_path_mojom_traits.h"
#include "mojo/public/cpp/bindings/array_traits_wtf_vector.h"
#include "mojo/public/cpp/test_support/test_utils.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h"
#include "third_party/blink/public/platform/file_path_conversion.h"
#include "third_party/blink/renderer/platform/blob/blob_data.h"
#include "third_party/blink/renderer/platform/loader/fetch/resource_request.h"
#include "third_party/blink/renderer/platform/network/form_data_encoder.h"
#include "third_party/blink/renderer/platform/network/wrapped_data_pipe_getter.h"
namespace blink {
namespace {
class FetchApiRequestBodyMojomTraitsTest : public testing::Test {
protected:
base::test::TaskEnvironment task_environment_;
};
TEST_F(FetchApiRequestBodyMojomTraitsTest, RoundTripEmpty) {
ResourceRequestBody src;
ResourceRequestBody dest;
EXPECT_TRUE(mojo::test::SerializeAndDeserialize<
blink::mojom::blink::FetchAPIRequestBody>(src, dest));
EXPECT_TRUE(dest.IsEmpty());
}
TEST_F(FetchApiRequestBodyMojomTraitsTest, RoundTripBytes) {
ResourceRequestBody src(EncodedFormData::Create());
src.FormBody()->AppendData("hello", 5);
src.FormBody()->SetIdentifier(29);
src.FormBody()->SetContainsPasswordData(true);
ResourceRequestBody dest;
EXPECT_TRUE(mojo::test::SerializeAndDeserialize<
blink::mojom::blink::FetchAPIRequestBody>(src, dest));
ASSERT_TRUE(dest.FormBody());
EXPECT_EQ(dest.FormBody()->Identifier(), 29);
EXPECT_TRUE(dest.FormBody()->ContainsPasswordData());
ASSERT_EQ(1u, dest.FormBody()->Elements().size());
const FormDataElement& e = dest.FormBody()->Elements()[0];
EXPECT_EQ(e.type_, FormDataElement::kData);
EXPECT_EQ("hello", String(e.data_.data(), e.data_.size()));
}
TEST_F(FetchApiRequestBodyMojomTraitsTest, RoundTripFile) {
ResourceRequestBody src(EncodedFormData::Create());
const base::Time now = base::Time::Now();
src.FormBody()->AppendFile("file.name", now);
ResourceRequestBody dest;
EXPECT_TRUE(mojo::test::SerializeAndDeserialize<
blink::mojom::blink::FetchAPIRequestBody>(src, dest));
ASSERT_TRUE(dest.FormBody());
ASSERT_EQ(1u, dest.FormBody()->Elements().size());
const FormDataElement& e = dest.FormBody()->Elements()[0];
EXPECT_EQ(e.type_, FormDataElement::kEncodedFile);
EXPECT_EQ(e.filename_, "file.name");
EXPECT_EQ(e.file_start_, 0);
EXPECT_EQ(e.file_length_, BlobData::kToEndOfFile);
EXPECT_EQ(e.expected_file_modification_time_, now);
}
TEST_F(FetchApiRequestBodyMojomTraitsTest, RoundTripFileRange) {
ResourceRequestBody src(EncodedFormData::Create());
src.FormBody()->AppendFileRange("abc", 4, 8, base::nullopt);
ResourceRequestBody dest;
EXPECT_TRUE(mojo::test::SerializeAndDeserialize<
blink::mojom::blink::FetchAPIRequestBody>(src, dest));
ASSERT_TRUE(dest.FormBody());
ASSERT_EQ(1u, dest.FormBody()->Elements().size());
const FormDataElement& e = dest.FormBody()->Elements()[0];
EXPECT_EQ(e.type_, FormDataElement::kEncodedFile);
EXPECT_EQ(e.filename_, "abc");
EXPECT_EQ(e.file_start_, 4);
EXPECT_EQ(e.file_length_, 8);
EXPECT_EQ(e.expected_file_modification_time_, base::nullopt);
}
TEST_F(FetchApiRequestBodyMojomTraitsTest, RoundTripBlobWithOpionalHandle) {
ResourceRequestBody src(EncodedFormData::Create());
mojo::MessagePipe pipe;
String uuid = "test_uuid";
auto blob_data_handle = BlobDataHandle::Create(
uuid, "type-test", 100,
mojo::PendingRemote<mojom::blink::Blob>(std::move(pipe.handle0), 0));
src.FormBody()->AppendBlob(uuid, blob_data_handle);
ResourceRequestBody dest;
EXPECT_TRUE(mojo::test::SerializeAndDeserialize<
blink::mojom::blink::FetchAPIRequestBody>(src, dest));
ASSERT_TRUE(dest.FormBody());
ASSERT_EQ(1u, dest.FormBody()->Elements().size());
const FormDataElement& e = dest.FormBody()->Elements()[0];
EXPECT_EQ(e.type_, FormDataElement::kDataPipe);
EXPECT_EQ(e.blob_uuid_, String());
EXPECT_TRUE(e.data_pipe_getter_);
}
TEST_F(FetchApiRequestBodyMojomTraitsTest, RoundTripDataPipeGetter) {
ResourceRequestBody src(EncodedFormData::Create());
mojo::PendingRemote<network::mojom::blink::DataPipeGetter> data_pipe_getter;
ignore_result(data_pipe_getter.InitWithNewPipeAndPassReceiver());
src.FormBody()->AppendDataPipe(
base::MakeRefCounted<blink::WrappedDataPipeGetter>(
std::move(data_pipe_getter)));
ResourceRequestBody dest;
EXPECT_TRUE(mojo::test::SerializeAndDeserialize<
blink::mojom::blink::FetchAPIRequestBody>(src, dest));
ASSERT_TRUE(dest.FormBody());
ASSERT_EQ(1u, dest.FormBody()->Elements().size());
const FormDataElement& e = dest.FormBody()->Elements()[0];
EXPECT_EQ(e.type_, FormDataElement::kDataPipe);
EXPECT_TRUE(e.data_pipe_getter_);
}
TEST_F(FetchApiRequestBodyMojomTraitsTest, RoundTripStreamBody) {
mojo::PendingRemote<network::mojom::blink::ChunkedDataPipeGetter>
chunked_data_pipe_getter;
ignore_result(chunked_data_pipe_getter.InitWithNewPipeAndPassReceiver());
ResourceRequestBody src(std::move(chunked_data_pipe_getter));
ResourceRequestBody dest;
EXPECT_TRUE(mojo::test::SerializeAndDeserialize<
blink::mojom::blink::FetchAPIRequestBody>(src, dest));
EXPECT_FALSE(dest.FormBody());
ASSERT_TRUE(dest.StreamBody());
}
} // namespace
} // namespace blink