1 //===- llvm/unittest/Support/DataExtractorTest.cpp - DataExtractor tests --===// 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/Support/DataExtractor.h" 10 #include "gtest/gtest.h" 11 using namespace llvm; 12 13 namespace { 14 15 // Test fixture 16 template <typename T> 17 class DataExtractorTest : public ::testing::Test { }; 18 19 // Test DataExtractor with both types which can be used for offsets. 20 typedef ::testing::Types<uint32_t, uint64_t> TestTypes; 21 TYPED_TEST_CASE(DataExtractorTest, TestTypes); 22 23 const char numberData[] = "\x80\x90\xFF\xFF\x80\x00\x00\x00"; 24 const char stringData[] = "hellohello\0hello"; 25 const char leb128data[] = "\xA6\x49"; 26 const char bigleb128data[] = "\xAA\xA9\xFF\xAA\xFF\xAA\xFF\x4A"; 27 28 TYPED_TEST(DataExtractorTest, OffsetOverflow) { 29 DataExtractor DE(StringRef(numberData, sizeof(numberData)-1), false, 8); 30 EXPECT_FALSE(DE.isValidOffsetForDataOfSize(-2U, 5)); 31 } 32 33 TYPED_TEST(DataExtractorTest, UnsignedNumbers) { 34 DataExtractor DE(StringRef(numberData, sizeof(numberData)-1), false, 8); 35 TypeParam offset = 0; 36 37 EXPECT_EQ(0x80U, DE.getU8(&offset)); 38 EXPECT_EQ(1U, offset); 39 offset = 0; 40 EXPECT_EQ(0x8090U, DE.getU16(&offset)); 41 EXPECT_EQ(2U, offset); 42 offset = 0; 43 EXPECT_EQ(0x8090FFFFU, DE.getU32(&offset)); 44 EXPECT_EQ(4U, offset); 45 offset = 0; 46 EXPECT_EQ(0x8090FFFF80000000ULL, DE.getU64(&offset)); 47 EXPECT_EQ(8U, offset); 48 offset = 0; 49 EXPECT_EQ(0x8090FFFF80000000ULL, DE.getAddress(&offset)); 50 EXPECT_EQ(8U, offset); 51 offset = 0; 52 53 uint32_t data[2]; 54 EXPECT_EQ(data, DE.getU32(&offset, data, 2)); 55 EXPECT_EQ(0x8090FFFFU, data[0]); 56 EXPECT_EQ(0x80000000U, data[1]); 57 EXPECT_EQ(8U, offset); 58 offset = 0; 59 60 // Now for little endian. 61 DE = DataExtractor(StringRef(numberData, sizeof(numberData)-1), true, 4); 62 EXPECT_EQ(0x9080U, DE.getU16(&offset)); 63 EXPECT_EQ(2U, offset); 64 offset = 0; 65 EXPECT_EQ(0xFFFF9080U, DE.getU32(&offset)); 66 EXPECT_EQ(4U, offset); 67 offset = 0; 68 EXPECT_EQ(0x80FFFF9080ULL, DE.getU64(&offset)); 69 EXPECT_EQ(8U, offset); 70 offset = 0; 71 EXPECT_EQ(0xFFFF9080U, DE.getAddress(&offset)); 72 EXPECT_EQ(4U, offset); 73 offset = 0; 74 75 EXPECT_EQ(data, DE.getU32(&offset, data, 2)); 76 EXPECT_EQ(0xFFFF9080U, data[0]); 77 EXPECT_EQ(0x80U, data[1]); 78 EXPECT_EQ(8U, offset); 79 } 80 81 TYPED_TEST(DataExtractorTest, SignedNumbers) { 82 DataExtractor DE(StringRef(numberData, sizeof(numberData)-1), false, 8); 83 TypeParam offset = 0; 84 85 EXPECT_EQ(-128, DE.getSigned(&offset, 1)); 86 EXPECT_EQ(1U, offset); 87 offset = 0; 88 EXPECT_EQ(-32624, DE.getSigned(&offset, 2)); 89 EXPECT_EQ(2U, offset); 90 offset = 0; 91 EXPECT_EQ(-2137980929, DE.getSigned(&offset, 4)); 92 EXPECT_EQ(4U, offset); 93 offset = 0; 94 EXPECT_EQ(-9182558167379214336LL, DE.getSigned(&offset, 8)); 95 EXPECT_EQ(8U, offset); 96 } 97 98 TYPED_TEST(DataExtractorTest, Strings) { 99 DataExtractor DE(StringRef(stringData, sizeof(stringData)-1), false, 8); 100 TypeParam offset = 0; 101 102 EXPECT_EQ(stringData, DE.getCStr(&offset)); 103 EXPECT_EQ(11U, offset); 104 EXPECT_EQ(nullptr, DE.getCStr(&offset)); 105 EXPECT_EQ(11U, offset); 106 } 107 108 TYPED_TEST(DataExtractorTest, LEB128) { 109 DataExtractor DE(StringRef(leb128data, sizeof(leb128data)-1), false, 8); 110 TypeParam offset = 0; 111 112 EXPECT_EQ(9382ULL, DE.getULEB128(&offset)); 113 EXPECT_EQ(2U, offset); 114 offset = 0; 115 EXPECT_EQ(-7002LL, DE.getSLEB128(&offset)); 116 EXPECT_EQ(2U, offset); 117 118 DataExtractor BDE(StringRef(bigleb128data, sizeof(bigleb128data)-1), false,8); 119 offset = 0; 120 EXPECT_EQ(42218325750568106ULL, BDE.getULEB128(&offset)); 121 EXPECT_EQ(8U, offset); 122 offset = 0; 123 EXPECT_EQ(-29839268287359830LL, BDE.getSLEB128(&offset)); 124 EXPECT_EQ(8U, offset); 125 } 126 127 TYPED_TEST(DataExtractorTest, LEB128_error) { 128 DataExtractor DE(StringRef("\x81"), false, 8); 129 TypeParam Offset = 0; 130 EXPECT_EQ(0U, DE.getULEB128(&Offset)); 131 EXPECT_EQ(0U, Offset); 132 133 Offset = 0; 134 EXPECT_EQ(0U, DE.getSLEB128(&Offset)); 135 EXPECT_EQ(0U, Offset); 136 } 137 } 138