Newer
Older
ppb "code.fbi.h-da.de/danet/api/go/gosdn/pnd"
spb "code.fbi.h-da.de/danet/api/go/gosdn/southbound"
tpb "code.fbi.h-da.de/danet/api/go/gosdn/transport"
"code.fbi.h-da.de/danet/gosdn/interfaces/device"
"code.fbi.h-da.de/danet/gosdn/interfaces/networkdomain"
"code.fbi.h-da.de/danet/gosdn/interfaces/southbound"
"code.fbi.h-da.de/danet/gosdn/mocks"
"code.fbi.h-da.de/danet/yang-models/generated/openconfig"
log "github.com/sirupsen/logrus"
"github.com/stretchr/testify/mock"
)
func TestNewPND(t *testing.T) {
p := newPnd()
if err := p.addSbi(&OpenConfig{id: defaultSbiID}); err != nil {
type args struct {
name string
description string
}{
{
name: "default",
args: args{
name: "default",
description: "default test pnd",
sbi: &OpenConfig{id: defaultSbiID},
pid: defaultPndID,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := NewPND(tt.args.name, tt.args.description, tt.args.pid, tt.args.sbi, nil, nil)
if (err != nil) != tt.wantErr {
t.Errorf("NewPND() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("NewPND() = %v, want %v", got, tt.want)
}
})
}
}
func Test_destroy(t *testing.T) {
tests := []struct {
name string
wantErr bool
}{
{name: "dummy", wantErr: false},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if err := destroy(); (err != nil) != tt.wantErr {
t.Errorf("destroy() error = %v, wantErr %v", err, tt.wantErr)
}
})
}
}
func Test_pndImplementation_AddDevice(t *testing.T) {
type args struct {
}
tests := []struct {
name string
args args
wantErr bool
}{
{
name: "default",
name: "fridolin",
opts: &tpb.TransportOption{
TransportOption: &tpb.TransportOption_GnmiTransportOption{
GnmiTransportOption: &tpb.GnmiTransportOption{},
},
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if err := pnd.addSbi(&OpenConfig{id: defaultSbiID}); err != nil {
t.Error(err)
}
if tt.name == "already exists" {
pnd.devices.Store[did] = tt.args.device.(device.Device)
err := pnd.AddDevice(tt.args.name, tt.args.opts, defaultSbiID)
if (err != nil) != tt.wantErr {
t.Errorf("AddDevice() error = %v, wantErr %v", err, tt.wantErr)
if tt.name != "fails wrong type" {
if err == nil {
d, err := pnd.devices.GetDevice(store.FromString(tt.args.name))
if err != nil {
t.Errorf("AddDevice() error = %v", err)
return
if d.Name() != tt.args.name {
t.Errorf("AddDevice() got = %v, want %v", d.Name(), tt.args.name)
}
if err := pnd.devices.Delete(d.ID()); err != nil {
// TODO: refactor test to use store interface instead if direct access.
func Test_pndImplementation_AddSbi(t *testing.T) {
type args struct {
}
tests := []struct {
name string
args args
wantErr bool
}{
{
name: "default",
args: args{
sbi: &OpenConfig{
},
},
wantErr: false,
},
{
name: "already exists",
args: args{
sbi: &OpenConfig{
},
},
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if tt.name == "already exists" {
pnd.sbic.Store[defaultSbiID] = tt.args.sbi
err := pnd.AddSbi(tt.args.sbi)
if (err != nil) != tt.wantErr {
t.Errorf("AddSbi() error = %v, wantErr %v", err, tt.wantErr)
if tt.name != "fails wrong type" {
if err == nil {
if !ok {
t.Errorf("AddSbi() SBI %v not in device store %v",
tt.args.sbi, pnd.GetSBIs())
}
if err := pnd.sbic.Delete(defaultSbiID); err != nil {
})
}
}
func Test_pndImplementation_ContainsDevice(t *testing.T) {
type args struct {
uuid uuid.UUID
}
tests := []struct {
name string
args args
want bool
}{
{name: "default", args: args{
uuid: did,
}, want: true},
{name: "fails", args: args{
uuid: uuid.New(),
{name: "fails empty", args: args{
uuid: uuid.New(),
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
pnd := newPnd()
if tt.name != "fails empty" {
if err := pnd.devices.Add(tt.args.device, "test"); err != nil {
if got := pnd.ContainsDevice(tt.args.uuid); got != tt.want {
t.Errorf("ContainsDevice() = %v, want %v", got, tt.want)
}
if err := pnd.devices.Delete(did); err != nil && tt.name != "fails empty" {
})
}
}
func Test_pndImplementation_Destroy(t *testing.T) {
type fields struct {
name string
description string
sbi *store.SbiStore
devices *store.DeviceStore
}
tests := []struct {
name string
fields fields
wantErr bool
}{
{name: "dummy", fields: fields{}, wantErr: false},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
pnd := &pndImplementation{
name: tt.fields.name,
description: tt.fields.description,
devices: tt.fields.devices,
}
if err := pnd.Destroy(); (err != nil) != tt.wantErr {
t.Errorf("Destroy() error = %v, wantErr %v", err, tt.wantErr)
}
})
}
}
func Test_pndImplementation_GetDescription(t *testing.T) {
tests := []struct {
name string
want string
}{
{name: "default", want: "default test pnd"},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := pnd.GetDescription(); got != tt.want {
t.Errorf("GetDescription() = %v, want %v", got, tt.want)
}
})
}
}
func Test_pndImplementation_GetName(t *testing.T) {
tests := []struct {
name string
want string
}{
{name: "default", want: "default"},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := pnd.GetName(); got != tt.want {
t.Errorf("GetName() = %v, want %v", got, tt.want)
}
})
}
}
func Test_pndImplementation_GetSBIs(t *testing.T) {
tests := []struct {
name string
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := pnd.GetSBIs(); !reflect.DeepEqual(got, tt.want) {
t.Errorf("GetSBIs() = %v, want %v", got, tt.want)
}
})
}
}
func Test_pndImplementation_MarshalDevice(t *testing.T) {
type args struct {
uuid uuid.UUID
}
tests := []struct {
name string
args args
want string
wantErr bool
}{
{
name: "default",
args: args{did},
want: "{\n\t\"Acl\": null,\n\t\"Bgp\": null,\n\t\"Components\": null,\n\t\"Interfaces\": null,\n\t\"LocalRoutes\": null,\n\t\"Messages\": null,\n\t\"NetworkInstances\": null,\n\t\"RoutingPolicy\": null,\n\t\"System\": null\n}",
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if err := pnd.addDevice(d); err != nil {
t.Error(err)
}
got, err := pnd.MarshalDevice(tt.args.uuid.String())
if (err != nil) != tt.wantErr {
t.Errorf("MarshalDevice() error = %v, wantErr %v", err, tt.wantErr)
return
}
if got != tt.want {
t.Errorf("MarshalDevice() got = %v, want %v", got, tt.want)
}
if err := pnd.devices.Delete(did); err != nil {
})
}
}
func Test_pndImplementation_RemoveDevice(t *testing.T) {
type args struct {
uuid uuid.UUID
}
tests := []struct {
name string
args args
wantErr bool
}{
{name: "default", args: args{uuid: did}, wantErr: false},
{name: "fails", args: args{uuid: uuid.New()}, wantErr: true},
{name: "fails empty", args: args{uuid: did}, wantErr: true},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
pnd := newPnd()
if tt.name != "fails empty" {
if err := pnd.addDevice(d); err != nil {
t.Error(err)
}
}
if err := pnd.RemoveDevice(tt.args.uuid); (err != nil) != tt.wantErr {
t.Errorf("RemoveDevice() error = %v, wantErr %v", err, tt.wantErr)
}
if pnd.devices.Exists(did) && tt.name == "default" {
t.Errorf("RemoveDevice() device still in device store %v", pnd.devices)
}
})
}
}
func Test_pndImplementation_RemoveSbi(t *testing.T) {
type args struct {
}
tests := []struct {
name string
args args
wantErr bool
}{
{name: "default", args: args{id: defaultSbiID}, wantErr: false},
{name: "fails", args: args{id: uuid.New()}, wantErr: true},
{name: "fails empty", args: args{id: defaultSbiID}, wantErr: true},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
pnd := &pndImplementation{
name: "test-remove-sbi",
description: "test-remove-sbi",
sbic: store.NewSbiStore(),
devices: store.NewDeviceStore(),
}
if tt.name != "fails empty" {
if err := pnd.addSbi(&OpenConfig{id: defaultSbiID}); err != nil {
t.Error(err)
}
}
if err := pnd.RemoveSbi(tt.args.id); (err != nil) != tt.wantErr {
t.Errorf("RemoveSbi() error = %v, wantErr %v", err, tt.wantErr)
}
t.Errorf("RemoveDevice() SBI still in SBI store %v", pnd.sbic)
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
}
})
}
}
func Test_pndImplementation_Request(t *testing.T) {
type args struct {
uuid uuid.UUID
path string
rErr error
}
tests := []struct {
name string
args args
wantErr bool
}{
{
name: "default",
args: args{
uuid: mdid,
path: "",
rErr: nil,
},
wantErr: false,
},
{
name: "error",
args: args{
uuid: did,
path: "",
rErr: errors.New("deliberate test fail"),
},
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
deviceWithMockTransport := mockDevice()
tr := deviceWithMockTransport.Transport().(*mocks.Transport)
tr.On("Get", mockContext, mock.Anything).Return(&gpb.GetResponse{}, tt.args.rErr)
tr.On("ProcessResponse", mock.Anything, mock.Anything, mock.Anything).Return(tt.args.rErr)
_, err := pnd.Request(tt.args.uuid, tt.args.path)
if (err != nil) != tt.wantErr {
t.Errorf("Request() error = %v, wantErr %v", err, tt.wantErr)
}
if err := pnd.devices.Delete(mdid); err != nil {
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
})
}
}
func Test_pndImplementation_RequestAll(t *testing.T) {
type args struct {
uuid uuid.UUID
path string
rErr error
}
tests := []struct {
name string
args args
wantErr bool
}{
{
name: "default",
args: args{
uuid: mdid,
path: "",
rErr: nil,
},
wantErr: false,
},
{
name: "error",
args: args{
path: "",
rErr: errors.New("deliberate test fail"),
},
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
deviceWithMockTransport := mockDevice()
tr := deviceWithMockTransport.Transport().(*mocks.Transport)
tr.On("Get", mockContext, mock.Anything).Return(&gpb.GetResponse{}, tt.args.rErr)
tr.On("ProcessResponse", mock.Anything, mock.Anything, mock.Anything).Return(tt.args.rErr)
if err := pnd.RequestAll(tt.args.path); (err != nil) != tt.wantErr {
t.Errorf("RequestAll() error = %v, wantErr %v", err, tt.wantErr)
}
if err := pnd.devices.Delete(mdid); err != nil {
func Test_pndImplementation_ChangeOND(t *testing.T) {
opts := &tpb.TransportOption{
TransportOption: &tpb.TransportOption_GnmiTransportOption{
GnmiTransportOption: &tpb.GnmiTransportOption{},
},
path string
value []string
}
tests := []struct {
name string
args args
wantErr bool
}{
path: "/system/config/hostname",
value: []string{"ceos3000"},
},
wantErr: false,
},
{
path: "/system/config/hostname",
value: []string{"ceos3000"},
},
wantErr: false,
},
{
path: "/system/config/hostname",
},
wantErr: false,
},
{
path: "/system/config/hostname",
value: []string{"ceos3000"},
},
wantErr: false,
},
// Negative test cases
{
},
wantErr: true,
},
{
path: "/system/config/hostname",
value: []string{"ceos3000", "ceos3001"},
},
wantErr: true,
},
path: "/system/config/hostname",
},
wantErr: true,
},
{
path: "/system/config/hostname",
},
wantErr: true,
},
},
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
pnd := newPnd()
if err := pnd.addSbi(&OpenConfig{id: defaultSbiID}); err != nil {
t.Error(err)
}
if err := pnd.AddDevice("testdevice", opts, defaultSbiID); err != nil {
t.Error(err)
return
}
did, ok := pnd.devices.DeviceNameToUUIDLookup["testdevice"]
if !ok {
err := errors.New("error fetching device")
t.Error(err)
return
}
_, err := pnd.ChangeOND(did, tt.args.operation, tt.args.path, tt.args.value...)
if (err != nil) != tt.wantErr {
t.Errorf("ChangeOND() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !tt.wantErr {
if len(pnd.changes.Store) != 1 {
t.Errorf("ChangeOND() unexpected change count. got %v, want 1", len(pnd.changes.Store))
func Test_pndImplementation_GetDevice(t *testing.T) {
sbi := NewSBI(spb.Type_OPENCONFIG)
d, err := NewDevice("", newGnmiTransportOptions(), sbi)
if err != nil {
t.Error(err)
return
}
if err = pnd.addDevice(d); err != nil {
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
t.Error(err)
return
}
type args struct {
uuid uuid.UUID
}
tests := []struct {
name string
args args
want ygot.GoStruct
wantErr bool
}{
{
name: "default",
args: args{uuid: d.ID()},
want: sbi.Schema().Root,
wantErr: false,
},
{
name: "device not found",
args: args{uuid: mdid},
want: nil,
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
foundDevice, err := pnd.GetDevice(tt.args.uuid.String())
if (err != nil) != tt.wantErr {
t.Errorf("GetDevice() error = %v, wantErr %v", err, tt.wantErr)
return
}
if foundDevice != nil {
if !reflect.DeepEqual(foundDevice.(device.Device).Model(), tt.want) {
t.Errorf("GetDevice() got = %v, want %v", foundDevice.(device.Device).Model(), tt.want)
})
}
}
func Test_pndImplementation_GetDeviceByName(t *testing.T) {
p := newPnd()
sbi := NewSBI(spb.Type_OPENCONFIG)
d, err := NewDevice("my-device", newGnmiTransportOptions(), sbi)
if err != nil {
t.Error(err)
return
}
if err = p.addDevice(d); err != nil {
t.Error(err)
return
}
type args struct {
name string
}
tests := []struct {
name string
args args
want ygot.GoStruct
wantErr bool
}{
{
name: "default",
want: sbi.Schema().Root,
wantErr: false,
},
{
name: "device not found",
args: args{name: "test-device"},
want: nil,
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
foundDevice, err := p.GetDevice(tt.args.name)
if (err != nil) != tt.wantErr {
t.Errorf("GetDeviceByName() error = %v, wantErr %v", err, tt.wantErr)
return
}
if foundDevice != nil {
if !reflect.DeepEqual(foundDevice.(device.Device).Model(), tt.want) {
t.Errorf("GetDeviceByName() got = %v, want %v", foundDevice.(device.Device).Model(), tt.want)
})
}
}
func Test_pndImplementation_Confirm(t *testing.T) {
tests := []struct {
name string
wantErr bool
}{
{
name: "default",
wantErr: false,
},
{
name: "uncommitted",
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
pnd := newPnd()
d := mockDevice()
tr.On("Set", mockContext, mock.Anything, mock.Anything).Return(nil)
_, err := pnd.ChangeOND(d.ID(), ppb.ApiOperation_UPDATE, "system/config/hostname", "ceos3000")
if err != nil {
if tt.name != "uncommitted" {
if err := pnd.Commit(u); (err != nil) != tt.wantErr {
t.Errorf("Confirm() error = %v, wantErr %v", err, tt.wantErr)
return
}
}
if err := pnd.Confirm(u); (err != nil) != tt.wantErr {
t.Errorf("Confirm() error = %v, wantErr %v", err, tt.wantErr)
}
})
}
}
func Test_pndImplementation_PendingChanges(t *testing.T) {
testName := t.Name()
callback := func(first ygot.GoStruct, second ygot.GoStruct) error {
log.Infof("callback in test %v", testName)
return nil
}
pending := NewChange(did, &openconfig.Device{}, &openconfig.Device{}, callback)
if err := store.Add(pending); err != nil {
t.Error(err)
return
}
tests := []struct {
name string
want []uuid.UUID
}{
{
name: "default",
want: []uuid.UUID{pending.cuid},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
pnd := newPnd()
if got := pnd.PendingChanges(); !reflect.DeepEqual(got, tt.want) {
t.Errorf("pndImplementation.PendingChanges() = %v, want %v", got, tt.want)
}
})
}
}
func Test_pndImplementation_CommittedChanges(t *testing.T) {
testName := t.Name()
callback := func(first ygot.GoStruct, second ygot.GoStruct) error {
log.Infof("callback in test %v", testName)
return nil
}
committed := NewChange(did, &openconfig.Device{}, &openconfig.Device{}, callback)
if err := committed.Commit(); err != nil {
t.Error(err)
return
}
if err := store.Add(committed); err != nil {
t.Error(err)
return
}
tests := []struct {
name string
want []uuid.UUID
}{
{
name: "default",
want: []uuid.UUID{committed.cuid},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
pnd := newPnd()
if got := pnd.CommittedChanges(); !reflect.DeepEqual(got, tt.want) {
t.Errorf("pndImplementation.CommittedChanges() = %v, want %v", got, tt.want)
}
})
}
}
func Test_pndImplementation_ConfirmedChanges(t *testing.T) {
testName := t.Name()
callback := func(first ygot.GoStruct, second ygot.GoStruct) error {
log.Infof("callback in test %v", testName)
return nil
}
confirmed := NewChange(did, &openconfig.Device{}, &openconfig.Device{}, callback)
if err := confirmed.Commit(); err != nil {
t.Error(err)
return
}
if err := confirmed.Confirm(); err != nil {
t.Error(err)
return
}
if err := store.Add(confirmed); err != nil {
t.Error(err)
return
}
tests := []struct {
name string
want []uuid.UUID
}{
{
name: "default",
want: []uuid.UUID{confirmed.cuid},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
pnd := newPnd()
if got := pnd.ConfirmedChanges(); !reflect.DeepEqual(got, tt.want) {
t.Errorf("pndImplementation.ConfirmedChanges() = %v, want %v", got, tt.want)
}
})
}
}