OLD | NEW |
---|---|
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "test/unittests/test-utils.h" | 5 #include "test/unittests/test-utils.h" |
6 | 6 |
7 #include "src/wasm/decoder.h" | 7 #include "src/wasm/decoder.h" |
8 #include "src/wasm/wasm-macro-gen.h" | 8 #include "src/wasm/wasm-macro-gen.h" |
9 | 9 |
10 namespace v8 { | 10 namespace v8 { |
(...skipping 20 matching lines...) Expand all Loading... | |
31 #define CHECK_INT32V_INLINE(expected, expected_length, ...) \ | 31 #define CHECK_INT32V_INLINE(expected, expected_length, ...) \ |
32 do { \ | 32 do { \ |
33 const byte data[] = {__VA_ARGS__}; \ | 33 const byte data[] = {__VA_ARGS__}; \ |
34 decoder.Reset(data, data + sizeof(data)); \ | 34 decoder.Reset(data, data + sizeof(data)); \ |
35 int length; \ | 35 int length; \ |
36 EXPECT_EQ(expected, \ | 36 EXPECT_EQ(expected, \ |
37 decoder.checked_read_i32v(decoder.start(), 0, &length)); \ | 37 decoder.checked_read_i32v(decoder.start(), 0, &length)); \ |
38 EXPECT_EQ(expected_length, length); \ | 38 EXPECT_EQ(expected_length, length); \ |
39 } while (false) | 39 } while (false) |
40 | 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 | |
41 TEST_F(DecoderTest, ReadU32v_OneByte) { | 61 TEST_F(DecoderTest, ReadU32v_OneByte) { |
42 CHECK_UINT32V_INLINE(0, 1, 0); | 62 CHECK_UINT32V_INLINE(0, 1, 0); |
43 CHECK_UINT32V_INLINE(5, 1, 5); | 63 CHECK_UINT32V_INLINE(5, 1, 5); |
44 CHECK_UINT32V_INLINE(7, 1, 7); | 64 CHECK_UINT32V_INLINE(7, 1, 7); |
45 CHECK_UINT32V_INLINE(9, 1, 9); | 65 CHECK_UINT32V_INLINE(9, 1, 9); |
46 CHECK_UINT32V_INLINE(37, 1, 37); | 66 CHECK_UINT32V_INLINE(37, 1, 37); |
47 CHECK_UINT32V_INLINE(69, 1, 69); | 67 CHECK_UINT32V_INLINE(69, 1, 69); |
48 CHECK_UINT32V_INLINE(110, 1, 110); | 68 CHECK_UINT32V_INLINE(110, 1, 110); |
49 CHECK_UINT32V_INLINE(125, 1, 125); | 69 CHECK_UINT32V_INLINE(125, 1, 125); |
50 CHECK_UINT32V_INLINE(126, 1, 126); | 70 CHECK_UINT32V_INLINE(126, 1, 126); |
(...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
401 for (int i = 1; i < 16; i++) { | 421 for (int i = 1; i < 16; i++) { |
402 data[4] = static_cast<byte>(i << 4); | 422 data[4] = static_cast<byte>(i << 4); |
403 int length = 0; | 423 int length = 0; |
404 decoder.Reset(data, data + sizeof(data)); | 424 decoder.Reset(data, data + sizeof(data)); |
405 decoder.checked_read_u32v(decoder.start(), 0, &length); | 425 decoder.checked_read_u32v(decoder.start(), 0, &length); |
406 EXPECT_EQ(5, length); | 426 EXPECT_EQ(5, length); |
407 EXPECT_FALSE(decoder.ok()); | 427 EXPECT_FALSE(decoder.ok()); |
408 } | 428 } |
409 } | 429 } |
410 | 430 |
431 TEST_F(DecoderTest, ReadU32v_Bits) { | |
432 // A more exhaustive test. | |
433 const int kMaxSize = 5; | |
434 const uint32_t kVals[] = { | |
435 0xaabbccdd, 0x11223344, 0x33445566, 0xffeeddcc, 0xF0F0F0F0, 0x0F0F0F0F, | |
436 0xEEEEEEEE, 0xAAAAAAAA, 0x12345678, 0x9abcdef0, 0x80309488, 0x729ed997, | |
437 0xc4a0cf81, 0x16c6eb85, 0x4206db8e, 0xf3b089d5, 0xaa2e223e, 0xf99e29c8, | |
438 0x4a4357d8, 0x1890b1c1, 0x8d80a085, 0xacb6ae4c, 0x1b827e10, 0xeb5c7bd9, | |
439 0xbb1bc146, 0xdf57a33l}; | |
440 byte data[kMaxSize]; | |
441 | |
442 // foreach value in above array | |
443 for (size_t v = 0; v < arraysize(kVals); v++) { | |
444 // foreach length 1...64 | |
binji
2016/03/01 18:49:40
32
titzer
2016/03/01 19:09:19
Done.
| |
445 for (int i = 1; i <= 32; i++) { | |
446 const uint32_t val = kVals[v] & ((1ull << (i - 1)) - 1); | |
binji
2016/03/01 18:49:40
Am I reading this wrong, or does this give the wro
titzer
2016/03/01 19:09:19
Good catch. It would strip off one extra high bit.
| |
447 | |
448 int length = 1 + i / 7; | |
449 for (int j = 0; j < kMaxSize; j++) { | |
450 data[j] = (val >> (7 * j)) & MASK_7; | |
ahaas
2016/03/01 08:22:58
static_cast?
titzer
2016/03/01 18:49:12
Done.
| |
451 } | |
452 for (int j = 0; j < length - 1; j++) { | |
453 data[j] |= 0x80; | |
454 } | |
455 | |
456 // foreach buffer size 0...5 | |
457 for (int limit = 0; limit <= kMaxSize; limit++) { | |
458 decoder.Reset(data, data + limit); | |
459 int rlen; | |
460 uint32_t result = decoder.checked_read_u32v(data, 0, &rlen); | |
461 if (limit < length) { | |
462 EXPECT_FALSE(decoder.ok()); | |
463 } else { | |
464 EXPECT_TRUE(decoder.ok()); | |
465 EXPECT_EQ(val, result); | |
466 EXPECT_EQ(length, rlen); | |
467 } | |
468 } | |
469 } | |
470 } | |
471 } | |
472 | |
473 TEST_F(DecoderTest, ReadU64v_OneByte) { | |
474 CHECK_UINT64V_INLINE(0, 1, 0); | |
475 CHECK_UINT64V_INLINE(6, 1, 6); | |
476 CHECK_UINT64V_INLINE(8, 1, 8); | |
477 CHECK_UINT64V_INLINE(12, 1, 12); | |
478 CHECK_UINT64V_INLINE(33, 1, 33); | |
479 CHECK_UINT64V_INLINE(59, 1, 59); | |
480 CHECK_UINT64V_INLINE(110, 1, 110); | |
481 CHECK_UINT64V_INLINE(125, 1, 125); | |
482 CHECK_UINT64V_INLINE(126, 1, 126); | |
483 CHECK_UINT64V_INLINE(127, 1, 127); | |
484 } | |
485 | |
486 TEST_F(DecoderTest, ReadI64v_TwoByte) { | |
ahaas
2016/03/01 08:22:58
Should this be ReadI64v_OneByte?
titzer
2016/03/01 18:49:12
Done.
| |
487 CHECK_INT64V_INLINE(0, 1, 0); | |
488 CHECK_INT64V_INLINE(4, 1, 4); | |
489 CHECK_INT64V_INLINE(6, 1, 6); | |
490 CHECK_INT64V_INLINE(9, 1, 9); | |
491 CHECK_INT64V_INLINE(33, 1, 33); | |
492 CHECK_INT64V_INLINE(61, 1, 61); | |
493 CHECK_INT64V_INLINE(63, 1, 63); | |
494 | |
495 CHECK_INT64V_INLINE(-1, 1, 127); | |
496 CHECK_INT64V_INLINE(-2, 1, 126); | |
497 CHECK_INT64V_INLINE(-11, 1, 117); | |
498 CHECK_INT64V_INLINE(-62, 1, 66); | |
499 CHECK_INT64V_INLINE(-63, 1, 65); | |
500 CHECK_INT64V_INLINE(-64, 1, 64); | |
501 } | |
502 | |
503 TEST_F(DecoderTest, ReadU64v_PowerOf2) { | |
504 const int kMaxSize = 10; | |
505 byte data[kMaxSize]; | |
506 | |
507 for (int i = 0; i < 64; i++) { | |
508 const uint64_t val = 1ull << i; | |
509 int index = i / 7; | |
510 data[index] = 1 << (i % 7); | |
511 memset(data, 0x80, index); | |
512 | |
513 for (int limit = 0; limit <= kMaxSize; limit++) { | |
514 decoder.Reset(data, data + limit); | |
515 int length; | |
516 uint64_t result = decoder.checked_read_u64v(data, 0, &length); | |
517 if (limit <= index) { | |
518 EXPECT_FALSE(decoder.ok()); | |
519 } else { | |
520 EXPECT_TRUE(decoder.ok()); | |
521 EXPECT_EQ(val, result); | |
522 EXPECT_EQ(index + 1, length); | |
523 } | |
524 } | |
525 } | |
526 } | |
527 | |
528 TEST_F(DecoderTest, ReadU64v_Bits) { | |
529 const int kMaxSize = 10; | |
530 const uint64_t kVals[] = { | |
531 0xaabbccdd11223344ull, 0x33445566ffeeddccull, 0xF0F0F0F0F0F0F0F0ull, | |
532 0x0F0F0F0F0F0F0F0Full, 0xEEEEEEEEEEEEEEEEull, 0xAAAAAAAAAAAAAAAAull, | |
533 0x123456789abcdef0ull, 0x80309488729ed997ull, 0xc4a0cf8116c6eb85ull, | |
534 0x4206db8ef3b089d5ull, 0xaa2e223ef99e29c8ull, 0x4a4357d81890b1c1ull, | |
535 0x8d80a085acb6ae4cull, 0x1b827e10eb5c7bd9ull, 0xbb1bc146df57a338ull}; | |
536 byte data[kMaxSize]; | |
537 | |
538 // foreach value in above array | |
539 for (size_t v = 0; v < arraysize(kVals); v++) { | |
540 // foreach length 1...64 | |
541 for (int i = 1; i <= 64; i++) { | |
542 const uint64_t val = (kVals[v] << (64 - i)) >> (64 - i); | |
543 | |
544 int length = 1 + i / 7; | |
545 for (int j = 0; j < kMaxSize; j++) { | |
546 data[j] = static_cast<byte>((val >> (7 * j)) & MASK_7); | |
547 } | |
548 for (int j = 0; j < length - 1; j++) { | |
549 data[j] |= 0x80; | |
550 } | |
551 | |
552 // foreach buffer size 0...10 | |
553 for (int limit = 0; limit <= kMaxSize; limit++) { | |
554 decoder.Reset(data, data + limit); | |
555 int rlen; | |
556 uint64_t result = decoder.checked_read_u64v(data, 0, &rlen); | |
557 if (limit < length) { | |
558 EXPECT_FALSE(decoder.ok()); | |
559 } else { | |
560 EXPECT_TRUE(decoder.ok()); | |
561 EXPECT_EQ(val, result); | |
562 EXPECT_EQ(length, rlen); | |
563 } | |
564 } | |
565 } | |
566 } | |
567 } | |
568 | |
569 TEST_F(DecoderTest, ReadI64v_Bits) { | |
ahaas
2016/03/01 08:22:58
Would it be possible to write one test function fo
titzer
2016/03/01 19:09:19
Too much mechanism I think.
| |
570 const int kMaxSize = 10; | |
571 // Exhaustive signedness test. | |
572 const uint64_t kVals[] = { | |
573 0xaabbccdd11223344ull, 0x33445566ffeeddccull, 0xF0F0F0F0F0F0F0F0ull, | |
574 0x0F0F0F0F0F0F0F0Full, 0xEEEEEEEEEEEEEEEEull, 0xAAAAAAAAAAAAAAAAull, | |
575 0x123456789abcdef0ull, 0x80309488729ed997ull, 0xc4a0cf8116c6eb85ull, | |
576 0x4206db8ef3b089d5ull, 0xaa2e223ef99e29c8ull, 0x4a4357d81890b1c1ull, | |
577 0x8d80a085acb6ae4cull, 0x1b827e10eb5c7bd9ull, 0xbb1bc146df57a338ull}; | |
578 byte data[kMaxSize]; | |
579 | |
580 // foreach value in above array | |
581 for (size_t v = 0; v < arraysize(kVals); v++) { | |
582 // foreach length 1...64 | |
583 for (int i = 1; i <= 64; i++) { | |
584 const int64_t val = bit_cast<int64_t>(kVals[v] << (64 - i)) >> (64 - i); | |
585 | |
586 int length = 1 + i / 7; | |
587 for (int j = 0; j < kMaxSize; j++) { | |
588 const uint64_t uval = bit_cast<uint64_t>(val); | |
589 data[j] = static_cast<byte>((uval >> (7 * j)) & MASK_7); | |
590 } | |
591 for (int j = 0; j < length - 1; j++) { | |
592 data[j] |= 0x80; | |
593 } | |
594 | |
595 // foreach buffer size 0...10 | |
596 for (int limit = 0; limit <= kMaxSize; limit++) { | |
597 decoder.Reset(data, data + limit); | |
598 int rlen; | |
599 int64_t result = decoder.checked_read_i64v(data, 0, &rlen); | |
600 if (limit < length) { | |
601 EXPECT_FALSE(decoder.ok()); | |
602 } else { | |
603 EXPECT_TRUE(decoder.ok()); | |
604 EXPECT_EQ(val, result); | |
605 EXPECT_EQ(length, rlen); | |
606 } | |
607 } | |
608 } | |
609 } | |
610 } | |
611 | |
612 TEST_F(DecoderTest, ReadU64v_extra_bits) { | |
613 byte data[] = {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00}; | |
614 for (int i = 1; i < 128; i++) { | |
615 data[9] = static_cast<byte>(i << 1); | |
616 int length = 0; | |
617 decoder.Reset(data, data + sizeof(data)); | |
618 decoder.checked_read_u64v(decoder.start(), 0, &length); | |
619 EXPECT_EQ(10, length); | |
620 EXPECT_FALSE(decoder.ok()); | |
621 } | |
622 } | |
623 | |
411 } // namespace wasm | 624 } // namespace wasm |
412 } // namespace internal | 625 } // namespace internal |
413 } // namespace v8 | 626 } // namespace v8 |
OLD | NEW |