| // Copyright 2021 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package slicereader |
| |
| import ( |
| "encoding/binary" |
| "testing" |
| ) |
| |
| func TestSliceReader(t *testing.T) { |
| b := []byte{} |
| |
| bt := make([]byte, 4) |
| e32 := uint32(1030507) |
| binary.LittleEndian.PutUint32(bt, e32) |
| b = append(b, bt...) |
| |
| bt = make([]byte, 8) |
| e64 := uint64(907050301) |
| binary.LittleEndian.PutUint64(bt, e64) |
| b = append(b, bt...) |
| |
| b = appendUleb128(b, uint(e32)) |
| b = appendUleb128(b, uint(e64)) |
| b = appendUleb128(b, 6) |
| s1 := "foobar" |
| s1b := []byte(s1) |
| b = append(b, s1b...) |
| b = appendUleb128(b, 9) |
| s2 := "bazbasher" |
| s2b := []byte(s2) |
| b = append(b, s2b...) |
| |
| readStr := func(slr *Reader) string { |
| len := slr.ReadULEB128() |
| return slr.ReadString(int64(len)) |
| } |
| |
| for i := 0; i < 2; i++ { |
| slr := NewReader(b, i == 0) |
| g32 := slr.ReadUint32() |
| if g32 != e32 { |
| t.Fatalf("slr.ReadUint32() got %d want %d", g32, e32) |
| } |
| g64 := slr.ReadUint64() |
| if g64 != e64 { |
| t.Fatalf("slr.ReadUint64() got %d want %d", g64, e64) |
| } |
| g32 = uint32(slr.ReadULEB128()) |
| if g32 != e32 { |
| t.Fatalf("slr.ReadULEB128() got %d want %d", g32, e32) |
| } |
| g64 = slr.ReadULEB128() |
| if g64 != e64 { |
| t.Fatalf("slr.ReadULEB128() got %d want %d", g64, e64) |
| } |
| gs1 := readStr(slr) |
| if gs1 != s1 { |
| t.Fatalf("readStr got %s want %s", gs1, s1) |
| } |
| gs2 := readStr(slr) |
| if gs2 != s2 { |
| t.Fatalf("readStr got %s want %s", gs2, s2) |
| } |
| slr.SeekTo(4) |
| off := slr.Offset() |
| if off != 4 { |
| t.Fatalf("Offset(0 returned %d wanted 4", off) |
| } |
| g64 = slr.ReadUint64() |
| if g64 != e64 { |
| t.Fatalf("post-seek slr.ReadUint64() got %d want %d", g64, e64) |
| } |
| } |
| } |
| |
| func appendUleb128(b []byte, v uint) []byte { |
| for { |
| c := uint8(v & 0x7f) |
| v >>= 7 |
| if v != 0 { |
| c |= 0x80 |
| } |
| b = append(b, c) |
| if c&0x80 == 0 { |
| break |
| } |
| } |
| return b |
| } |