xref: /llvm-project/lldb/unittests/Utility/DataExtractorTest.cpp (revision 07e93c57a3e5cf0ae32f7ed08fcc04ccb4ce82d5)
1 //===-- DataExtractorTest.cpp -----------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "gtest/gtest.h"
11 
12 #include "lldb/Utility/DataExtractor.h"
13 
14 using namespace lldb_private;
15 
16 TEST(DataExtractorTest, GetBitfield) {
17   uint8_t buffer[] = {0x01, 0x23, 0x45, 0x67};
18   DataExtractor LE(buffer, sizeof(buffer), lldb::eByteOrderLittle,
19                    sizeof(void *));
20   DataExtractor BE(buffer, sizeof(buffer), lldb::eByteOrderBig, sizeof(void *));
21 
22   lldb::offset_t offset;
23 
24   offset = 0;
25   ASSERT_EQ(buffer[1], LE.GetMaxU64Bitfield(&offset, sizeof(buffer), 8, 8));
26   offset = 0;
27   ASSERT_EQ(buffer[1], BE.GetMaxU64Bitfield(&offset, sizeof(buffer), 8, 8));
28 
29   offset = 0;
30   ASSERT_EQ(int8_t(buffer[1]),
31             LE.GetMaxS64Bitfield(&offset, sizeof(buffer), 8, 8));
32   offset = 0;
33   ASSERT_EQ(int8_t(buffer[1]),
34             BE.GetMaxS64Bitfield(&offset, sizeof(buffer), 8, 8));
35 }
36 
37 TEST(DataExtractorTest, PeekData) {
38   uint8_t buffer[] = {0x01, 0x02, 0x03, 0x04};
39   DataExtractor E(buffer, sizeof buffer, lldb::eByteOrderLittle, 4);
40 
41   EXPECT_EQ(buffer + 0, E.PeekData(0, 0));
42   EXPECT_EQ(buffer + 0, E.PeekData(0, 4));
43   EXPECT_EQ(nullptr, E.PeekData(0, 5));
44 
45   EXPECT_EQ(buffer + 2, E.PeekData(2, 0));
46   EXPECT_EQ(buffer + 2, E.PeekData(2, 2));
47   EXPECT_EQ(nullptr, E.PeekData(2, 3));
48 
49   EXPECT_EQ(buffer + 4, E.PeekData(4, 0));
50   EXPECT_EQ(nullptr, E.PeekData(4, 1));
51 }
52 
53 TEST(DataExtractorTest, GetMaxU64) {
54   uint8_t buffer[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
55   DataExtractor LE(buffer, sizeof(buffer), lldb::eByteOrderLittle,
56                    sizeof(void *));
57   DataExtractor BE(buffer, sizeof(buffer), lldb::eByteOrderBig, sizeof(void *));
58 
59   lldb::offset_t offset;
60 
61   // Check with the minimum allowed byte size.
62   offset = 0;
63   EXPECT_EQ(0x01U, LE.GetMaxU64(&offset, 1));
64   EXPECT_EQ(1U, offset);
65   offset = 0;
66   EXPECT_EQ(0x01U, BE.GetMaxU64(&offset, 1));
67   EXPECT_EQ(1U, offset);
68 
69   // Check with a non-zero offset.
70   offset = 1;
71   EXPECT_EQ(0x0302U, LE.GetMaxU64(&offset, 2));
72   EXPECT_EQ(3U, offset);
73   offset = 1;
74   EXPECT_EQ(0x0203U, BE.GetMaxU64(&offset, 2));
75   EXPECT_EQ(3U, offset);
76 
77   // Check with the byte size not being a multiple of 2.
78   offset = 0;
79   EXPECT_EQ(0x07060504030201U, LE.GetMaxU64(&offset, 7));
80   EXPECT_EQ(7U, offset);
81   offset = 0;
82   EXPECT_EQ(0x01020304050607U, BE.GetMaxU64(&offset, 7));
83   EXPECT_EQ(7U, offset);
84 
85   // Check with the maximum allowed byte size.
86   offset = 0;
87   EXPECT_EQ(0x0807060504030201U, LE.GetMaxU64(&offset, 8));
88   EXPECT_EQ(8U, offset);
89   offset = 0;
90   EXPECT_EQ(0x0102030405060708U, BE.GetMaxU64(&offset, 8));
91   EXPECT_EQ(8U, offset);
92 }
93 
94 TEST(DataExtractorTest, GetMaxS64) {
95   uint8_t buffer[] = {0x01, 0x02, 0x83, 0x04, 0x05, 0x06, 0x07, 0x08};
96   DataExtractor LE(buffer, sizeof(buffer), lldb::eByteOrderLittle,
97                    sizeof(void *));
98   DataExtractor BE(buffer, sizeof(buffer), lldb::eByteOrderBig, sizeof(void *));
99 
100   lldb::offset_t offset;
101 
102   // Check with the minimum allowed byte size.
103   offset = 0;
104   EXPECT_EQ(0x01, LE.GetMaxS64(&offset, 1));
105   EXPECT_EQ(1U, offset);
106   offset = 0;
107   EXPECT_EQ(0x01, BE.GetMaxS64(&offset, 1));
108   EXPECT_EQ(1U, offset);
109 
110   // Check that sign extension works correctly.
111   offset = 0;
112   int64_t value = LE.GetMaxS64(&offset, 3);
113   EXPECT_EQ(0xffffffffff830201U, *reinterpret_cast<uint64_t *>(&value));
114   EXPECT_EQ(3U, offset);
115   offset = 2;
116   value = BE.GetMaxS64(&offset, 3);
117   EXPECT_EQ(0xffffffffff830405U, *reinterpret_cast<uint64_t *>(&value));
118   EXPECT_EQ(5U, offset);
119 
120   // Check with the maximum allowed byte size.
121   offset = 0;
122   EXPECT_EQ(0x0807060504830201, LE.GetMaxS64(&offset, 8));
123   EXPECT_EQ(8U, offset);
124   offset = 0;
125   EXPECT_EQ(0x0102830405060708, BE.GetMaxS64(&offset, 8));
126   EXPECT_EQ(8U, offset);
127 }
128 
129 TEST(DataExtractorTest, GetMaxU64_unchecked) {
130   uint8_t buffer[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
131   DataExtractor LE(buffer, sizeof(buffer), lldb::eByteOrderLittle,
132                    sizeof(void *));
133   DataExtractor BE(buffer, sizeof(buffer), lldb::eByteOrderBig, sizeof(void *));
134 
135   lldb::offset_t offset;
136 
137   // Check with the minimum allowed byte size.
138   offset = 0;
139   EXPECT_EQ(0x01U, LE.GetMaxU64_unchecked(&offset, 1));
140   EXPECT_EQ(1U, offset);
141   offset = 0;
142   EXPECT_EQ(0x01U, BE.GetMaxU64_unchecked(&offset, 1));
143   EXPECT_EQ(1U, offset);
144 
145   // Check with a non-zero offset.
146   offset = 1;
147   EXPECT_EQ(0x0302U, LE.GetMaxU64_unchecked(&offset, 2));
148   EXPECT_EQ(3U, offset);
149   offset = 1;
150   EXPECT_EQ(0x0203U, BE.GetMaxU64_unchecked(&offset, 2));
151   EXPECT_EQ(3U, offset);
152 
153   // Check with the byte size not being a multiple of 2.
154   offset = 0;
155   EXPECT_EQ(0x07060504030201U, LE.GetMaxU64_unchecked(&offset, 7));
156   EXPECT_EQ(7U, offset);
157   offset = 0;
158   EXPECT_EQ(0x01020304050607U, BE.GetMaxU64_unchecked(&offset, 7));
159   EXPECT_EQ(7U, offset);
160 
161   // Check with the maximum allowed byte size.
162   offset = 0;
163   EXPECT_EQ(0x0807060504030201U, LE.GetMaxU64_unchecked(&offset, 8));
164   EXPECT_EQ(8U, offset);
165   offset = 0;
166   EXPECT_EQ(0x0102030405060708U, BE.GetMaxU64_unchecked(&offset, 8));
167   EXPECT_EQ(8U, offset);
168 }
169