github.com/koko1123/flow-go-1@v0.29.6/network/codec/cbor/codec_test.go (about)

     1  package cbor_test
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/stretchr/testify/assert"
     7  	"github.com/stretchr/testify/require"
     8  
     9  	"github.com/koko1123/flow-go-1/network/codec"
    10  	"github.com/koko1123/flow-go-1/network/codec/cbor"
    11  	"github.com/koko1123/flow-go-1/utils/unittest"
    12  )
    13  
    14  func TestCodec_Decode(t *testing.T) {
    15  	t.Parallel()
    16  
    17  	c := cbor.NewCodec()
    18  
    19  	t.Run("decodes message successfully", func(t *testing.T) {
    20  		t.Parallel()
    21  
    22  		data := unittest.ProposalFixture()
    23  		encoded, err := c.Encode(data)
    24  		require.NoError(t, err)
    25  
    26  		decoded, err := c.Decode(encoded)
    27  		require.NoError(t, err)
    28  		require.Equal(t, data, decoded)
    29  	})
    30  
    31  	t.Run("returns error when data is empty", func(t *testing.T) {
    32  		t.Parallel()
    33  
    34  		decoded, err := c.Decode(nil)
    35  		assert.Nil(t, decoded)
    36  		assert.True(t, codec.IsErrInvalidEncoding(err))
    37  
    38  		decoded, err = c.Decode([]byte{})
    39  		assert.Nil(t, decoded)
    40  		assert.True(t, codec.IsErrInvalidEncoding(err))
    41  	})
    42  
    43  	t.Run("returns error when message code is invalid", func(t *testing.T) {
    44  		t.Parallel()
    45  
    46  		decoded, err := c.Decode([]byte{codec.CodeMin})
    47  		assert.Nil(t, decoded)
    48  		assert.True(t, codec.IsErrUnknownMsgCode(err))
    49  
    50  		decoded, err = c.Decode([]byte{codec.CodeMax})
    51  		assert.Nil(t, decoded)
    52  		assert.True(t, codec.IsErrUnknownMsgCode(err))
    53  
    54  		decoded, err = c.Decode([]byte{codec.CodeMin - 1})
    55  		assert.Nil(t, decoded)
    56  		assert.True(t, codec.IsErrUnknownMsgCode(err))
    57  
    58  		decoded, err = c.Decode([]byte{codec.CodeMax + 1})
    59  		assert.Nil(t, decoded)
    60  		assert.True(t, codec.IsErrUnknownMsgCode(err))
    61  	})
    62  
    63  	t.Run("returns error when unmarshalling fails - empty", func(t *testing.T) {
    64  		t.Parallel()
    65  
    66  		decoded, err := c.Decode([]byte{codec.CodeBlockProposal})
    67  		assert.Nil(t, decoded)
    68  		assert.True(t, codec.IsErrMsgUnmarshal(err))
    69  	})
    70  
    71  	t.Run("returns error when unmarshalling fails - wrong type", func(t *testing.T) {
    72  		t.Parallel()
    73  
    74  		data := unittest.ProposalFixture()
    75  		encoded, err := c.Encode(data)
    76  		require.NoError(t, err)
    77  
    78  		encoded[0] = codec.CodeCollectionGuarantee
    79  
    80  		decoded, err := c.Decode(encoded)
    81  		assert.Nil(t, decoded)
    82  		assert.True(t, codec.IsErrMsgUnmarshal(err))
    83  	})
    84  
    85  	t.Run("returns error when unmarshalling fails - corrupt", func(t *testing.T) {
    86  		t.Parallel()
    87  
    88  		data := unittest.ProposalFixture()
    89  		encoded, err := c.Encode(data)
    90  		require.NoError(t, err)
    91  
    92  		encoded[2] = 0x20 // corrupt payload
    93  
    94  		decoded, err := c.Decode(encoded)
    95  		assert.Nil(t, decoded)
    96  		assert.True(t, codec.IsErrMsgUnmarshal(err))
    97  	})
    98  }