hessian2/basic_codec/def_ref_codec_unittests.cc (79 lines of code) (raw):
#include <iostream>
#include <type_traits>
#include "gtest/gtest.h"
#include "hessian2/basic_codec/def_ref_codec.hpp"
#include "hessian2/object.hpp"
namespace Hessian2 {
class DefinitionTest : public testing::Test {
public:
void decodeSucc(absl::string_view data, Object::Definition out) {
Hessian2::Decoder decoder(data);
auto output = decoder.decode<Object::Definition>();
EXPECT_EQ(out, *output);
EXPECT_EQ(1, decoder.offset());
}
void decodeFail(absl::string_view data) {
Hessian2::Decoder decoder(data);
auto output = decoder.decode<Object::Definition>();
EXPECT_EQ(nullptr, output);
}
};
// Insufficient Data
TEST_F(DefinitionTest, InsufficientData) {
{
std::string data;
decodeFail(data);
}
{
std::string data{'C'};
decodeFail(data);
}
{
std::string data{'C', 0x05, 'h', 'e'};
decodeFail(data);
}
}
TEST(DefRefCodecTest, Decode) {
{
unsigned char buf[] = {'C', 0x05, 'h', 'e', 'l', 'l', 'o', 0x92,
0x05, 'c', 'o', 'l', 'o', 'r', 0x05, 'm',
'o', 'd', 'e', 'l', 'O', 0x90, 0x60, 0x61};
std::string data(reinterpret_cast<char *>(buf), sizeof(buf));
Hessian2::Decoder decoder(data);
Object::RawDefinition def;
def.type_ = "hello";
def.field_names_.push_back("color");
def.field_names_.push_back("model");
auto output = decoder.decode<Object::Definition>();
EXPECT_EQ(def, *output->data_);
EXPECT_EQ(1, decoder.getDefRefSize());
auto output2 = decoder.decode<Object::Definition>();
EXPECT_EQ(def, *output2->data_);
EXPECT_EQ(output->data_, output2->data_);
EXPECT_EQ(1, decoder.getDefRefSize());
auto output3 = decoder.decode<Object::Definition>();
EXPECT_EQ(def, *output3->data_);
EXPECT_EQ(output3->data_, output2->data_);
EXPECT_EQ(output3->data_, output->data_);
EXPECT_EQ(1, decoder.getDefRefSize());
auto output4 = decoder.decode<Object::Definition>();
EXPECT_TRUE(output4 == nullptr);
}
}
TEST(DefRefCodecTest, encode) {
{
unsigned char buf[] = {'C', 0x05, 'h', 'e', 'l', 'l', 'o',
0x92, 0x05, 'c', 'o', 'l', 'o', 'r',
0x05, 'm', 'o', 'd', 'e', 'l', 0x60};
std::string data(reinterpret_cast<char *>(buf), sizeof(buf));
Object::RawDefinition def;
def.type_ = "hello";
def.field_names_.push_back("color");
def.field_names_.push_back("model");
std::string output;
Hessian2::Encoder encoder(output);
encoder.encode(def);
EXPECT_EQ(1, encoder.getDefRefSize());
EXPECT_EQ(data, output);
}
}
} // namespace Hessian2