Files
gocast/controller/bgp_test.go
Mayuresh Gaitonde 96b39ec9bb add comment
2020-12-18 11:44:32 -08:00

104 lines
2.6 KiB
Go

package controller
import (
"context"
"fmt"
"net"
"os"
"testing"
"github.com/golang/protobuf/ptypes"
"github.com/mayuresh82/gocast/config"
api "github.com/osrg/gobgp/api"
gobgp "github.com/osrg/gobgp/pkg/server"
"github.com/stretchr/testify/assert"
)
type BgpListener struct {
s *gobgp.BgpServer
recvdPaths chan string
}
// NewBgpListener starts a local BGP server for testing purposes
func NewBgpListener(localAS int) (*BgpListener, error) {
s := gobgp.NewBgpServer()
go s.Serve()
if err := s.StartBgp(context.Background(), &api.StartBgpRequest{
Global: &api.Global{
As: uint32(localAS),
RouterId: "100.100.100.100",
},
}); err != nil {
return nil, fmt.Errorf("Unable to start bgp: %v", err)
}
n := &BgpListener{s: s, recvdPaths: make(chan string)}
err := s.MonitorTable(context.Background(), &api.MonitorTableRequest{TableType: api.TableType_ADJ_IN}, func(p *api.Path) {
// assumes v4 only paths !
var value ptypes.DynamicAny
if err := ptypes.UnmarshalAny(p.Nlri, &value); err != nil {
return
}
nlri := value.Message.(*api.IPAddressPrefix)
n.recvdPaths <- fmt.Sprintf("%s/%d", nlri.Prefix, nlri.PrefixLen)
})
if err != nil {
return nil, err
}
if err := s.AddPeer(context.Background(), &api.AddPeerRequest{
Peer: &api.Peer{
Conf: &api.PeerConf{
NeighborAddress: "127.0.0.1",
PeerAs: 11111,
},
Transport: &api.Transport{PassiveMode: true},
},
}); err != nil {
return nil, err
}
return n, nil
}
func (l *BgpListener) Shutdown() error {
if err := l.s.StopBgp(context.Background(), &api.StopBgpRequest{}); err != nil {
return err
}
return nil
}
// This test tests the BGP controller talking to a local BGP
// listener. It needs a few seconds to pass and *may* time out
// if the test timeouts are very small. It also needs to be run as
// root (sudo)
// Disabling this test in CI currently due to https://github.com/osrg/gobgp/issues/2366
func TestBgpNew(t *testing.T) {
if os.Getenv("CI") != "" {
t.Skip("Skipping testing in CI environment")
}
listener, err := NewBgpListener(22222)
if err != nil {
panic(err)
}
defer listener.Shutdown()
a := assert.New(t)
c := config.BgpConfig{
LocalAS: 11111,
PeerAS: 22222,
PeerIP: "127.0.0.1",
LocalIP: "192.168.1.100",
Communities: []string{"100:100"},
Origin: "igp",
}
ctrl, err := NewController(c)
if err != nil {
a.FailNow(err.Error())
}
_, ipnet, _ := net.ParseCIDR("20.30.40.0/24")
if err := ctrl.Announce(ipnet); err != nil {
a.FailNow(err.Error())
}
path := <-listener.recvdPaths
a.Equal("20.30.40.0/24", path)
ctrl.Shutdown()
}