Skip to content
Snippets Groups Projects
update_helper_test.go 2.22 KiB
Newer Older
  • Learn to ignore specific revisions
  • Oliver Herms's avatar
    Oliver Herms committed
    	"bytes"
    	"errors"
    
    	"io"
    
    	bnet "github.com/bio-routing/bio-rd/net"
    
    Daniel Czerwonk's avatar
    Daniel Czerwonk committed
    	"github.com/bio-routing/bio-rd/protocols/bgp/packet"
    
    type failingUpdate struct{}
    
    
    func (f *failingUpdate) SerializeUpdate(opt *packet.EncodeOptions) ([]byte, error) {
    
    	return nil, errors.New("general error")
    }
    
    type WriterByter interface {
    	Bytes() []byte
    	io.Writer
    }
    
    type failingReadWriter struct {
    }
    
    func (f *failingReadWriter) Write(p []byte) (n int, err error) {
    	return 0, errors.New("general error")
    }
    
    func (f *failingReadWriter) Bytes() []byte {
    	return []byte{}
    }
    
    
    func TestSerializeAndSendUpdate(t *testing.T) {
    	tests := []struct {
    		name       string
    
    		buf        WriterByter
    
    		err        error
    		testUpdate serializeAbleUpdate
    		expected   []byte
    	}{
    		{
    			name: "normal bgp update",
    
    			buf:  bytes.NewBuffer(nil),
    
    			err:  nil,
    			testUpdate: &packet.BGPUpdate{
    				WithdrawnRoutesLen: 5,
    				WithdrawnRoutes: &packet.NLRI{
    
    Daniel Czerwonk's avatar
    Daniel Czerwonk committed
    					Prefix: bnet.NewPfx(bnet.IPv4FromOctets(10, 0, 0, 0), 8),
    
    Daniel Czerwonk's avatar
    Daniel Czerwonk committed
    						Prefix: bnet.NewPfx(bnet.IPv4FromOctets(192, 168, 0, 0), 16),
    
    					},
    				},
    			},
    
    			expected: []byte{
    				255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, // Marker
    				0, 28, // Length
    				2,                               // Type = Update
    				0, 5, 8, 10, 16, 192, 168, 0, 0, // 2 withdraws
    			},
    		},
    
    		{
    			name:       "failed serialization",
    			buf:        bytes.NewBuffer(nil),
    			err:        nil,
    			testUpdate: &failingUpdate{},
    			expected:   nil,
    		},
    		{
    			name: "failed connection",
    			buf:  &failingReadWriter{},
    			err:  errors.New("Failed sending Update: general error"),
    			testUpdate: &packet.BGPUpdate{
    				WithdrawnRoutesLen: 5,
    				WithdrawnRoutes: &packet.NLRI{
    
    Daniel Czerwonk's avatar
    Daniel Czerwonk committed
    					Prefix: bnet.NewPfx(bnet.IPv4FromOctets(10, 0, 0, 0), 8),
    
    					Next: &packet.NLRI{
    
    Daniel Czerwonk's avatar
    Daniel Czerwonk committed
    						Prefix: bnet.NewPfx(bnet.IPv4FromOctets(192, 168, 0, 0), 16),
    
    					},
    				},
    			},
    			expected: []byte{},
    		},
    
    	}
    	for _, test := range tests {
    		t.Run(test.name, func(t *testing.T) {
    
    			opt := &packet.EncodeOptions{}
    
    			err := serializeAndSendUpdate(test.buf, test.testUpdate, opt)
    
    			assert.Equal(t, test.expected, test.buf.Bytes())