Newer
Older
"code.fbi.h-da.de/danet/gosdn/interfaces/southbound"
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/mocks"
"code.fbi.h-da.de/danet/yang-models/generated/openconfig"
gpb "github.com/openconfig/gnmi/proto/gnmi"
"github.com/openconfig/goyang/pkg/yang"
"github.com/openconfig/ygot/ytypes"
"github.com/stretchr/testify/mock"
)
// testSetupGnmi bootstraps tests for gnmi transport
func testSetupGnmi() {
// TODO: Set sane defaults
gnmiConfig = &gnmi.Config{
Username: "test",
Password: "test",
Addr: "localhost:13371",
Encoding: gpb.Encoding_PROTO,
}
startGnmiTarget = make(chan string)
stopGnmiTarget = make(chan bool)
go targetRunner()
}
func TestGnmi_Capabilities(t *testing.T) {
capabilityResponse := &gpb.CapabilityResponse{
SupportedModels: nil,
SupportedEncodings: []gpb.Encoding{gpb.Encoding_PROTO, gpb.Encoding_JSON_IETF, gpb.Encoding_JSON},
GNMIVersion: "0.6.0",
Extension: nil,
}
capabilityRequest := &gpb.CapabilityRequest{}
transport.client.(*mocks.GNMIClient).
On("NewContext", mockContext, mock.Anything).
Return(mockContext)
transport.client.(*mocks.GNMIClient).
On("Capabilities", mockContext, capabilityRequest).
Return(capabilityResponse, nil)
}
tests := []struct {
name string
fields fields
args args
want *gpb.CapabilityResponse
wantErr bool
}{
{
fields: fields{transport: &transport},
endpoint: gnmiConfig.Addr,
want: capabilityResponse,
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if tt.args.runEndpoint {
startGnmiTarget <- tt.args.endpoint
}
got, err := tt.fields.transport.Capabilities(context.Background())
if (err != nil) != tt.wantErr {
t.Errorf("Capabilities() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("Get() got = %v, want %v", got, tt.want)
if tt.args.runEndpoint {
stopGnmiTarget <- true
}
})
}
}
func TestGnmi_Close(t *testing.T) {
type fields struct {
SetNode func(schema *yang.Entry, root interface{}, path *gpb.Path, val interface{}, opts ...ytypes.SetNodeOpt) error
RespChan chan *gpb.SubscribeResponse
}
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) {
g := &Gnmi{
SetNode: tt.fields.SetNode,
RespChan: tt.fields.RespChan,
}
if err := g.Close(); (err != nil) != tt.wantErr {
t.Errorf("Close() error = %v, wantErr %v", err, tt.wantErr)
}
})
}
}
func TestGnmi_Get(t *testing.T) {
getRequest := &gpb.GetRequest{
Prefix: nil,
Path: nil,
Type: 0,
Encoding: 0,
UseModels: nil,
Extension: nil,
}
getResponse := &gpb.GetResponse{
Notification: nil,
Error: nil,
Extension: nil,
}
transport.client.(*mocks.GNMIClient).
On("NewContext", mockContext, mock.Anything).
Return(mockContext)
transport.client.(*mocks.GNMIClient).
On("NewGetRequest", mockContext, mock.Anything, mock.Anything).
Return(getRequest, nil)
transport.client.(*mocks.GNMIClient).
On("Get", mockContext, mock.Anything).
Return(getResponse, nil)
}
tests := []struct {
name string
fields fields
args args
want interface{}
wantErr bool
}{
fields: fields{&Gnmi{}},
args: args{
params: nil,
},
fields: fields{transport: &transport},
args: args{},
want: getResponse,
fields: fields{transport: &transport},
args: args{
runEndpoint: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if tt.args.runEndpoint {
got, err := tt.fields.transport.Get(context.Background(), tt.args.params...)
if (err != nil) != tt.wantErr {
t.Errorf("Get() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("Get() got = %v, want %v", got, tt.want)
}
if tt.args.runEndpoint {
stopGnmiTarget <- true
}
})
}
}
func TestGnmi_ProcessResponse(t *testing.T) {
type fields struct {
root interface{}
}
tests := []struct {
name string
fields fields
args args
wantErr bool
}{
name: "Interfaces Interface",
fields: fields{Sbi: &OpenConfig{}},
path: "../test/proto/resp-interfaces-interface-arista-ceos",
fields: fields{Sbi: &OpenConfig{}},
args: args{
path: "../test/proto/resp-interfaces-wildcard",
root: &openconfig.Device{},
},
wantErr: false,
},
{
fields: fields{Sbi: &OpenConfig{}},
args: args{
path: "../test/proto/resp-full-node-arista-ceos",
root: &openconfig.Device{},
},
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
g := &Gnmi{
SetNode: tt.fields.Sbi.SetNode,
Unmarshal: tt.fields.Sbi.(*OpenConfig).Unmarshal,
if err := g.ProcessResponse(resp, tt.args.root, s); (err != nil) != tt.wantErr {
t.Errorf("ProcessResponse() error = %v, wantErr %v", err, tt.wantErr)
}
})
}
}
func TestGnmi_Set(t *testing.T) {
type fields struct {
}
tests := []struct {
name string
fields fields
args args
wantErr bool
}{
{
name: "uninitialised",
fields: fields{&Gnmi{}},
args: args{
},
wantErr: true,
},
// TODO: Positive test cases
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
err := tt.fields.transport.Set(context.Background(), tt.args.payload)
if (err != nil) != tt.wantErr {
t.Errorf("Set() error = %v, wantErr %v", err, tt.wantErr)
}
})
}
}
func TestGnmi_Subscribe(t *testing.T) {
type fields struct {
SetNode func(schema *yang.Entry, root interface{}, path *gpb.Path, val interface{}, opts ...ytypes.SetNodeOpt) error
RespChan chan *gpb.SubscribeResponse
}
type args struct {
ctx context.Context
params []string
}
tests := []struct {
name string
fields fields
args args
wantErr bool
}{
{name: "nil client", fields: fields{}, args: args{}, wantErr: true},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if err := g.Subscribe(tt.args.ctx, tt.args.params...); (err != nil) != tt.wantErr {
t.Errorf("Subscribe() error = %v, wantErr %v", err, tt.wantErr)
}
})
}
}
func TestGnmi_Type(t *testing.T) {
type fields struct {
SetNode func(schema *yang.Entry, root interface{}, path *gpb.Path, val interface{}, opts ...ytypes.SetNodeOpt) error
RespChan chan *gpb.SubscribeResponse
}
tests := []struct {
name string
fields fields
want string
}{
{name: "dummy", fields: fields{}, want: "gnmi"},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
g := &Gnmi{
SetNode: tt.fields.SetNode,
RespChan: tt.fields.RespChan,
}
if got := g.Type(); got != tt.want {
t.Errorf("Type() = %v, want %v", got, tt.want)
}
})
}
}
func TestGnmi_getWithRequest(t *testing.T) {
reqFullNode := gnmiMessages["../test/proto/req-full-node"].(*gpb.GetRequest)
reqInterfacesWildcard := gnmiMessages["../test/proto/req-interfaces-wildcard"].(*gpb.GetRequest)
respFullNode := gnmiMessages["../test/proto/resp-full-node"].(*gpb.GetResponse)
respInterfacesWildcard := gnmiMessages["../test/proto/resp-interfaces-wildcard"].(*gpb.GetResponse)
transport.client.(*mocks.GNMIClient).
On("Get", mockContext, reqFullNode).
Return(respFullNode, nil)
transport.client.(*mocks.GNMIClient).
On("Get", mockContext, reqInterfacesWildcard).
Return(respInterfacesWildcard, nil)
transport.client.(*mocks.GNMIClient).
On("Get", mockContext, mock.Anything).
Return(nil, errors.New("expected mock gnmi error"))
}
tests := []struct {
name string
fields fields
args args
want interface{}
wantErr bool
}{
fields: fields{transport: &transport},
name: "getInterfacesWildcard",
fields: fields{transport: &transport},
args: args{
request: reqInterfacesWildcard,
},
{
name: "invalid request",
fields: fields{transport: &transport},
args: args{
request: nil,
runEndpoint: false,
},
want: nil,
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := tt.fields.transport.getWithRequest(context.Background(), tt.args.request)
if (err != nil) != tt.wantErr {
t.Errorf("getWithRequest() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("getWithRequest() got = %v, want %v", got, tt.want)
}
})
}
}
func TestNewGnmiTransport(t *testing.T) {
type args struct {
}
tests := []struct {
name string
args args
want *Gnmi
wantErr bool
}{
{
name: "unsupported compression",
args: args{
opts: &tpb.TransportOption{
TransportOption: &tpb.TransportOption_GnmiTransportOption{
GnmiTransportOption: &tpb.GnmiTransportOption{
Compression: "brotli",
},
}}},
want: nil,
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if tt.name == "default" {
startGnmiTarget <- gnmiConfig.Addr
}
got, err := newGnmiTransport(tt.args.opts, NewSBI(spb.Type_OPENCONFIG))
if (err != nil) != tt.wantErr {
t.Errorf("NewGnmiTransport() error = %v, wantErr %v", err, tt.wantErr)
return
}
if tt.name == "default" && got != nil {
tt.want.client = got.client
tt.want.config = got.config
tt.want.SetNode = got.SetNode
tt.want.RespChan = got.RespChan
t.Errorf("NewGnmiTransport() got = %#v, want %#v", got, tt.want)
}
if tt.name == "default" {
stopGnmiTarget <- true
}
})
}