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