hessian2/string_reader_unittests.cc (259 lines of code) (raw):
#include <climits>
#include <vector>
#include "common/common.h"
#include "gtest/gtest.h"
#include "hessian2/reader.hpp"
#include "hessian2/string_reader.hpp"
namespace Hessian2 {
class StringReaderTest : public testing::Test {
public:
void addSeq(std::string buffer, const std::initializer_list<uint8_t> values) {
for (int8_t value : values) {
buffer.push_back(value);
}
}
template <typename T>
void readBE(std::vector<std::pair<T, bool>> &vals) {
for (const auto &val : vals) {
auto out = reader_.readBE<T>();
EXPECT_EQ(std::get<1>(val), out.first);
if (out.first) {
EXPECT_EQ(std::get<0>(val), out.second);
}
}
}
template <typename T>
void readLE(std::vector<std::pair<T, bool>> &vals) {
for (const auto &val : vals) {
auto out = reader_.readLE<T>();
EXPECT_EQ(std::get<1>(val), out.first);
if (out.first) {
EXPECT_EQ(std::get<0>(val), out.second);
}
}
}
StringReader reader_{absl::string_view("")};
};
TEST_F(StringReaderTest, ReadAndPeekI8) {
{
unsigned char buf[] = {0, 1, 0XFE};
absl::string_view buffer(reinterpret_cast<char *>(&buf), 3);
reader_ = StringReader(buffer);
EXPECT_EQ(reader_.peek<int8_t>().second, 0);
EXPECT_EQ(reader_.peek<int8_t>(0).second, 0);
EXPECT_EQ(reader_.peek<int8_t>(1).second, 1);
EXPECT_EQ(reader_.peek<int8_t>(2).second, -2);
EXPECT_EQ(buffer.size(), 3);
std::vector<std::pair<int8_t, bool>> vals = {
{0, true}, {1, true}, {-2, true}, {0, false}};
readBE<int8_t>(vals);
EXPECT_EQ(buffer.size(), 3);
}
{
std::string input;
reader_ = StringReader(input);
std::vector<std::pair<int8_t, bool>> vals = {{0, false}};
EXPECT_EQ(reader_.peek<int8_t>(0).first, false);
readBE<int8_t>(vals);
}
{
std::string input(1, 0x30);
reader_ = StringReader(input);
std::vector<std::pair<int8_t, bool>> vals = {{0x30, true}, {0, false}};
EXPECT_EQ(reader_.peek<int8_t>(0).second, 0x30);
EXPECT_EQ(reader_.peek<int8_t>(1).first, false);
readBE<int8_t>(vals);
}
}
TEST_F(StringReaderTest, ReadAndPeekLEI16) {
{
unsigned char buf[] = {0, 1, 2, 3, 0xFF, 0xFF};
absl::string_view buffer(reinterpret_cast<char *>(&buf), 6);
reader_ = StringReader(buffer);
EXPECT_EQ(reader_.peekLE<int16_t>().second, 0x0100);
EXPECT_EQ(reader_.peekLE<int16_t>(0).second, 0x0100);
EXPECT_EQ(reader_.peekLE<int16_t>(1).second, 0x0201);
EXPECT_EQ(reader_.peekLE<int16_t>(2).second, 0x0302);
EXPECT_EQ(reader_.peekLE<int16_t>(4).second, -1);
EXPECT_EQ(buffer.length(), 6);
std::vector<std::pair<int16_t, bool>> vals = {
{0x0100, true}, {0x0302, true}, {0xFFFF, true}, {0, false}};
readLE<int16_t>(vals);
EXPECT_EQ(buffer.size(), 6);
}
{
std::string input;
reader_ = StringReader(input);
std::vector<std::pair<int16_t, bool>> vals = {{0, false}};
EXPECT_EQ(reader_.peekLE<int16_t>().first, false);
readLE<int16_t>(vals);
}
{
std::string input(2, 0x30);
reader_ = StringReader(input);
std::vector<std::pair<int16_t, bool>> vals = {{0x3030, true}, {0, false}};
EXPECT_EQ(reader_.peek<int16_t>(0).second, 0x3030);
EXPECT_EQ(reader_.peek<int16_t>(1).first, false);
readLE<int16_t>(vals);
}
}
TEST_F(StringReaderTest, ReadAndPeekLEI32) {
{
unsigned char buf[] = {0, 1, 2, 3, 0xFF, 0xFF, 0XFF, 0XFF};
absl::string_view buffer(reinterpret_cast<char *>(&buf), 8);
reader_ = StringReader(buffer);
EXPECT_EQ(reader_.peekLE<int32_t>().second, 0x03020100);
EXPECT_EQ(reader_.peekLE<int32_t>(0).second, 0x03020100);
EXPECT_EQ(reader_.peekLE<int32_t>(1).second, 0xFF030201);
EXPECT_EQ(reader_.peekLE<int32_t>(2).second, 0xFFFF0302);
EXPECT_EQ(reader_.peekLE<int32_t>(4).second, -1);
EXPECT_EQ(buffer.length(), 8);
std::vector<std::pair<int32_t, bool>> vals = {
{0x03020100, true}, {0xFFFFFFFF, true}, {0, false}};
readLE<int32_t>(vals);
EXPECT_EQ(buffer.size(), 8);
}
{
std::string input;
reader_ = StringReader(input);
std::vector<std::pair<int32_t, bool>> vals = {{0, false}};
EXPECT_EQ(reader_.peekLE<int32_t>().first, false);
readLE<int32_t>(vals);
}
{
std::string input(4, 0x30);
reader_ = StringReader(input);
std::vector<std::pair<int32_t, bool>> vals = {{0x30303030, true},
{0, false}};
EXPECT_EQ(reader_.peekLE<int32_t>().second, 0x30303030);
EXPECT_EQ(reader_.peekLE<int32_t>(1).first, false);
readLE<int32_t>(vals);
}
}
TEST_F(StringReaderTest, ReadAndPeekLEI64) {
{
unsigned char buf[] = {0, 1, 2, 3, 4, 5, 6, 7,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
absl::string_view buffer(reinterpret_cast<char *>(&buf), 16);
reader_ = StringReader(buffer);
EXPECT_EQ(reader_.peekLE<int64_t>().second, 0x0706050403020100);
EXPECT_EQ(reader_.peekLE<int64_t>(0).second, 0x0706050403020100);
EXPECT_EQ(reader_.peekLE<int64_t>(1).second, 0xFF07060504030201);
EXPECT_EQ(reader_.peekLE<int64_t>(2).second, 0xFFFF070605040302);
EXPECT_EQ(reader_.peekLE<int64_t>(8).second, -1);
EXPECT_EQ(buffer.length(), 16);
std::vector<std::pair<int64_t, bool>> vals = {
{0x0706050403020100, true}, {-1, true}, {0, false}};
readLE<int64_t>(vals);
EXPECT_EQ(buffer.size(), 16);
}
{
std::string input;
reader_ = StringReader(input);
std::vector<std::pair<int64_t, bool>> vals = {{0, false}};
EXPECT_EQ(reader_.peekLE<int64_t>(0).first, false);
readLE<int64_t>(vals);
}
{
std::string input(8, 0x30);
reader_ = StringReader(input);
std::vector<std::pair<int64_t, bool>> vals = {{0x3030303030303030, true},
{0, false}};
EXPECT_EQ(reader_.peekLE<int64_t>(0).second, 0x3030303030303030);
EXPECT_EQ(reader_.peekLE<int64_t>(1).first, false);
readLE<int64_t>(vals);
}
}
TEST_F(StringReaderTest, ReadAndPeekLEU16) {
{
unsigned char buf[] = {0, 1, 2, 3, 0xFF, 0xFF};
absl::string_view buffer(reinterpret_cast<char *>(&buf), 6);
reader_ = StringReader(buffer);
EXPECT_EQ(reader_.peekLE<uint16_t>().second, 0x0100);
EXPECT_EQ(reader_.peekLE<uint16_t>(0).second, 0x0100);
EXPECT_EQ(reader_.peekLE<uint16_t>(1).second, 0x0201);
EXPECT_EQ(reader_.peekLE<uint16_t>(2).second, 0x0302);
EXPECT_EQ(reader_.peekLE<uint16_t>(4).second, 0xFFFF);
EXPECT_EQ(buffer.length(), 6);
std::vector<std::pair<uint16_t, bool>> vals = {
{0x0100, true}, {0x0302, true}, {0xFFFF, true}, {0, false}};
readLE<uint16_t>(vals);
EXPECT_EQ(buffer.size(), 6);
}
{
std::string input;
reader_ = StringReader(input);
std::vector<std::pair<uint16_t, bool>> vals = {{0, false}};
readBE<uint16_t>(vals);
}
{
std::string input(2, '0');
reader_ = StringReader(input);
std::vector<std::pair<uint16_t, bool>> vals = {{0x3030, true}, {0, false}};
readBE<uint16_t>(vals);
}
}
TEST_F(StringReaderTest, ReadBEU32) {
{
unsigned char buf[] = {0, 1, 2, 3, 0xFF, 0xFF, 0XFF, 0XFF};
absl::string_view buffer(reinterpret_cast<char *>(&buf), 8);
reader_ = StringReader(buffer);
std::vector<std::pair<uint32_t, bool>> vals = {
{0x00010203, true}, {-1, true}, {0, false}};
readBE<uint32_t>(vals);
EXPECT_EQ(buffer.size(), 8);
}
{
std::string input;
reader_ = StringReader(input);
std::vector<std::pair<uint32_t, bool>> vals = {{0, false}};
readBE<uint32_t>(vals);
}
{
std::string input(4, '0');
reader_ = StringReader(input);
std::vector<std::pair<uint32_t, bool>> vals = {{0x30303030, true},
{0, false}};
readBE<uint32_t>(vals);
}
}
TEST_F(StringReaderTest, ReadBEU64) {
{
unsigned char buf[] = {0, 1, 2, 3, 4, 5, 6, 7,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
absl::string_view buffer(reinterpret_cast<char *>(&buf), 16);
reader_ = StringReader(buffer);
std::vector<std::pair<uint64_t, bool>> vals = {
{0x0001020304050607, true}, {-1, true}, {0, false}};
readBE<uint64_t>(vals);
EXPECT_EQ(buffer.size(), 16);
}
{
std::string input;
reader_ = StringReader(input);
std::vector<std::pair<uint64_t, bool>> vals = {{0, false}};
readBE<uint64_t>(vals);
}
{
std::string input(8, '0');
reader_ = StringReader(input);
std::vector<std::pair<uint64_t, bool>> vals = {{0x3030303030303030, true},
{0, false}};
readBE<uint64_t>(vals);
}
}
TEST_F(StringReaderTest, ReadString) {
{
std::string input("HELLO");
reader_ = StringReader(input);
std::string data;
EXPECT_EQ(5, reader_.byteAvailable());
reader_.readNBytes(Utils::allocStringBuffer(&data, 2), 1);
EXPECT_EQ("H", data);
EXPECT_EQ(4, reader_.byteAvailable());
reader_.readNBytes(Utils::allocStringBuffer(&data, 3), 2);
EXPECT_EQ("EL", data);
EXPECT_EQ(2, reader_.byteAvailable());
}
}
} // namespace Hessian2