| #include <errno.h> | |
| #include <fcntl.h> | |
| #include <unistd.h> | |
| #include <memory> | |
| #include <string> | |
| #include <thread> | |
| #include <utility> | |
| #include <gtest/gtest.h> | |
| #include <pdx/rpc/argument_encoder.h> | |
| #include <pdx/rpc/array_wrapper.h> | |
| #include <pdx/rpc/default_initialization_allocator.h> | |
| #include <pdx/rpc/payload.h> | |
| #include <pdx/rpc/serializable.h> | |
| #include <pdx/rpc/serialization.h> | |
| #include <pdx/rpc/string_wrapper.h> | |
| #include <pdx/utility.h> | |
| using namespace android::pdx; | |
| using namespace android::pdx::rpc; | |
| // Tests the serialization/deserialization of all supported types, verifying all | |
| // reasonable boundary conditions for types with multiple encodings. | |
| // | |
| // NOTE: Sometimes this file uses the construct "var = decltype(var)({...})" | |
| // instead of the equivalent "var = {...}" to construct vectors. This is to | |
| // prevent clang-format from producing annoyingly vertical code from long | |
| // initializers. | |
| // TODO(eieio): Automatically generate some of these tests? | |
| namespace { | |
| // Test data for serialization/deserialization of floats. | |
| const float kZeroFloat = 0.0f; | |
| const float kOneFloat = 1.0f; | |
| const auto kZeroFloatBytes = reinterpret_cast<const std::uint8_t*>(&kZeroFloat); | |
| const auto kOneFloatBytes = reinterpret_cast<const std::uint8_t*>(&kOneFloat); | |
| const double kZeroDouble = 0.0; | |
| const double kOneDouble = 1.0; | |
| const auto kZeroDoubleBytes = | |
| reinterpret_cast<const std::uint8_t*>(&kZeroDouble); | |
| const auto kOneDoubleBytes = reinterpret_cast<const std::uint8_t*>(&kOneDouble); | |
| struct TestType { | |
| enum class Foo { kFoo, kBar, kBaz }; | |
| int a; | |
| float b; | |
| std::string c; | |
| Foo d; | |
| TestType() {} | |
| TestType(int a, float b, const std::string& c, Foo d) | |
| : a(a), b(b), c(c), d(d) {} | |
| // Make gtest expressions simpler by defining equality operator. This is not | |
| // needed for serialization. | |
| bool operator==(const TestType& other) const { | |
| return a == other.a && b == other.b && c == other.c && d == other.d; | |
| } | |
| private: | |
| PDX_SERIALIZABLE_MEMBERS(TestType, a, b, c, d); | |
| }; | |
| template <typename FileHandleType> | |
| struct TestTemplateType { | |
| FileHandleType fd; | |
| TestTemplateType() {} | |
| TestTemplateType(FileHandleType fd) : fd(std::move(fd)) {} | |
| bool operator==(const TestTemplateType& other) const { | |
| return fd.Get() == other.fd.Get(); | |
| } | |
| private: | |
| PDX_SERIALIZABLE_MEMBERS(TestTemplateType<FileHandleType>, fd); | |
| }; | |
| // Utilities to generate test maps and payloads. | |
| template <typename MapType> | |
| MapType MakeMap(std::size_t size) { | |
| MapType result; | |
| for (std::size_t i = 0; i < size; i++) { | |
| result.emplace(i, i); | |
| } | |
| return result; | |
| } | |
| template <typename MapType> | |
| void InsertKeyValue(MessageWriter* writer, std::size_t size) { | |
| MapType map; | |
| for (std::size_t i = 0; i < size; i++) { | |
| map.emplace(i, i); | |
| } | |
| for (const auto& element : map) { | |
| Serialize(element.first, writer); | |
| Serialize(element.second, writer); | |
| } | |
| } | |
| } // anonymous namespace | |
| TEST(SerializableTypes, Constructor) { | |
| TestType tt(1, 2.0, "three", TestType::Foo::kBar); | |
| EXPECT_EQ(1, tt.a); | |
| EXPECT_EQ(2.0, tt.b); | |
| EXPECT_EQ("three", tt.c); | |
| EXPECT_EQ(TestType::Foo::kBar, tt.d); | |
| } | |
| TEST(SerializationTest, bool) { | |
| Payload result; | |
| Payload expected; | |
| bool value; | |
| // True. | |
| value = true; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_TRUE}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // False. | |
| value = false; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_FALSE}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| } | |
| TEST(SerializationTest, uint8_t) { | |
| Payload result; | |
| Payload expected; | |
| uint8_t value; | |
| // Min FIXINT. | |
| value = 0; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_POSITIVE_FIXINT_MIN}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max FIXINT. | |
| value = (1 << 7) - 1; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_POSITIVE_FIXINT_MAX}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min UINT8. | |
| value = (1 << 7); | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_UINT8, (1 << 7)}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max UINT8. | |
| value = 0xff; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_UINT8, 0xff}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| } | |
| TEST(SerializationTest, uint16_t) { | |
| Payload result; | |
| Payload expected; | |
| uint16_t value; | |
| // Min FIXINT. | |
| value = 0; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_POSITIVE_FIXINT_MIN}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max FIXINT. | |
| value = (1 << 7) - 1; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_POSITIVE_FIXINT_MAX}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min UINT8. | |
| value = (1 << 7); | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_UINT8, (1 << 7)}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max UINT8. | |
| value = 0xff; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_UINT8, 0xff}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min UINT16. | |
| value = (1 << 8); | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_UINT16, 0, 1}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max UINT16. | |
| value = 0xffff; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_UINT16, 0xff, 0xff}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| } | |
| TEST(SerializationTest, uint32_t) { | |
| Payload result; | |
| Payload expected; | |
| uint32_t value; | |
| // Min FIXINT. | |
| value = 0; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_POSITIVE_FIXINT_MIN}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max FIXINT. | |
| value = (1 << 7) - 1; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_POSITIVE_FIXINT_MAX}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min UINT8. | |
| value = (1 << 7); | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_UINT8, (1 << 7)}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max UINT8. | |
| value = 0xff; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_UINT8, 0xff}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min UINT16. | |
| value = (1 << 8); | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_UINT16, 0, 1}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max UINT16. | |
| value = 0xffff; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_UINT16, 0xff, 0xff}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min UINT32. | |
| value = (1 << 16); | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_UINT32, 0, 0, 1, 0}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max UINT32. | |
| value = 0xffffffff; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_UINT32, 0xff, 0xff, 0xff, 0xff}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| } | |
| TEST(SerializationTest, uint64_t) { | |
| Payload result; | |
| Payload expected; | |
| uint64_t value; | |
| // Min FIXINT. | |
| value = 0; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_POSITIVE_FIXINT_MIN}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max FIXINT. | |
| value = (1 << 7) - 1; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_POSITIVE_FIXINT_MAX}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min UINT8. | |
| value = (1 << 7); | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_UINT8, (1 << 7)}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max UINT8. | |
| value = 0xff; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_UINT8, 0xff}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min UINT16. | |
| value = (1 << 8); | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_UINT16, 0, 1}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max UINT16. | |
| value = 0xffff; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_UINT16, 0xff, 0xff}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min UINT32. | |
| value = (1 << 16); | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_UINT32, 0, 0, 1, 0}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max UINT32. | |
| value = 0xffffffff; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_UINT32, 0xff, 0xff, 0xff, 0xff}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min UINT64. | |
| value = (1ULL << 32); | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_UINT64, 0, 0, 0, 0, 1, 0, 0, 0}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max UINT64. | |
| value = 0xffffffffffffffffULL; | |
| Serialize(value, &result); | |
| expected = { | |
| ENCODING_TYPE_UINT64, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| } | |
| TEST(SerializationTest, int8_t) { | |
| Payload result; | |
| Payload expected; | |
| int8_t value; | |
| // Min NEGATIVE FIXINT. | |
| value = -32; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_NEGATIVE_FIXINT_MIN}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max NEGATIVE FIXINT. | |
| value = -1; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_NEGATIVE_FIXINT_MAX}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min FIXINT. | |
| value = 0; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_POSITIVE_FIXINT_MIN}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max FIXINT. | |
| value = 127; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_POSITIVE_FIXINT_MAX}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min INT8. | |
| value = -128; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_INT8, 0x80}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max INT8. | |
| value = -33; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_INT8, 0xdf}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| } | |
| TEST(SerializationTest, int16_t) { | |
| Payload result; | |
| Payload expected; | |
| int16_t value; | |
| // Min NEGATIVE FIXINT. | |
| value = -32; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_NEGATIVE_FIXINT_MIN}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max NEGATIVE FIXINT. | |
| value = -1; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_NEGATIVE_FIXINT_MAX}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min FIXINT. | |
| value = 0; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_POSITIVE_FIXINT_MIN}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max FIXINT. | |
| value = 127; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_POSITIVE_FIXINT_MAX}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min INT8. | |
| value = -128; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_INT8, 0x80}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max INT8. | |
| value = -33; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_INT8, 0xdf}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min INT16. | |
| value = -32768; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_INT16, 0x00, 0x80}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max INT16. | |
| value = 32767; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_INT16, 0xff, 0x7f}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| } | |
| TEST(SerializationTest, int32_t) { | |
| Payload result; | |
| Payload expected; | |
| int32_t value; | |
| // Min NEGATIVE FIXINT. | |
| value = -32; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_NEGATIVE_FIXINT_MIN}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max NEGATIVE FIXINT. | |
| value = -1; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_NEGATIVE_FIXINT_MAX}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min FIXINT. | |
| value = 0; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_POSITIVE_FIXINT_MIN}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max FIXINT. | |
| value = 127; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_POSITIVE_FIXINT_MAX}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min INT8. | |
| value = -128; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_INT8, 0x80}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max INT8. | |
| value = -33; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_INT8, 0xdf}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min INT16. | |
| value = -32768; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_INT16, 0x00, 0x80}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max INT16. | |
| value = 32767; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_INT16, 0xff, 0x7f}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min INT32. | |
| value = -2147483648; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_INT32, 0x00, 0x00, 0x00, 0x80}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max INT32. | |
| value = 2147483647; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_INT32, 0xff, 0xff, 0xff, 0x7f}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| } | |
| TEST(SerializationTest, int64_t) { | |
| Payload result; | |
| Payload expected; | |
| int64_t value; | |
| // Min NEGATIVE FIXINT. | |
| value = -32; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_NEGATIVE_FIXINT_MIN}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max NEGATIVE FIXINT. | |
| value = -1; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_NEGATIVE_FIXINT_MAX}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min FIXINT. | |
| value = 0; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_POSITIVE_FIXINT_MIN}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max FIXINT. | |
| value = 127; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_POSITIVE_FIXINT_MAX}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min INT8. | |
| value = -128; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_INT8, 0x80}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max INT8. | |
| value = -33; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_INT8, 0xdf}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min INT16. | |
| value = -32768; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_INT16, 0x00, 0x80}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max INT16. | |
| value = 32767; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_INT16, 0xff, 0x7f}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min INT32. | |
| value = -2147483648; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_INT32, 0x00, 0x00, 0x00, 0x80}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max INT32. | |
| value = 2147483647; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_INT32, 0xff, 0xff, 0xff, 0x7f}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min INT64. | |
| value = -9223372036854775808ULL; | |
| Serialize(value, &result); | |
| expected = { | |
| ENCODING_TYPE_INT64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max INT64. | |
| value = 9223372036854775807ULL; | |
| Serialize(value, &result); | |
| expected = { | |
| ENCODING_TYPE_INT64, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| } | |
| TEST(SerializationTest, float) { | |
| Payload result; | |
| Payload expected; | |
| float value; | |
| value = 0.0f; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_FLOAT32, kZeroFloatBytes[0], kZeroFloatBytes[1], | |
| kZeroFloatBytes[2], kZeroFloatBytes[3]}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| value = 1.0f; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_FLOAT32, kOneFloatBytes[0], kOneFloatBytes[1], | |
| kOneFloatBytes[2], kOneFloatBytes[3]}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| } | |
| TEST(SerializationTest, double) { | |
| Payload result; | |
| Payload expected; | |
| double value; | |
| value = 0.0f; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_FLOAT64, kZeroDoubleBytes[0], kZeroDoubleBytes[1], | |
| kZeroDoubleBytes[2], kZeroDoubleBytes[3], kZeroDoubleBytes[4], | |
| kZeroDoubleBytes[5], kZeroDoubleBytes[6], kZeroDoubleBytes[7]}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| value = 1.0f; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_FLOAT64, kOneDoubleBytes[0], kOneDoubleBytes[1], | |
| kOneDoubleBytes[2], kOneDoubleBytes[3], kOneDoubleBytes[4], | |
| kOneDoubleBytes[5], kOneDoubleBytes[6], kOneDoubleBytes[7]}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| } | |
| TEST(SerializationTest, Enum) { | |
| Payload result; | |
| Payload expected; | |
| enum Foo { kFoo, kBar, kBaz }; | |
| Foo value = kBar; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_POSITIVE_FIXINT_MIN + 1}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| } | |
| TEST(SerializationTest, EnumClass) { | |
| Payload result; | |
| Payload expected; | |
| enum class Foo { kFoo, kBar, kBaz }; | |
| Foo value = Foo::kBaz; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_POSITIVE_FIXINT_MIN + 2}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| } | |
| TEST(SerializationTest, LocalHandle) { | |
| Payload result; | |
| Payload expected; | |
| LocalHandle fd1; | |
| LocalHandle fd2; | |
| fd1 = LocalHandle(100); | |
| Serialize(fd1, &result); | |
| expected = {ENCODING_TYPE_FIXEXT2, ENCODING_EXT_TYPE_FILE_DESCRIPTOR, 0, 0}; | |
| EXPECT_EQ(expected, result); | |
| EXPECT_EQ(1u, result.FdCount()); | |
| EXPECT_EQ(100, result.FdArray()[0]); | |
| result.Clear(); | |
| fd2 = LocalHandle(200); | |
| Serialize(std::forward_as_tuple(fd1, fd2), &result); | |
| expected = decltype(expected)( | |
| {ENCODING_TYPE_FIXARRAY_MIN + 2, ENCODING_TYPE_FIXEXT2, | |
| ENCODING_EXT_TYPE_FILE_DESCRIPTOR, 0, 0, ENCODING_TYPE_FIXEXT2, | |
| ENCODING_EXT_TYPE_FILE_DESCRIPTOR, 1, 0}); | |
| EXPECT_EQ(expected, result); | |
| EXPECT_EQ(2u, result.FdCount()); | |
| EXPECT_EQ(100, result.FdArray()[0]); | |
| EXPECT_EQ(200, result.FdArray()[1]); | |
| result.Clear(); | |
| fd1.Release(); // Don't try to close fd 100. | |
| fd2.Release(); // Don't try to close fd 200. | |
| fd1 = LocalHandle(-2); | |
| Serialize(fd1, &result); | |
| expected = {ENCODING_TYPE_FIXEXT2, ENCODING_EXT_TYPE_FILE_DESCRIPTOR, 0xfe, | |
| 0xff}; | |
| EXPECT_EQ(expected, result); | |
| EXPECT_EQ(0u, result.FdCount()); | |
| result.Clear(); | |
| } | |
| TEST(SerializationTest, string) { | |
| Payload result; | |
| Payload expected; | |
| std::string value; | |
| // Min FIXSTR. | |
| value = ""; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_FIXSTR_MIN}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max FIXSTR. | |
| value = std::string((1 << 5) - 1, 'x'); | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_FIXSTR_MAX}; | |
| expected.Append((1 << 5) - 1, 'x'); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min STR8. | |
| value = std::string((1 << 5), 'x'); | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_STR8, (1 << 5)}; | |
| expected.Append((1 << 5), 'x'); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max STR8. | |
| value = std::string((1 << 8) - 1, 'x'); | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_STR8, (1 << 8) - 1}; | |
| expected.Append((1 << 8) - 1, 'x'); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min STR16. | |
| value = std::string((1 << 8), 'x'); | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_STR16, 0x00, 0x01}; | |
| expected.Append((1 << 8), 'x'); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max STR16. | |
| value = std::string((1 << 16) - 1, 'x'); | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_STR16, 0xff, 0xff}; | |
| expected.Append((1 << 16) - 1, 'x'); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min STR32. | |
| value = std::string((1 << 16), 'x'); | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_STR32, 0x00, 0x00, 0x01, 0x00}; | |
| expected.Append((1 << 16), 'x'); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| } | |
| TEST(SerializationTest, StringWrapper) { | |
| Payload result; | |
| Payload expected; | |
| std::string value; | |
| // Min FIXSTR. | |
| value = ""; | |
| Serialize(WrapString(value), &result); | |
| expected = {ENCODING_TYPE_FIXSTR_MIN}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max FIXSTR. | |
| value = std::string((1 << 5) - 1, 'x'); | |
| Serialize(WrapString(value), &result); | |
| expected = {ENCODING_TYPE_FIXSTR_MAX}; | |
| expected.Append((1 << 5) - 1, 'x'); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min STR8. | |
| value = std::string((1 << 5), 'x'); | |
| Serialize(WrapString(value), &result); | |
| expected = {ENCODING_TYPE_STR8, (1 << 5)}; | |
| expected.Append((1 << 5), 'x'); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max STR8. | |
| value = std::string((1 << 8) - 1, 'x'); | |
| Serialize(WrapString(value), &result); | |
| expected = {ENCODING_TYPE_STR8, (1 << 8) - 1}; | |
| expected.Append((1 << 8) - 1, 'x'); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min STR16. | |
| value = std::string((1 << 8), 'x'); | |
| Serialize(WrapString(value), &result); | |
| expected = {ENCODING_TYPE_STR16, 0x00, 0x01}; | |
| expected.Append((1 << 8), 'x'); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max STR16. | |
| value = std::string((1 << 16) - 1, 'x'); | |
| Serialize(WrapString(value), &result); | |
| expected = {ENCODING_TYPE_STR16, 0xff, 0xff}; | |
| expected.Append((1 << 16) - 1, 'x'); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min STR32. | |
| value = std::string((1 << 16), 'x'); | |
| Serialize(WrapString(value), &result); | |
| expected = {ENCODING_TYPE_STR32, 0x00, 0x00, 0x01, 0x00}; | |
| expected.Append((1 << 16), 'x'); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| } | |
| TEST(SerializationTest, vector) { | |
| Payload result; | |
| Payload expected; | |
| std::vector<uint8_t> value; | |
| // Min FIXARRAY. | |
| value = {}; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_FIXARRAY_MIN}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max FIXARRAY. | |
| value = decltype(value)((1 << 4) - 1, 'x'); | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_FIXARRAY_MAX}; | |
| expected.Append((1 << 4) - 1, 'x'); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min ARRAY16. | |
| value = decltype(value)((1 << 4), 'x'); | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_ARRAY16, 0x10, 0x00}; | |
| expected.Append((1 << 4), 'x'); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max ARRAY16. | |
| value = decltype(value)((1 << 16) - 1, 'x'); | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_ARRAY16, 0xff, 0xff}; | |
| expected.Append((1 << 16) - 1, 'x'); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min ARRAY32. | |
| value = decltype(value)((1 << 16), 'x'); | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_ARRAY32, 0x00, 0x00, 0x01, 0x00}; | |
| expected.Append((1 << 16), 'x'); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| } | |
| TEST(SerializationTest, map) { | |
| Payload result; | |
| Payload expected; | |
| std::map<std::uint32_t, std::uint32_t> value; | |
| // Min FIXMAP. | |
| value = {}; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_FIXMAP_MIN}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max FIXMAP. | |
| value = MakeMap<decltype(value)>((1 << 4) - 1); | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_FIXMAP_MAX}; | |
| InsertKeyValue<decltype(value)>(&expected, (1 << 4) - 1); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min MAP16. | |
| value = MakeMap<decltype(value)>((1 << 4)); | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_MAP16, 0x10, 0x00}; | |
| InsertKeyValue<decltype(value)>(&expected, (1 << 4)); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max MAP16. | |
| value = MakeMap<decltype(value)>((1 << 16) - 1); | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_MAP16, 0xff, 0xff}; | |
| InsertKeyValue<decltype(value)>(&expected, (1 << 16) - 1); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min MAP32. | |
| value = MakeMap<decltype(value)>((1 << 16)); | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_MAP32, 0x00, 0x00, 0x01, 0x00}; | |
| InsertKeyValue<decltype(value)>(&expected, (1 << 16)); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| } | |
| TEST(SerializationTest, unordered_map) { | |
| Payload result; | |
| Payload expected; | |
| std::unordered_map<std::uint32_t, std::uint32_t> value; | |
| // Min FIXMAP. | |
| value = {}; | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_FIXMAP_MIN}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max FIXMAP. | |
| value = MakeMap<decltype(value)>((1 << 4) - 1); | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_FIXMAP_MAX}; | |
| InsertKeyValue<decltype(value)>(&expected, (1 << 4) - 1); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min MAP16. | |
| value = MakeMap<decltype(value)>((1 << 4)); | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_MAP16, 0x10, 0x00}; | |
| InsertKeyValue<decltype(value)>(&expected, (1 << 4)); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max MAP16. | |
| value = MakeMap<decltype(value)>((1 << 16) - 1); | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_MAP16, 0xff, 0xff}; | |
| InsertKeyValue<decltype(value)>(&expected, (1 << 16) - 1); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min MAP32. | |
| value = MakeMap<decltype(value)>((1 << 16)); | |
| Serialize(value, &result); | |
| expected = {ENCODING_TYPE_MAP32, 0x00, 0x00, 0x01, 0x00}; | |
| InsertKeyValue<decltype(value)>(&expected, (1 << 16)); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| } | |
| TEST(SerializationTest, array) { | |
| Payload result; | |
| Payload expected; | |
| // Min FIXARRAY. | |
| std::array<std::uint8_t, 0> a0; | |
| Serialize(a0, &result); | |
| expected = {ENCODING_TYPE_FIXARRAY_MIN}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max FIXARRAY. | |
| std::array<std::uint8_t, (1 << 4) - 1> a1; | |
| for (auto& element : a1) | |
| element = 'x'; | |
| Serialize(a1, &result); | |
| expected = {ENCODING_TYPE_FIXARRAY_MAX}; | |
| expected.Append((1 << 4) - 1, 'x'); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min ARRAY16. | |
| std::array<std::uint8_t, (1 << 4)> a2; | |
| for (auto& element : a2) | |
| element = 'x'; | |
| Serialize(a2, &result); | |
| expected = {ENCODING_TYPE_ARRAY16, 0x10, 0x00}; | |
| expected.Append((1 << 4), 'x'); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max ARRAY16. | |
| std::array<std::uint8_t, (1 << 16) - 1> a3; | |
| for (auto& element : a3) | |
| element = 'x'; | |
| Serialize(a3, &result); | |
| expected = {ENCODING_TYPE_ARRAY16, 0xff, 0xff}; | |
| expected.Append((1 << 16) - 1, 'x'); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min ARRAY32. | |
| std::array<std::uint8_t, (1 << 16)> a4; | |
| for (auto& element : a4) | |
| element = 'x'; | |
| Serialize(a4, &result); | |
| expected = {ENCODING_TYPE_ARRAY32, 0x00, 0x00, 0x01, 0x00}; | |
| expected.Append((1 << 16), 'x'); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| } | |
| TEST(SerializationTest, ArrayWrapper) { | |
| Payload result; | |
| Payload expected; | |
| std::vector<std::uint8_t, DefaultInitializationAllocator<std::uint8_t>> value; | |
| ArrayWrapper<std::uint8_t> wrapper; | |
| // Min FIXARRAY. | |
| value = {}; | |
| Serialize(wrapper, &result); | |
| expected = {ENCODING_TYPE_FIXARRAY_MIN}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max FIXARRAY. | |
| value = decltype(value)((1 << 4) - 1, 'x'); | |
| wrapper = decltype(wrapper)(value.data(), value.capacity(), value.size()); | |
| Serialize(wrapper, &result); | |
| expected = {ENCODING_TYPE_FIXARRAY_MAX}; | |
| expected.Append((1 << 4) - 1, 'x'); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min ARRAY16. | |
| value = decltype(value)((1 << 4), 'x'); | |
| wrapper = decltype(wrapper)(value.data(), value.capacity(), value.size()); | |
| Serialize(wrapper, &result); | |
| expected = {ENCODING_TYPE_ARRAY16, 0x10, 0x00}; | |
| expected.Append((1 << 4), 'x'); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max ARRAY16. | |
| value = decltype(value)((1 << 16) - 1, 'x'); | |
| wrapper = decltype(wrapper)(value.data(), value.capacity(), value.size()); | |
| Serialize(wrapper, &result); | |
| expected = {ENCODING_TYPE_ARRAY16, 0xff, 0xff}; | |
| expected.Append((1 << 16) - 1, 'x'); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min ARRAY32. | |
| value = decltype(value)((1 << 16), 'x'); | |
| wrapper = decltype(wrapper)(value.data(), value.capacity(), value.size()); | |
| Serialize(wrapper, &result); | |
| expected = {ENCODING_TYPE_ARRAY32, 0x00, 0x00, 0x01, 0x00}; | |
| expected.Append((1 << 16), 'x'); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| } | |
| TEST(SerializationTest, pair) { | |
| Payload result; | |
| Payload expected; | |
| auto p1 = std::make_pair(1, 2); | |
| Serialize(p1, &result); | |
| expected = {ENCODING_TYPE_FIXARRAY_MIN + 2, 1, 2}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| auto p2 = std::make_pair('x', std::string("12345")); | |
| Serialize(p2, &result); | |
| expected = decltype(expected)({ENCODING_TYPE_FIXARRAY_MIN + 2, 'x', | |
| ENCODING_TYPE_FIXSTR_MIN + 5, '1', '2', '3', | |
| '4', '5'}); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| } | |
| TEST(SerializationTest, tuple) { | |
| Payload result; | |
| Payload expected; | |
| // Min FIXARRAY. | |
| auto t1 = std::make_tuple(); | |
| Serialize(t1, &result); | |
| expected = {ENCODING_TYPE_FIXARRAY_MIN}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Max FIXARRAY. | |
| auto t2 = GetNTuple<15>('x'); | |
| Serialize(t2, &result); | |
| expected = {ENCODING_TYPE_FIXARRAY_MAX}; | |
| expected.Append((1 << 4) - 1, 'x'); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min ARRAY16. | |
| auto t3 = GetNTuple<(1 << 4)>('x'); | |
| Serialize(t3, &result); | |
| expected = {ENCODING_TYPE_ARRAY16, 0x10, 0x00}; | |
| expected.Append((1 << 4), 'x'); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Template instantiation depth is an issue for these tests. They are commented | |
| // out to document the expected behavior, even though tuples of this order are | |
| // not expected in practice. | |
| #if 0 | |
| // Max ARRAY16. | |
| auto t4 = GetNTuple<(1 << 16)-1>('x'); | |
| Serialize(t4, &result); | |
| expected = {ENCODING_TYPE_ARRAY16, 0xff, 0xff}; | |
| expected.Append((1 << 16)-1, 'x'); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // Min ARRAY32. | |
| auto t5 = GetNTuple<(1 << 16)>('x'); | |
| Serialize(t5, &result); | |
| expected = {ENCODING_TYPE_ARRAY32, 0x00, 0x00, 0x01, 0x00}; | |
| expected.Append((1 << 16), 'x'); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| #endif | |
| } | |
| // TODO(eieio): More exhaustive testing of type nesting. | |
| TEST(SerializationTest, NestedTuple) { | |
| Payload result; | |
| Payload expected; | |
| auto t1 = std::make_tuple('x', std::make_tuple<int, int>(1, 2)); | |
| Serialize(t1, &result); | |
| expected = decltype(expected)({ENCODING_TYPE_FIXARRAY_MIN + 2, 'x', | |
| ENCODING_TYPE_FIXARRAY_MIN + 2, 1, 2}); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| auto t2 = std::make_tuple('x', std::make_tuple<int, int>(1, 2), | |
| std::string("0123456789")); | |
| Serialize(t2, &result); | |
| expected = decltype(expected)({ENCODING_TYPE_FIXARRAY_MIN + 3, 'x', | |
| ENCODING_TYPE_FIXARRAY_MIN + 2, 1, 2, | |
| ENCODING_TYPE_FIXSTR | 10, '0', '1', '2', '3', | |
| '4', '5', '6', '7', '8', '9'}); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| auto t3 = std::make_tuple(0.0f, std::uint64_t(10ULL), | |
| std::vector<char>{'a', 'b', 'c'}); | |
| Serialize(t3, &result); | |
| expected = decltype(expected)( | |
| {ENCODING_TYPE_FIXARRAY_MIN + 3, ENCODING_TYPE_FLOAT32, | |
| kZeroFloatBytes[0], kZeroFloatBytes[1], kZeroFloatBytes[2], | |
| kZeroFloatBytes[3], ENCODING_TYPE_POSITIVE_FIXINT_MIN + 10, | |
| ENCODING_TYPE_FIXARRAY_MIN + 3, 'a', 'b', 'c'}); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| } | |
| TEST(SerializationTest, NestedMap) { | |
| Payload result; | |
| Payload expected; | |
| std::map<int, std::pair<std::string, int>> m1 = {{0, {"a", 2}}, | |
| {1, {"b", 10}}}; | |
| Serialize(m1, &result); | |
| expected = decltype(expected)( | |
| {ENCODING_TYPE_FIXMAP_MIN + 2, 0, ENCODING_TYPE_FIXARRAY_MIN + 2, | |
| ENCODING_TYPE_FIXSTR_MIN + 1, 'a', 2, 1, ENCODING_TYPE_FIXARRAY_MIN + 2, | |
| ENCODING_TYPE_FIXSTR_MIN + 1, 'b', 10}); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| } | |
| TEST(SerializationTest, Serializable) { | |
| Payload result; | |
| Payload expected; | |
| TestType t1{10, 0.0, "12345", TestType::Foo::kBaz}; | |
| Serialize(t1, &result); | |
| expected = decltype(expected)( | |
| {ENCODING_TYPE_FIXARRAY_MIN + 4, 10, ENCODING_TYPE_FLOAT32, | |
| kZeroFloatBytes[0], kZeroFloatBytes[1], kZeroFloatBytes[2], | |
| kZeroFloatBytes[3], ENCODING_TYPE_FIXSTR_MIN + 5, '1', '2', '3', '4', | |
| '5', ENCODING_TYPE_POSITIVE_FIXINT_MIN + 2}); | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| TestTemplateType<LocalHandle> tt{LocalHandle(-1)}; | |
| Serialize(tt, &result); | |
| expected = | |
| decltype(expected)({ENCODING_TYPE_FIXARRAY_MIN + 1, ENCODING_TYPE_FIXEXT2, | |
| ENCODING_EXT_TYPE_FILE_DESCRIPTOR, 0xff, 0xff}); | |
| EXPECT_EQ(expected, result); | |
| } | |
| TEST(SerializationTest, Variant) { | |
| Payload result; | |
| Payload expected; | |
| Variant<int, bool, float> v; | |
| // Empty variant. | |
| Serialize(v, &result); | |
| expected = {ENCODING_TYPE_FIXMAP_MIN + 1, ENCODING_TYPE_NEGATIVE_FIXINT_MAX, | |
| ENCODING_TYPE_NIL}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| v = 10; | |
| Serialize(v, &result); | |
| expected = {ENCODING_TYPE_FIXMAP_MIN + 1, | |
| ENCODING_TYPE_POSITIVE_FIXINT_MIN + 0, | |
| ENCODING_TYPE_POSITIVE_FIXINT_MIN + 10}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| v = true; | |
| Serialize(v, &result); | |
| expected = {ENCODING_TYPE_FIXMAP_MIN + 1, | |
| ENCODING_TYPE_POSITIVE_FIXINT_MIN + 1, ENCODING_TYPE_TRUE}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| v = false; | |
| Serialize(v, &result); | |
| expected = {ENCODING_TYPE_FIXMAP_MIN + 1, | |
| ENCODING_TYPE_POSITIVE_FIXINT_MIN + 1, ENCODING_TYPE_FALSE}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| v = 1.0f; | |
| Serialize(v, &result); | |
| expected = {ENCODING_TYPE_FIXMAP_MIN + 1, | |
| ENCODING_TYPE_POSITIVE_FIXINT_MIN + 2, | |
| ENCODING_TYPE_FLOAT32, | |
| kOneFloatBytes[0], | |
| kOneFloatBytes[1], | |
| kOneFloatBytes[2], | |
| kOneFloatBytes[3]}; | |
| EXPECT_EQ(expected, result); | |
| result.Clear(); | |
| // TODO(eieio): Add more serialization tests for Variant. | |
| } | |
| TEST(DeserializationTest, bool) { | |
| Payload buffer; | |
| bool result = false; | |
| ErrorType error; | |
| // True. | |
| buffer = {ENCODING_TYPE_TRUE}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(1, result); // Gtest generates warning from bool literals. | |
| // False. | |
| buffer = {ENCODING_TYPE_FALSE}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(0, result); // Gtest generates warning from bool literals. | |
| } | |
| TEST(DeserializationTest, uint8_t) { | |
| Payload buffer; | |
| std::uint8_t result = 0; | |
| ErrorType error; | |
| // Min FIXINT. | |
| buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MIN}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(0U, result); | |
| // Max FIXINT. | |
| buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MAX}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(127U, result); | |
| // Min UINT8. | |
| buffer = {ENCODING_TYPE_UINT8, 0x00}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(0U, result); | |
| // Max UINT8. | |
| buffer = {ENCODING_TYPE_UINT8, 0xff}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(0xffU, result); | |
| // UINT16 out of range. | |
| buffer = {ENCODING_TYPE_UINT16}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error); | |
| EXPECT_EQ(ENCODING_CLASS_UINT, error.encoding_class()); | |
| EXPECT_EQ(ENCODING_TYPE_UINT16, error.encoding_type()); | |
| // UINT32 out of range. | |
| buffer = {ENCODING_TYPE_UINT32}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error); | |
| EXPECT_EQ(ENCODING_CLASS_UINT, error.encoding_class()); | |
| EXPECT_EQ(ENCODING_TYPE_UINT32, error.encoding_type()); | |
| // UINT64 out of range. | |
| buffer = {ENCODING_TYPE_UINT64}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error); | |
| EXPECT_EQ(ENCODING_CLASS_UINT, error.encoding_class()); | |
| EXPECT_EQ(ENCODING_TYPE_UINT64, error.encoding_type()); | |
| } | |
| TEST(DeserializationTest, uint16_t) { | |
| Payload buffer; | |
| std::uint16_t result = 0; | |
| ErrorType error; | |
| // Min FIXINT. | |
| buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MIN}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(0U, result); | |
| // Max FIXINT. | |
| buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MAX}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(127U, result); | |
| // Min UINT8. | |
| buffer = {ENCODING_TYPE_UINT8, 0x00}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(0U, result); | |
| // Max UINT8. | |
| buffer = {ENCODING_TYPE_UINT8, 0xff}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(0xffU, result); | |
| // Min UINT16. | |
| buffer = {ENCODING_TYPE_UINT16, 0x00, 0x00}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(0U, result); | |
| // Max UINT16. | |
| buffer = {ENCODING_TYPE_UINT16, 0xff, 0xff}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(0xffffU, result); | |
| // UINT32 out of range. | |
| buffer = {ENCODING_TYPE_UINT32}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error); | |
| EXPECT_EQ(ENCODING_CLASS_UINT, error.encoding_class()); | |
| EXPECT_EQ(ENCODING_TYPE_UINT32, error.encoding_type()); | |
| // UINT64 out of range. | |
| buffer = {ENCODING_TYPE_UINT64}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error); | |
| EXPECT_EQ(ENCODING_CLASS_UINT, error.encoding_class()); | |
| EXPECT_EQ(ENCODING_TYPE_UINT64, error.encoding_type()); | |
| } | |
| TEST(DeserializationTest, uint32_t) { | |
| Payload buffer; | |
| std::uint32_t result = 0; | |
| ErrorType error; | |
| // Min FIXINT. | |
| buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MIN}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(0U, result); | |
| // Max FIXINT. | |
| buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MAX}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(127U, result); | |
| // Min UINT8. | |
| buffer = {ENCODING_TYPE_UINT8, 0x00}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(0U, result); | |
| // Max UINT8. | |
| buffer = {ENCODING_TYPE_UINT8, 0xff}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(0xffU, result); | |
| // Min UINT16. | |
| buffer = {ENCODING_TYPE_UINT16, 0x00, 0x00}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(0U, result); | |
| // Max UINT16. | |
| buffer = {ENCODING_TYPE_UINT16, 0xff, 0xff}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(0xffffU, result); | |
| // Min UINT32. | |
| buffer = {ENCODING_TYPE_UINT32, 0x00, 0x00, 0x00, 0x00}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(0U, result); | |
| // Max UINT32. | |
| buffer = {ENCODING_TYPE_UINT32, 0xff, 0xff, 0xff, 0xff}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(0xffffffffU, result); | |
| // UINT64 out of range. | |
| buffer = {ENCODING_TYPE_UINT64}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error); | |
| EXPECT_EQ(ENCODING_CLASS_UINT, error.encoding_class()); | |
| EXPECT_EQ(ENCODING_TYPE_UINT64, error.encoding_type()); | |
| } | |
| TEST(DeserializationTest, uint64_t) { | |
| Payload buffer; | |
| std::uint64_t result = 0; | |
| ErrorType error; | |
| // Min FIXINT. | |
| buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MIN}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(0U, result); | |
| // Max FIXINT. | |
| buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MAX}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(127U, result); | |
| // Min UINT8. | |
| buffer = {ENCODING_TYPE_UINT8, 0x00}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(0U, result); | |
| // Max UINT8. | |
| buffer = {ENCODING_TYPE_UINT8, 0xff}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(0xffU, result); | |
| // Min UINT16. | |
| buffer = {ENCODING_TYPE_UINT16, 0x00, 0x00}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(0U, result); | |
| // Max UINT16. | |
| buffer = {ENCODING_TYPE_UINT16, 0xff, 0xff}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(0xffffU, result); | |
| // Min UINT32. | |
| buffer = {ENCODING_TYPE_UINT32, 0x00, 0x00, 0x00, 0x00}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(0U, result); | |
| // Max UINT32. | |
| buffer = {ENCODING_TYPE_UINT32, 0xff, 0xff, 0xff, 0xff}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(0xffffffffU, result); | |
| // Min UINT64. | |
| buffer = { | |
| ENCODING_TYPE_UINT64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(0U, result); | |
| // Max UINT64. | |
| buffer = { | |
| ENCODING_TYPE_UINT64, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(0xffffffffffffffffUL, result); | |
| } | |
| TEST(DeserializationTest, int8_t) { | |
| Payload buffer; | |
| std::int8_t result = 0; | |
| ErrorType error; | |
| // Min NEGATIVE FIXINT. | |
| buffer = {ENCODING_TYPE_NEGATIVE_FIXINT_MIN}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(-32, result); | |
| // Max NEGATIVE FIXINT. | |
| buffer = {ENCODING_TYPE_NEGATIVE_FIXINT_MAX}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(-1, result); | |
| // Min FIXINT. | |
| buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MIN}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(0, result); | |
| // Max FIXINT. | |
| buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MAX}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(127, result); | |
| // Min INT8. | |
| buffer = {ENCODING_TYPE_INT8, 0x80}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(-128, result); | |
| // Max INT8. | |
| buffer = {ENCODING_TYPE_INT8, 0x7f}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(127, result); | |
| // INT16 out of range. | |
| buffer = {ENCODING_TYPE_INT16}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error); | |
| EXPECT_EQ(ENCODING_CLASS_INT, error.encoding_class()); | |
| EXPECT_EQ(ENCODING_TYPE_INT16, error.encoding_type()); | |
| // INT32 out of range. | |
| buffer = {ENCODING_TYPE_INT32}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error); | |
| EXPECT_EQ(ENCODING_CLASS_INT, error.encoding_class()); | |
| EXPECT_EQ(ENCODING_TYPE_INT32, error.encoding_type()); | |
| // INT64 out of range. | |
| buffer = {ENCODING_TYPE_INT64}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error); | |
| EXPECT_EQ(ENCODING_CLASS_INT, error.encoding_class()); | |
| EXPECT_EQ(ENCODING_TYPE_INT64, error.encoding_type()); | |
| } | |
| TEST(DeserializationTest, int16_t) { | |
| Payload buffer; | |
| std::int16_t result = 0; | |
| ErrorType error; | |
| // Min NEGATIVE FIXINT. | |
| buffer = {ENCODING_TYPE_NEGATIVE_FIXINT_MIN}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(-32, result); | |
| // Max NEGATIVE FIXINT. | |
| buffer = {ENCODING_TYPE_NEGATIVE_FIXINT_MAX}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(-1, result); | |
| // Min FIXINT. | |
| buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MIN}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(0, result); | |
| // Max FIXINT. | |
| buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MAX}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(127, result); | |
| // Min INT8. | |
| buffer = {ENCODING_TYPE_INT8, 0x80}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(-128, result); | |
| // Max INT8. | |
| buffer = {ENCODING_TYPE_INT8, 0x7f}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(127, result); | |
| // Min INT16. | |
| buffer = {ENCODING_TYPE_INT16, 0x00, 0x80}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(-32768, result); | |
| // Max INT16. | |
| buffer = {ENCODING_TYPE_INT16, 0xff, 0x7f}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(32767, result); | |
| // INT32 out of range. | |
| buffer = {ENCODING_TYPE_INT32}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error); | |
| EXPECT_EQ(ENCODING_CLASS_INT, error.encoding_class()); | |
| EXPECT_EQ(ENCODING_TYPE_INT32, error.encoding_type()); | |
| // INT64 out of range. | |
| buffer = {ENCODING_TYPE_INT64}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error); | |
| EXPECT_EQ(ENCODING_CLASS_INT, error.encoding_class()); | |
| EXPECT_EQ(ENCODING_TYPE_INT64, error.encoding_type()); | |
| } | |
| TEST(DeserializationTest, int32_t) { | |
| Payload buffer; | |
| std::int32_t result = 0; | |
| ErrorType error; | |
| // Min NEGATIVE FIXINT. | |
| buffer = {ENCODING_TYPE_NEGATIVE_FIXINT_MIN}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(-32, result); | |
| // Max NEGATIVE FIXINT. | |
| buffer = {ENCODING_TYPE_NEGATIVE_FIXINT_MAX}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(-1, result); | |
| // Min FIXINT. | |
| buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MIN}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(0, result); | |
| // Max FIXINT. | |
| buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MAX}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(127, result); | |
| // Min INT8. | |
| buffer = {ENCODING_TYPE_INT8, 0x80}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(-128, result); | |
| // Max INT8. | |
| buffer = {ENCODING_TYPE_INT8, 0x7f}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(127, result); | |
| // Min INT16. | |
| buffer = {ENCODING_TYPE_INT16, 0x00, 0x80}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(-32768, result); | |
| // Max INT16. | |
| buffer = {ENCODING_TYPE_INT16, 0xff, 0x7f}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(32767, result); | |
| // Min INT32. | |
| buffer = {ENCODING_TYPE_INT32, 0x00, 0x00, 0x00, 0x80}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(-2147483648, result); | |
| // Max INT32. | |
| buffer = {ENCODING_TYPE_INT32, 0xff, 0xff, 0xff, 0x7f}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(2147483647, result); | |
| // INT64 out of range. | |
| buffer = {ENCODING_TYPE_INT64}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error); | |
| EXPECT_EQ(ENCODING_CLASS_INT, error.encoding_class()); | |
| EXPECT_EQ(ENCODING_TYPE_INT64, error.encoding_type()); | |
| } | |
| TEST(DeserializationTest, int64_t) { | |
| Payload buffer; | |
| std::int64_t result = 0; | |
| ErrorType error; | |
| // Min NEGATIVE FIXINT. | |
| buffer = {ENCODING_TYPE_NEGATIVE_FIXINT_MIN}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(-32, result); | |
| // Max NEGATIVE FIXINT. | |
| buffer = {ENCODING_TYPE_NEGATIVE_FIXINT_MAX}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(-1, result); | |
| // Min FIXINT. | |
| buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MIN}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(0, result); | |
| // Max FIXINT. | |
| buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MAX}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(127, result); | |
| // Min INT8. | |
| buffer = {ENCODING_TYPE_INT8, 0x80}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(-128, result); | |
| // Max INT8. | |
| buffer = {ENCODING_TYPE_INT8, 0x7f}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(127, result); | |
| // Min INT16. | |
| buffer = {ENCODING_TYPE_INT16, 0x00, 0x80}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(-32768, result); | |
| // Max INT16. | |
| buffer = {ENCODING_TYPE_INT16, 0xff, 0x7f}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(32767, result); | |
| // Min INT32. | |
| buffer = {ENCODING_TYPE_INT32, 0x00, 0x00, 0x00, 0x80}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(-2147483648, result); | |
| // Max INT32. | |
| buffer = {ENCODING_TYPE_INT32, 0xff, 0xff, 0xff, 0x7f}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(2147483647, result); | |
| // Min INT64. | |
| buffer = { | |
| ENCODING_TYPE_INT64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| // Believe it or not, this is actually the correct way to specify the most | |
| // negative signed long long. | |
| EXPECT_EQ(-9223372036854775807LL - 1, result); | |
| // Max INT64. | |
| buffer = { | |
| ENCODING_TYPE_INT64, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(9223372036854775807LL, result); | |
| } | |
| TEST(DeserializationTest, float) { | |
| Payload buffer; | |
| float result; | |
| ErrorType error; | |
| // FLOAT32. | |
| buffer = {ENCODING_TYPE_FLOAT32, kZeroFloatBytes[0], kZeroFloatBytes[1], | |
| kZeroFloatBytes[2], kZeroFloatBytes[3]}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(kZeroFloat, result); | |
| // FLOAT32. | |
| buffer = {ENCODING_TYPE_FLOAT32, kOneFloatBytes[0], kOneFloatBytes[1], | |
| kOneFloatBytes[2], kOneFloatBytes[3]}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(kOneFloat, result); | |
| } | |
| TEST(DeserializationTest, double) { | |
| Payload buffer; | |
| double result; | |
| ErrorType error; | |
| // FLOAT32. | |
| buffer = {ENCODING_TYPE_FLOAT32, kZeroFloatBytes[0], kZeroFloatBytes[1], | |
| kZeroFloatBytes[2], kZeroFloatBytes[3]}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(kZeroDouble, result); | |
| // FLOAT64. | |
| buffer = {ENCODING_TYPE_FLOAT64, kZeroDoubleBytes[0], kZeroDoubleBytes[1], | |
| kZeroDoubleBytes[2], kZeroDoubleBytes[3], kZeroDoubleBytes[4], | |
| kZeroDoubleBytes[5], kZeroDoubleBytes[6], kZeroDoubleBytes[7]}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(kZeroDouble, result); | |
| // FLOAT32. | |
| buffer = {ENCODING_TYPE_FLOAT32, kOneFloatBytes[0], kOneFloatBytes[1], | |
| kOneFloatBytes[2], kOneFloatBytes[3]}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(kOneDouble, result); | |
| // FLOAT64. | |
| buffer = {ENCODING_TYPE_FLOAT64, kOneDoubleBytes[0], kOneDoubleBytes[1], | |
| kOneDoubleBytes[2], kOneDoubleBytes[3], kOneDoubleBytes[4], | |
| kOneDoubleBytes[5], kOneDoubleBytes[6], kOneDoubleBytes[7]}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(kOneDouble, result); | |
| } | |
| TEST(DeserializationTest, Enum) { | |
| Payload buffer; | |
| enum Foo { kFoo, kBar, kBaz } result; | |
| ErrorType error; | |
| buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MIN + 1}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(kBar, result); | |
| } | |
| TEST(DeserializationTest, EnumClass) { | |
| Payload buffer; | |
| enum Foo { kFoo, kBar, kBaz } result; | |
| ErrorType error; | |
| buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MIN + 2}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(Foo::kBaz, result); | |
| } | |
| TEST(DeserializationTest, LocalHandle) { | |
| Payload buffer; | |
| LocalHandle result1; | |
| LocalHandle result2; | |
| ErrorType error; | |
| buffer = {ENCODING_TYPE_FIXEXT2, ENCODING_EXT_TYPE_FILE_DESCRIPTOR, 0, 0}; | |
| error = Deserialize(&result1, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(0, result1.Get()); | |
| result1.Release(); // Don't close fd 0. | |
| std::tuple<LocalHandle&, LocalHandle&> t1(result1, result2); | |
| buffer = decltype(buffer)( | |
| {ENCODING_TYPE_FIXARRAY_MIN + 2, ENCODING_TYPE_FIXEXT2, | |
| ENCODING_EXT_TYPE_FILE_DESCRIPTOR, 0, 0, ENCODING_TYPE_FIXEXT2, | |
| ENCODING_EXT_TYPE_FILE_DESCRIPTOR, 1, 0}); | |
| error = Deserialize(&t1, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(0, result1.Get()); | |
| EXPECT_EQ(1, result2.Get()); | |
| result1.Release(); // Don't close fd 0. | |
| result2.Release(); // Don't close fd 1. | |
| buffer = {ENCODING_TYPE_FIXEXT2, ENCODING_EXT_TYPE_FILE_DESCRIPTOR, 0xfe, | |
| 0xff}; | |
| error = Deserialize(&result1, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(-2, result1.Get()); | |
| } | |
| TEST(DeserializationTest, string) { | |
| Payload buffer; | |
| std::string result = ""; | |
| ErrorType error; | |
| // Min FIXSTR. | |
| buffer = {ENCODING_TYPE_FIXSTR_MIN}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ("", result); | |
| // Max FIXSTR. | |
| buffer = {ENCODING_TYPE_FIXSTR_MAX}; | |
| buffer.Append((1 << 5) - 1, 'x'); | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(std::string((1 << 5) - 1, 'x'), result); | |
| // Min STR8. | |
| buffer = {ENCODING_TYPE_STR8, 0x00}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ("", result); | |
| // Max STR8. | |
| buffer = {ENCODING_TYPE_STR8, 0xff}; | |
| buffer.Append(0xff, 'x'); | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(std::string(0xff, 'x'), result); | |
| // Min STR16. | |
| buffer = {ENCODING_TYPE_STR16, 0x00, 0x00}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ("", result); | |
| // Max STR16. | |
| buffer = {ENCODING_TYPE_STR16, 0xff, 0xff}; | |
| buffer.Append(0xffff, 'x'); | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(std::string(0xffff, 'x'), result); | |
| // Min STR32. | |
| buffer = {ENCODING_TYPE_STR32, 0x00, 0x00, 0x00, 0x00}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ("", result); | |
| // Test STR32 with max STR16 + 1 bytes. It's not practical to test max | |
| // STR32. | |
| buffer = {ENCODING_TYPE_STR32, 0x00, 0x00, 0x01, 0x00}; | |
| buffer.Append(0x10000, 'x'); | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(std::string(0x10000, 'x'), result); | |
| } | |
| TEST(DeserializationTest, vector) { | |
| Payload buffer; | |
| std::vector<std::uint8_t, DefaultInitializationAllocator<std::uint8_t>> | |
| result; | |
| Payload expected; | |
| ErrorType error; | |
| // Min FIXARRAY. | |
| buffer = {ENCODING_TYPE_FIXARRAY_MIN}; | |
| error = Deserialize(&result, &buffer); | |
| expected = {}; | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(expected, result); | |
| // Max FIXARRAY. | |
| buffer = {ENCODING_TYPE_FIXARRAY_MAX}; | |
| buffer.Append((1 << 4) - 1, 1); | |
| error = Deserialize(&result, &buffer); | |
| expected = decltype(expected)((1 << 4) - 1, 1); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(expected, result); | |
| // Min ARRAY16. | |
| buffer = {ENCODING_TYPE_ARRAY16, 0x00, 0x00}; | |
| error = Deserialize(&result, &buffer); | |
| expected = {}; | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(expected, result); | |
| // Max ARRAY16. | |
| buffer = {ENCODING_TYPE_ARRAY16, 0xff, 0xff}; | |
| buffer.Append(0xffff, 1); | |
| error = Deserialize(&result, &buffer); | |
| expected = decltype(expected)(0xffff, 1); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(expected, result); | |
| // Min ARRAY32. | |
| buffer = {ENCODING_TYPE_ARRAY32, 0x00, 0x00, 0x00, 0x00}; | |
| error = Deserialize(&result, &buffer); | |
| expected = {}; | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(expected, result); | |
| // ARRAY32 with max ARRAY16 + 1. It's not practical to test max ARRAY32. | |
| buffer = {ENCODING_TYPE_ARRAY32, 0x00, 0x00, 0x01, 0x00}; | |
| buffer.Append(0x10000, 1); | |
| error = Deserialize(&result, &buffer); | |
| expected = decltype(expected)(0x10000, 1); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(expected, result); | |
| } | |
| TEST(DeserializationTest, map) { | |
| Payload buffer; | |
| std::map<std::uint32_t, std::uint32_t> result; | |
| std::map<std::uint32_t, std::uint32_t> expected; | |
| ErrorType error; | |
| // Min FIXMAP. | |
| buffer = {ENCODING_TYPE_FIXMAP_MIN}; | |
| error = Deserialize(&result, &buffer); | |
| expected = {}; | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(expected, result); | |
| // Size mismatch. | |
| buffer = {ENCODING_TYPE_FIXMAP_MIN + 1}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::INSUFFICIENT_BUFFER, error); | |
| // Max FIXMAP. | |
| buffer = {ENCODING_TYPE_FIXMAP_MAX}; | |
| InsertKeyValue<decltype(result)>(&buffer, (1 << 4) - 1); | |
| error = Deserialize(&result, &buffer); | |
| expected = MakeMap<decltype(expected)>((1 << 4) - 1); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error) << std::string(error); | |
| EXPECT_EQ(expected, result); | |
| // Min MAP16. | |
| buffer = {ENCODING_TYPE_MAP16, 0x00, 0x00}; | |
| error = Deserialize(&result, &buffer); | |
| expected = {}; | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(expected, result); | |
| // Max MAP16. | |
| buffer = {ENCODING_TYPE_MAP16, 0xff, 0xff}; | |
| InsertKeyValue<decltype(result)>(&buffer, (1 << 16) - 1); | |
| error = Deserialize(&result, &buffer); | |
| expected = MakeMap<decltype(expected)>((1 << 16) - 1); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(expected, result); | |
| // Min MAP32. | |
| buffer = {ENCODING_TYPE_MAP32, 0x00, 0x00, 0x00, 0x00}; | |
| error = Deserialize(&result, &buffer); | |
| expected = {}; | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(expected, result); | |
| // MAP32 with max MAP16 + 1. It's not practical to test max MAP32. | |
| buffer = {ENCODING_TYPE_MAP32, 0x00, 0x00, 0x01, 0x00}; | |
| InsertKeyValue<decltype(result)>(&buffer, (1 << 16)); | |
| error = Deserialize(&result, &buffer); | |
| expected = MakeMap<decltype(expected)>((1 << 16)); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(expected, result); | |
| } | |
| TEST(DeserializationTest, unordered_map) { | |
| Payload buffer; | |
| std::unordered_map<std::uint32_t, std::uint32_t> result; | |
| std::unordered_map<std::uint32_t, std::uint32_t> expected; | |
| ErrorType error; | |
| // Min FIXMAP. | |
| buffer = {ENCODING_TYPE_FIXMAP_MIN}; | |
| error = Deserialize(&result, &buffer); | |
| expected = {}; | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(expected, result); | |
| // Size mismatch. | |
| buffer = {ENCODING_TYPE_FIXMAP_MIN + 1}; | |
| error = Deserialize(&result, &buffer); | |
| EXPECT_EQ(ErrorCode::INSUFFICIENT_BUFFER, error); | |
| // Max FIXMAP. | |
| buffer = {ENCODING_TYPE_FIXMAP_MAX}; | |
| InsertKeyValue<decltype(result)>(&buffer, (1 << 4) - 1); | |
| error = Deserialize(&result, &buffer); | |
| expected = MakeMap<decltype(expected)>((1 << 4) - 1); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(expected, result); | |
| // Min MAP16. | |
| buffer = {ENCODING_TYPE_MAP16, 0x00, 0x00}; | |
| error = Deserialize(&result, &buffer); | |
| expected = {}; | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(expected, result); | |
| // Max MAP16. | |
| buffer = {ENCODING_TYPE_MAP16, 0xff, 0xff}; | |
| InsertKeyValue<decltype(result)>(&buffer, (1 << 16) - 1); | |
| error = Deserialize(&result, &buffer); | |
| expected = MakeMap<decltype(expected)>((1 << 16) - 1); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(expected, result); | |
| // Min MAP32. | |
| buffer = {ENCODING_TYPE_MAP32, 0x00, 0x00, 0x00, 0x00}; | |
| error = Deserialize(&result, &buffer); | |
| expected = {}; | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(expected, result); | |
| // MAP32 with max MAP16 + 1. It's not practical to test max MAP32. | |
| buffer = {ENCODING_TYPE_MAP32, 0x00, 0x00, 0x01, 0x00}; | |
| InsertKeyValue<decltype(result)>(&buffer, (1 << 16)); | |
| error = Deserialize(&result, &buffer); | |
| expected = MakeMap<decltype(expected)>((1 << 16)); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(expected, result); | |
| } | |
| TEST(DeserializationTest, array) { | |
| Payload buffer; | |
| ErrorType error; | |
| // Min FIXARRAY. | |
| buffer = {ENCODING_TYPE_FIXARRAY_MIN}; | |
| std::array<std::uint8_t, 0> a0; | |
| error = Deserialize(&a0, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| // Size mismatch. | |
| buffer = {ENCODING_TYPE_FIXARRAY_MIN + 1}; | |
| error = Deserialize(&a0, &buffer); | |
| EXPECT_EQ(ErrorCode::INSUFFICIENT_DESTINATION_SIZE, error); | |
| // Max FIXARRAY. | |
| buffer = {ENCODING_TYPE_FIXARRAY_MAX}; | |
| buffer.Append((1 << 4) - 1, 'x'); | |
| std::array<std::uint8_t, (1 << 4) - 1> a1, expected1; | |
| for (auto& element : expected1) | |
| element = 'x'; | |
| error = Deserialize(&a1, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(expected1, a1); | |
| // Min ARRAY16. | |
| buffer = {ENCODING_TYPE_ARRAY16, 0x00, 0x00}; | |
| error = Deserialize(&a0, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| // Max ARRAY16. | |
| buffer = {ENCODING_TYPE_ARRAY16, 0xff, 0xff}; | |
| buffer.Append((1 << 16) - 1, 'x'); | |
| std::array<std::uint8_t, (1 << 16) - 1> a3, expected3; | |
| for (auto& element : expected3) | |
| element = 'x'; | |
| error = Deserialize(&a3, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(expected3, a3); | |
| // Min ARRAY32. | |
| buffer = {ENCODING_TYPE_ARRAY32, 0x00, 0x00, 0x00, 0x00}; | |
| error = Deserialize(&a0, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| // ARRAY32 with max ARRAY16 + 1. It's not practical to test max ARRAY32. | |
| buffer = {ENCODING_TYPE_ARRAY32, 0x00, 0x00, 0x01, 0x00}; | |
| buffer.Append((1 << 16), 'x'); | |
| std::array<std::uint8_t, (1 << 16)> a4, expected4; | |
| for (auto& element : expected4) | |
| element = 'x'; | |
| error = Deserialize(&a4, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(expected4, a4); | |
| } | |
| TEST(DeserializationTest, ArrayWrapper) { | |
| Payload buffer; | |
| std::vector<std::uint8_t, DefaultInitializationAllocator<std::uint8_t>> | |
| result; | |
| std::vector<std::uint8_t, DefaultInitializationAllocator<std::uint8_t>> | |
| expected; | |
| ErrorType error; | |
| result.reserve(0x10000); | |
| ArrayWrapper<std::uint8_t> wrapper(result.data(), result.capacity()); | |
| // Min FIXARRAY. | |
| buffer = {ENCODING_TYPE_FIXARRAY_MIN}; | |
| error = Deserialize(&wrapper, &buffer); | |
| expected = {}; | |
| result.resize(wrapper.size()); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(expected, result); | |
| // Max FIXARRAY. | |
| buffer = {ENCODING_TYPE_FIXARRAY_MAX}; | |
| buffer.Append((1 << 4) - 1, 1); | |
| error = Deserialize(&wrapper, &buffer); | |
| expected = decltype(expected)((1 << 4) - 1, 1); | |
| result.resize(wrapper.size()); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(expected, result); | |
| // Min ARRAY16. | |
| buffer = {ENCODING_TYPE_ARRAY16, 0x00, 0x00}; | |
| error = Deserialize(&wrapper, &buffer); | |
| expected = {}; | |
| result.resize(wrapper.size()); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(expected, result); | |
| // Max ARRAY16. | |
| buffer = {ENCODING_TYPE_ARRAY16, 0xff, 0xff}; | |
| buffer.Append(0xffff, 1); | |
| error = Deserialize(&wrapper, &buffer); | |
| expected = decltype(expected)(0xffff, 1); | |
| result.resize(wrapper.size()); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(expected, result); | |
| // Min ARRAY32. | |
| buffer = {ENCODING_TYPE_ARRAY32, 0x00, 0x00, 0x00, 0x00}; | |
| error = Deserialize(&wrapper, &buffer); | |
| expected = {}; | |
| result.resize(wrapper.size()); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(expected, result); | |
| // ARRAY32 with max ARRAY16 + 1. It's not practical to test max ARRAY32. | |
| buffer = {ENCODING_TYPE_ARRAY32, 0x00, 0x00, 0x01, 0x00}; | |
| buffer.Append(0x10000, 1); | |
| error = Deserialize(&wrapper, &buffer); | |
| expected = decltype(expected)(0x10000, 1); | |
| result.resize(wrapper.size()); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(expected, result); | |
| } | |
| TEST(DeserializationTest, pair) { | |
| Payload buffer; | |
| ErrorType error; | |
| std::pair<int, int> p1; | |
| buffer = {ENCODING_TYPE_FIXARRAY_MIN + 2, 1, 2}; | |
| error = Deserialize(&p1, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(std::make_pair(1, 2), p1); | |
| } | |
| TEST(DeserializationTest, tuple) { | |
| Payload buffer; | |
| ErrorType error; | |
| // Min FIXARRAY. | |
| std::tuple<> t1; | |
| buffer = {ENCODING_TYPE_FIXARRAY_MIN}; | |
| error = Deserialize(&t1, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(std::make_tuple(), t1); // Superfluous. | |
| // Max FIXARRAY. | |
| auto t2 = GetNTuple<15, int>(0); | |
| buffer = {ENCODING_TYPE_FIXARRAY_MAX}; | |
| buffer.Append((1 << 4) - 1, 1); | |
| error = Deserialize(&t2, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ((GetNTuple<15, int>(1)), t2); | |
| // Min ARRAY16. | |
| // Using t1 above. | |
| buffer = {ENCODING_TYPE_ARRAY16, 0x00, 0x00}; | |
| error = Deserialize(&t1, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(std::make_tuple(), t1); | |
| // ARRAY16 at Max FIXARRAY + 1 | |
| auto t3 = GetNTuple<(1 << 4), int>(0); | |
| buffer = {ENCODING_TYPE_ARRAY16, 0x10, 0x00}; | |
| buffer.Append((1 << 4), 1); | |
| error = Deserialize(&t3, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ((GetNTuple<(1 << 4), int>(1)), t3); | |
| // Min ARRAY32. | |
| // Using t1 from above. | |
| buffer = {ENCODING_TYPE_ARRAY32, 0x00, 0x00, 0x00, 0x00}; | |
| error = Deserialize(&t1, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(std::make_tuple(), t1); | |
| // ARRAY32 at Max FIXARRAY + 1 | |
| auto t4 = GetNTuple<(1 << 4), int>(0); | |
| buffer = {ENCODING_TYPE_ARRAY32, 0x10, 0x00, 0x00, 0x00}; | |
| buffer.Append((1 << 4), 1); | |
| error = Deserialize(&t4, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ((GetNTuple<(1 << 4), int>(1)), t4); | |
| // Template instantiation depth is an issue for tuples with large numbers of | |
| // elements. As these are not expected in practice, the limits of ARRAY16 | |
| // and ARRAY32 are not tested. | |
| } | |
| TEST(DeserializationTest, Serializable) { | |
| Payload buffer; | |
| ErrorType error; | |
| buffer = decltype(buffer)( | |
| {ENCODING_TYPE_FIXARRAY_MIN + 4, 10, ENCODING_TYPE_FLOAT32, | |
| kZeroFloatBytes[0], kZeroFloatBytes[1], kZeroFloatBytes[2], | |
| kZeroFloatBytes[3], ENCODING_TYPE_FIXSTR_MIN + 5, '1', '2', '3', '4', | |
| '5', ENCODING_TYPE_POSITIVE_FIXINT_MIN + 1}); | |
| TestType t1; | |
| error = Deserialize(&t1, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(TestType(10, 0.f, "12345", TestType::Foo::kBar), t1); | |
| buffer = | |
| decltype(buffer)({ENCODING_TYPE_FIXARRAY_MIN + 1, ENCODING_TYPE_FIXEXT2, | |
| ENCODING_EXT_TYPE_FILE_DESCRIPTOR, 0xff, 0xff}); | |
| TestTemplateType<LocalHandle> tt; | |
| error = Deserialize(&tt, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_EQ(TestTemplateType<LocalHandle>(LocalHandle(-1)), tt); | |
| } | |
| TEST(DeserializationTest, Variant) { | |
| Payload buffer; | |
| ErrorType error; | |
| Variant<int, bool, float> v; | |
| buffer = {ENCODING_TYPE_FIXMAP_MIN + 1, ENCODING_TYPE_NEGATIVE_FIXINT_MAX, | |
| ENCODING_TYPE_NIL}; | |
| error = Deserialize(&v, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| EXPECT_TRUE(v.empty()); | |
| buffer = {ENCODING_TYPE_FIXMAP_MIN + 1, ENCODING_TYPE_POSITIVE_FIXINT_MIN + 0, | |
| ENCODING_TYPE_POSITIVE_FIXINT_MIN + 10}; | |
| error = Deserialize(&v, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| ASSERT_TRUE(v.is<int>()); | |
| EXPECT_EQ(10, std::get<int>(v)); | |
| buffer = {ENCODING_TYPE_FIXMAP_MIN + 1, ENCODING_TYPE_POSITIVE_FIXINT_MIN + 1, | |
| ENCODING_TYPE_TRUE}; | |
| error = Deserialize(&v, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| ASSERT_TRUE(v.is<bool>()); | |
| EXPECT_EQ(true, std::get<bool>(v)); | |
| buffer = {ENCODING_TYPE_FIXMAP_MIN + 1, ENCODING_TYPE_POSITIVE_FIXINT_MIN + 1, | |
| ENCODING_TYPE_FALSE}; | |
| error = Deserialize(&v, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| ASSERT_TRUE(v.is<bool>()); | |
| EXPECT_EQ(false, std::get<bool>(v)); | |
| buffer = {ENCODING_TYPE_FIXMAP_MIN + 1, | |
| ENCODING_TYPE_POSITIVE_FIXINT_MIN + 2, | |
| ENCODING_TYPE_FLOAT32, | |
| kOneFloatBytes[0], | |
| kOneFloatBytes[1], | |
| kOneFloatBytes[2], | |
| kOneFloatBytes[3]}; | |
| error = Deserialize(&v, &buffer); | |
| EXPECT_EQ(ErrorCode::NO_ERROR, error); | |
| ASSERT_TRUE(v.is<float>()); | |
| EXPECT_FLOAT_EQ(1.0, std::get<float>(v)); | |
| // TODO(eieio): Add more deserialization tests for Variant. | |
| } | |
| TEST(DeserializationTest, ErrorType) { | |
| Payload buffer; | |
| ErrorType error; | |
| std::uint8_t u8; | |
| buffer = {ENCODING_TYPE_STR8}; | |
| error = Deserialize(&u8, &buffer); | |
| EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error); | |
| EXPECT_EQ(ENCODING_CLASS_UINT, error.encoding_class()); | |
| EXPECT_EQ(ENCODING_TYPE_STR8, error.encoding_type()); | |
| std::uint16_t u16; | |
| buffer = {ENCODING_TYPE_STR8}; | |
| error = Deserialize(&u16, &buffer); | |
| EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error); | |
| EXPECT_EQ(ENCODING_CLASS_UINT, error.encoding_class()); | |
| EXPECT_EQ(ENCODING_TYPE_STR8, error.encoding_type()); | |
| std::uint32_t u32; | |
| buffer = {ENCODING_TYPE_STR8}; | |
| error = Deserialize(&u32, &buffer); | |
| EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error); | |
| EXPECT_EQ(ENCODING_CLASS_UINT, error.encoding_class()); | |
| EXPECT_EQ(ENCODING_TYPE_STR8, error.encoding_type()); | |
| std::uint64_t u64; | |
| buffer = {ENCODING_TYPE_STR8}; | |
| error = Deserialize(&u64, &buffer); | |
| EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error); | |
| EXPECT_EQ(ENCODING_CLASS_UINT, error.encoding_class()); | |
| EXPECT_EQ(ENCODING_TYPE_STR8, error.encoding_type()); | |
| std::int8_t i8; | |
| buffer = {ENCODING_TYPE_STR8}; | |
| error = Deserialize(&i8, &buffer); | |
| EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error); | |
| EXPECT_EQ(ENCODING_CLASS_INT, error.encoding_class()); | |
| EXPECT_EQ(ENCODING_TYPE_STR8, error.encoding_type()); | |
| std::int16_t i16; | |
| buffer = {ENCODING_TYPE_STR8}; | |
| error = Deserialize(&i16, &buffer); | |
| EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error); | |
| EXPECT_EQ(ENCODING_CLASS_INT, error.encoding_class()); | |
| EXPECT_EQ(ENCODING_TYPE_STR8, error.encoding_type()); | |
| std::int32_t i32; | |
| buffer = {ENCODING_TYPE_STR8}; | |
| error = Deserialize(&i32, &buffer); | |
| EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error); | |
| EXPECT_EQ(ENCODING_CLASS_INT, error.encoding_class()); | |
| EXPECT_EQ(ENCODING_TYPE_STR8, error.encoding_type()); | |
| std::int64_t i64; | |
| buffer = {ENCODING_TYPE_STR8}; | |
| error = Deserialize(&i64, &buffer); | |
| EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error); | |
| EXPECT_EQ(ENCODING_CLASS_INT, error.encoding_class()); | |
| EXPECT_EQ(ENCODING_TYPE_STR8, error.encoding_type()); | |
| std::string s; | |
| buffer = {ENCODING_TYPE_POSITIVE_FIXINT}; | |
| error = Deserialize(&s, &buffer); | |
| EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error); | |
| EXPECT_EQ(ENCODING_CLASS_STRING, error.encoding_class()); | |
| EXPECT_EQ(ENCODING_TYPE_POSITIVE_FIXINT, error.encoding_type()); | |
| std::vector<std::uint8_t> v; | |
| buffer = {ENCODING_TYPE_POSITIVE_FIXINT}; | |
| error = Deserialize(&v, &buffer); | |
| EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error); | |
| EXPECT_EQ(ENCODING_CLASS_ARRAY, error.encoding_class()); | |
| EXPECT_EQ(ENCODING_TYPE_POSITIVE_FIXINT, error.encoding_type()); | |
| buffer = {ENCODING_TYPE_FIXARRAY_MIN + 1, ENCODING_TYPE_STR8}; | |
| error = Deserialize(&v, &buffer); | |
| EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error); | |
| EXPECT_EQ(ENCODING_CLASS_UINT, error.encoding_class()); | |
| EXPECT_EQ(ENCODING_TYPE_STR8, error.encoding_type()); | |
| buffer = {ENCODING_TYPE_FIXARRAY_MIN + 2, 0, 1}; | |
| std::tuple<int> t; | |
| error = Deserialize(&t, &buffer); | |
| EXPECT_EQ(ErrorCode::UNEXPECTED_TYPE_SIZE, error); | |
| buffer = {ENCODING_TYPE_FIXARRAY_MIN + 3, 0, 1, 2}; | |
| std::pair<int, int> p; | |
| error = Deserialize(&p, &buffer); | |
| EXPECT_EQ(ErrorCode::UNEXPECTED_TYPE_SIZE, error); | |
| } |