1 //===-- DataExtractorTest.cpp -----------------------------------*- C++ -*-===// 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 "gtest/gtest.h" 10 11 #include "lldb/Utility/DataExtractor.h" 12 13 using namespace lldb_private; 14 15 TEST(DataExtractorTest, GetBitfield) { 16 uint8_t buffer[] = {0x01, 0x23, 0x45, 0x67}; 17 DataExtractor LE(buffer, sizeof(buffer), lldb::eByteOrderLittle, 18 sizeof(void *)); 19 DataExtractor BE(buffer, sizeof(buffer), lldb::eByteOrderBig, sizeof(void *)); 20 21 lldb::offset_t offset; 22 23 offset = 0; 24 ASSERT_EQ(buffer[1], LE.GetMaxU64Bitfield(&offset, sizeof(buffer), 8, 8)); 25 offset = 0; 26 ASSERT_EQ(buffer[1], BE.GetMaxU64Bitfield(&offset, sizeof(buffer), 8, 8)); 27 28 offset = 0; 29 ASSERT_EQ(int8_t(buffer[1]), 30 LE.GetMaxS64Bitfield(&offset, sizeof(buffer), 8, 8)); 31 offset = 0; 32 ASSERT_EQ(int8_t(buffer[1]), 33 BE.GetMaxS64Bitfield(&offset, sizeof(buffer), 8, 8)); 34 } 35 36 TEST(DataExtractorTest, PeekData) { 37 uint8_t buffer[] = {0x01, 0x02, 0x03, 0x04}; 38 DataExtractor E(buffer, sizeof buffer, lldb::eByteOrderLittle, 4); 39 40 EXPECT_EQ(buffer + 0, E.PeekData(0, 0)); 41 EXPECT_EQ(buffer + 0, E.PeekData(0, 4)); 42 EXPECT_EQ(nullptr, E.PeekData(0, 5)); 43 44 EXPECT_EQ(buffer + 2, E.PeekData(2, 0)); 45 EXPECT_EQ(buffer + 2, E.PeekData(2, 2)); 46 EXPECT_EQ(nullptr, E.PeekData(2, 3)); 47 48 EXPECT_EQ(buffer + 4, E.PeekData(4, 0)); 49 EXPECT_EQ(nullptr, E.PeekData(4, 1)); 50 } 51 52 TEST(DataExtractorTest, GetCStr) { 53 uint8_t buffer[] = {'X', 'f', 'o', 'o', '\0'}; 54 DataExtractor E(buffer, sizeof buffer, lldb::eByteOrderLittle, 4); 55 56 lldb::offset_t offset = 1; 57 EXPECT_STREQ("foo", E.GetCStr(&offset)); 58 EXPECT_EQ(5U, offset); 59 } 60 61 TEST(DataExtractorTest, GetCStrEmpty) { 62 uint8_t buffer[] = {'X', '\0'}; 63 DataExtractor E(buffer, sizeof buffer, lldb::eByteOrderLittle, 4); 64 65 lldb::offset_t offset = 1; 66 EXPECT_STREQ("", E.GetCStr(&offset)); 67 EXPECT_EQ(2U, offset); 68 } 69 70 TEST(DataExtractorTest, GetCStrUnterminated) { 71 uint8_t buffer[] = {'X', 'f', 'o', 'o'}; 72 DataExtractor E(buffer, sizeof buffer, lldb::eByteOrderLittle, 4); 73 74 lldb::offset_t offset = 1; 75 EXPECT_EQ(nullptr, E.GetCStr(&offset)); 76 EXPECT_EQ(1U, offset); 77 } 78 79 TEST(DataExtractorTest, GetCStrAtEnd) { 80 uint8_t buffer[] = {'X'}; 81 DataExtractor E(buffer, sizeof buffer, lldb::eByteOrderLittle, 4); 82 83 lldb::offset_t offset = 1; 84 EXPECT_EQ(nullptr, E.GetCStr(&offset)); 85 EXPECT_EQ(1U, offset); 86 } 87 88 TEST(DataExtractorTest, GetCStrAtNullOffset) { 89 uint8_t buffer[] = {'f', 'o', 'o', '\0'}; 90 DataExtractor E(buffer, sizeof buffer, lldb::eByteOrderLittle, 4); 91 92 lldb::offset_t offset = 0; 93 EXPECT_STREQ("foo", E.GetCStr(&offset)); 94 EXPECT_EQ(4U, offset); 95 } 96 97 TEST(DataExtractorTest, GetMaxU64) { 98 uint8_t buffer[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}; 99 DataExtractor LE(buffer, sizeof(buffer), lldb::eByteOrderLittle, 100 sizeof(void *)); 101 DataExtractor BE(buffer, sizeof(buffer), lldb::eByteOrderBig, sizeof(void *)); 102 103 lldb::offset_t offset; 104 105 // Check with the minimum allowed byte size. 106 offset = 0; 107 EXPECT_EQ(0x01U, LE.GetMaxU64(&offset, 1)); 108 EXPECT_EQ(1U, offset); 109 offset = 0; 110 EXPECT_EQ(0x01U, BE.GetMaxU64(&offset, 1)); 111 EXPECT_EQ(1U, offset); 112 113 // Check with a non-zero offset. 114 offset = 1; 115 EXPECT_EQ(0x0302U, LE.GetMaxU64(&offset, 2)); 116 EXPECT_EQ(3U, offset); 117 offset = 1; 118 EXPECT_EQ(0x0203U, BE.GetMaxU64(&offset, 2)); 119 EXPECT_EQ(3U, offset); 120 121 // Check with the byte size not being a multiple of 2. 122 offset = 0; 123 EXPECT_EQ(0x07060504030201U, LE.GetMaxU64(&offset, 7)); 124 EXPECT_EQ(7U, offset); 125 offset = 0; 126 EXPECT_EQ(0x01020304050607U, BE.GetMaxU64(&offset, 7)); 127 EXPECT_EQ(7U, offset); 128 129 // Check with the maximum allowed byte size. 130 offset = 0; 131 EXPECT_EQ(0x0807060504030201U, LE.GetMaxU64(&offset, 8)); 132 EXPECT_EQ(8U, offset); 133 offset = 0; 134 EXPECT_EQ(0x0102030405060708U, BE.GetMaxU64(&offset, 8)); 135 EXPECT_EQ(8U, offset); 136 } 137 138 TEST(DataExtractorTest, GetMaxS64) { 139 uint8_t buffer[] = {0x01, 0x02, 0x83, 0x04, 0x05, 0x06, 0x07, 0x08}; 140 DataExtractor LE(buffer, sizeof(buffer), lldb::eByteOrderLittle, 141 sizeof(void *)); 142 DataExtractor BE(buffer, sizeof(buffer), lldb::eByteOrderBig, sizeof(void *)); 143 144 lldb::offset_t offset; 145 146 // Check with the minimum allowed byte size. 147 offset = 0; 148 EXPECT_EQ(0x01, LE.GetMaxS64(&offset, 1)); 149 EXPECT_EQ(1U, offset); 150 offset = 0; 151 EXPECT_EQ(0x01, BE.GetMaxS64(&offset, 1)); 152 EXPECT_EQ(1U, offset); 153 154 // Check that sign extension works correctly. 155 offset = 0; 156 int64_t value = LE.GetMaxS64(&offset, 3); 157 EXPECT_EQ(0xffffffffff830201U, *reinterpret_cast<uint64_t *>(&value)); 158 EXPECT_EQ(3U, offset); 159 offset = 2; 160 value = BE.GetMaxS64(&offset, 3); 161 EXPECT_EQ(0xffffffffff830405U, *reinterpret_cast<uint64_t *>(&value)); 162 EXPECT_EQ(5U, offset); 163 164 // Check with the maximum allowed byte size. 165 offset = 0; 166 EXPECT_EQ(0x0807060504830201, LE.GetMaxS64(&offset, 8)); 167 EXPECT_EQ(8U, offset); 168 offset = 0; 169 EXPECT_EQ(0x0102830405060708, BE.GetMaxS64(&offset, 8)); 170 EXPECT_EQ(8U, offset); 171 } 172 173 TEST(DataExtractorTest, GetMaxU64_unchecked) { 174 uint8_t buffer[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}; 175 DataExtractor LE(buffer, sizeof(buffer), lldb::eByteOrderLittle, 176 sizeof(void *)); 177 DataExtractor BE(buffer, sizeof(buffer), lldb::eByteOrderBig, sizeof(void *)); 178 179 lldb::offset_t offset; 180 181 // Check with the minimum allowed byte size. 182 offset = 0; 183 EXPECT_EQ(0x01U, LE.GetMaxU64_unchecked(&offset, 1)); 184 EXPECT_EQ(1U, offset); 185 offset = 0; 186 EXPECT_EQ(0x01U, BE.GetMaxU64_unchecked(&offset, 1)); 187 EXPECT_EQ(1U, offset); 188 189 // Check with a non-zero offset. 190 offset = 1; 191 EXPECT_EQ(0x0302U, LE.GetMaxU64_unchecked(&offset, 2)); 192 EXPECT_EQ(3U, offset); 193 offset = 1; 194 EXPECT_EQ(0x0203U, BE.GetMaxU64_unchecked(&offset, 2)); 195 EXPECT_EQ(3U, offset); 196 197 // Check with the byte size not being a multiple of 2. 198 offset = 0; 199 EXPECT_EQ(0x07060504030201U, LE.GetMaxU64_unchecked(&offset, 7)); 200 EXPECT_EQ(7U, offset); 201 offset = 0; 202 EXPECT_EQ(0x01020304050607U, BE.GetMaxU64_unchecked(&offset, 7)); 203 EXPECT_EQ(7U, offset); 204 205 // Check with the maximum allowed byte size. 206 offset = 0; 207 EXPECT_EQ(0x0807060504030201U, LE.GetMaxU64_unchecked(&offset, 8)); 208 EXPECT_EQ(8U, offset); 209 offset = 0; 210 EXPECT_EQ(0x0102030405060708U, BE.GetMaxU64_unchecked(&offset, 8)); 211 EXPECT_EQ(8U, offset); 212 } 213