#include "bin_pack.h" #include #include #include #include #include "bin_unpack.h" namespace { struct Bin_Pack_Deleter { void operator()(Bin_Pack *bp) const { bin_pack_free(bp); } }; using Bin_Pack_Ptr = std::unique_ptr; struct Bin_Unpack_Deleter { void operator()(Bin_Unpack *bu) const { bin_unpack_free(bu); } }; using Bin_Unpack_Ptr = std::unique_ptr; TEST(BinPack, TooSmallBufferIsNotExceeded) { std::array buf; Bin_Pack_Ptr bp(bin_pack_new(buf.data(), buf.size())); ASSERT_NE(bp, nullptr); EXPECT_FALSE(bin_pack_u64_b(bp.get(), 1234567812345678LL)); } TEST(BinPack, PackedUint64CanBeUnpacked) { std::array buf; Bin_Pack_Ptr bp(bin_pack_new(buf.data(), buf.size())); ASSERT_NE(bp, nullptr); ASSERT_TRUE(bin_pack_u64_b(bp.get(), 1234567812345678LL)); Bin_Unpack_Ptr bu(bin_unpack_new(buf.data(), buf.size())); ASSERT_NE(bu, nullptr); uint64_t val; ASSERT_TRUE(bin_unpack_u64_b(bu.get(), &val)); EXPECT_EQ(val, 1234567812345678LL); } TEST(BinPack, MsgPackedUint8CanBeUnpackedAsUint32) { std::array buf; Bin_Pack_Ptr bp(bin_pack_new(buf.data(), buf.size())); ASSERT_NE(bp, nullptr); ASSERT_TRUE(bin_pack_u08(bp.get(), 123)); Bin_Unpack_Ptr bu(bin_unpack_new(buf.data(), buf.size())); ASSERT_NE(bu, nullptr); uint32_t val; ASSERT_TRUE(bin_unpack_u32(bu.get(), &val)); EXPECT_EQ(val, 123); } TEST(BinPack, MsgPackedUint32CanBeUnpackedAsUint8IfSmallEnough) { std::array buf; Bin_Pack_Ptr bp(bin_pack_new(buf.data(), buf.size())); ASSERT_NE(bp, nullptr); ASSERT_TRUE(bin_pack_u32(bp.get(), 123)); Bin_Unpack_Ptr bu(bin_unpack_new(buf.data(), buf.size())); ASSERT_NE(bu, nullptr); uint8_t val; ASSERT_TRUE(bin_unpack_u08(bu.get(), &val)); EXPECT_EQ(val, 123); } TEST(BinPack, LargeMsgPackedUint32CannotBeUnpackedAsUint8) { std::array buf; Bin_Pack_Ptr bp(bin_pack_new(buf.data(), buf.size())); ASSERT_NE(bp, nullptr); ASSERT_TRUE(bin_pack_u32(bp.get(), 1234567)); Bin_Unpack_Ptr bu(bin_unpack_new(buf.data(), buf.size())); ASSERT_NE(bu, nullptr); uint8_t val; EXPECT_FALSE(bin_unpack_u08(bu.get(), &val)); } TEST(BinPack, BinCanHoldPackedInts) { std::array buf; Bin_Pack_Ptr bp(bin_pack_new(buf.data(), buf.size())); ASSERT_NE(bp, nullptr); ASSERT_TRUE(bin_pack_bin_marker(bp.get(), 8)); ASSERT_TRUE(bin_pack_u64_b(bp.get(), 1234567812345678LL)); ASSERT_TRUE(bin_pack_u16_b(bp.get(), 54321)); Bin_Unpack_Ptr bu(bin_unpack_new(buf.data(), buf.size())); ASSERT_NE(bu, nullptr); uint32_t size; EXPECT_TRUE(bin_unpack_bin_size(bu.get(), &size)); EXPECT_EQ(size, 8); uint64_t val1; EXPECT_TRUE(bin_unpack_u64_b(bu.get(), &val1)); EXPECT_EQ(val1, 1234567812345678LL); uint16_t val2; EXPECT_TRUE(bin_unpack_u16_b(bu.get(), &val2)); EXPECT_EQ(val2, 54321); } TEST(BinPack, BinCanHoldArbitraryData) { std::array buf; Bin_Pack_Ptr bp(bin_pack_new(buf.data(), buf.size())); ASSERT_NE(bp, nullptr); ASSERT_TRUE(bin_pack_bin_marker(bp.get(), 5)); ASSERT_TRUE(bin_pack_bin_b(bp.get(), reinterpret_cast("hello"), 5)); Bin_Unpack_Ptr bu(bin_unpack_new(buf.data(), buf.size())); ASSERT_NE(bu, nullptr); std::array str; EXPECT_TRUE(bin_unpack_bin_fixed(bu.get(), str.data(), str.size())); EXPECT_EQ(str, (std::array{'h', 'e', 'l', 'l', 'o'})); } TEST(BinPack, OversizedArrayFailsUnpack) { std::array buf = {0x91}; Bin_Unpack_Ptr bu(bin_unpack_new(buf.data(), buf.size())); uint32_t size; EXPECT_FALSE(bin_unpack_array(bu.get(), &size)); } } // namespace