github.com/insolar/vanilla@v0.0.0-20201023172447-248fdf805322/protokit/notation_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 "testing" 11 12 "github.com/stretchr/testify/require" 13 ) 14 15 func TestContentType(t *testing.T) { 16 buf := []byte{0, 1, 99} 17 reader := bytes.NewReader(buf) 18 counters := [ContentPolymorph + 1]int{} 19 20 for i := 256; i > 0; i-- { 21 n := buf[0] 22 ct, id, err := PeekContentTypeAndPolymorphIDFromBytes(buf) 23 require.NoError(t, err, "0x%X", n) 24 25 if n <= maskWireType { 26 counters[ContentUndefined]++ 27 require.Equal(t, ContentUndefined, ct) 28 } else { 29 counters[ct]++ 30 switch ct { 31 case ContentUndefined: 32 switch WireType(n & maskWireType) { 33 case WireVarint, WireFixed64, WireBytes, WireStartGroup, WireFixed32: 34 require.Fail(t, "valid wire type", "0x%X", n) 35 } 36 case ContentText: 37 require.True(t, n >= '\t', "0x%X", n) 38 require.True(t, n < illegalUtf8FirstByte || n >= legalUtf8, "0x%X", n) 39 case ContentBinary: 40 require.True(t, n&maskWireType == 4, "0x%X", n) 41 require.True(t, n >= illegalUtf8FirstByte && n < legalUtf8, "0x%X", n) 42 case ContentMessage: 43 u, c := DecodeVarintFromBytes(buf) 44 require.NotZero(t, c) 45 wt := WireTag(u) 46 require.True(t, wt.IsValid()) 47 switch wt.Type() { 48 case WireVarint, WireFixed64, WireBytes, WireStartGroup, WireFixed32: 49 default: 50 require.Fail(t, "invalid wire type", "0x%X", n) 51 } 52 case ContentPolymorph: 53 require.True(t, n >= illegalUtf8FirstByte && n < legalUtf8, "0x%X", n) 54 require.Equal(t, uint64(99), id) 55 default: 56 t.FailNow() 57 } 58 } 59 60 reader.Reset(buf) 61 pct, err := PeekPossibleContentTypes(reader) 62 require.Equal(t, len(buf), reader.Len()) // must be unread 63 64 require.NoError(t, err, "0x%X", n) 65 require.Equal(t, PossibleContentTypes(buf[0]), pct, "0x%X", n) 66 67 ct2, id2, err := PeekContentTypeAndPolymorphID(reader) 68 require.NoError(t, err, "0x%X", n) 69 require.Equal(t, ct, ct2, "0x%X", n) 70 require.Equal(t, id, id2, "0x%X", n) 71 72 buf[0]++ 73 } 74 75 n := 0 76 for _, c := range counters { 77 n += c 78 } 79 require.Equal(t, 256, n) 80 81 require.Equal(t, 24, counters[ContentUndefined]) 82 require.Equal(t, 183, counters[ContentText]) 83 require.Equal(t, 8, counters[ContentBinary]) 84 require.Equal(t, 33, counters[ContentMessage]) 85 require.Equal(t, 8, counters[ContentPolymorph]) 86 }