1 //===-------- SimplePackedSerializationTest.cpp - Test SPS scheme ---------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "llvm/ExecutionEngine/Orc/Shared/SimplePackedSerialization.h" 10 #include "gtest/gtest.h" 11 12 using namespace llvm; 13 using namespace llvm::orc::shared; 14 15 TEST(SimplePackedSerializationTest, SPSOutputBuffer) { 16 constexpr unsigned NumBytes = 8; 17 char Buffer[NumBytes]; 18 char Zero = 0; 19 SPSOutputBuffer OB(Buffer, NumBytes); 20 21 // Expect that we can write NumBytes of content. 22 for (unsigned I = 0; I != NumBytes; ++I) { 23 char C = I; 24 EXPECT_TRUE(OB.write(&C, 1)); 25 } 26 27 // Expect an error when we attempt to write an extra byte. 28 EXPECT_FALSE(OB.write(&Zero, 1)); 29 30 // Check that the buffer contains the expected content. 31 for (unsigned I = 0; I != NumBytes; ++I) 32 EXPECT_EQ(Buffer[I], (char)I); 33 } 34 35 TEST(SimplePackedSerializationTest, SPSInputBuffer) { 36 char Buffer[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}; 37 SPSInputBuffer IB(Buffer, sizeof(Buffer)); 38 39 char C; 40 for (unsigned I = 0; I != sizeof(Buffer); ++I) { 41 EXPECT_TRUE(IB.read(&C, 1)); 42 EXPECT_EQ(C, (char)I); 43 } 44 45 EXPECT_FALSE(IB.read(&C, 1)); 46 } 47 48 template <typename SPSTagT, typename T> 49 static void blobSerializationRoundTrip(const T &Value) { 50 using BST = SPSSerializationTraits<SPSTagT, T>; 51 52 size_t Size = BST::size(Value); 53 auto Buffer = std::make_unique<char[]>(Size); 54 SPSOutputBuffer OB(Buffer.get(), Size); 55 56 EXPECT_TRUE(BST::serialize(OB, Value)); 57 58 SPSInputBuffer IB(Buffer.get(), Size); 59 60 T DSValue; 61 EXPECT_TRUE(BST::deserialize(IB, DSValue)); 62 63 EXPECT_EQ(Value, DSValue) 64 << "Incorrect value after serialization/deserialization round-trip"; 65 } 66 67 template <typename T> static void testFixedIntegralTypeSerialization() { 68 blobSerializationRoundTrip<T, T>(0); 69 blobSerializationRoundTrip<T, T>(static_cast<T>(1)); 70 if (std::is_signed<T>::value) { 71 blobSerializationRoundTrip<T, T>(static_cast<T>(-1)); 72 blobSerializationRoundTrip<T, T>(std::numeric_limits<T>::min()); 73 } 74 blobSerializationRoundTrip<T, T>(std::numeric_limits<T>::max()); 75 } 76 77 TEST(SimplePackedSerializationTest, BoolSerialization) { 78 blobSerializationRoundTrip<bool, bool>(true); 79 blobSerializationRoundTrip<bool, bool>(false); 80 } 81 82 TEST(SimplePackedSerializationTest, CharSerialization) { 83 blobSerializationRoundTrip<char, char>((char)0x00); 84 blobSerializationRoundTrip<char, char>((char)0xAA); 85 blobSerializationRoundTrip<char, char>((char)0xFF); 86 } 87 88 TEST(SimplePackedSerializationTest, Int8Serialization) { 89 testFixedIntegralTypeSerialization<int8_t>(); 90 } 91 92 TEST(SimplePackedSerializationTest, UInt8Serialization) { 93 testFixedIntegralTypeSerialization<uint8_t>(); 94 } 95 96 TEST(SimplePackedSerializationTest, Int16Serialization) { 97 testFixedIntegralTypeSerialization<int16_t>(); 98 } 99 100 TEST(SimplePackedSerializationTest, UInt16Serialization) { 101 testFixedIntegralTypeSerialization<uint16_t>(); 102 } 103 104 TEST(SimplePackedSerializationTest, Int32Serialization) { 105 testFixedIntegralTypeSerialization<int32_t>(); 106 } 107 108 TEST(SimplePackedSerializationTest, UInt32Serialization) { 109 testFixedIntegralTypeSerialization<uint32_t>(); 110 } 111 112 TEST(SimplePackedSerializationTest, Int64Serialization) { 113 testFixedIntegralTypeSerialization<int64_t>(); 114 } 115 116 TEST(SimplePackedSerializationTest, UInt64Serialization) { 117 testFixedIntegralTypeSerialization<uint64_t>(); 118 } 119 120 TEST(SimplePackedSerializationTest, SequenceSerialization) { 121 std::vector<int32_t> V({1, 2, -47, 139}); 122 blobSerializationRoundTrip<SPSSequence<int32_t>, std::vector<int32_t>>(V); 123 } 124 125 TEST(SimplePackedSerializationTest, StringViewCharSequenceSerialization) { 126 const char *HW = "Hello, world!"; 127 blobSerializationRoundTrip<SPSString, StringRef>(StringRef(HW)); 128 } 129 130 TEST(SimplePackedSerializationTest, StdPairSerialization) { 131 std::pair<int32_t, std::string> P(42, "foo"); 132 blobSerializationRoundTrip<SPSTuple<int32_t, SPSString>, 133 std::pair<int32_t, std::string>>(P); 134 } 135 136 TEST(SimplePackedSerializationTest, ArgListSerialization) { 137 using BAL = SPSArgList<bool, int32_t, SPSString>; 138 139 bool Arg1 = true; 140 int32_t Arg2 = 42; 141 std::string Arg3 = "foo"; 142 143 size_t Size = BAL::size(Arg1, Arg2, Arg3); 144 auto Buffer = std::make_unique<char[]>(Size); 145 SPSOutputBuffer OB(Buffer.get(), Size); 146 147 EXPECT_TRUE(BAL::serialize(OB, Arg1, Arg2, Arg3)); 148 149 SPSInputBuffer IB(Buffer.get(), Size); 150 151 bool ArgOut1; 152 int32_t ArgOut2; 153 std::string ArgOut3; 154 155 EXPECT_TRUE(BAL::deserialize(IB, ArgOut1, ArgOut2, ArgOut3)); 156 157 EXPECT_EQ(Arg1, ArgOut1); 158 EXPECT_EQ(Arg2, ArgOut2); 159 EXPECT_EQ(Arg3, ArgOut3); 160 } 161