Skip to content
Snippets Groups Projects
Commit d360be1c authored by André Sterba's avatar André Sterba
Browse files

Fix NBI pnd tests

parent 510a698b
No related branches found
No related tags found
6 merge requests!376Add additional example application hostname-checker,!349Northbound refactoring to implement NIB concept for devices,!343Add basic application framework and example application to show interaction between events an NBI,!339Create basic venv-manager for use with arista,!327Remove NBI package global services and refactor NBI servers,!324Provide prototype implementation for topology handling
...@@ -2,7 +2,6 @@ package server ...@@ -2,7 +2,6 @@ package server
import ( import (
"context" "context"
"os"
"reflect" "reflect"
"testing" "testing"
"time" "time"
...@@ -14,14 +13,12 @@ import ( ...@@ -14,14 +13,12 @@ import (
"code.fbi.h-da.de/danet/gosdn/controller/interfaces/southbound" "code.fbi.h-da.de/danet/gosdn/controller/interfaces/southbound"
"code.fbi.h-da.de/danet/gosdn/controller/mocks" "code.fbi.h-da.de/danet/gosdn/controller/mocks"
"code.fbi.h-da.de/danet/gosdn/controller/nucleus" "code.fbi.h-da.de/danet/gosdn/controller/nucleus"
"code.fbi.h-da.de/danet/gosdn/controller/rbac"
"code.fbi.h-da.de/danet/gosdn/models/generated/openconfig" "code.fbi.h-da.de/danet/gosdn/models/generated/openconfig"
"github.com/golang/protobuf/proto" "github.com/golang/protobuf/proto"
"github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp"
"github.com/google/go-cmp/cmp/cmpopts" "github.com/google/go-cmp/cmp/cmpopts"
"github.com/google/uuid" "github.com/google/uuid"
"github.com/openconfig/gnmi/proto/gnmi" "github.com/openconfig/gnmi/proto/gnmi"
log "github.com/sirupsen/logrus"
"github.com/stretchr/testify/mock" "github.com/stretchr/testify/mock"
) )
...@@ -42,32 +39,59 @@ var mockPnd *mocks.NetworkDomain ...@@ -42,32 +39,59 @@ var mockPnd *mocks.NetworkDomain
var mockDevice device.Device var mockDevice device.Device
var sbiStore southbound.Store var sbiStore southbound.Store
func TestMain(m *testing.M) { func initUUIDs(t *testing.T) {
log.SetReportCaller(true)
var err error var err error
pndUUID, err = uuid.Parse(pndID) pndUUID, err = uuid.Parse(pndID)
if err != nil { if err != nil {
log.Fatal(err) t.Fatal(err)
} }
sbiUUID, err = uuid.Parse(sbiID) sbiUUID, err = uuid.Parse(sbiID)
if err != nil { if err != nil {
log.Fatal(err) t.Fatal(err)
} }
pendingChangeUUID, err = uuid.Parse(pendingChangeID) pendingChangeUUID, err = uuid.Parse(pendingChangeID)
if err != nil { if err != nil {
log.Fatal(err) t.Fatal(err)
} }
committedChangeUUID, err = uuid.Parse(committedChangeID) committedChangeUUID, err = uuid.Parse(committedChangeID)
if err != nil { if err != nil {
log.Fatal(err) t.Fatal(err)
} }
deviceUUID, err = uuid.Parse(ondID) deviceUUID, err = uuid.Parse(ondID)
if err != nil { if err != nil {
log.Fatal(err) t.Fatal(err)
}
}
func getTestCoreServer(t *testing.T) *core {
var err error
pndUUID, err = uuid.Parse(pndID)
if err != nil {
t.Fatal(err)
}
sbiUUID, err = uuid.Parse(sbiID)
if err != nil {
t.Fatal(err)
}
pendingChangeUUID, err = uuid.Parse(pendingChangeID)
if err != nil {
t.Fatal(err)
}
committedChangeUUID, err = uuid.Parse(committedChangeID)
if err != nil {
t.Fatal(err)
}
deviceUUID, err = uuid.Parse(ondID)
if err != nil {
t.Fatal(err)
} }
mockDevice = &nucleus.CommonDevice{ mockDevice = &nucleus.CommonDevice{
...@@ -84,14 +108,14 @@ func TestMain(m *testing.M) { ...@@ -84,14 +108,14 @@ func TestMain(m *testing.M) {
sbi, err := nucleus.NewSBI(spb.Type_TYPE_OPENCONFIG, sbiUUID) sbi, err := nucleus.NewSBI(spb.Type_TYPE_OPENCONFIG, sbiUUID)
if err != nil { if err != nil {
log.Fatal(err) t.Fatal(err)
} }
mockDevice.(*nucleus.CommonDevice).SetSBI(sbi) mockDevice.(*nucleus.CommonDevice).SetSBI(sbi)
mockDevice.(*nucleus.CommonDevice).SetTransport(&mocks.Transport{}) mockDevice.(*nucleus.CommonDevice).SetTransport(&mocks.Transport{})
mockDevice.(*nucleus.CommonDevice).SetName(hostname) mockDevice.(*nucleus.CommonDevice).SetName(hostname)
sbiStore = nucleus.NewSbiStore(pndUUID) sbiStore = nucleus.NewSbiStore(pndUUID)
if err := sbiStore.Add(mockDevice.SBI()); err != nil { if err := sbiStore.Add(mockDevice.SBI()); err != nil {
log.Fatal(err) t.Fatal(err)
} }
mockChange := &mocks.Change{} mockChange := &mocks.Change{}
...@@ -115,21 +139,96 @@ func TestMain(m *testing.M) { ...@@ -115,21 +139,96 @@ func TestMain(m *testing.M) {
mockPnd.On("ChangeOND", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(uuid.Nil, nil) mockPnd.On("ChangeOND", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(uuid.Nil, nil)
mockPnd.On("Request", mock.Anything, mock.Anything).Return(nil, nil) mockPnd.On("Request", mock.Anything, mock.Anything).Return(nil, nil)
pndc = nucleus.NewMemoryPndStore() pndStore := nucleus.NewMemoryPndStore()
if err := pndc.Add(mockPnd); err != nil { if err := pndStore.Add(mockPnd); err != nil {
log.Fatal(err) t.Fatal(err)
} }
// everyting auth related c := NewCoreServer(pndStore)
userService = rbac.NewUserService(rbac.NewMemoryUserStore())
roleService = rbac.NewRoleService(rbac.NewMemoryRoleStore()) return c
err = clearAndCreateAuthTestSetup() }
func getTestPndServer(t *testing.T) *pndServer {
var err error
pndUUID, err = uuid.Parse(pndID)
if err != nil {
t.Fatal(err)
}
sbiUUID, err = uuid.Parse(sbiID)
if err != nil {
t.Fatal(err)
}
pendingChangeUUID, err = uuid.Parse(pendingChangeID)
if err != nil { if err != nil {
log.Fatal(err) t.Fatal(err)
} }
jwt = rbac.NewJWTManager("", 1*time.Minute)
os.Exit(m.Run()) committedChangeUUID, err = uuid.Parse(committedChangeID)
if err != nil {
t.Fatal(err)
}
deviceUUID, err = uuid.Parse(ondID)
if err != nil {
t.Fatal(err)
}
mockDevice = &nucleus.CommonDevice{
Model: &openconfig.Device{
System: &openconfig.OpenconfigSystem_System{
Config: &openconfig.OpenconfigSystem_System_Config{
Hostname: &hostname,
DomainName: &domainname,
},
},
},
UUID: deviceUUID,
}
sbi, err := nucleus.NewSBI(spb.Type_TYPE_OPENCONFIG, sbiUUID)
if err != nil {
t.Fatal(err)
}
mockDevice.(*nucleus.CommonDevice).SetSBI(sbi)
mockDevice.(*nucleus.CommonDevice).SetTransport(&mocks.Transport{})
mockDevice.(*nucleus.CommonDevice).SetName(hostname)
sbiStore = nucleus.NewSbiStore(pndUUID)
if err := sbiStore.Add(mockDevice.SBI()); err != nil {
t.Fatal(err)
}
mockChange := &mocks.Change{}
mockChange.On("Age").Return(time.Hour)
mockChange.On("State").Return(ppb.ChangeState_CHANGE_STATE_INCONSISTENT)
mockPnd = &mocks.NetworkDomain{}
mockPnd.On("ID").Return(pndUUID)
mockPnd.On("GetName").Return("test")
mockPnd.On("GetDescription").Return("test")
mockPnd.On("GetSBIs").Return(sbiStore)
mockPnd.On("GetSBI", mock.Anything).Return(mockDevice.SBI(), nil)
mockPnd.On("Devices").Return([]uuid.UUID{deviceUUID})
mockPnd.On("PendingChanges").Return([]uuid.UUID{pendingChangeUUID})
mockPnd.On("CommittedChanges").Return([]uuid.UUID{committedChangeUUID})
mockPnd.On("GetChange", mock.Anything).Return(mockChange, nil)
mockPnd.On("AddDevice", mock.Anything, mock.Anything, mock.Anything).Return(nil)
mockPnd.On("GetDevice", mock.Anything).Return(mockDevice, nil)
mockPnd.On("Commit", mock.Anything).Return(nil)
mockPnd.On("Confirm", mock.Anything).Return(nil)
mockPnd.On("ChangeOND", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(uuid.Nil, nil)
mockPnd.On("Request", mock.Anything, mock.Anything).Return(nil, nil)
pndStore := nucleus.NewMemoryPndStore()
if err := pndStore.Add(mockPnd); err != nil {
t.Fatal(err)
}
c := NewPndServer(pndStore)
return c
} }
// TODO: We should re-add all tests for changes. // TODO: We should re-add all tests for changes.
...@@ -165,10 +264,9 @@ func Test_pnd_Get(t *testing.T) { ...@@ -165,10 +264,9 @@ func Test_pnd_Get(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
p := core{ c := getTestCoreServer(t)
UnimplementedCoreServiceServer: pb.UnimplementedCoreServiceServer{},
} resp, err := c.GetPnd(tt.args.ctx, tt.args.request)
resp, err := p.GetPnd(tt.args.ctx, tt.args.request)
if (err != nil) != tt.wantErr { if (err != nil) != tt.wantErr {
t.Errorf("Get() error = %v, wantErr %v", err, tt.wantErr) t.Errorf("Get() error = %v, wantErr %v", err, tt.wantErr)
return return
...@@ -184,6 +282,8 @@ func Test_pnd_Get(t *testing.T) { ...@@ -184,6 +282,8 @@ func Test_pnd_Get(t *testing.T) {
} }
func Test_pnd_GetPath(t *testing.T) { func Test_pnd_GetPath(t *testing.T) {
initUUIDs(t)
opts := cmp.Options{ opts := cmp.Options{
cmpopts.SortSlices( cmpopts.SortSlices(
func(x, y *gnmi.Update) bool { func(x, y *gnmi.Update) bool {
...@@ -209,9 +309,9 @@ func Test_pnd_GetPath(t *testing.T) { ...@@ -209,9 +309,9 @@ func Test_pnd_GetPath(t *testing.T) {
ctx: context.Background(), ctx: context.Background(),
request: &ppb.GetPathRequest{ request: &ppb.GetPathRequest{
Timestamp: time.Now().UnixNano(), Timestamp: time.Now().UnixNano(),
Did: mockDevice.ID().String(), Did: deviceUUID.String(),
Path: "system/config/hostname", Path: "system/config/hostname",
Pid: mockPnd.ID().String(), Pid: pndUUID.String(),
}, },
}, },
want: []*gnmi.Notification{ want: []*gnmi.Notification{
...@@ -247,9 +347,9 @@ func Test_pnd_GetPath(t *testing.T) { ...@@ -247,9 +347,9 @@ func Test_pnd_GetPath(t *testing.T) {
ctx: context.Background(), ctx: context.Background(),
request: &ppb.GetPathRequest{ request: &ppb.GetPathRequest{
Timestamp: time.Now().UnixNano(), Timestamp: time.Now().UnixNano(),
Did: mockDevice.ID().String(), Did: deviceUUID.String(),
Path: "system", Path: "system",
Pid: mockPnd.ID().String(), Pid: pndUUID.String(),
}, },
}, },
want: []*gnmi.Notification{ want: []*gnmi.Notification{
...@@ -279,9 +379,9 @@ func Test_pnd_GetPath(t *testing.T) { ...@@ -279,9 +379,9 @@ func Test_pnd_GetPath(t *testing.T) {
ctx: context.Background(), ctx: context.Background(),
request: &ppb.GetPathRequest{ request: &ppb.GetPathRequest{
Timestamp: time.Now().UnixNano(), Timestamp: time.Now().UnixNano(),
Did: mockDevice.ID().String(), Did: deviceUUID.String(),
Path: "this/path/is/not/valid", Path: "this/path/is/not/valid",
Pid: mockPnd.ID().String(), Pid: pndUUID.String(),
}, },
}, },
want: []*gnmi.Notification{}, want: []*gnmi.Notification{},
...@@ -290,9 +390,7 @@ func Test_pnd_GetPath(t *testing.T) { ...@@ -290,9 +390,7 @@ func Test_pnd_GetPath(t *testing.T) {
} }
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
s := pndServer{ s := getTestPndServer(t)
UnimplementedPndServiceServer: ppb.UnimplementedPndServiceServer{},
}
resp, err := s.GetPath(tt.args.ctx, tt.args.request) resp, err := s.GetPath(tt.args.ctx, tt.args.request)
if (err != nil) != tt.wantErr { if (err != nil) != tt.wantErr {
t.Errorf("GetPath() error = %v, wantErr %v", err, tt.wantErr) t.Errorf("GetPath() error = %v, wantErr %v", err, tt.wantErr)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment