#include "test_utils/codec.hpp" #include #include #include #include #include #include #include #include #include namespace test_utils { template static EncodingResult encode(int (*encode_func)(exi_bitstream_t*, DocType*), const DocType& request, const uint8_t* compare_data, std::size_t length) { // FIXME (aw): what general size to take here? uint8_t stream[256] = {}; exi_bitstream_t exi_stream_in; size_t pos1 = 0; exi_bitstream_init(&exi_stream_in, stream, sizeof(stream), pos1, nullptr); if (0 != encode_func(&exi_stream_in, const_cast(&request))) { return {false, false}; } const auto encoded_stream = std::vector(stream, stream + exi_bitstream_get_length(&exi_stream_in)); const auto expected_exi_stream = std::vector(compare_data, compare_data + length); return {true, encoded_stream == expected_exi_stream}; } template DecodingResult decode(int (*decode_func)(exi_bitstream_t*, DocType*), const uint8_t* raw_data, std::size_t length) { exi_bitstream_t exi_stream_in; size_t pos1 = 0; exi_bitstream_init(&exi_stream_in, const_cast(raw_data), length, pos1, nullptr); DecodingResult result; result.decoding_successful = (decode_func(&exi_stream_in, &result.value) == 0); return result; } // // app handshake // template <> EncodingResult encode_and_compare(const appHand_exiDocument& request, const uint8_t* compare_data, std::size_t length) { return encode(&encode_appHand_exiDocument, request, compare_data, length); } template <> DecodingResult decode(const uint8_t* raw_data, std::size_t length) { return decode(&decode_appHand_exiDocument, raw_data, length); } // // din // template <> EncodingResult encode_and_compare(const din_exiDocument& request, const uint8_t* compare_data, std::size_t length) { return encode(&encode_din_exiDocument, request, compare_data, length); } template <> DecodingResult decode(const uint8_t* raw_data, std::size_t length) { return decode(&decode_din_exiDocument, raw_data, length); } // // iso20 ac // template <> EncodingResult encode_and_compare(const iso20_ac_exiDocument& request, const uint8_t* compare_data, std::size_t length) { return encode(&encode_iso20_ac_exiDocument, request, compare_data, length); } template <> DecodingResult decode(const uint8_t* raw_data, std::size_t length) { return decode(&decode_iso20_ac_exiDocument, raw_data, length); } // // iso20 dc // template <> EncodingResult encode_and_compare(const iso20_dc_exiDocument& request, const uint8_t* compare_data, std::size_t length) { return encode(&encode_iso20_dc_exiDocument, request, compare_data, length); } template <> DecodingResult decode(const uint8_t* raw_data, std::size_t length) { return decode(&decode_iso20_dc_exiDocument, raw_data, length); } } // namespace test_utils