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  }