github.com/insolar/vanilla@v0.0.0-20201023172447-248fdf805322/protokit/encode_test.go (about) 1 // Copyright 2020 Insolar Network Ltd. 2 // All rights reserved. 3 // This material is licensed under the Insolar License version 1.0, 4 // available at https://github.com/insolar/assured-ledger/blob/master/LICENSE.md. 5 6 package protokit 7 8 import ( 9 "bytes" 10 "io" 11 "math" 12 "testing" 13 14 "github.com/stretchr/testify/require" 15 ) 16 17 func TestEncodeDecodeVarint(t *testing.T) { 18 lastSize := 1 19 require.Equal(t, lastSize, testEncodeDecode(t, 0)) 20 require.Equal(t, lastSize, testEncodeDecode(t, 1)) 21 22 v := uint64(0x80) 23 for v != 0 { 24 n := testEncodeDecode(t, v-1) 25 require.Equal(t, lastSize, n) 26 27 lastSize++ 28 29 n = testEncodeDecode(t, v) 30 require.Equal(t, lastSize, n) 31 32 n = testEncodeDecode(t, v+1) 33 require.Equal(t, lastSize, n) 34 v <<= 7 35 } 36 } 37 38 func testEncodeDecode(t *testing.T, v uint64) int { 39 var b [MaxVarintSize]byte 40 41 n := EncodeVarintToBytes(b[:], v) 42 require.Equal(t, n, SizeVarint64(v)) 43 if v <= math.MaxUint32 { 44 require.Equal(t, n, SizeVarint32(uint32(v))) 45 } 46 47 u, n2 := DecodeVarintFromBytes(b[:]) 48 require.Equal(t, n, n2) 49 require.Equal(t, v, u) 50 51 var err error 52 u, n2, err = DecodeVarintFromBytesWithError(b[:]) 53 require.NoError(t, err) 54 require.Equal(t, n, n2) 55 require.Equal(t, v, u) 56 57 u, n2, err = WireVarint.Tag(1).ReadValueFromBytes(b[:]) 58 require.NoError(t, err) 59 require.Equal(t, n, n2) 60 require.Equal(t, v, u) 61 62 u, n2, err = WireBytes.Tag(1).ReadValueFromBytes(b[:]) 63 require.NoError(t, err) 64 require.Equal(t, n, n2) 65 require.Equal(t, v, u) 66 67 for i := n - 1; i > 0; i-- { 68 u, n2, err = DecodeVarintFromBytesWithError(b[:i]) 69 require.Equal(t, io.ErrUnexpectedEOF, err) 70 require.Zero(t, n2) 71 require.Zero(t, u) 72 73 u, n2, err = WireVarint.Tag(1).ReadValueFromBytes(b[:i]) 74 require.Equal(t, io.ErrUnexpectedEOF, err) 75 require.Zero(t, n2) 76 require.Zero(t, u) 77 78 u, n2, err = WireBytes.Tag(1).ReadValueFromBytes(b[:i]) 79 require.Equal(t, io.ErrUnexpectedEOF, err) 80 require.Zero(t, n2) 81 require.Zero(t, u) 82 83 require.Panics(t, func() { DecodeVarintFromBytes(b[:i]) }) 84 } 85 86 var b2 [MaxVarintSize]byte 87 n2, err = EncodeVarintToBytesWithError(b2[:], v) 88 require.NoError(t, err) 89 require.Equal(t, b[:n], b2[:n2]) 90 91 n2, err = WireVarint.Tag(1).WriteValueToBytes(b[:], v) 92 require.NoError(t, err) 93 require.Equal(t, b[:n], b2[:n2]) 94 95 n2, err = WireBytes.Tag(1).WriteValueToBytes(b[:], v) 96 require.NoError(t, err) 97 require.Equal(t, b[:n], b2[:n2]) 98 99 for i := n - 1; i > 0; i-- { 100 n2, err = EncodeVarintToBytesWithError(b2[:i], v) 101 require.Equal(t, io.ErrShortBuffer, err) 102 require.Zero(t, n2) 103 104 n2, err = WireVarint.Tag(1).WriteValueToBytes(b[:i], v) 105 require.Equal(t, io.ErrShortBuffer, err) 106 require.Zero(t, n2) 107 108 n2, err = WireBytes.Tag(1).WriteValueToBytes(b[:i], v) 109 require.Equal(t, io.ErrShortBuffer, err) 110 require.Zero(t, n2) 111 } 112 113 buf := &bytes.Buffer{} 114 115 err = EncodeVarint(buf, v) 116 require.NoError(t, err) 117 bufCopy := buf.Bytes() 118 119 u, err = DecodeVarint(buf) 120 require.NoError(t, err) 121 require.Equal(t, v, u) 122 require.Zero(t, buf.Len()) 123 124 buf = &bytes.Buffer{} 125 err = WireVarint.Tag(1).WriteValue(buf, v) 126 require.NoError(t, err) 127 require.Equal(t, bufCopy, buf.Bytes()) 128 129 u, err = WireVarint.Tag(1).ReadValue(buf) 130 require.NoError(t, err) 131 require.Equal(t, v, u) 132 require.Zero(t, buf.Len()) 133 134 buf = &bytes.Buffer{} 135 err = WireBytes.Tag(1).WriteValue(buf, v) 136 require.NoError(t, err) 137 require.Equal(t, bufCopy, buf.Bytes()) 138 139 u, err = WireBytes.Tag(1).ReadValue(buf) 140 require.NoError(t, err) 141 require.Equal(t, v, u) 142 require.Zero(t, buf.Len()) 143 144 return n 145 } 146 147 func TestEncodeDecodeFixed64(t *testing.T) { 148 v := uint64(1) 149 for { 150 buf := &bytes.Buffer{} 151 err := EncodeFixed64(buf, v) 152 require.NoError(t, err) 153 154 u, n, err := DecodeFixed64FromBytesWithError(buf.Bytes()) 155 require.NoError(t, err) 156 require.Equal(t, v, u) 157 require.Equal(t, buf.Len(), n) 158 159 b := make([]byte, n) 160 n, err = EncodeFixed64ToBytes(b, v) 161 require.NoError(t, err) 162 require.Equal(t, buf.Bytes(), b[:n]) 163 164 n, err = EncodeFixed64ToBytes(b, v) 165 require.NoError(t, err) 166 require.Equal(t, buf.Bytes(), b[:n]) 167 168 n, err = WireFixed64.Tag(1).WriteValueToBytes(b, v) 169 require.NoError(t, err) 170 require.Equal(t, buf.Bytes(), b[:n]) 171 172 for i := n - 1; i >= 0; i-- { 173 n, err = EncodeFixed64ToBytes(b[:i], v) 174 require.Error(t, err) 175 require.Zero(t, n) 176 177 n, err = WireFixed64.Tag(1).WriteValueToBytes(b[:i], v) 178 require.Error(t, err) 179 require.Zero(t, n) 180 } 181 182 u, n, err = DecodeFixed64FromBytesWithError(buf.Bytes()) 183 require.NoError(t, err) 184 require.Equal(t, v, u) 185 require.Equal(t, buf.Len(), n) 186 187 b = buf.Bytes() 188 189 u, err = DecodeFixed64(buf) 190 require.NoError(t, err) 191 require.Equal(t, v, u) 192 require.Zero(t, buf.Len()) 193 194 buf = &bytes.Buffer{} 195 err = WireFixed64.Tag(1).WriteValue(buf, v) 196 require.NoError(t, err) 197 require.Equal(t, b, buf.Bytes()) 198 199 u, err = WireFixed64.Tag(1).ReadValue(buf) 200 require.NoError(t, err) 201 require.Equal(t, v, u) 202 require.Zero(t, buf.Len()) 203 204 for i := n - 1; i > 0; i-- { 205 u, n, err = DecodeFixed64FromBytesWithError(b[:i]) 206 require.Equal(t, io.ErrUnexpectedEOF, err) 207 require.Zero(t, n) 208 require.Zero(t, u) 209 210 u, n, err = WireFixed64.Tag(1).ReadValueFromBytes(b[:i]) 211 require.Equal(t, io.ErrUnexpectedEOF, err) 212 require.Zero(t, n) 213 require.Zero(t, u) 214 215 u, err = WireFixed64.Tag(1).ReadValue(bytes.NewBuffer(b[:i])) 216 require.Equal(t, io.EOF, err) 217 require.Zero(t, n) 218 require.Zero(t, u) 219 220 require.Panics(t, func() { DecodeFixed64FromBytes(b[:i]) }) 221 } 222 223 if v != 0 { 224 break 225 } 226 v <<= 1 227 } 228 } 229 230 func TestEncodeDecodeFixed32(t *testing.T) { 231 v := uint32(1) 232 for { 233 buf := &bytes.Buffer{} 234 err := EncodeFixed32(buf, v) 235 require.NoError(t, err) 236 237 u, n, err := DecodeFixed32FromBytesWithError(buf.Bytes()) 238 require.NoError(t, err) 239 require.Equal(t, uint64(v), u) 240 require.Equal(t, buf.Len(), n) 241 242 b := make([]byte, n) 243 n, err = EncodeFixed32ToBytes(b, v) 244 require.NoError(t, err) 245 require.Equal(t, buf.Bytes(), b[:n]) 246 247 n, err = EncodeFixed32ToBytes(b, v) 248 require.NoError(t, err) 249 require.Equal(t, buf.Bytes(), b[:n]) 250 251 n, err = WireFixed32.Tag(1).WriteValueToBytes(b, uint64(v)) 252 require.NoError(t, err) 253 require.Equal(t, buf.Bytes(), b[:n]) 254 255 for i := n - 1; i >= 0; i-- { 256 n, err = EncodeFixed32ToBytes(b[:i], v) 257 require.Error(t, err) 258 require.Zero(t, n) 259 260 n, err = WireFixed32.Tag(1).WriteValueToBytes(b[:i], uint64(v)) 261 require.Error(t, err) 262 require.Zero(t, n) 263 } 264 265 u, n, err = DecodeFixed32FromBytesWithError(buf.Bytes()) 266 require.NoError(t, err) 267 require.Equal(t, uint64(v), u) 268 require.Equal(t, buf.Len(), n) 269 270 b = buf.Bytes() 271 272 u, err = DecodeFixed32(buf) 273 require.NoError(t, err) 274 require.Equal(t, uint64(v), u) 275 require.Zero(t, buf.Len()) 276 277 buf = &bytes.Buffer{} 278 err = WireFixed32.Tag(1).WriteValue(buf, uint64(v)) 279 require.NoError(t, err) 280 require.Equal(t, b, buf.Bytes()) 281 282 u, err = WireFixed32.Tag(1).ReadValue(buf) 283 require.NoError(t, err) 284 require.Equal(t, uint64(v), u) 285 require.Zero(t, buf.Len()) 286 287 for i := n - 1; i > 0; i-- { 288 u, n, err = DecodeFixed32FromBytesWithError(b[:i]) 289 require.Equal(t, io.ErrUnexpectedEOF, err) 290 require.Zero(t, n) 291 require.Zero(t, u) 292 293 u, n, err = WireFixed32.Tag(1).ReadValueFromBytes(b[:i]) 294 require.Equal(t, io.ErrUnexpectedEOF, err) 295 require.Zero(t, n) 296 require.Zero(t, u) 297 298 u, err = WireFixed32.Tag(1).ReadValue(bytes.NewBuffer(b[:i])) 299 require.Equal(t, io.EOF, err) 300 require.Zero(t, n) 301 require.Zero(t, u) 302 303 require.Panics(t, func() { DecodeFixed32FromBytes(b[:i]) }) 304 } 305 306 if v != 0 { 307 break 308 } 309 v <<= 1 310 } 311 }