byteio - varint_test.go
1 package byteio
2
3 import (
4 "bytes"
5 "testing"
6 )
7
8 func TestLittleEndianVarUint(t *testing.T) {
9 buf := bytes.NewBuffer(make([]byte, 0, 9))
10 for n, test := range [...]struct {
11 Input uint64
12 Output []byte
13 }{
14 {0, []byte{0}},
15 {1, []byte{1}},
16 {127, []byte{127}},
17 {128, []byte{128, 0}},
18 {129, []byte{129, 0}},
19 {255, []byte{255, 0}},
20 {256, []byte{128, 1}},
21 {257, []byte{129, 1}},
22 {300, []byte{172, 1}},
23 {512, []byte{128, 3}},
24 {1024, []byte{128, 7}},
25 {2048, []byte{128, 15}},
26 {4096, []byte{128, 31}},
27 {8192, []byte{128, 63}},
28 {16384, []byte{128, 127}},
29 {16511, []byte{255, 127}},
30 {16512, []byte{128, 128, 0}},
31 {32768, []byte{128, 255, 0}},
32 {65536, []byte{128, 255, 2}},
33 {131072, []byte{128, 255, 6}},
34 {262144, []byte{128, 255, 14}},
35 {524288, []byte{128, 255, 30}},
36 {1048576, []byte{128, 255, 62}},
37 {2097152, []byte{128, 255, 126}},
38 {134217728, []byte{128, 255, 254, 62}},
39 {268435456, []byte{128, 255, 254, 126}},
40 {17179869184, []byte{128, 255, 254, 254, 62}},
41 {18446744073709551615, []byte{255, 254, 254, 254, 254, 254, 254, 254, 254}},
42 } {
43 buf.Reset()
44 (&LittleEndianWriter{Writer: buf}).WriteUintX(test.Input)
45 if !bytes.Equal(buf.Bytes(), test.Output) {
46 t.Errorf("test %d.1: expecting %v, got %v", n+1, test.Output, buf)
47 buf.Reset()
48 buf.Write(test.Output)
49 }
50 num, _, _ := (&LittleEndianReader{Reader: buf}).ReadUintX()
51 if num != test.Input {
52 t.Errorf("test %d.2: expecting %d, got %d", n+1, test.Input, num)
53 }
54 }
55 }
56
57 func FuzzLittleEndianVarInt(f *testing.F) {
58 for _, seed := range []uint64{0, 127, 128, 255, 256, 1024, 16512, 134217728, 18446744073709551615} {
59 f.Add(seed)
60 }
61
62 f.Fuzz(func(t *testing.T, in uint64) {
63 var buf bytes.Buffer
64 (&LittleEndianWriter{Writer: &buf}).WriteUintX(in)
65 num, _, _ := (&LittleEndianReader{Reader: &buf}).ReadUintX()
66
67 if num != in {
68 t.Errorf("failed on %d", in)
69 }
70 })
71 }
72
73 func TestBigEndianVarUint(t *testing.T) {
74 buf := bytes.NewBuffer(make([]byte, 0, 9))
75 for n, test := range [...]struct {
76 Input uint64
77 Output []byte
78 }{
79 {0, []byte{0}},
80 {1, []byte{1}},
81 {127, []byte{127}},
82 {128, []byte{128, 0}},
83 {129, []byte{128, 1}},
84 {130, []byte{128, 2}},
85 {255, []byte{128, 127}},
86 {256, []byte{129, 0}},
87 {257, []byte{129, 1}},
88 {512, []byte{131, 0}},
89 {1024, []byte{135, 0}},
90 {2048, []byte{143, 0}},
91 {4096, []byte{159, 0}},
92 {8192, []byte{191, 0}},
93 {16384, []byte{255, 0}},
94 {16385, []byte{255, 1}},
95 {16511, []byte{255, 127}},
96 {16512, []byte{128, 128, 0}},
97 {32768, []byte{128, 255, 0}},
98 {65536, []byte{130, 255, 0}},
99 {131072, []byte{134, 255, 0}},
100 {262144, []byte{142, 255, 0}},
101 {2113663, []byte{255, 255, 127}},
102 {2113664, []byte{128, 128, 128, 0}},
103 {18446744073709551615, []byte{254, 254, 254, 254, 254, 254, 254, 254, 255}},
104 {9295997013522923646, []byte{255, 255, 255, 255, 255, 255, 255, 255, 126}},
105 {9295997013522923647, []byte{255, 255, 255, 255, 255, 255, 255, 255, 127}},
106 {9295997013522923648, []byte{191, 191, 191, 191, 191, 191, 191, 191, 128}},
107 {9295997013522923649, []byte{191, 191, 191, 191, 191, 191, 191, 191, 129}},
108 } {
109 buf.Reset()
110 (&BigEndianWriter{Writer: buf}).WriteUintX(test.Input)
111 if !bytes.Equal(buf.Bytes(), test.Output) {
112 t.Errorf("test %d.1: expecting %v, got %v", n+1, test.Output, buf)
113 buf.Reset()
114 buf.Write(test.Output)
115 }
116 num, _, _ := (&BigEndianReader{Reader: buf}).ReadUintX()
117 if num != test.Input {
118 t.Errorf("test %d.2: expecting %d, got %d", n+1, test.Input, num)
119 }
120 }
121 }
122
123 func FuzzBigEndianVarInt(f *testing.F) {
124 for _, seed := range []uint64{0, 127, 128, 255, 256, 1024, 16512, 134217728, 18446744073709551615} {
125 f.Add(seed)
126 }
127
128 f.Fuzz(func(t *testing.T, in uint64) {
129 var buf bytes.Buffer
130 (&BigEndianWriter{Writer: &buf}).WriteUintX(in)
131 num, _, _ := (&BigEndianReader{Reader: &buf}).ReadUintX()
132
133 if num != in {
134 t.Errorf("failed on %d", in)
135 }
136 })
137 }
138