blob: 11d68f161eecfa32adf4faa2050cb329e1fff671 [file] [log] [blame]
Ben Murdochda12d292016-06-02 14:46:10 +01001// Copyright 2016 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "test/unittests/test-utils.h"
6
7#include "src/wasm/decoder.h"
8#include "src/wasm/wasm-macro-gen.h"
9
10namespace v8 {
11namespace internal {
12namespace wasm {
13
14class DecoderTest : public TestWithZone {
15 public:
16 DecoderTest() : decoder(nullptr, nullptr) {}
17
18 Decoder decoder;
19};
20
21#define CHECK_UINT32V_INLINE(expected, expected_length, ...) \
22 do { \
23 const byte data[] = {__VA_ARGS__}; \
24 decoder.Reset(data, data + sizeof(data)); \
25 int length; \
26 EXPECT_EQ(expected, \
27 decoder.checked_read_u32v(decoder.start(), 0, &length)); \
28 EXPECT_EQ(expected_length, length); \
29 } while (false)
30
31#define CHECK_INT32V_INLINE(expected, expected_length, ...) \
32 do { \
33 const byte data[] = {__VA_ARGS__}; \
34 decoder.Reset(data, data + sizeof(data)); \
35 int length; \
36 EXPECT_EQ(expected, \
37 decoder.checked_read_i32v(decoder.start(), 0, &length)); \
38 EXPECT_EQ(expected_length, length); \
39 } while (false)
40
41#define CHECK_UINT64V_INLINE(expected, expected_length, ...) \
42 do { \
43 const byte data[] = {__VA_ARGS__}; \
44 decoder.Reset(data, data + sizeof(data)); \
45 int length; \
46 EXPECT_EQ(expected, \
47 decoder.checked_read_u64v(decoder.start(), 0, &length)); \
48 EXPECT_EQ(expected_length, length); \
49 } while (false)
50
51#define CHECK_INT64V_INLINE(expected, expected_length, ...) \
52 do { \
53 const byte data[] = {__VA_ARGS__}; \
54 decoder.Reset(data, data + sizeof(data)); \
55 int length; \
56 EXPECT_EQ(expected, \
57 decoder.checked_read_i64v(decoder.start(), 0, &length)); \
58 EXPECT_EQ(expected_length, length); \
59 } while (false)
60
61TEST_F(DecoderTest, ReadU32v_OneByte) {
62 CHECK_UINT32V_INLINE(0, 1, 0);
63 CHECK_UINT32V_INLINE(5, 1, 5);
64 CHECK_UINT32V_INLINE(7, 1, 7);
65 CHECK_UINT32V_INLINE(9, 1, 9);
66 CHECK_UINT32V_INLINE(37, 1, 37);
67 CHECK_UINT32V_INLINE(69, 1, 69);
68 CHECK_UINT32V_INLINE(110, 1, 110);
69 CHECK_UINT32V_INLINE(125, 1, 125);
70 CHECK_UINT32V_INLINE(126, 1, 126);
71 CHECK_UINT32V_INLINE(127, 1, 127);
72}
73
74TEST_F(DecoderTest, ReadU32v_TwoByte) {
75 CHECK_UINT32V_INLINE(0, 1, 0, 0);
76 CHECK_UINT32V_INLINE(10, 1, 10, 0);
77 CHECK_UINT32V_INLINE(27, 1, 27, 0);
78 CHECK_UINT32V_INLINE(100, 1, 100, 0);
79
80 CHECK_UINT32V_INLINE(444, 2, U32V_2(444));
81 CHECK_UINT32V_INLINE(544, 2, U32V_2(544));
82 CHECK_UINT32V_INLINE(1311, 2, U32V_2(1311));
83 CHECK_UINT32V_INLINE(2333, 2, U32V_2(2333));
84
85 for (uint32_t i = 0; i < 1 << 14; i = i * 13 + 1) {
86 CHECK_UINT32V_INLINE(i, 2, U32V_2(i));
87 }
88
89 const uint32_t max = (1 << 14) - 1;
90 CHECK_UINT32V_INLINE(max, 2, U32V_2(max));
91}
92
93TEST_F(DecoderTest, ReadU32v_ThreeByte) {
94 CHECK_UINT32V_INLINE(0, 1, 0, 0, 0, 0);
95 CHECK_UINT32V_INLINE(10, 1, 10, 0, 0, 0);
96 CHECK_UINT32V_INLINE(27, 1, 27, 0, 0, 0);
97 CHECK_UINT32V_INLINE(100, 1, 100, 0, 0, 0);
98
99 CHECK_UINT32V_INLINE(11, 3, U32V_3(11));
100 CHECK_UINT32V_INLINE(101, 3, U32V_3(101));
101 CHECK_UINT32V_INLINE(446, 3, U32V_3(446));
102 CHECK_UINT32V_INLINE(546, 3, U32V_3(546));
103 CHECK_UINT32V_INLINE(1319, 3, U32V_3(1319));
104 CHECK_UINT32V_INLINE(2338, 3, U32V_3(2338));
105 CHECK_UINT32V_INLINE(8191, 3, U32V_3(8191));
106 CHECK_UINT32V_INLINE(9999, 3, U32V_3(9999));
107 CHECK_UINT32V_INLINE(14444, 3, U32V_3(14444));
108 CHECK_UINT32V_INLINE(314444, 3, U32V_3(314444));
109 CHECK_UINT32V_INLINE(614444, 3, U32V_3(614444));
110
111 const uint32_t max = (1 << 21) - 1;
112
113 for (uint32_t i = 0; i <= max; i = i * 13 + 3) {
114 CHECK_UINT32V_INLINE(i, 3, U32V_3(i), 0);
115 }
116
117 CHECK_UINT32V_INLINE(max, 3, U32V_3(max));
118}
119
120TEST_F(DecoderTest, ReadU32v_FourByte) {
121 CHECK_UINT32V_INLINE(0, 1, 0, 0, 0, 0, 0);
122 CHECK_UINT32V_INLINE(10, 1, 10, 0, 0, 0, 0);
123 CHECK_UINT32V_INLINE(27, 1, 27, 0, 0, 0, 0);
124 CHECK_UINT32V_INLINE(100, 1, 100, 0, 0, 0, 0);
125
126 CHECK_UINT32V_INLINE(13, 4, U32V_4(13));
127 CHECK_UINT32V_INLINE(107, 4, U32V_4(107));
128 CHECK_UINT32V_INLINE(449, 4, U32V_4(449));
129 CHECK_UINT32V_INLINE(541, 4, U32V_4(541));
130 CHECK_UINT32V_INLINE(1317, 4, U32V_4(1317));
131 CHECK_UINT32V_INLINE(2334, 4, U32V_4(2334));
132 CHECK_UINT32V_INLINE(8191, 4, U32V_4(8191));
133 CHECK_UINT32V_INLINE(9994, 4, U32V_4(9994));
134 CHECK_UINT32V_INLINE(14442, 4, U32V_4(14442));
135 CHECK_UINT32V_INLINE(314442, 4, U32V_4(314442));
136 CHECK_UINT32V_INLINE(614442, 4, U32V_4(614442));
137 CHECK_UINT32V_INLINE(1614442, 4, U32V_4(1614442));
138 CHECK_UINT32V_INLINE(5614442, 4, U32V_4(5614442));
139 CHECK_UINT32V_INLINE(19614442, 4, U32V_4(19614442));
140
141 const uint32_t max = (1 << 28) - 1;
142
143 for (uint32_t i = 0; i <= max; i = i * 13 + 5) {
144 CHECK_UINT32V_INLINE(i, 4, U32V_4(i), 0);
145 }
146
147 CHECK_UINT32V_INLINE(max, 4, U32V_4(max));
148}
149
150TEST_F(DecoderTest, ReadU32v_FiveByte) {
151 CHECK_UINT32V_INLINE(0, 1, 0, 0, 0, 0, 0);
152 CHECK_UINT32V_INLINE(10, 1, 10, 0, 0, 0, 0);
153 CHECK_UINT32V_INLINE(27, 1, 27, 0, 0, 0, 0);
154 CHECK_UINT32V_INLINE(100, 1, 100, 0, 0, 0, 0);
155
156 CHECK_UINT32V_INLINE(13, 5, U32V_5(13));
157 CHECK_UINT32V_INLINE(107, 5, U32V_5(107));
158 CHECK_UINT32V_INLINE(449, 5, U32V_5(449));
159 CHECK_UINT32V_INLINE(541, 5, U32V_5(541));
160 CHECK_UINT32V_INLINE(1317, 5, U32V_5(1317));
161 CHECK_UINT32V_INLINE(2334, 5, U32V_5(2334));
162 CHECK_UINT32V_INLINE(8191, 5, U32V_5(8191));
163 CHECK_UINT32V_INLINE(9994, 5, U32V_5(9994));
164 CHECK_UINT32V_INLINE(24442, 5, U32V_5(24442));
165 CHECK_UINT32V_INLINE(414442, 5, U32V_5(414442));
166 CHECK_UINT32V_INLINE(714442, 5, U32V_5(714442));
167 CHECK_UINT32V_INLINE(1614442, 5, U32V_5(1614442));
168 CHECK_UINT32V_INLINE(6614442, 5, U32V_5(6614442));
169 CHECK_UINT32V_INLINE(89614442, 5, U32V_5(89614442));
170 CHECK_UINT32V_INLINE(2219614442u, 5, U32V_5(2219614442u));
171 CHECK_UINT32V_INLINE(3219614442u, 5, U32V_5(3219614442u));
172 CHECK_UINT32V_INLINE(4019614442u, 5, U32V_5(4019614442u));
173
174 const uint32_t max = 0xFFFFFFFFu;
175
176 for (uint32_t i = 1; i < 32; i++) {
177 uint32_t val = 0x983489aau << i;
178 CHECK_UINT32V_INLINE(val, 5, U32V_5(val), 0);
179 }
180
181 CHECK_UINT32V_INLINE(max, 5, U32V_5(max));
182}
183
184TEST_F(DecoderTest, ReadU32v_various) {
185 for (int i = 0; i < 10; i++) {
186 uint32_t x = 0xCCCCCCCCu * i;
187 for (int width = 0; width < 32; width++) {
188 uint32_t val = x >> width;
189
190 CHECK_UINT32V_INLINE(val & MASK_7, 1, U32V_1(val));
191 CHECK_UINT32V_INLINE(val & MASK_14, 2, U32V_2(val));
192 CHECK_UINT32V_INLINE(val & MASK_21, 3, U32V_3(val));
193 CHECK_UINT32V_INLINE(val & MASK_28, 4, U32V_4(val));
194 CHECK_UINT32V_INLINE(val, 5, U32V_5(val));
195 }
196 }
197}
198
199TEST_F(DecoderTest, ReadI32v_OneByte) {
200 CHECK_INT32V_INLINE(0, 1, 0);
201 CHECK_INT32V_INLINE(4, 1, 4);
202 CHECK_INT32V_INLINE(6, 1, 6);
203 CHECK_INT32V_INLINE(9, 1, 9);
204 CHECK_INT32V_INLINE(33, 1, 33);
205 CHECK_INT32V_INLINE(61, 1, 61);
206 CHECK_INT32V_INLINE(63, 1, 63);
207
208 CHECK_INT32V_INLINE(-1, 1, 127);
209 CHECK_INT32V_INLINE(-2, 1, 126);
210 CHECK_INT32V_INLINE(-11, 1, 117);
211 CHECK_INT32V_INLINE(-62, 1, 66);
212 CHECK_INT32V_INLINE(-63, 1, 65);
213 CHECK_INT32V_INLINE(-64, 1, 64);
214}
215
216TEST_F(DecoderTest, ReadI32v_TwoByte) {
217 CHECK_INT32V_INLINE(0, 2, U32V_2(0));
218 CHECK_INT32V_INLINE(9, 2, U32V_2(9));
219 CHECK_INT32V_INLINE(61, 2, U32V_2(61));
220 CHECK_INT32V_INLINE(63, 2, U32V_2(63));
221
222 CHECK_INT32V_INLINE(-1, 2, U32V_2(-1));
223 CHECK_INT32V_INLINE(-2, 2, U32V_2(-2));
224 CHECK_INT32V_INLINE(-63, 2, U32V_2(-63));
225 CHECK_INT32V_INLINE(-64, 2, U32V_2(-64));
226
227 CHECK_INT32V_INLINE(-200, 2, U32V_2(-200));
228 CHECK_INT32V_INLINE(-1002, 2, U32V_2(-1002));
229 CHECK_INT32V_INLINE(-2004, 2, U32V_2(-2004));
230 CHECK_INT32V_INLINE(-4077, 2, U32V_2(-4077));
231
232 CHECK_INT32V_INLINE(207, 2, U32V_2(207));
233 CHECK_INT32V_INLINE(1009, 2, U32V_2(1009));
234 CHECK_INT32V_INLINE(2003, 2, U32V_2(2003));
235 CHECK_INT32V_INLINE(4072, 2, U32V_2(4072));
236
237 const int32_t min = 0 - (1 << 13);
238 for (int i = min; i < min + 10; i++) {
239 CHECK_INT32V_INLINE(i, 2, U32V_2(i));
240 }
241
242 const int32_t max = (1 << 13) - 1;
243 for (int i = max; i > max - 10; i--) {
244 CHECK_INT32V_INLINE(i, 2, U32V_2(i));
245 }
246}
247
248TEST_F(DecoderTest, ReadI32v_ThreeByte) {
249 CHECK_INT32V_INLINE(0, 3, U32V_3(0));
250 CHECK_INT32V_INLINE(9, 3, U32V_3(9));
251 CHECK_INT32V_INLINE(61, 3, U32V_3(61));
252 CHECK_INT32V_INLINE(63, 3, U32V_3(63));
253
254 CHECK_INT32V_INLINE(-1, 3, U32V_3(-1));
255 CHECK_INT32V_INLINE(-2, 3, U32V_3(-2));
256 CHECK_INT32V_INLINE(-63, 3, U32V_3(-63));
257 CHECK_INT32V_INLINE(-64, 3, U32V_3(-64));
258
259 CHECK_INT32V_INLINE(-207, 3, U32V_3(-207));
260 CHECK_INT32V_INLINE(-1012, 3, U32V_3(-1012));
261 CHECK_INT32V_INLINE(-4067, 3, U32V_3(-4067));
262 CHECK_INT32V_INLINE(-14067, 3, U32V_3(-14067));
263 CHECK_INT32V_INLINE(-234061, 3, U32V_3(-234061));
264
265 CHECK_INT32V_INLINE(237, 3, U32V_3(237));
266 CHECK_INT32V_INLINE(1309, 3, U32V_3(1309));
267 CHECK_INT32V_INLINE(4372, 3, U32V_3(4372));
268 CHECK_INT32V_INLINE(64372, 3, U32V_3(64372));
269 CHECK_INT32V_INLINE(374372, 3, U32V_3(374372));
270
271 const int32_t min = 0 - (1 << 20);
272 for (int i = min; i < min + 10; i++) {
273 CHECK_INT32V_INLINE(i, 3, U32V_3(i));
274 }
275
276 const int32_t max = (1 << 20) - 1;
277 for (int i = max; i > max - 10; i--) {
278 CHECK_INT32V_INLINE(i, 3, U32V_3(i));
279 }
280}
281
282TEST_F(DecoderTest, ReadI32v_FourByte) {
283 CHECK_INT32V_INLINE(0, 4, U32V_4(0));
284 CHECK_INT32V_INLINE(9, 4, U32V_4(9));
285 CHECK_INT32V_INLINE(61, 4, U32V_4(61));
286 CHECK_INT32V_INLINE(63, 4, U32V_4(63));
287
288 CHECK_INT32V_INLINE(-1, 4, U32V_4(-1));
289 CHECK_INT32V_INLINE(-2, 4, U32V_4(-2));
290 CHECK_INT32V_INLINE(-63, 4, U32V_4(-63));
291 CHECK_INT32V_INLINE(-64, 4, U32V_4(-64));
292
293 CHECK_INT32V_INLINE(-267, 4, U32V_4(-267));
294 CHECK_INT32V_INLINE(-1612, 4, U32V_4(-1612));
295 CHECK_INT32V_INLINE(-4667, 4, U32V_4(-4667));
296 CHECK_INT32V_INLINE(-16067, 4, U32V_4(-16067));
297 CHECK_INT32V_INLINE(-264061, 4, U32V_4(-264061));
298 CHECK_INT32V_INLINE(-1264061, 4, U32V_4(-1264061));
299 CHECK_INT32V_INLINE(-6264061, 4, U32V_4(-6264061));
300 CHECK_INT32V_INLINE(-8264061, 4, U32V_4(-8264061));
301
302 CHECK_INT32V_INLINE(277, 4, U32V_4(277));
303 CHECK_INT32V_INLINE(1709, 4, U32V_4(1709));
304 CHECK_INT32V_INLINE(4772, 4, U32V_4(4772));
305 CHECK_INT32V_INLINE(67372, 4, U32V_4(67372));
306 CHECK_INT32V_INLINE(374372, 4, U32V_4(374372));
307 CHECK_INT32V_INLINE(2374372, 4, U32V_4(2374372));
308 CHECK_INT32V_INLINE(7374372, 4, U32V_4(7374372));
309 CHECK_INT32V_INLINE(9374372, 4, U32V_4(9374372));
310
311 const int32_t min = 0 - (1 << 27);
312 for (int i = min; i < min + 10; i++) {
313 CHECK_INT32V_INLINE(i, 4, U32V_4(i));
314 }
315
316 const int32_t max = (1 << 27) - 1;
317 for (int i = max; i > max - 10; i--) {
318 CHECK_INT32V_INLINE(i, 4, U32V_4(i));
319 }
320}
321
322TEST_F(DecoderTest, ReadI32v_FiveByte) {
323 CHECK_INT32V_INLINE(0, 5, U32V_5(0));
324 CHECK_INT32V_INLINE(16, 5, U32V_5(16));
325 CHECK_INT32V_INLINE(94, 5, U32V_5(94));
326 CHECK_INT32V_INLINE(127, 5, U32V_5(127));
327
328 CHECK_INT32V_INLINE(-1, 5, U32V_5(-1));
329 CHECK_INT32V_INLINE(-2, 5, U32V_5(-2));
330 CHECK_INT32V_INLINE(-63, 5, U32V_5(-63));
331 CHECK_INT32V_INLINE(-64, 5, U32V_5(-64));
332
333 CHECK_INT32V_INLINE(-257, 5, U32V_5(-257));
334 CHECK_INT32V_INLINE(-1512, 5, U32V_5(-1512));
335 CHECK_INT32V_INLINE(-4567, 5, U32V_5(-4567));
336 CHECK_INT32V_INLINE(-15067, 5, U32V_5(-15067));
337 CHECK_INT32V_INLINE(-254061, 5, U32V_5(-254061));
338 CHECK_INT32V_INLINE(-1364061, 5, U32V_5(-1364061));
339 CHECK_INT32V_INLINE(-6364061, 5, U32V_5(-6364061));
340 CHECK_INT32V_INLINE(-8364061, 5, U32V_5(-8364061));
341 CHECK_INT32V_INLINE(-28364061, 5, U32V_5(-28364061));
342 CHECK_INT32V_INLINE(-228364061, 5, U32V_5(-228364061));
343
344 CHECK_INT32V_INLINE(227, 5, U32V_5(227));
345 CHECK_INT32V_INLINE(1209, 5, U32V_5(1209));
346 CHECK_INT32V_INLINE(4272, 5, U32V_5(4272));
347 CHECK_INT32V_INLINE(62372, 5, U32V_5(62372));
348 CHECK_INT32V_INLINE(324372, 5, U32V_5(324372));
349 CHECK_INT32V_INLINE(2274372, 5, U32V_5(2274372));
350 CHECK_INT32V_INLINE(7274372, 5, U32V_5(7274372));
351 CHECK_INT32V_INLINE(9274372, 5, U32V_5(9274372));
352 CHECK_INT32V_INLINE(42374372, 5, U32V_5(42374372));
353 CHECK_INT32V_INLINE(429374372, 5, U32V_5(429374372));
354
355 const int32_t min = kMinInt;
356 for (int i = min; i < min + 10; i++) {
357 CHECK_INT32V_INLINE(i, 5, U32V_5(i));
358 }
359
360 const int32_t max = kMaxInt;
361 for (int i = max; i > max - 10; i--) {
362 CHECK_INT32V_INLINE(i, 5, U32V_5(i));
363 }
364}
365
366TEST_F(DecoderTest, ReadU32v_off_end1) {
367 static const byte data[] = {U32V_1(11)};
368 int length = 0;
369 decoder.Reset(data, data);
370 decoder.checked_read_u32v(decoder.start(), 0, &length);
371 EXPECT_EQ(0, length);
372 EXPECT_FALSE(decoder.ok());
373}
374
375TEST_F(DecoderTest, ReadU32v_off_end2) {
376 static const byte data[] = {U32V_2(1111)};
377 for (size_t i = 0; i < sizeof(data); i++) {
378 int length = 0;
379 decoder.Reset(data, data + i);
380 decoder.checked_read_u32v(decoder.start(), 0, &length);
381 EXPECT_EQ(i, length);
382 EXPECT_FALSE(decoder.ok());
383 }
384}
385
386TEST_F(DecoderTest, ReadU32v_off_end3) {
387 static const byte data[] = {U32V_3(111111)};
388 for (size_t i = 0; i < sizeof(data); i++) {
389 int length = 0;
390 decoder.Reset(data, data + i);
391 decoder.checked_read_u32v(decoder.start(), 0, &length);
392 EXPECT_EQ(i, length);
393 EXPECT_FALSE(decoder.ok());
394 }
395}
396
397TEST_F(DecoderTest, ReadU32v_off_end4) {
398 static const byte data[] = {U32V_4(11111111)};
399 for (size_t i = 0; i < sizeof(data); i++) {
400 int length = 0;
401 decoder.Reset(data, data + i);
402 decoder.checked_read_u32v(decoder.start(), 0, &length);
403 EXPECT_EQ(i, length);
404 EXPECT_FALSE(decoder.ok());
405 }
406}
407
408TEST_F(DecoderTest, ReadU32v_off_end5) {
409 static const byte data[] = {U32V_5(111111111)};
410 for (size_t i = 0; i < sizeof(data); i++) {
411 int length = 0;
412 decoder.Reset(data, data + i);
413 decoder.checked_read_u32v(decoder.start(), 0, &length);
414 EXPECT_EQ(i, length);
415 EXPECT_FALSE(decoder.ok());
416 }
417}
418
419TEST_F(DecoderTest, ReadU32v_extra_bits) {
420 byte data[] = {0x80, 0x80, 0x80, 0x80, 0x00};
421 for (int i = 1; i < 16; i++) {
422 data[4] = static_cast<byte>(i << 4);
423 int length = 0;
424 decoder.Reset(data, data + sizeof(data));
425 decoder.checked_read_u32v(decoder.start(), 0, &length);
426 EXPECT_EQ(5, length);
427 EXPECT_FALSE(decoder.ok());
428 }
429}
430
431TEST_F(DecoderTest, ReadI32v_extra_bits_negative) {
432 // OK for negative signed values to have extra ones.
433 int length = 0;
434 byte data[] = {0xff, 0xff, 0xff, 0xff, 0x7f};
435 decoder.Reset(data, data + sizeof(data));
436 decoder.checked_read_i32v(decoder.start(), 0, &length);
437 EXPECT_EQ(5, length);
438 EXPECT_TRUE(decoder.ok());
439}
440
441TEST_F(DecoderTest, ReadI32v_extra_bits_positive) {
442 // Not OK for positive signed values to have extra ones.
443 int length = 0;
444 byte data[] = {0x80, 0x80, 0x80, 0x80, 0x77};
445 decoder.Reset(data, data + sizeof(data));
446 decoder.checked_read_i32v(decoder.start(), 0, &length);
447 EXPECT_EQ(5, length);
448 EXPECT_FALSE(decoder.ok());
449}
450
451TEST_F(DecoderTest, ReadU32v_Bits) {
452 // A more exhaustive test.
453 const int kMaxSize = 5;
454 const uint32_t kVals[] = {
455 0xaabbccdd, 0x11223344, 0x33445566, 0xffeeddcc, 0xF0F0F0F0, 0x0F0F0F0F,
456 0xEEEEEEEE, 0xAAAAAAAA, 0x12345678, 0x9abcdef0, 0x80309488, 0x729ed997,
457 0xc4a0cf81, 0x16c6eb85, 0x4206db8e, 0xf3b089d5, 0xaa2e223e, 0xf99e29c8,
458 0x4a4357d8, 0x1890b1c1, 0x8d80a085, 0xacb6ae4c, 0x1b827e10, 0xeb5c7bd9,
459 0xbb1bc146, 0xdf57a33l};
460 byte data[kMaxSize];
461
462 // foreach value in above array
463 for (size_t v = 0; v < arraysize(kVals); v++) {
464 // foreach length 1...32
465 for (int i = 1; i <= 32; i++) {
466 uint32_t val = kVals[v];
467 if (i < 32) val &= ((1 << i) - 1);
468
469 int length = 1 + i / 7;
470 for (int j = 0; j < kMaxSize; j++) {
471 data[j] = static_cast<byte>((val >> (7 * j)) & MASK_7);
472 }
473 for (int j = 0; j < length - 1; j++) {
474 data[j] |= 0x80;
475 }
476
477 // foreach buffer size 0...5
478 for (int limit = 0; limit <= kMaxSize; limit++) {
479 decoder.Reset(data, data + limit);
480 int rlen;
481 uint32_t result = decoder.checked_read_u32v(data, 0, &rlen);
482 if (limit < length) {
483 EXPECT_FALSE(decoder.ok());
484 } else {
485 EXPECT_TRUE(decoder.ok());
486 EXPECT_EQ(val, result);
487 EXPECT_EQ(length, rlen);
488 }
489 }
490 }
491 }
492}
493
494TEST_F(DecoderTest, ReadU64v_OneByte) {
495 CHECK_UINT64V_INLINE(0, 1, 0);
496 CHECK_UINT64V_INLINE(6, 1, 6);
497 CHECK_UINT64V_INLINE(8, 1, 8);
498 CHECK_UINT64V_INLINE(12, 1, 12);
499 CHECK_UINT64V_INLINE(33, 1, 33);
500 CHECK_UINT64V_INLINE(59, 1, 59);
501 CHECK_UINT64V_INLINE(110, 1, 110);
502 CHECK_UINT64V_INLINE(125, 1, 125);
503 CHECK_UINT64V_INLINE(126, 1, 126);
504 CHECK_UINT64V_INLINE(127, 1, 127);
505}
506
507TEST_F(DecoderTest, ReadI64v_OneByte) {
508 CHECK_INT64V_INLINE(0, 1, 0);
509 CHECK_INT64V_INLINE(4, 1, 4);
510 CHECK_INT64V_INLINE(6, 1, 6);
511 CHECK_INT64V_INLINE(9, 1, 9);
512 CHECK_INT64V_INLINE(33, 1, 33);
513 CHECK_INT64V_INLINE(61, 1, 61);
514 CHECK_INT64V_INLINE(63, 1, 63);
515
516 CHECK_INT64V_INLINE(-1, 1, 127);
517 CHECK_INT64V_INLINE(-2, 1, 126);
518 CHECK_INT64V_INLINE(-11, 1, 117);
519 CHECK_INT64V_INLINE(-62, 1, 66);
520 CHECK_INT64V_INLINE(-63, 1, 65);
521 CHECK_INT64V_INLINE(-64, 1, 64);
522}
523
524TEST_F(DecoderTest, ReadU64v_PowerOf2) {
525 const int kMaxSize = 10;
526 byte data[kMaxSize];
527
528 for (int i = 0; i < 64; i++) {
529 const uint64_t val = 1ull << i;
530 int index = i / 7;
531 data[index] = 1 << (i % 7);
532 memset(data, 0x80, index);
533
534 for (int limit = 0; limit <= kMaxSize; limit++) {
535 decoder.Reset(data, data + limit);
536 int length;
537 uint64_t result = decoder.checked_read_u64v(data, 0, &length);
538 if (limit <= index) {
539 EXPECT_FALSE(decoder.ok());
540 } else {
541 EXPECT_TRUE(decoder.ok());
542 EXPECT_EQ(val, result);
543 EXPECT_EQ(index + 1, length);
544 }
545 }
546 }
547}
548
549TEST_F(DecoderTest, ReadU64v_Bits) {
550 const int kMaxSize = 10;
551 const uint64_t kVals[] = {
552 0xaabbccdd11223344ull, 0x33445566ffeeddccull, 0xF0F0F0F0F0F0F0F0ull,
553 0x0F0F0F0F0F0F0F0Full, 0xEEEEEEEEEEEEEEEEull, 0xAAAAAAAAAAAAAAAAull,
554 0x123456789abcdef0ull, 0x80309488729ed997ull, 0xc4a0cf8116c6eb85ull,
555 0x4206db8ef3b089d5ull, 0xaa2e223ef99e29c8ull, 0x4a4357d81890b1c1ull,
556 0x8d80a085acb6ae4cull, 0x1b827e10eb5c7bd9ull, 0xbb1bc146df57a338ull};
557 byte data[kMaxSize];
558
559 // foreach value in above array
560 for (size_t v = 0; v < arraysize(kVals); v++) {
561 // foreach length 1...64
562 for (int i = 1; i <= 64; i++) {
563 uint64_t val = kVals[v];
564 if (i < 64) val &= ((1ull << i) - 1);
565
566 int length = 1 + i / 7;
567 for (int j = 0; j < kMaxSize; j++) {
568 data[j] = static_cast<byte>((val >> (7 * j)) & MASK_7);
569 }
570 for (int j = 0; j < length - 1; j++) {
571 data[j] |= 0x80;
572 }
573
574 // foreach buffer size 0...10
575 for (int limit = 0; limit <= kMaxSize; limit++) {
576 decoder.Reset(data, data + limit);
577 int rlen;
578 uint64_t result = decoder.checked_read_u64v(data, 0, &rlen);
579 if (limit < length) {
580 EXPECT_FALSE(decoder.ok());
581 } else {
582 EXPECT_TRUE(decoder.ok());
583 EXPECT_EQ(val, result);
584 EXPECT_EQ(length, rlen);
585 }
586 }
587 }
588 }
589}
590
591TEST_F(DecoderTest, ReadI64v_Bits) {
592 const int kMaxSize = 10;
593 // Exhaustive signedness test.
594 const uint64_t kVals[] = {
595 0xaabbccdd11223344ull, 0x33445566ffeeddccull, 0xF0F0F0F0F0F0F0F0ull,
596 0x0F0F0F0F0F0F0F0Full, 0xEEEEEEEEEEEEEEEEull, 0xAAAAAAAAAAAAAAAAull,
597 0x123456789abcdef0ull, 0x80309488729ed997ull, 0xc4a0cf8116c6eb85ull,
598 0x4206db8ef3b089d5ull, 0xaa2e223ef99e29c8ull, 0x4a4357d81890b1c1ull,
599 0x8d80a085acb6ae4cull, 0x1b827e10eb5c7bd9ull, 0xbb1bc146df57a338ull};
600 byte data[kMaxSize];
601
602 // foreach value in above array
603 for (size_t v = 0; v < arraysize(kVals); v++) {
604 // foreach length 1...64
605 for (int i = 1; i <= 64; i++) {
606 const int64_t val = bit_cast<int64_t>(kVals[v] << (64 - i)) >> (64 - i);
607
608 int length = 1 + i / 7;
609 for (int j = 0; j < kMaxSize; j++) {
610 data[j] = static_cast<byte>((val >> (7 * j)) & MASK_7);
611 }
612 for (int j = 0; j < length - 1; j++) {
613 data[j] |= 0x80;
614 }
615
616 // foreach buffer size 0...10
617 for (int limit = 0; limit <= kMaxSize; limit++) {
618 decoder.Reset(data, data + limit);
619 int rlen;
620 int64_t result = decoder.checked_read_i64v(data, 0, &rlen);
621 if (limit < length) {
622 EXPECT_FALSE(decoder.ok());
623 } else {
624 EXPECT_TRUE(decoder.ok());
625 EXPECT_EQ(val, result);
626 EXPECT_EQ(length, rlen);
627 }
628 }
629 }
630 }
631}
632
633TEST_F(DecoderTest, ReadU64v_extra_bits) {
634 byte data[] = {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00};
635 for (int i = 1; i < 128; i++) {
636 data[9] = static_cast<byte>(i << 1);
637 int length = 0;
638 decoder.Reset(data, data + sizeof(data));
639 decoder.checked_read_u64v(decoder.start(), 0, &length);
640 EXPECT_EQ(10, length);
641 EXPECT_FALSE(decoder.ok());
642 }
643}
644
645TEST_F(DecoderTest, ReadI64v_extra_bits_negative) {
646 // OK for negative signed values to have extra ones.
647 int length = 0;
648 byte data[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f};
649 decoder.Reset(data, data + sizeof(data));
650 decoder.checked_read_i64v(decoder.start(), 0, &length);
651 EXPECT_EQ(10, length);
652 EXPECT_TRUE(decoder.ok());
653}
654
655TEST_F(DecoderTest, ReadI64v_extra_bits_positive) {
656 // Not OK for positive signed values to have extra ones.
657 int length = 0;
658 byte data[] = {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x77};
659 decoder.Reset(data, data + sizeof(data));
660 decoder.checked_read_i64v(decoder.start(), 0, &length);
661 EXPECT_EQ(10, length);
662 EXPECT_FALSE(decoder.ok());
663}
664
665} // namespace wasm
666} // namespace internal
667} // namespace v8