hessian2/basic_codec/byte_codec_unittests.cc (223 lines of code) (raw):

#include <iostream> #include <type_traits> #include "gtest/gtest.h" #include "hessian2/basic_codec/byte_codec.hpp" #include "hessian2/test_framework/decoder_test_framework.h" #include "hessian2/test_framework/encoder_test_framework.h" namespace Hessian2 { class ByteCodecTest : public testing::Test { public: void decodeSucc(absl::string_view data, std::vector<uint8_t> out, size_t size) { Hessian2::Decoder decoder(data); std::unique_ptr<std::vector<uint8_t>> output = decoder.decode<std::vector<uint8_t>>(); EXPECT_EQ(out.size(), output->size()); EXPECT_EQ(out, *output); EXPECT_EQ(size, decoder.offset()); } void decodeFail(absl::string_view data) { Hessian2::Decoder decoder(data); auto output = decoder.decode<std::vector<uint8_t>>(); EXPECT_EQ(nullptr, output); } void encodeSucc(std::vector<uint8_t> data, size_t size, std::string expected_data = "") { std::string res; Hessian2::Encoder encoder(res); encoder.encode<std::vector<uint8_t>>(data); if (!expected_data.empty()) { EXPECT_EQ(expected_data, res); } decodeSucc(res, data, size); } }; TEST_F(TestDecoderFramework, DecoderJavaTestCaseForByte) { { EXPECT_TRUE( Decode<std::vector<uint8_t>>("replyBinary_0", std::vector<uint8_t>{})); } { EXPECT_TRUE(Decode<std::vector<uint8_t>>("replyBinary_1", std::vector<uint8_t>{'0'})); } { std::string str("012345678901234"); std::vector<uint8_t> vec(str.begin(), str.end()); EXPECT_TRUE(Decode<std::vector<uint8_t>>("replyBinary_15", vec)); } { std::string str("0123456789012345"); std::vector<uint8_t> vec(str.begin(), str.end()); EXPECT_TRUE(Decode<std::vector<uint8_t>>("replyBinary_16", vec)); } { std::string str; for (int i = 0; i < 16; ++i) { str.append(std::to_string(i / 10)); str.append(std::to_string(i % 10)); str.append( " 456789012345678901234567890123456789012345678901234567890123\n"); } str.resize(1023); std::vector<uint8_t> vec(str.begin(), str.end()); EXPECT_TRUE(Decode<std::vector<uint8_t>>("replyBinary_1023", vec)); } { std::string str; for (int i = 0; i < 16; ++i) { str.append(std::to_string(i / 10)); str.append(std::to_string(i % 10)); str.append( " 456789012345678901234567890123456789012345678901234567890123\n"); } str.resize(1024); std::vector<uint8_t> vec(str.begin(), str.end()); EXPECT_TRUE(Decode<std::vector<uint8_t>>("replyBinary_1024", vec)); } { std::string str; for (int i = 0; i < 1024; ++i) { str.append(std::to_string(i / 100)); str.append(std::to_string((i / 10) % 10)); str.append(std::to_string(i % 10)); str.append( " 56789012345678901234567890123456789012345678901234567890123\n"); } str.resize(65536); std::vector<uint8_t> vec(str.begin(), str.end()); EXPECT_TRUE(Decode<std::vector<uint8_t>>("replyBinary_65536", vec)); } } TEST_F(TestEncoderFramework, EncoderJavaTestCaseForByte) { { EXPECT_TRUE( Encode<std::vector<uint8_t>>("argBinary_0", std::vector<uint8_t>{})); } { EXPECT_TRUE( Encode<std::vector<uint8_t>>("argBinary_1", std::vector<uint8_t>{'0'})); } { std::string str("012345678901234"); std::vector<uint8_t> vec(str.begin(), str.end()); EXPECT_TRUE(Encode<std::vector<uint8_t>>("argBinary_15", vec)); } { std::string str("0123456789012345"); std::vector<uint8_t> vec(str.begin(), str.end()); EXPECT_TRUE(Encode<std::vector<uint8_t>>("argBinary_16", vec)); } { std::string str; for (int i = 0; i < 16; ++i) { str.append(std::to_string(i / 10)); str.append(std::to_string(i % 10)); str.append( " 456789012345678901234567890123456789012345678901234567890123\n"); } str.resize(1023); std::vector<uint8_t> vec(str.begin(), str.end()); EXPECT_TRUE(Encode<std::vector<uint8_t>>("argBinary_1023", vec)); } { std::string str; for (int i = 0; i < 16; ++i) { str.append(std::to_string(i / 10)); str.append(std::to_string(i % 10)); str.append( " 456789012345678901234567890123456789012345678901234567890123\n"); } str.resize(1024); std::vector<uint8_t> vec(str.begin(), str.end()); EXPECT_TRUE(Encode<std::vector<uint8_t>>("argBinary_1024", vec)); } { std::string str; for (int i = 0; i < 1024; ++i) { str.append(std::to_string(i / 100)); str.append(std::to_string((i / 10) % 10)); str.append(std::to_string(i % 10)); str.append( " 56789012345678901234567890123456789012345678901234567890123\n"); } str.resize(65536); std::vector<uint8_t> vec(str.begin(), str.end()); EXPECT_TRUE(Encode<std::vector<uint8_t>>("argBinary_65536", vec)); } } TEST_F(ByteCodecTest, Decode) { // Insufficient Data { std::string data; decodeFail(data); } { std::string data{0x41}; decodeFail(data); } { std::string data{0x42}; decodeFail(data); } { std::string data{0x19}; decodeFail(data); } { for (uint8_t i = 0x21; i <= 0xef; ++i) { std::string data{static_cast<int8_t>(i)}; decodeFail(data); } for (uint8_t i = 0x34; i <= 0x37; ++i) { std::string data{static_cast<int8_t>(i)}; decodeFail(data); } } { std::string data{0x20}; decodeSucc(data, std::vector<uint8_t>{}, 1); } { std::string data{0x23, 0x01, 0x02, 0x03}; decodeSucc(data, std::vector<uint8_t>{1, 2, 3}, 4); } { std::vector<uint8_t> expect_output; std::string expect_string = {0x37, 0x10}; expect_string.append(std::string(784, 't')); expect_output.insert(expect_output.begin(), expect_string.begin() + 2, expect_string.end()); decodeSucc(expect_string, expect_output, 786); } { std::vector<uint8_t> expect_output; unsigned char buf[] = {0x37, 0xFF}; std::string expect_string(reinterpret_cast<char *>(&buf), 2); expect_string.append(std::string(1023, 't')); expect_output.insert(expect_output.begin(), expect_string.begin() + 2, expect_string.end()); decodeSucc(expect_string, expect_output, 1025); } { std::vector<uint8_t> expect_output; std::string expect_string = {0x42, 0x10, 0x00}; expect_string.append(std::string(4096, 't')); expect_output.insert(expect_output.begin(), expect_string.begin() + 3, expect_string.end()); decodeSucc(expect_string, expect_output, 4099); } } TEST_F(ByteCodecTest, encode) { { std::string expect_string{0x23, 0x01, 0x02, 0x03}; encodeSucc(std::vector<uint8_t>{0x01, 0x02, 0x03}, 4, expect_string); } { std::vector<uint8_t> data; std::string expect_string = {0x37, 0x10}; expect_string.append(std::string(784, 't')); data.insert(data.begin(), expect_string.begin() + 2, expect_string.end()); encodeSucc(data, 786, expect_string); } } } // namespace Hessian2