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, GetMaxU64) {
53   uint8_t buffer[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
54   DataExtractor LE(buffer, sizeof(buffer), lldb::eByteOrderLittle,
55                    sizeof(void *));
56   DataExtractor BE(buffer, sizeof(buffer), lldb::eByteOrderBig, sizeof(void *));
57 
58   lldb::offset_t offset;
59 
60   // Check with the minimum allowed byte size.
61   offset = 0;
62   EXPECT_EQ(0x01U, LE.GetMaxU64(&offset, 1));
63   EXPECT_EQ(1U, offset);
64   offset = 0;
65   EXPECT_EQ(0x01U, BE.GetMaxU64(&offset, 1));
66   EXPECT_EQ(1U, offset);
67 
68   // Check with a non-zero offset.
69   offset = 1;
70   EXPECT_EQ(0x0302U, LE.GetMaxU64(&offset, 2));
71   EXPECT_EQ(3U, offset);
72   offset = 1;
73   EXPECT_EQ(0x0203U, BE.GetMaxU64(&offset, 2));
74   EXPECT_EQ(3U, offset);
75 
76   // Check with the byte size not being a multiple of 2.
77   offset = 0;
78   EXPECT_EQ(0x07060504030201U, LE.GetMaxU64(&offset, 7));
79   EXPECT_EQ(7U, offset);
80   offset = 0;
81   EXPECT_EQ(0x01020304050607U, BE.GetMaxU64(&offset, 7));
82   EXPECT_EQ(7U, offset);
83 
84   // Check with the maximum allowed byte size.
85   offset = 0;
86   EXPECT_EQ(0x0807060504030201U, LE.GetMaxU64(&offset, 8));
87   EXPECT_EQ(8U, offset);
88   offset = 0;
89   EXPECT_EQ(0x0102030405060708U, BE.GetMaxU64(&offset, 8));
90   EXPECT_EQ(8U, offset);
91 }
92 
93 TEST(DataExtractorTest, GetMaxS64) {
94   uint8_t buffer[] = {0x01, 0x02, 0x83, 0x04, 0x05, 0x06, 0x07, 0x08};
95   DataExtractor LE(buffer, sizeof(buffer), lldb::eByteOrderLittle,
96                    sizeof(void *));
97   DataExtractor BE(buffer, sizeof(buffer), lldb::eByteOrderBig, sizeof(void *));
98 
99   lldb::offset_t offset;
100 
101   // Check with the minimum allowed byte size.
102   offset = 0;
103   EXPECT_EQ(0x01, LE.GetMaxS64(&offset, 1));
104   EXPECT_EQ(1U, offset);
105   offset = 0;
106   EXPECT_EQ(0x01, BE.GetMaxS64(&offset, 1));
107   EXPECT_EQ(1U, offset);
108 
109   // Check that sign extension works correctly.
110   offset = 0;
111   int64_t value = LE.GetMaxS64(&offset, 3);
112   EXPECT_EQ(0xffffffffff830201U, *reinterpret_cast<uint64_t *>(&value));
113   EXPECT_EQ(3U, offset);
114   offset = 2;
115   value = BE.GetMaxS64(&offset, 3);
116   EXPECT_EQ(0xffffffffff830405U, *reinterpret_cast<uint64_t *>(&value));
117   EXPECT_EQ(5U, offset);
118 
119   // Check with the maximum allowed byte size.
120   offset = 0;
121   EXPECT_EQ(0x0807060504830201, LE.GetMaxS64(&offset, 8));
122   EXPECT_EQ(8U, offset);
123   offset = 0;
124   EXPECT_EQ(0x0102830405060708, BE.GetMaxS64(&offset, 8));
125   EXPECT_EQ(8U, offset);
126 }
127 
128 TEST(DataExtractorTest, GetMaxU64_unchecked) {
129   uint8_t buffer[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
130   DataExtractor LE(buffer, sizeof(buffer), lldb::eByteOrderLittle,
131                    sizeof(void *));
132   DataExtractor BE(buffer, sizeof(buffer), lldb::eByteOrderBig, sizeof(void *));
133 
134   lldb::offset_t offset;
135 
136   // Check with the minimum allowed byte size.
137   offset = 0;
138   EXPECT_EQ(0x01U, LE.GetMaxU64_unchecked(&offset, 1));
139   EXPECT_EQ(1U, offset);
140   offset = 0;
141   EXPECT_EQ(0x01U, BE.GetMaxU64_unchecked(&offset, 1));
142   EXPECT_EQ(1U, offset);
143 
144   // Check with a non-zero offset.
145   offset = 1;
146   EXPECT_EQ(0x0302U, LE.GetMaxU64_unchecked(&offset, 2));
147   EXPECT_EQ(3U, offset);
148   offset = 1;
149   EXPECT_EQ(0x0203U, BE.GetMaxU64_unchecked(&offset, 2));
150   EXPECT_EQ(3U, offset);
151 
152   // Check with the byte size not being a multiple of 2.
153   offset = 0;
154   EXPECT_EQ(0x07060504030201U, LE.GetMaxU64_unchecked(&offset, 7));
155   EXPECT_EQ(7U, offset);
156   offset = 0;
157   EXPECT_EQ(0x01020304050607U, BE.GetMaxU64_unchecked(&offset, 7));
158   EXPECT_EQ(7U, offset);
159 
160   // Check with the maximum allowed byte size.
161   offset = 0;
162   EXPECT_EQ(0x0807060504030201U, LE.GetMaxU64_unchecked(&offset, 8));
163   EXPECT_EQ(8U, offset);
164   offset = 0;
165   EXPECT_EQ(0x0102030405060708U, BE.GetMaxU64_unchecked(&offset, 8));
166   EXPECT_EQ(8U, offset);
167 }
168