github.com/go-asm/go@v1.21.1-0.20240213172139-40c5ead50c48/coverage/slicereader/slr_test.go (about) 1 // Copyright 2021 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package slicereader 6 7 import ( 8 "encoding/binary" 9 "io" 10 "testing" 11 ) 12 13 func TestSliceReader(t *testing.T) { 14 b := []byte{} 15 16 bt := make([]byte, 4) 17 e32 := uint32(1030507) 18 binary.LittleEndian.PutUint32(bt, e32) 19 b = append(b, bt...) 20 21 bt = make([]byte, 8) 22 e64 := uint64(907050301) 23 binary.LittleEndian.PutUint64(bt, e64) 24 b = append(b, bt...) 25 26 b = appendUleb128(b, uint(e32)) 27 b = appendUleb128(b, uint(e64)) 28 b = appendUleb128(b, 6) 29 s1 := "foobar" 30 s1b := []byte(s1) 31 b = append(b, s1b...) 32 b = appendUleb128(b, 9) 33 s2 := "bazbasher" 34 s2b := []byte(s2) 35 b = append(b, s2b...) 36 37 readStr := func(slr *Reader) string { 38 len := slr.ReadULEB128() 39 return slr.ReadString(int64(len)) 40 } 41 42 for i := 0; i < 2; i++ { 43 slr := NewReader(b, i == 0) 44 g32 := slr.ReadUint32() 45 if g32 != e32 { 46 t.Fatalf("slr.ReadUint32() got %d want %d", g32, e32) 47 } 48 g64 := slr.ReadUint64() 49 if g64 != e64 { 50 t.Fatalf("slr.ReadUint64() got %d want %d", g64, e64) 51 } 52 g32 = uint32(slr.ReadULEB128()) 53 if g32 != e32 { 54 t.Fatalf("slr.ReadULEB128() got %d want %d", g32, e32) 55 } 56 g64 = slr.ReadULEB128() 57 if g64 != e64 { 58 t.Fatalf("slr.ReadULEB128() got %d want %d", g64, e64) 59 } 60 gs1 := readStr(slr) 61 if gs1 != s1 { 62 t.Fatalf("readStr got %s want %s", gs1, s1) 63 } 64 gs2 := readStr(slr) 65 if gs2 != s2 { 66 t.Fatalf("readStr got %s want %s", gs2, s2) 67 } 68 if _, err := slr.Seek(4, io.SeekStart); err != nil { 69 t.Fatal(err) 70 } 71 off := slr.Offset() 72 if off != 4 { 73 t.Fatalf("Offset() returned %d wanted 4", off) 74 } 75 g64 = slr.ReadUint64() 76 if g64 != e64 { 77 t.Fatalf("post-seek slr.ReadUint64() got %d want %d", g64, e64) 78 } 79 } 80 } 81 82 func appendUleb128(b []byte, v uint) []byte { 83 for { 84 c := uint8(v & 0x7f) 85 v >>= 7 86 if v != 0 { 87 c |= 0x80 88 } 89 b = append(b, c) 90 if c&0x80 == 0 { 91 break 92 } 93 } 94 return b 95 }