2020-12-26 14:12:05 -08:00
|
|
|
// Copyright (c) FIRST and other WPILib contributors.
|
|
|
|
|
// Open Source Software; you can modify and/or share it under the terms of
|
|
|
|
|
// the WPILib BSD license file in the root directory of this project.
|
2015-07-03 22:21:17 -07:00
|
|
|
|
2015-07-03 22:11:29 -07:00
|
|
|
#include <cfloat>
|
|
|
|
|
#include <climits>
|
|
|
|
|
#include <string>
|
2021-06-06 16:13:58 -07:00
|
|
|
#include <string_view>
|
2017-08-19 23:08:27 -07:00
|
|
|
|
2021-11-27 21:31:40 -08:00
|
|
|
#include <wpi/StringExtras.h>
|
|
|
|
|
|
2017-08-19 23:08:27 -07:00
|
|
|
#include "TestPrinters.h"
|
|
|
|
|
#include "WireEncoder.h"
|
|
|
|
|
#include "gtest/gtest.h"
|
2015-07-03 22:11:29 -07:00
|
|
|
|
|
|
|
|
#define BUFSIZE 1024
|
|
|
|
|
|
2021-06-06 16:13:58 -07:00
|
|
|
using namespace std::string_view_literals;
|
|
|
|
|
|
2015-07-17 07:21:07 -07:00
|
|
|
namespace nt {
|
2015-07-03 22:11:29 -07:00
|
|
|
|
2015-07-04 10:18:30 -07:00
|
|
|
class WireEncoderTest : public ::testing::Test {
|
|
|
|
|
protected:
|
2015-07-19 16:30:04 -07:00
|
|
|
WireEncoderTest() {
|
2015-07-16 01:38:27 -07:00
|
|
|
v_empty = std::make_shared<Value>();
|
|
|
|
|
v_boolean = Value::MakeBoolean(true);
|
|
|
|
|
v_double = Value::MakeDouble(1.0);
|
2021-06-06 16:13:58 -07:00
|
|
|
v_string = Value::MakeString("hello"sv);
|
|
|
|
|
v_raw = Value::MakeRaw("hello"sv);
|
2015-07-16 01:38:27 -07:00
|
|
|
v_boolean_array = Value::MakeBooleanArray(std::vector<int>{0, 1, 0});
|
|
|
|
|
v_boolean_array_big = Value::MakeBooleanArray(std::vector<int>(256));
|
|
|
|
|
v_double_array = Value::MakeDoubleArray(std::vector<double>{0.5, 0.25});
|
|
|
|
|
v_double_array_big = Value::MakeDoubleArray(std::vector<double>(256));
|
|
|
|
|
|
|
|
|
|
std::vector<std::string> sa;
|
|
|
|
|
sa.push_back("hello");
|
|
|
|
|
sa.push_back("goodbye");
|
|
|
|
|
v_string_array = Value::MakeStringArray(std::move(sa));
|
2015-07-04 10:18:30 -07:00
|
|
|
|
|
|
|
|
sa.clear();
|
2020-12-28 12:58:06 -08:00
|
|
|
for (int i = 0; i < 256; ++i) {
|
|
|
|
|
sa.push_back("h");
|
|
|
|
|
}
|
2015-07-16 01:38:27 -07:00
|
|
|
v_string_array_big = Value::MakeStringArray(std::move(sa));
|
2015-07-04 10:18:30 -07:00
|
|
|
|
2015-07-16 01:38:27 -07:00
|
|
|
s_normal = "hello";
|
2015-07-04 10:18:30 -07:00
|
|
|
|
2015-07-16 01:38:27 -07:00
|
|
|
s_long.clear();
|
|
|
|
|
s_long.append(127, '*');
|
|
|
|
|
s_long.push_back('x');
|
2015-07-04 10:18:30 -07:00
|
|
|
|
2015-07-16 01:38:27 -07:00
|
|
|
s_big.clear();
|
|
|
|
|
s_big.append(65534, '*');
|
|
|
|
|
s_big.append(3, 'x');
|
2015-07-04 10:18:30 -07:00
|
|
|
}
|
|
|
|
|
|
2015-07-16 01:38:27 -07:00
|
|
|
std::shared_ptr<Value> v_empty;
|
|
|
|
|
std::shared_ptr<Value> v_boolean, v_double, v_string, v_raw;
|
|
|
|
|
std::shared_ptr<Value> v_boolean_array, v_boolean_array_big;
|
|
|
|
|
std::shared_ptr<Value> v_double_array, v_double_array_big;
|
|
|
|
|
std::shared_ptr<Value> v_string_array, v_string_array_big;
|
2015-07-04 10:18:30 -07:00
|
|
|
|
2015-07-16 01:38:27 -07:00
|
|
|
std::string s_normal, s_long, s_big;
|
2015-07-04 10:18:30 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
TEST_F(WireEncoderTest, Construct) {
|
2015-07-03 22:11:29 -07:00
|
|
|
WireEncoder e(0x0300u);
|
|
|
|
|
EXPECT_EQ(0u, e.size());
|
|
|
|
|
EXPECT_EQ(nullptr, e.error());
|
|
|
|
|
EXPECT_EQ(0x0300u, e.proto_rev());
|
|
|
|
|
}
|
|
|
|
|
|
2015-07-04 10:18:30 -07:00
|
|
|
TEST_F(WireEncoderTest, SetProtoRev) {
|
2015-07-03 22:11:29 -07:00
|
|
|
WireEncoder e(0x0300u);
|
|
|
|
|
e.set_proto_rev(0x0200u);
|
|
|
|
|
EXPECT_EQ(0x0200u, e.proto_rev());
|
|
|
|
|
}
|
|
|
|
|
|
2015-07-04 10:18:30 -07:00
|
|
|
TEST_F(WireEncoderTest, Write8) {
|
2017-08-19 23:08:27 -07:00
|
|
|
size_t off = BUFSIZE - 1;
|
2015-07-03 22:11:29 -07:00
|
|
|
WireEncoder e(0x0300u);
|
2020-12-28 12:58:06 -08:00
|
|
|
for (size_t i = 0; i < off; ++i) {
|
|
|
|
|
e.Write8(0u); // test across Reserve()
|
|
|
|
|
}
|
2015-07-03 22:11:29 -07:00
|
|
|
e.Write8(5u);
|
|
|
|
|
e.Write8(0x101u); // should be truncated
|
|
|
|
|
e.Write8(0u);
|
2017-08-19 23:08:27 -07:00
|
|
|
ASSERT_EQ(3u, e.size() - off);
|
2021-11-27 21:31:40 -08:00
|
|
|
ASSERT_EQ("\x05\x01\x00"sv, wpi::substr({e.data(), e.size()}, off));
|
2015-07-03 22:11:29 -07:00
|
|
|
}
|
|
|
|
|
|
2015-07-04 10:18:30 -07:00
|
|
|
TEST_F(WireEncoderTest, Write16) {
|
2017-08-19 23:08:27 -07:00
|
|
|
size_t off = BUFSIZE - 2;
|
2015-07-03 22:11:29 -07:00
|
|
|
WireEncoder e(0x0300u);
|
2020-12-28 12:58:06 -08:00
|
|
|
for (size_t i = 0; i < off; ++i) {
|
|
|
|
|
e.Write8(0u); // test across Reserve()
|
|
|
|
|
}
|
2015-07-03 22:11:29 -07:00
|
|
|
e.Write16(5u);
|
|
|
|
|
e.Write16(0x10001u); // should be truncated
|
|
|
|
|
e.Write16(0x4567u);
|
|
|
|
|
e.Write16(0u);
|
2017-08-19 23:08:27 -07:00
|
|
|
ASSERT_EQ(8u, e.size() - off);
|
2021-06-06 16:13:58 -07:00
|
|
|
ASSERT_EQ("\x00\x05\x00\x01\x45\x67\x00\x00"sv,
|
2021-11-27 21:31:40 -08:00
|
|
|
wpi::substr({e.data(), e.size()}, off));
|
2015-07-03 22:11:29 -07:00
|
|
|
}
|
|
|
|
|
|
2015-07-04 10:18:30 -07:00
|
|
|
TEST_F(WireEncoderTest, Write32) {
|
2017-08-19 23:08:27 -07:00
|
|
|
size_t off = BUFSIZE - 4;
|
2015-07-03 22:11:29 -07:00
|
|
|
WireEncoder e(0x0300u);
|
2020-12-28 12:58:06 -08:00
|
|
|
for (size_t i = 0; i < off; ++i) {
|
|
|
|
|
e.Write8(0u); // test across Reserve()
|
|
|
|
|
}
|
2015-07-03 22:11:29 -07:00
|
|
|
e.Write32(5ul);
|
2015-07-23 22:06:57 -07:00
|
|
|
e.Write32(1ul);
|
2015-07-03 22:11:29 -07:00
|
|
|
e.Write32(0xabcdul);
|
|
|
|
|
e.Write32(0x12345678ul);
|
|
|
|
|
e.Write32(0ul);
|
2017-08-19 23:08:27 -07:00
|
|
|
ASSERT_EQ(20u, e.size() - off);
|
2021-06-06 16:13:58 -07:00
|
|
|
ASSERT_EQ(std::string_view("\x00\x00\x00\x05\x00\x00\x00\x01\x00\x00\xab\xcd"
|
|
|
|
|
"\x12\x34\x56\x78\x00\x00\x00\x00",
|
|
|
|
|
20),
|
2021-11-27 21:31:40 -08:00
|
|
|
wpi::substr({e.data(), e.size()}, off));
|
2015-07-03 22:11:29 -07:00
|
|
|
}
|
|
|
|
|
|
2015-07-04 10:18:30 -07:00
|
|
|
TEST_F(WireEncoderTest, WriteDouble) {
|
2017-08-19 23:08:27 -07:00
|
|
|
size_t off = BUFSIZE - 8;
|
2015-07-03 22:11:29 -07:00
|
|
|
WireEncoder e(0x0300u);
|
2020-12-28 12:58:06 -08:00
|
|
|
for (size_t i = 0; i < off; ++i) {
|
|
|
|
|
e.Write8(0u); // test across Reserve()
|
|
|
|
|
}
|
2015-07-03 22:11:29 -07:00
|
|
|
e.WriteDouble(0.0);
|
|
|
|
|
e.WriteDouble(2.3e5);
|
|
|
|
|
e.WriteDouble(std::numeric_limits<double>::infinity());
|
|
|
|
|
e.WriteDouble(DBL_MIN);
|
|
|
|
|
e.WriteDouble(DBL_MAX);
|
2017-08-19 23:08:27 -07:00
|
|
|
ASSERT_EQ(40u, e.size() - off);
|
2015-07-03 22:11:29 -07:00
|
|
|
// golden values except min and max from
|
|
|
|
|
// http://www.binaryconvert.com/result_double.html
|
2021-06-06 16:13:58 -07:00
|
|
|
ASSERT_EQ(std::string_view("\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
|
|
|
"\x41\x0c\x13\x80\x00\x00\x00\x00"
|
|
|
|
|
"\x7f\xf0\x00\x00\x00\x00\x00\x00"
|
|
|
|
|
"\x00\x10\x00\x00\x00\x00\x00\x00"
|
|
|
|
|
"\x7f\xef\xff\xff\xff\xff\xff\xff",
|
|
|
|
|
40),
|
2021-11-27 21:31:40 -08:00
|
|
|
wpi::substr({e.data(), e.size()}, off));
|
2015-07-03 22:11:29 -07:00
|
|
|
}
|
|
|
|
|
|
2015-07-04 10:18:30 -07:00
|
|
|
TEST_F(WireEncoderTest, WriteUleb128) {
|
2017-08-19 23:08:27 -07:00
|
|
|
size_t off = BUFSIZE - 2;
|
2015-07-03 22:11:29 -07:00
|
|
|
WireEncoder e(0x0300u);
|
2020-12-28 12:58:06 -08:00
|
|
|
for (size_t i = 0; i < off; ++i) {
|
|
|
|
|
e.Write8(0u); // test across Reserve()
|
|
|
|
|
}
|
2015-07-03 22:11:29 -07:00
|
|
|
e.WriteUleb128(0ul);
|
|
|
|
|
e.WriteUleb128(0x7ful);
|
|
|
|
|
e.WriteUleb128(0x80ul);
|
2017-08-19 23:08:27 -07:00
|
|
|
ASSERT_EQ(4u, e.size() - off);
|
2021-11-27 21:31:40 -08:00
|
|
|
ASSERT_EQ("\x00\x7f\x80\x01"sv, wpi::substr({e.data(), e.size()}, off));
|
2015-07-03 22:11:29 -07:00
|
|
|
}
|
|
|
|
|
|
2015-07-04 10:18:30 -07:00
|
|
|
TEST_F(WireEncoderTest, WriteType) {
|
2017-08-19 23:08:27 -07:00
|
|
|
size_t off = BUFSIZE - 1;
|
2015-07-03 22:11:29 -07:00
|
|
|
WireEncoder e(0x0300u);
|
2020-12-28 12:58:06 -08:00
|
|
|
for (size_t i = 0; i < off; ++i) {
|
|
|
|
|
e.Write8(0u); // test across Reserve()
|
|
|
|
|
}
|
2015-07-03 22:11:29 -07:00
|
|
|
e.WriteType(NT_BOOLEAN);
|
|
|
|
|
e.WriteType(NT_DOUBLE);
|
|
|
|
|
e.WriteType(NT_STRING);
|
|
|
|
|
e.WriteType(NT_RAW);
|
|
|
|
|
e.WriteType(NT_BOOLEAN_ARRAY);
|
|
|
|
|
e.WriteType(NT_DOUBLE_ARRAY);
|
|
|
|
|
e.WriteType(NT_STRING_ARRAY);
|
|
|
|
|
e.WriteType(NT_RPC);
|
2015-07-04 23:11:35 -07:00
|
|
|
ASSERT_EQ(nullptr, e.error());
|
2017-08-19 23:08:27 -07:00
|
|
|
ASSERT_EQ(8u, e.size() - off);
|
2021-06-06 16:13:58 -07:00
|
|
|
ASSERT_EQ("\x00\x01\x02\x03\x10\x11\x12\x20"sv,
|
2021-11-27 21:31:40 -08:00
|
|
|
wpi::substr({e.data(), e.size()}, off));
|
2015-07-03 22:11:29 -07:00
|
|
|
}
|
|
|
|
|
|
2015-07-04 10:18:30 -07:00
|
|
|
TEST_F(WireEncoderTest, WriteTypeError) {
|
2015-07-03 22:11:29 -07:00
|
|
|
WireEncoder e(0x0200u);
|
|
|
|
|
e.WriteType(NT_UNASSIGNED);
|
|
|
|
|
EXPECT_EQ(0u, e.size());
|
|
|
|
|
EXPECT_EQ(std::string("unrecognized type"), e.error());
|
|
|
|
|
|
|
|
|
|
e.Reset();
|
|
|
|
|
e.WriteType(NT_RAW);
|
|
|
|
|
EXPECT_EQ(0u, e.size());
|
|
|
|
|
EXPECT_EQ(std::string("raw type not supported in protocol < 3.0"), e.error());
|
|
|
|
|
|
|
|
|
|
e.Reset();
|
|
|
|
|
e.WriteType(NT_RPC);
|
|
|
|
|
EXPECT_EQ(0u, e.size());
|
|
|
|
|
EXPECT_EQ(std::string("RPC type not supported in protocol < 3.0"), e.error());
|
|
|
|
|
}
|
|
|
|
|
|
2015-07-04 10:18:30 -07:00
|
|
|
TEST_F(WireEncoderTest, Reset) {
|
2015-07-03 22:11:29 -07:00
|
|
|
WireEncoder e(0x0300u);
|
|
|
|
|
e.WriteType(NT_UNASSIGNED);
|
|
|
|
|
EXPECT_NE(nullptr, e.error());
|
|
|
|
|
e.Reset();
|
|
|
|
|
EXPECT_EQ(nullptr, e.error());
|
|
|
|
|
|
|
|
|
|
e.Write8(0u);
|
|
|
|
|
EXPECT_EQ(1u, e.size());
|
|
|
|
|
e.Reset();
|
|
|
|
|
EXPECT_EQ(0u, e.size());
|
|
|
|
|
}
|
|
|
|
|
|
2015-07-04 10:18:30 -07:00
|
|
|
TEST_F(WireEncoderTest, GetValueSize2) {
|
|
|
|
|
WireEncoder e(0x0200u);
|
2015-07-16 01:38:27 -07:00
|
|
|
EXPECT_EQ(0u, e.GetValueSize(*v_empty)); // empty
|
|
|
|
|
EXPECT_EQ(1u, e.GetValueSize(*v_boolean));
|
|
|
|
|
EXPECT_EQ(8u, e.GetValueSize(*v_double));
|
|
|
|
|
EXPECT_EQ(7u, e.GetValueSize(*v_string));
|
|
|
|
|
EXPECT_EQ(0u, e.GetValueSize(*v_raw)); // not supported
|
2015-07-04 10:18:30 -07:00
|
|
|
|
2017-08-19 23:08:27 -07:00
|
|
|
EXPECT_EQ(1u + 3u, e.GetValueSize(*v_boolean_array));
|
2015-07-04 10:18:30 -07:00
|
|
|
// truncated
|
2017-08-19 23:08:27 -07:00
|
|
|
EXPECT_EQ(1u + 255u, e.GetValueSize(*v_boolean_array_big));
|
2015-07-04 10:18:30 -07:00
|
|
|
|
2017-08-19 23:08:27 -07:00
|
|
|
EXPECT_EQ(1u + 2u * 8u, e.GetValueSize(*v_double_array));
|
2015-07-04 10:18:30 -07:00
|
|
|
// truncated
|
2017-08-19 23:08:27 -07:00
|
|
|
EXPECT_EQ(1u + 255u * 8u, e.GetValueSize(*v_double_array_big));
|
2015-07-04 10:18:30 -07:00
|
|
|
|
2017-08-19 23:08:27 -07:00
|
|
|
EXPECT_EQ(1u + 7u + 9u, e.GetValueSize(*v_string_array));
|
2015-07-04 10:18:30 -07:00
|
|
|
// truncated
|
2017-08-19 23:08:27 -07:00
|
|
|
EXPECT_EQ(1u + 255u * 3u, e.GetValueSize(*v_string_array_big));
|
2015-07-04 10:18:30 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WireEncoderTest, WriteBooleanValue2) {
|
|
|
|
|
WireEncoder e(0x0200u);
|
2015-07-16 01:38:27 -07:00
|
|
|
e.WriteValue(*v_boolean);
|
|
|
|
|
auto v_false = Value::MakeBoolean(false);
|
|
|
|
|
e.WriteValue(*v_false);
|
2015-07-04 10:18:30 -07:00
|
|
|
ASSERT_EQ(nullptr, e.error());
|
|
|
|
|
ASSERT_EQ(2u, e.size());
|
2021-06-06 16:13:58 -07:00
|
|
|
ASSERT_EQ("\x01\x00"sv, std::string_view(e.data(), e.size()));
|
2015-07-04 10:18:30 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WireEncoderTest, WriteDoubleValue2) {
|
|
|
|
|
WireEncoder e(0x0200u);
|
2015-07-16 01:38:27 -07:00
|
|
|
e.WriteValue(*v_double);
|
2015-07-04 10:18:30 -07:00
|
|
|
ASSERT_EQ(nullptr, e.error());
|
|
|
|
|
ASSERT_EQ(8u, e.size());
|
2021-06-06 16:13:58 -07:00
|
|
|
ASSERT_EQ("\x3f\xf0\x00\x00\x00\x00\x00\x00"sv,
|
|
|
|
|
std::string_view(e.data(), e.size()));
|
2015-07-04 10:18:30 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WireEncoderTest, WriteStringValue2) {
|
|
|
|
|
WireEncoder e(0x0200u);
|
2015-07-16 01:38:27 -07:00
|
|
|
e.WriteValue(*v_string);
|
2015-07-04 10:18:30 -07:00
|
|
|
ASSERT_EQ(nullptr, e.error());
|
|
|
|
|
ASSERT_EQ(7u, e.size());
|
2021-06-06 16:13:58 -07:00
|
|
|
ASSERT_EQ("\x00\x05hello"sv, std::string_view(e.data(), e.size()));
|
2015-07-04 10:18:30 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WireEncoderTest, WriteBooleanArrayValue2) {
|
|
|
|
|
WireEncoder e(0x0200u);
|
2015-07-16 01:38:27 -07:00
|
|
|
e.WriteValue(*v_boolean_array);
|
2015-07-04 10:18:30 -07:00
|
|
|
ASSERT_EQ(nullptr, e.error());
|
2017-08-19 23:08:27 -07:00
|
|
|
ASSERT_EQ(1u + 3u, e.size());
|
2021-06-06 16:13:58 -07:00
|
|
|
ASSERT_EQ("\x03\x00\x01\x00"sv, std::string_view(e.data(), e.size()));
|
2015-07-04 10:18:30 -07:00
|
|
|
|
|
|
|
|
// truncated
|
|
|
|
|
e.Reset();
|
2015-07-16 01:38:27 -07:00
|
|
|
e.WriteValue(*v_boolean_array_big);
|
2015-07-04 10:18:30 -07:00
|
|
|
ASSERT_EQ(nullptr, e.error());
|
2017-08-19 23:08:27 -07:00
|
|
|
ASSERT_EQ(1u + 255u, e.size());
|
2021-06-06 16:13:58 -07:00
|
|
|
ASSERT_EQ("\xff\x00"sv, std::string_view(e.data(), 2));
|
2015-07-04 10:18:30 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WireEncoderTest, WriteDoubleArrayValue2) {
|
|
|
|
|
WireEncoder e(0x0200u);
|
2015-07-16 01:38:27 -07:00
|
|
|
e.WriteValue(*v_double_array);
|
2015-07-04 10:18:30 -07:00
|
|
|
ASSERT_EQ(nullptr, e.error());
|
2017-08-19 23:08:27 -07:00
|
|
|
ASSERT_EQ(1u + 2u * 8u, e.size());
|
2021-06-06 16:13:58 -07:00
|
|
|
ASSERT_EQ(std::string_view("\x02\x3f\xe0\x00\x00\x00\x00\x00\x00"
|
|
|
|
|
"\x3f\xd0\x00\x00\x00\x00\x00\x00",
|
|
|
|
|
17),
|
|
|
|
|
std::string_view(e.data(), e.size()));
|
2015-07-04 10:18:30 -07:00
|
|
|
|
|
|
|
|
// truncated
|
|
|
|
|
e.Reset();
|
2015-07-16 01:38:27 -07:00
|
|
|
e.WriteValue(*v_double_array_big);
|
2015-07-04 10:18:30 -07:00
|
|
|
ASSERT_EQ(nullptr, e.error());
|
2017-08-19 23:08:27 -07:00
|
|
|
ASSERT_EQ(1u + 255u * 8u, e.size());
|
2021-06-06 16:13:58 -07:00
|
|
|
ASSERT_EQ("\xff\x00"sv, std::string_view(e.data(), 2));
|
2015-07-04 10:18:30 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WireEncoderTest, WriteStringArrayValue2) {
|
|
|
|
|
WireEncoder e(0x0200u);
|
2015-07-16 01:38:27 -07:00
|
|
|
e.WriteValue(*v_string_array);
|
2015-07-04 10:18:30 -07:00
|
|
|
ASSERT_EQ(nullptr, e.error());
|
2017-08-19 23:08:27 -07:00
|
|
|
ASSERT_EQ(1u + 7u + 9u, e.size());
|
2021-06-06 16:13:58 -07:00
|
|
|
ASSERT_EQ("\x02\x00\x05hello\x00\x07goodbye"sv,
|
|
|
|
|
std::string_view(e.data(), e.size()));
|
2015-07-04 10:18:30 -07:00
|
|
|
|
|
|
|
|
// truncated
|
|
|
|
|
e.Reset();
|
2015-07-16 01:38:27 -07:00
|
|
|
e.WriteValue(*v_string_array_big);
|
2015-07-04 10:18:30 -07:00
|
|
|
ASSERT_EQ(nullptr, e.error());
|
2017-08-19 23:08:27 -07:00
|
|
|
ASSERT_EQ(1u + 255u * 3u, e.size());
|
2021-06-06 16:13:58 -07:00
|
|
|
ASSERT_EQ("\xff\x00\x01"sv, std::string_view(e.data(), 3));
|
2015-07-04 10:18:30 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WireEncoderTest, WriteValueError2) {
|
|
|
|
|
WireEncoder e(0x0200u);
|
2015-07-16 01:38:27 -07:00
|
|
|
e.WriteValue(*v_empty); // empty
|
2015-07-04 10:18:30 -07:00
|
|
|
ASSERT_EQ(0u, e.size());
|
|
|
|
|
ASSERT_NE(nullptr, e.error());
|
|
|
|
|
|
|
|
|
|
e.Reset();
|
2015-07-16 01:38:27 -07:00
|
|
|
e.WriteValue(*v_raw); // not supported
|
2015-07-04 10:18:30 -07:00
|
|
|
ASSERT_EQ(0u, e.size());
|
|
|
|
|
ASSERT_NE(nullptr, e.error());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WireEncoderTest, GetValueSize3) {
|
|
|
|
|
WireEncoder e(0x0300u);
|
2015-07-16 01:38:27 -07:00
|
|
|
EXPECT_EQ(0u, e.GetValueSize(*v_empty)); // empty
|
|
|
|
|
EXPECT_EQ(1u, e.GetValueSize(*v_boolean));
|
|
|
|
|
EXPECT_EQ(8u, e.GetValueSize(*v_double));
|
|
|
|
|
EXPECT_EQ(6u, e.GetValueSize(*v_string));
|
|
|
|
|
EXPECT_EQ(6u, e.GetValueSize(*v_raw));
|
2015-07-04 10:18:30 -07:00
|
|
|
|
2017-08-19 23:08:27 -07:00
|
|
|
EXPECT_EQ(1u + 3u, e.GetValueSize(*v_boolean_array));
|
2015-07-04 10:18:30 -07:00
|
|
|
// truncated
|
2017-08-19 23:08:27 -07:00
|
|
|
EXPECT_EQ(1u + 255u, e.GetValueSize(*v_boolean_array_big));
|
2015-07-04 10:18:30 -07:00
|
|
|
|
2017-08-19 23:08:27 -07:00
|
|
|
EXPECT_EQ(1u + 2u * 8u, e.GetValueSize(*v_double_array));
|
2015-07-04 10:18:30 -07:00
|
|
|
// truncated
|
2017-08-19 23:08:27 -07:00
|
|
|
EXPECT_EQ(1u + 255u * 8u, e.GetValueSize(*v_double_array_big));
|
2015-07-04 10:18:30 -07:00
|
|
|
|
2017-08-19 23:08:27 -07:00
|
|
|
EXPECT_EQ(1u + 6u + 8u, e.GetValueSize(*v_string_array));
|
2015-07-04 10:18:30 -07:00
|
|
|
// truncated
|
2017-08-19 23:08:27 -07:00
|
|
|
EXPECT_EQ(1u + 255u * 2u, e.GetValueSize(*v_string_array_big));
|
2015-07-04 10:18:30 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WireEncoderTest, WriteBooleanValue3) {
|
|
|
|
|
WireEncoder e(0x0300u);
|
2015-07-16 01:38:27 -07:00
|
|
|
e.WriteValue(*v_boolean);
|
|
|
|
|
auto v_false = Value::MakeBoolean(false);
|
|
|
|
|
e.WriteValue(*v_false);
|
2015-07-04 10:18:30 -07:00
|
|
|
ASSERT_EQ(nullptr, e.error());
|
|
|
|
|
ASSERT_EQ(2u, e.size());
|
2021-06-06 16:13:58 -07:00
|
|
|
ASSERT_EQ("\x01\x00"sv, std::string_view(e.data(), e.size()));
|
2015-07-04 10:18:30 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WireEncoderTest, WriteDoubleValue3) {
|
|
|
|
|
WireEncoder e(0x0300u);
|
2015-07-16 01:38:27 -07:00
|
|
|
e.WriteValue(*v_double);
|
2015-07-04 10:18:30 -07:00
|
|
|
ASSERT_EQ(nullptr, e.error());
|
|
|
|
|
ASSERT_EQ(8u, e.size());
|
2021-06-06 16:13:58 -07:00
|
|
|
ASSERT_EQ("\x3f\xf0\x00\x00\x00\x00\x00\x00"sv,
|
|
|
|
|
std::string_view(e.data(), e.size()));
|
2015-07-04 10:18:30 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WireEncoderTest, WriteStringValue3) {
|
|
|
|
|
WireEncoder e(0x0300u);
|
2015-07-16 01:38:27 -07:00
|
|
|
e.WriteValue(*v_string);
|
2015-07-04 10:18:30 -07:00
|
|
|
ASSERT_EQ(nullptr, e.error());
|
|
|
|
|
ASSERT_EQ(6u, e.size());
|
2021-06-06 16:13:58 -07:00
|
|
|
ASSERT_EQ("\x05hello"sv, std::string_view(e.data(), e.size()));
|
2015-07-04 10:18:30 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WireEncoderTest, WriteRawValue3) {
|
|
|
|
|
WireEncoder e(0x0300u);
|
2015-07-16 01:38:27 -07:00
|
|
|
e.WriteValue(*v_raw);
|
2015-07-04 10:18:30 -07:00
|
|
|
ASSERT_EQ(nullptr, e.error());
|
|
|
|
|
ASSERT_EQ(6u, e.size());
|
2021-06-06 16:13:58 -07:00
|
|
|
ASSERT_EQ("\x05hello"sv, std::string_view(e.data(), e.size()));
|
2015-07-04 10:18:30 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WireEncoderTest, WriteBooleanArrayValue3) {
|
|
|
|
|
WireEncoder e(0x0300u);
|
2015-07-16 01:38:27 -07:00
|
|
|
e.WriteValue(*v_boolean_array);
|
2015-07-04 10:18:30 -07:00
|
|
|
ASSERT_EQ(nullptr, e.error());
|
2017-08-19 23:08:27 -07:00
|
|
|
ASSERT_EQ(1u + 3u, e.size());
|
2021-06-06 16:13:58 -07:00
|
|
|
ASSERT_EQ("\x03\x00\x01\x00"sv, std::string_view(e.data(), e.size()));
|
2015-07-04 10:18:30 -07:00
|
|
|
|
|
|
|
|
// truncated
|
|
|
|
|
e.Reset();
|
2015-07-16 01:38:27 -07:00
|
|
|
e.WriteValue(*v_boolean_array_big);
|
2015-07-04 10:18:30 -07:00
|
|
|
ASSERT_EQ(nullptr, e.error());
|
2017-08-19 23:08:27 -07:00
|
|
|
ASSERT_EQ(1u + 255u, e.size());
|
2021-06-06 16:13:58 -07:00
|
|
|
ASSERT_EQ("\xff\x00"sv, std::string_view(e.data(), 2));
|
2015-07-04 10:18:30 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WireEncoderTest, WriteDoubleArrayValue3) {
|
|
|
|
|
WireEncoder e(0x0300u);
|
2015-07-16 01:38:27 -07:00
|
|
|
e.WriteValue(*v_double_array);
|
2015-07-04 10:18:30 -07:00
|
|
|
ASSERT_EQ(nullptr, e.error());
|
2017-08-19 23:08:27 -07:00
|
|
|
ASSERT_EQ(1u + 2u * 8u, e.size());
|
2021-06-06 16:13:58 -07:00
|
|
|
ASSERT_EQ(std::string_view("\x02\x3f\xe0\x00\x00\x00\x00\x00\x00"
|
|
|
|
|
"\x3f\xd0\x00\x00\x00\x00\x00\x00",
|
|
|
|
|
17),
|
|
|
|
|
std::string_view(e.data(), e.size()));
|
2015-07-04 10:18:30 -07:00
|
|
|
|
|
|
|
|
// truncated
|
|
|
|
|
e.Reset();
|
2015-07-16 01:38:27 -07:00
|
|
|
e.WriteValue(*v_double_array_big);
|
2015-07-04 10:18:30 -07:00
|
|
|
ASSERT_EQ(nullptr, e.error());
|
2017-08-19 23:08:27 -07:00
|
|
|
ASSERT_EQ(1u + 255u * 8u, e.size());
|
2021-06-06 16:13:58 -07:00
|
|
|
ASSERT_EQ("\xff\x00"sv, std::string_view(e.data(), 2));
|
2015-07-04 10:18:30 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WireEncoderTest, WriteStringArrayValue3) {
|
|
|
|
|
WireEncoder e(0x0300u);
|
2015-07-16 01:38:27 -07:00
|
|
|
e.WriteValue(*v_string_array);
|
2015-07-04 10:18:30 -07:00
|
|
|
ASSERT_EQ(nullptr, e.error());
|
2017-08-19 23:08:27 -07:00
|
|
|
ASSERT_EQ(1u + 6u + 8u, e.size());
|
2021-06-06 16:13:58 -07:00
|
|
|
ASSERT_EQ("\x02\x05hello\x07goodbye"sv, std::string_view(e.data(), e.size()));
|
2015-07-04 10:18:30 -07:00
|
|
|
|
|
|
|
|
// truncated
|
|
|
|
|
e.Reset();
|
2015-07-16 01:38:27 -07:00
|
|
|
e.WriteValue(*v_string_array_big);
|
2015-07-04 10:18:30 -07:00
|
|
|
ASSERT_EQ(nullptr, e.error());
|
2017-08-19 23:08:27 -07:00
|
|
|
ASSERT_EQ(1u + 255u * 2u, e.size());
|
2021-06-06 16:13:58 -07:00
|
|
|
ASSERT_EQ("\xff\x01"sv, std::string_view(e.data(), 2));
|
2015-07-04 10:18:30 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WireEncoderTest, WriteValueError3) {
|
|
|
|
|
WireEncoder e(0x0300u);
|
2015-07-16 01:38:27 -07:00
|
|
|
e.WriteValue(*v_empty); // empty
|
2015-07-04 10:18:30 -07:00
|
|
|
ASSERT_EQ(0u, e.size());
|
|
|
|
|
ASSERT_NE(nullptr, e.error());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WireEncoderTest, GetStringSize2) {
|
|
|
|
|
// 2-byte length
|
|
|
|
|
WireEncoder e(0x0200u);
|
2015-07-16 01:38:27 -07:00
|
|
|
EXPECT_EQ(7u, e.GetStringSize(s_normal));
|
|
|
|
|
EXPECT_EQ(130u, e.GetStringSize(s_long));
|
2015-07-04 10:18:30 -07:00
|
|
|
// truncated
|
2015-07-16 01:38:27 -07:00
|
|
|
EXPECT_EQ(65537u, e.GetStringSize(s_big));
|
2015-07-04 10:18:30 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WireEncoderTest, WriteString2) {
|
|
|
|
|
WireEncoder e(0x0200u);
|
2015-07-16 01:38:27 -07:00
|
|
|
e.WriteString(s_normal);
|
2015-07-04 10:18:30 -07:00
|
|
|
EXPECT_EQ(nullptr, e.error());
|
|
|
|
|
EXPECT_EQ(7u, e.size());
|
2021-06-06 16:13:58 -07:00
|
|
|
EXPECT_EQ("\x00\x05hello"sv, std::string_view(e.data(), e.size()));
|
2015-07-04 10:18:30 -07:00
|
|
|
|
|
|
|
|
e.Reset();
|
2015-07-16 01:38:27 -07:00
|
|
|
e.WriteString(s_long);
|
2015-07-04 10:18:30 -07:00
|
|
|
EXPECT_EQ(nullptr, e.error());
|
|
|
|
|
ASSERT_EQ(130u, e.size());
|
2021-06-06 16:13:58 -07:00
|
|
|
EXPECT_EQ("\x00\x80**"sv, std::string_view(e.data(), 4));
|
2015-07-04 10:18:30 -07:00
|
|
|
EXPECT_EQ('*', e.data()[128]);
|
|
|
|
|
EXPECT_EQ('x', e.data()[129]);
|
|
|
|
|
|
|
|
|
|
// truncated
|
|
|
|
|
e.Reset();
|
2015-07-16 01:38:27 -07:00
|
|
|
e.WriteString(s_big);
|
2015-07-04 10:18:30 -07:00
|
|
|
EXPECT_EQ(nullptr, e.error());
|
|
|
|
|
ASSERT_EQ(65537u, e.size());
|
2021-06-06 16:13:58 -07:00
|
|
|
EXPECT_EQ("\xff\xff**"sv, std::string_view(e.data(), 4));
|
2015-07-04 10:18:30 -07:00
|
|
|
EXPECT_EQ('*', e.data()[65535]);
|
|
|
|
|
EXPECT_EQ('x', e.data()[65536]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WireEncoderTest, GetStringSize3) {
|
|
|
|
|
// leb128-encoded length
|
|
|
|
|
WireEncoder e(0x0300u);
|
2015-07-16 01:38:27 -07:00
|
|
|
EXPECT_EQ(6u, e.GetStringSize(s_normal));
|
|
|
|
|
EXPECT_EQ(130u, e.GetStringSize(s_long));
|
|
|
|
|
EXPECT_EQ(65540u, e.GetStringSize(s_big));
|
2015-07-04 10:18:30 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WireEncoderTest, WriteString3) {
|
|
|
|
|
WireEncoder e(0x0300u);
|
2015-07-16 01:38:27 -07:00
|
|
|
e.WriteString(s_normal);
|
2015-07-04 10:18:30 -07:00
|
|
|
EXPECT_EQ(nullptr, e.error());
|
|
|
|
|
EXPECT_EQ(6u, e.size());
|
2021-06-06 16:13:58 -07:00
|
|
|
EXPECT_EQ("\x05hello"sv, std::string_view(e.data(), e.size()));
|
2015-07-04 10:18:30 -07:00
|
|
|
|
|
|
|
|
e.Reset();
|
2015-07-16 01:38:27 -07:00
|
|
|
e.WriteString(s_long);
|
2015-07-04 10:18:30 -07:00
|
|
|
EXPECT_EQ(nullptr, e.error());
|
|
|
|
|
ASSERT_EQ(130u, e.size());
|
2021-06-06 16:13:58 -07:00
|
|
|
EXPECT_EQ("\x80\x01**"sv, std::string_view(e.data(), 4));
|
2015-07-04 10:18:30 -07:00
|
|
|
EXPECT_EQ('*', e.data()[128]);
|
|
|
|
|
EXPECT_EQ('x', e.data()[129]);
|
|
|
|
|
|
|
|
|
|
// NOT truncated
|
|
|
|
|
e.Reset();
|
2015-07-16 01:38:27 -07:00
|
|
|
e.WriteString(s_big);
|
2015-07-04 10:18:30 -07:00
|
|
|
EXPECT_EQ(nullptr, e.error());
|
|
|
|
|
ASSERT_EQ(65540u, e.size());
|
2021-06-06 16:13:58 -07:00
|
|
|
EXPECT_EQ("\x81\x80\x04*"sv, std::string_view(e.data(), 4));
|
2015-07-04 10:18:30 -07:00
|
|
|
EXPECT_EQ('*', e.data()[65536]);
|
|
|
|
|
EXPECT_EQ('x', e.data()[65537]);
|
|
|
|
|
EXPECT_EQ('x', e.data()[65538]);
|
|
|
|
|
EXPECT_EQ('x', e.data()[65539]);
|
|
|
|
|
}
|
|
|
|
|
|
2015-07-17 07:21:07 -07:00
|
|
|
} // namespace nt
|