Skip to content
Snippets Groups Projects
encoder_test.go 3.44 KiB
Newer Older
  • Learn to ignore specific revisions
  • Oliver Herms's avatar
    Oliver Herms committed
    package packet
    
    import (
    	"bytes"
    	"testing"
    
    	"github.com/stretchr/testify/assert"
    	"github.com/taktv6/tflow2/convert"
    )
    
    func TestSerializeKeepaliveMsg(t *testing.T) {
    	expected := []byte{
    		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    		0x00, 0x13, 0x04,
    	}
    	res := SerializeKeepaliveMsg()
    
    	assert.Equal(t, expected, res)
    }
    
    func TestSerializeNotificationMsg(t *testing.T) {
    	tests := []struct {
    		name     string
    		input    *BGPNotification
    		expected []byte
    	}{
    		{
    			name: "Valid #1",
    			input: &BGPNotification{
    				ErrorCode:    10,
    				ErrorSubcode: 5,
    			},
    			expected: []byte{
    				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    				0x00, 0x15, // Length
    				0x03, // Type
    				0x0a, // Error Code
    				0x05, // Error Subcode
    			},
    		},
    		{
    			name: "Valid #2",
    			input: &BGPNotification{
    				ErrorCode:    11,
    				ErrorSubcode: 6,
    			},
    			expected: []byte{
    				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    				0x00, 0x15, // Length
    				0x03, // Type
    				0x0b, // Error Code
    				0x06, // Error Subcode
    			},
    		},
    	}
    
    	for _, test := range tests {
    		res := SerializeNotificationMsg(test.input)
    		assert.Equal(t, test.expected, res)
    	}
    }
    
    func TestSerializeOpenMsg(t *testing.T) {
    	tests := []struct {
    		name     string
    		input    *BGPOpen
    		expected []byte
    	}{
    		{
    			name: "Valid #1",
    			input: &BGPOpen{
    				Version:       4,
    
    Oliver Herms's avatar
    Oliver Herms committed
    				HoldTime:      120,
    				BGPIdentifier: convert.Uint32([]byte{100, 111, 120, 130}),
    				OptParmLen:    0,
    			},
    			expected: []byte{
    				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    				0x00, 0x1d, // Length
    				0x01,       // Type
    				0x04,       // Version
    				0x3b, 0x41, // ASN
    				0x00, 0x78, // Holdtime
    				130, 120, 111, 100, // BGP Identifier
    				0x00, // Opt. Param Length
    			},
    		},
    	}
    
    	for _, test := range tests {
    		res := SerializeOpenMsg(test.input)
    		assert.Equal(t, test.expected, res)
    	}
    }
    
    
    Oliver Herms's avatar
    Oliver Herms committed
    func TestSerializeOptParams(t *testing.T) {
    
    	tests := []struct {
    		name      string
    		optParams []OptParam
    		expected  []byte
    	}{
    		{
    			name:      "empty",
    			optParams: []OptParam{},
    			expected:  []byte{},
    		},
    		{
    			name: "1 Option",
    			optParams: []OptParam{
    				{
    
    Oliver Herms's avatar
    Oliver Herms committed
    					Type:   2,
    					Length: 6,
    					Value: Capability{
    						Code:   69,
    						Length: 4,
    						Value: AddPathCapability{
    							AFI:         1,
    							SAFI:        1,
    							SendReceive: 3,
    						},
    					},
    
    Oliver Herms's avatar
    Oliver Herms committed
    			expected: []byte{2, 6, 69, 4, 0, 1, 1, 3},
    
    		},
    	}
    
    	for _, test := range tests {
    		buf := bytes.NewBuffer(make([]byte, 0))
    		serializeOptParams(buf, test.optParams)
    		assert.Equal(t, test.expected, buf.Bytes())
    	}
    
    Oliver Herms's avatar
    Oliver Herms committed
    }
    
    Oliver Herms's avatar
    Oliver Herms committed
    func TestSerializeHeader(t *testing.T) {
    	tests := []struct {
    		name     string
    		length   uint16
    		typ      uint8
    		expected []byte
    	}{
    		{
    			name:   "Valid #1",
    			length: 10,
    			typ:    5,
    			expected: []byte{
    				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    				0x00, 0x0a, 0x05,
    			},
    		},
    		{
    			name:   "Valid #12",
    			length: 256,
    			typ:    255,
    			expected: []byte{
    				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    				0x01, 0x00, 0xff,
    			},
    		},
    	}
    
    	for _, test := range tests {
    		buf := bytes.NewBuffer([]byte{})
    		serializeHeader(buf, test.length, test.typ)
    
    		assert.Equal(t, test.expected, buf.Bytes())
    	}
    }