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