blob: e615d3563b9d5d0d24ad8290e29a747c6c242d05 [file] [log] [blame] [edit]
#include <lib/fidl/internal.h>
#include <iostream>
#include "gtest/gtest.h"
#include "lib/fidl/cpp/clone.h"
namespace fidl {
namespace test {
namespace util {
bool cmp_payload(const uint8_t* actual, size_t actual_size, const uint8_t* expected,
size_t expected_size);
template <class Output, class Input>
Output RoundTrip(const Input& input) {
const size_t input_encoded_size = CodingTraits<Input>::encoded_size;
const size_t input_padding_size = FIDL_ALIGN(input_encoded_size) - input_encoded_size;
const ::fidl::FidlStructField fake_input_interface_fields[] = {
::fidl::FidlStructField(Input::FidlType, 16, input_padding_size),
};
const fidl_type_t fake_input_interface_struct{
::fidl::FidlCodedStruct(fake_input_interface_fields, 1, 16 + input_encoded_size, "Input")};
const size_t output_encoded_size = CodingTraits<Input>::encoded_size;
const size_t output_padding_size = FIDL_ALIGN(output_encoded_size) - output_encoded_size;
const ::fidl::FidlStructField fake_output_interface_fields[] = {
::fidl::FidlStructField(Output::FidlType, 16, output_padding_size),
};
const fidl_type_t fake_output_interface_struct{
::fidl::FidlCodedStruct(fake_output_interface_fields, 1, 16 + output_encoded_size, "Output")};
fidl::Encoder enc(0xfefefefe);
auto ofs = enc.Alloc(input_encoded_size);
fidl::Clone(input).Encode(&enc, ofs);
auto msg = enc.GetMessage();
const char* err_msg = nullptr;
EXPECT_EQ(ZX_OK, msg.Validate(&fake_input_interface_struct, &err_msg)) << err_msg;
EXPECT_EQ(ZX_OK, msg.Decode(&fake_output_interface_struct, &err_msg)) << err_msg;
fidl::Decoder dec(std::move(msg));
Output output;
Output::Decode(&dec, &output, ofs);
return output;
}
template <class Output>
Output DecodedBytes(std::vector<uint8_t> input) {
Message message(BytePart(input.data(), input.capacity(), input.size()), HandlePart());
const char* error = nullptr;
EXPECT_EQ(ZX_OK, message.Decode(Output::FidlType, &error)) << error;
fidl::Decoder decoder(std::move(message));
Output output;
Output::Decode(&decoder, &output, 0);
return output;
}
template <class Input>
bool ValueToBytes(const Input& input, const std::vector<uint8_t>& expected) {
fidl::Encoder enc(0xfefefefe);
auto offset = enc.Alloc(CodingTraits<Input>::encoded_size);
fidl::Clone(input).Encode(&enc, offset);
auto msg = enc.GetMessage();
auto payload = msg.payload();
return cmp_payload(reinterpret_cast<const uint8_t*>(payload.data()), payload.actual(),
reinterpret_cast<const uint8_t*>(expected.data()), expected.size());
}
} // namespace util
} // namespace test
} // namespace fidl