|  | #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); | 
|  | } |