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  }