blob: 97aa7d974fd19070f8b9bd19669cfe42c653466e [file] [log] [blame]
Shih-wei Liao5460a1f2012-03-16 22:41:16 -07001//===- implTest.cpp -------------------------------------------------------===//
2//
3// The MCLinker Project
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
Stephen Hines37b74a32014-11-26 18:48:20 -08009#include "mcld/Support/LEB128.h"
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070010#include "LEB128Test.h"
11
Stephen Hines37b74a32014-11-26 18:48:20 -080012#include "mcld/Support/SystemUtils.h"
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070013#include <ctime>
14#include <cstdlib>
15
16using namespace mcld;
17using namespace mcldtest;
18
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070019// Constructor can do set-up work for all test here.
Stephen Hines37b74a32014-11-26 18:48:20 -080020LEB128Test::LEB128Test() {
21 // Initialize the seed for random number generator using during the tests.
Stephen Hinesf7ac0f12013-05-03 19:09:24 -070022 sys::SetRandomSeed(::time(NULL));
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070023}
24
25// Destructor can do clean-up work that doesn't throw exceptions here.
Stephen Hines37b74a32014-11-26 18:48:20 -080026LEB128Test::~LEB128Test() {
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070027}
28
29// SetUp() will be called immediately before each test.
Stephen Hines37b74a32014-11-26 18:48:20 -080030void LEB128Test::SetUp() {
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070031}
32
33// TearDown() will be called immediately after each test.
Stephen Hines37b74a32014-11-26 18:48:20 -080034void LEB128Test::TearDown() {
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070035}
36
37//==========================================================================//
38// Testcases
39//
40
Stephen Hines37b74a32014-11-26 18:48:20 -080041TEST_F(LEB128Test, EncodeULEB_Example_from_Dwarf3_Figure22_Using_32bits) {
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070042 leb128::ByteType buffer[2];
Stephen Hines37b74a32014-11-26 18:48:20 -080043 leb128::ByteType* result;
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070044 size_t size;
45
46 result = buffer;
47 size = leb128::encode<uint32_t>(result, 2);
48 ASSERT_EQ(buffer[0], 2);
49 ASSERT_EQ(result, buffer + 1);
Shih-wei Liao22add6f2012-12-15 17:21:00 -080050 ASSERT_TRUE(size == 1);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070051
52 result = buffer;
53 size = leb128::encode<uint32_t>(result, 127);
54 ASSERT_EQ(buffer[0], 127);
55 ASSERT_EQ(result, buffer + 1);
Shih-wei Liao22add6f2012-12-15 17:21:00 -080056 ASSERT_TRUE(size == 1);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070057
58 result = buffer;
59 size = leb128::encode<uint32_t>(result, 128);
60 ASSERT_EQ(buffer[0], 0 + 0x80);
61 ASSERT_EQ(buffer[1], 1);
62 ASSERT_EQ(result, buffer + 2);
Shih-wei Liao22add6f2012-12-15 17:21:00 -080063 ASSERT_TRUE(size == 2);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070064
65 result = buffer;
66 size = leb128::encode<uint32_t>(result, 129);
67 ASSERT_EQ(buffer[0], 1 + 0x80);
68 ASSERT_EQ(buffer[1], 1);
69 ASSERT_EQ(result, buffer + 2);
Shih-wei Liao22add6f2012-12-15 17:21:00 -080070 ASSERT_TRUE(size == 2);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070071
72 result = buffer;
73 size = leb128::encode<uint32_t>(result, 130);
74 ASSERT_EQ(buffer[0], 2 + 0x80);
75 ASSERT_EQ(buffer[1], 1);
76 ASSERT_EQ(result, buffer + 2);
Shih-wei Liao22add6f2012-12-15 17:21:00 -080077 ASSERT_TRUE(size == 2);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070078
79 result = buffer;
80 size = leb128::encode<uint32_t>(result, 12857);
81 ASSERT_EQ(buffer[0], 57 + 0x80);
82 ASSERT_EQ(buffer[1], 100);
83 ASSERT_EQ(result, buffer + 2);
Shih-wei Liao22add6f2012-12-15 17:21:00 -080084 ASSERT_TRUE(size == 2);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070085}
86
Stephen Hines37b74a32014-11-26 18:48:20 -080087TEST_F(LEB128Test, EncodeULEB_Example_from_Dwarf3_Figure22_Using_64bits) {
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070088 leb128::ByteType buffer[2];
Stephen Hines37b74a32014-11-26 18:48:20 -080089 leb128::ByteType* result;
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070090 size_t size;
91
92 result = buffer;
93 size = leb128::encode<uint64_t>(result, 2);
94 ASSERT_EQ(buffer[0], 2);
95 ASSERT_EQ(result, buffer + 1);
Shih-wei Liao22add6f2012-12-15 17:21:00 -080096 ASSERT_TRUE(size == 1);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070097
98 result = buffer;
99 size = leb128::encode<uint64_t>(result, 127);
100 ASSERT_EQ(buffer[0], 127);
101 ASSERT_EQ(result, buffer + 1);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800102 ASSERT_TRUE(size == 1);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700103
104 result = buffer;
105 size = leb128::encode<uint64_t>(result, 128);
106 ASSERT_EQ(buffer[0], 0 + 0x80);
107 ASSERT_EQ(buffer[1], 1);
108 ASSERT_EQ(result, buffer + 2);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800109 ASSERT_TRUE(size == 2);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700110
111 result = buffer;
112 size = leb128::encode<uint64_t>(result, 129);
113 ASSERT_EQ(buffer[0], 1 + 0x80);
114 ASSERT_EQ(buffer[1], 1);
115 ASSERT_EQ(result, buffer + 2);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800116 ASSERT_TRUE(size == 2);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700117
118 result = buffer;
119 size = leb128::encode<uint64_t>(result, 130);
120 ASSERT_EQ(buffer[0], 2 + 0x80);
121 ASSERT_EQ(buffer[1], 1);
122 ASSERT_EQ(result, buffer + 2);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800123 ASSERT_TRUE(size == 2);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700124
125 result = buffer;
126 size = leb128::encode<uint64_t>(result, 12857);
127 ASSERT_EQ(buffer[0], 57 + 0x80);
128 ASSERT_EQ(buffer[1], 100);
129 ASSERT_EQ(result, buffer + 2);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800130 ASSERT_TRUE(size == 2);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700131}
132
Stephen Hines37b74a32014-11-26 18:48:20 -0800133TEST_F(LEB128Test, EncodeSLEB_Example_from_Dwarf3_Figure22) {
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700134 leb128::ByteType buffer[2];
Stephen Hines37b74a32014-11-26 18:48:20 -0800135 leb128::ByteType* result;
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700136 size_t size;
137
138 result = buffer;
139 size = leb128::encode<int32_t>(result, 2);
140 ASSERT_EQ(buffer[0], 2);
141 ASSERT_EQ(result, buffer + 1);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800142 ASSERT_TRUE(size == 1);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700143
144 result = buffer;
145 size = leb128::encode<int32_t>(result, -2);
146 ASSERT_EQ(buffer[0], 0x7e);
147 ASSERT_EQ(result, buffer + 1);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800148 ASSERT_TRUE(size == 1);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700149
150 result = buffer;
151 size = leb128::encode<int32_t>(result, 127);
152 ASSERT_EQ(buffer[0], 127 + 0x80);
153 ASSERT_EQ(buffer[1], 0);
154 ASSERT_EQ(result, buffer + 2);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800155 ASSERT_TRUE(size == 2);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700156
157 result = buffer;
158 size = leb128::encode<int32_t>(result, -127);
159 ASSERT_EQ(buffer[0], 1 + 0x80);
160 ASSERT_EQ(buffer[1], 0x7f);
161 ASSERT_EQ(result, buffer + 2);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800162 ASSERT_TRUE(size == 2);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700163
164 result = buffer;
165 size = leb128::encode<int32_t>(result, 128);
166 ASSERT_EQ(buffer[0], 0 + 0x80);
167 ASSERT_EQ(buffer[1], 1);
168 ASSERT_EQ(result, buffer + 2);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800169 ASSERT_TRUE(size == 2);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700170
171 result = buffer;
172 size = leb128::encode<int32_t>(result, -128);
173 ASSERT_EQ(buffer[0], 0 + 0x80);
174 ASSERT_EQ(buffer[1], 0x7f);
175 ASSERT_EQ(result, buffer + 2);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800176 ASSERT_TRUE(size == 2);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700177
178 result = buffer;
179 size = leb128::encode<int32_t>(result, 129);
180 ASSERT_EQ(buffer[0], 1 + 0x80);
181 ASSERT_EQ(buffer[1], 1);
182 ASSERT_EQ(result, buffer + 2);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800183 ASSERT_TRUE(size == 2);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700184
185 result = buffer;
186 size = leb128::encode<int32_t>(result, -129);
187 ASSERT_EQ(buffer[0], 0x7f + 0x80);
188 ASSERT_EQ(buffer[1], 0x7e);
189 ASSERT_EQ(result, buffer + 2);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800190 ASSERT_TRUE(size == 2);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700191}
192
Stephen Hines37b74a32014-11-26 18:48:20 -0800193TEST_F(LEB128Test, DecodeULEB_Example_from_Dwarf3_Figure22) {
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700194 leb128::ByteType buffer[2];
195 size_t size;
196
197 buffer[0] = 2;
198 buffer[1] = 0;
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800199 ASSERT_TRUE(leb128::decode<uint64_t>(buffer, size) == 2);
200 ASSERT_TRUE(size == 1);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700201
202 buffer[0] = 127;
203 buffer[1] = 0;
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800204 ASSERT_TRUE(leb128::decode<uint64_t>(buffer, size) == 127);
205 ASSERT_TRUE(size == 1);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700206
207 buffer[0] = 0 + 0x80;
208 buffer[1] = 1;
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800209 ASSERT_TRUE(leb128::decode<uint64_t>(buffer, size) == 128);
210 ASSERT_TRUE(size == 2);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700211
212 buffer[0] = 1 + 0x80;
213 buffer[1] = 1;
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800214 ASSERT_TRUE(leb128::decode<uint64_t>(buffer, size) == 129);
215 ASSERT_TRUE(size == 2);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700216
217 buffer[0] = 2 + 0x80;
218 buffer[1] = 1;
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800219 ASSERT_TRUE(leb128::decode<uint64_t>(buffer, size) == 130);
220 ASSERT_TRUE(size == 2);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700221
222 buffer[0] = 57 + 0x80;
223 buffer[1] = 100;
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800224 ASSERT_TRUE(leb128::decode<uint64_t>(buffer, size) == 12857);
225 ASSERT_TRUE(size == 2);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700226}
227
Stephen Hines37b74a32014-11-26 18:48:20 -0800228TEST_F(LEB128Test, DecodeSLEB_Example_from_Dwarf3_Figure22) {
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700229 leb128::ByteType buffer[2];
230 size_t size;
231
232 buffer[0] = 2;
233 buffer[1] = 0;
234 ASSERT_EQ(leb128::decode<int64_t>(buffer, size), 2);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800235 ASSERT_TRUE(size == 1);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700236
237 buffer[0] = 0x7e;
238 buffer[1] = 0;
239 ASSERT_EQ(leb128::decode<int64_t>(buffer, size), -2);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800240 ASSERT_TRUE(size == 1);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700241
242 buffer[0] = 127 + 0x80;
243 buffer[1] = 0;
244 ASSERT_EQ(leb128::decode<int64_t>(buffer, size), 127);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800245 ASSERT_TRUE(size == 2);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700246
247 buffer[0] = 1 + 0x80;
248 buffer[1] = 0x7f;
249 ASSERT_EQ(leb128::decode<int64_t>(buffer, size), -127);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800250 ASSERT_TRUE(size == 2);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700251
252 buffer[0] = 0 + 0x80;
253 buffer[1] = 1;
254 ASSERT_EQ(leb128::decode<int64_t>(buffer, size), 128);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800255 ASSERT_TRUE(size == 2);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700256
257 buffer[0] = 0 + 0x80;
258 buffer[1] = 0x7f;
259 ASSERT_EQ(leb128::decode<int64_t>(buffer, size), -128);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800260 ASSERT_TRUE(size == 2);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700261
262 buffer[0] = 1 + 0x80;
263 buffer[1] = 1;
264 ASSERT_EQ(leb128::decode<int64_t>(buffer, size), 129);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800265 ASSERT_TRUE(size == 2);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700266
267 buffer[0] = 0x7f + 0x80;
268 buffer[1] = 0x7e;
269 ASSERT_EQ(leb128::decode<int64_t>(buffer, size), -129);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800270 ASSERT_TRUE(size == 2);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700271}
272
Stephen Hines37b74a32014-11-26 18:48:20 -0800273TEST_F(LEB128Test, DecodeULEB_Tests_Found_in_Android_dalvik_dx) {
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700274 leb128::ByteType content[2];
Stephen Hines37b74a32014-11-26 18:48:20 -0800275 const leb128::ByteType* p;
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700276
277 content[0] = 0;
278 p = content;
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800279 ASSERT_TRUE(leb128::decode<uint64_t>(p) == 0);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700280 ASSERT_EQ(p, content + 1);
281
282 content[0] = 1;
283 p = content;
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800284 ASSERT_TRUE(leb128::decode<uint64_t>(p) == 1);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700285 ASSERT_EQ(p, content + 1);
286
287 content[0] = 0x80;
288 content[1] = 0x7f;
289 p = content;
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800290 ASSERT_TRUE(leb128::decode<uint64_t>(p) == 16256);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700291 ASSERT_EQ(p, content + 2);
292}
293
Stephen Hines37b74a32014-11-26 18:48:20 -0800294TEST_F(LEB128Test, EncodeULEB_Tests_Found_in_Android_dalvik_dx) {
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700295 leb128::ByteType buffer[5];
Stephen Hines37b74a32014-11-26 18:48:20 -0800296 leb128::ByteType* result;
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700297 size_t size;
298
299 result = buffer;
300 size = leb128::encode<uint32_t>(result, 0);
301 ASSERT_EQ(buffer[0], 0);
302 ASSERT_EQ(result, buffer + 1);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800303 ASSERT_TRUE(size == 1);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700304
305 result = buffer;
306 size = leb128::encode<uint64_t>(result, 0);
307 ASSERT_EQ(buffer[0], 0);
308 ASSERT_EQ(result, buffer + 1);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800309 ASSERT_TRUE(size == 1);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700310
311 result = buffer;
312 size = leb128::encode<uint32_t>(result, 1);
313 ASSERT_EQ(buffer[0], 1);
314 ASSERT_EQ(result, buffer + 1);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800315 ASSERT_TRUE(size == 1);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700316
317 result = buffer;
318 size = leb128::encode<uint64_t>(result, 1);
319 ASSERT_EQ(buffer[0], 1);
320 ASSERT_EQ(result, buffer + 1);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800321 ASSERT_TRUE(size == 1);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700322
323 result = buffer;
324 size = leb128::encode<uint32_t>(result, 16256);
325 ASSERT_EQ(buffer[0], 0x80);
326 ASSERT_EQ(buffer[1], 0x7f);
327 ASSERT_EQ(result, buffer + 2);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800328 ASSERT_TRUE(size == 2);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700329
330 result = buffer;
331 size = leb128::encode<uint64_t>(result, 16256);
332 ASSERT_EQ(buffer[0], 0x80);
333 ASSERT_EQ(buffer[1], 0x7f);
334 ASSERT_EQ(result, buffer + 2);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800335 ASSERT_TRUE(size == 2);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700336
337 result = buffer;
338 size = leb128::encode<uint32_t>(result, 0x3b4);
339 ASSERT_EQ(buffer[0], 0xb4);
340 ASSERT_EQ(buffer[1], 0x07);
341 ASSERT_EQ(result, buffer + 2);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800342 ASSERT_TRUE(size == 2);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700343
344 result = buffer;
345 size = leb128::encode<uint64_t>(result, 0x3b4);
346 ASSERT_EQ(buffer[0], 0xb4);
347 ASSERT_EQ(buffer[1], 0x07);
348 ASSERT_EQ(result, buffer + 2);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800349 ASSERT_TRUE(size == 2);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700350
351 result = buffer;
352 size = leb128::encode<uint32_t>(result, 0x40c);
353 ASSERT_EQ(buffer[0], 0x8c);
354 ASSERT_EQ(buffer[1], 0x08);
355 ASSERT_EQ(result, buffer + 2);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800356 ASSERT_TRUE(size == 2);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700357
358 result = buffer;
359 size = leb128::encode<uint64_t>(result, 0x40c);
360 ASSERT_EQ(buffer[0], 0x8c);
361 ASSERT_EQ(buffer[1], 0x08);
362 ASSERT_EQ(result, buffer + 2);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800363 ASSERT_TRUE(size == 2);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700364
365 result = buffer;
366 size = leb128::encode<uint32_t>(result, 0xffffffff);
367 ASSERT_EQ(buffer[0], 0xff);
368 ASSERT_EQ(buffer[1], 0xff);
369 ASSERT_EQ(buffer[2], 0xff);
370 ASSERT_EQ(buffer[3], 0xff);
371 ASSERT_EQ(buffer[4], 0xf);
372 ASSERT_EQ(result, buffer + 5);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800373 ASSERT_TRUE(size == 5);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700374
375 result = buffer;
376 size = leb128::encode<uint64_t>(result, 0xffffffff);
377 ASSERT_EQ(buffer[0], 0xff);
378 ASSERT_EQ(buffer[1], 0xff);
379 ASSERT_EQ(buffer[2], 0xff);
380 ASSERT_EQ(buffer[3], 0xff);
381 ASSERT_EQ(buffer[4], 0xf);
382 ASSERT_EQ(result, buffer + 5);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800383 ASSERT_TRUE(size == 5);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700384}
385
Stephen Hines37b74a32014-11-26 18:48:20 -0800386TEST_F(LEB128Test, DecodeSLEB_Tests_Found_in_Android_dalvik_dx) {
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700387 leb128::ByteType content[2];
Stephen Hines37b74a32014-11-26 18:48:20 -0800388 const leb128::ByteType* p;
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700389
390 content[0] = 0;
391 p = content;
392 ASSERT_EQ(leb128::decode<int64_t>(p), 0);
393 ASSERT_EQ(p, content + 1);
394
395 content[0] = 1;
396 p = content;
397 ASSERT_EQ(leb128::decode<int64_t>(p), 1);
398 ASSERT_EQ(p, content + 1);
399
400 content[0] = 0x7f;
401 p = content;
402 ASSERT_EQ(leb128::decode<int64_t>(p), -1);
403 ASSERT_EQ(p, content + 1);
404
405 content[0] = 0x3c;
406 p = content;
407 ASSERT_EQ(leb128::decode<int64_t>(p), 0x3c);
408 ASSERT_EQ(p, content + 1);
409}
410
Stephen Hines37b74a32014-11-26 18:48:20 -0800411TEST_F(LEB128Test, EncodeSLEB_Tests_Found_in_Android_dalvik_dx) {
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700412 leb128::ByteType buffer[5];
Stephen Hines37b74a32014-11-26 18:48:20 -0800413 leb128::ByteType* result;
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700414 size_t size;
415
416 result = buffer;
417 size = leb128::encode<int32_t>(result, 0);
418 ASSERT_EQ(buffer[0], 0);
419 ASSERT_EQ(result, buffer + 1);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800420 ASSERT_TRUE(size == 1);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700421
422 result = buffer;
423 size = leb128::encode<int64_t>(result, 0);
424 ASSERT_EQ(buffer[0], 0);
425 ASSERT_EQ(result, buffer + 1);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800426 ASSERT_TRUE(size == 1);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700427
428 result = buffer;
429 size = leb128::encode<int32_t>(result, 1);
430 ASSERT_EQ(buffer[0], 1);
431 ASSERT_EQ(result, buffer + 1);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800432 ASSERT_TRUE(size == 1);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700433
434 result = buffer;
435 size = leb128::encode<int64_t>(result, 1);
436 ASSERT_EQ(buffer[0], 1);
437 ASSERT_EQ(result, buffer + 1);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800438 ASSERT_TRUE(size == 1);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700439
440 result = buffer;
441 size = leb128::encode<int32_t>(result, -1);
442 ASSERT_EQ(buffer[0], 0x7f);
443 ASSERT_EQ(result, buffer + 1);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800444 ASSERT_TRUE(size == 1);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700445
446 result = buffer;
447 size = leb128::encode<int64_t>(result, -1);
448 ASSERT_EQ(buffer[0], 0x7f);
449 ASSERT_EQ(result, buffer + 1);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800450 ASSERT_TRUE(size == 1);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700451}
452
Stephen Hines37b74a32014-11-26 18:48:20 -0800453TEST_F(LEB128Test, Random_Regression_Test) {
Zonr Changaffc1502012-07-16 14:28:23 +0800454 leb128::ByteType buffer[9];
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700455
456 for (int i = 0; i < 20; i++) {
Stephen Hinesf7ac0f12013-05-03 19:09:24 -0700457 unsigned long int value = sys::GetRandomNum();
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700458 uint64_t value2 = value * value;
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800459 int64_t value3 = value * value;
Stephen Hines37b74a32014-11-26 18:48:20 -0800460 leb128::ByteType* result;
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700461 size_t encode_size, decode_size;
462
463 // Test encode<uint32_t> and decode<uint64_t> on value
464 result = buffer;
465 encode_size = leb128::encode<uint32_t>(result, value);
466 ASSERT_EQ(result, buffer + encode_size);
467 ASSERT_EQ(leb128::decode<uint64_t>(buffer, decode_size), value);
468 ASSERT_EQ(encode_size, decode_size);
469
470 // Test encode<uint64_t> and decode<uint64_t> on (value * value)
471 result = buffer;
472 encode_size = leb128::encode<uint64_t>(result, value2);
473 ASSERT_EQ(result, buffer + encode_size);
474 ASSERT_EQ(leb128::decode<uint64_t>(buffer, decode_size), value2);
475 ASSERT_EQ(encode_size, decode_size);
476
477 // Test encode<uint64_t> and decode<uint64_t> on (value * value)
478 result = buffer;
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800479 encode_size = leb128::encode<int64_t>(result, value3);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700480 ASSERT_EQ(result, buffer + encode_size);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800481 ASSERT_EQ(leb128::decode<int64_t>(buffer, decode_size), value3);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700482 ASSERT_EQ(encode_size, decode_size);
483
484 // Test encode<uint64_t> and decode<uint64_t> on -(value * value)
485 result = buffer;
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800486 encode_size = leb128::encode<int64_t>(result, -value3);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700487 ASSERT_EQ(result, buffer + encode_size);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800488 ASSERT_EQ(leb128::decode<int64_t>(buffer, decode_size), -value3);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700489 ASSERT_EQ(encode_size, decode_size);
490 }
491}
492
Stephen Hines37b74a32014-11-26 18:48:20 -0800493TEST_F(LEB128Test, Other_Test) {
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700494 leb128::ByteType buffer[5];
Stephen Hines37b74a32014-11-26 18:48:20 -0800495 leb128::ByteType* result;
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700496 size_t size;
497
498 result = buffer;
499 leb128::encode<uint64_t>(result, 154452);
500 ASSERT_EQ(result, buffer + 3);
501 ASSERT_EQ(buffer[0], 0xd4);
502 ASSERT_EQ(buffer[1], 0xb6);
503 ASSERT_EQ(buffer[2], 0x9);
504
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800505 ASSERT_TRUE(leb128::decode<uint64_t>(buffer, size) == 154452);
506 ASSERT_TRUE(size == 3);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700507}
508
Stephen Hines37b74a32014-11-26 18:48:20 -0800509TEST_F(LEB128Test, Type_Conversion_Test) {
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700510 char buffer[5];
Stephen Hines37b74a32014-11-26 18:48:20 -0800511 char* result;
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700512 size_t size;
513
514 result = buffer;
515 leb128::encode<uint64_t>(result, 154452);
516 ASSERT_EQ(result, buffer + 3);
517 ASSERT_EQ(buffer[0], '\xd4');
518 ASSERT_EQ(buffer[1], '\xb6');
519 ASSERT_EQ(buffer[2], '\x09');
520
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800521 ASSERT_TRUE(leb128::decode<uint64_t>(buffer, size) == 154452);
522 ASSERT_TRUE(size == 3);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700523
Stephen Hines37b74a32014-11-26 18:48:20 -0800524 const char* p = buffer;
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800525 ASSERT_TRUE(leb128::decode<uint64_t>(p) == 154452);
526 ASSERT_TRUE(p == (buffer + 3));
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700527}