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

Add more topology northbound tests

parent 66e97519
No related branches found
No related tags found
5 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,!324Provide prototype implementation for topology handling
Pipeline #109283 passed
This commit is part of merge request !343. Comments created here will be created in the context of that merge request.
...@@ -36,7 +36,7 @@ func NewTopologyServer( ...@@ -36,7 +36,7 @@ func NewTopologyServer(
} }
// AddLink adds a new link to the topology // AddLink adds a new link to the topology
func (t Topology) AddLink(ctx context.Context, request *apb.AddLinkRequest) (*apb.AddLinkResponse, error) { func (t *Topology) AddLink(ctx context.Context, request *apb.AddLinkRequest) (*apb.AddLinkResponse, error) {
sourceNode, sourcePort, err := t.ensureNodeAndPortExists(request.Link.SourceNode, request.Link.SourcePort) sourceNode, sourcePort, err := t.ensureNodeAndPortExists(request.Link.SourceNode, request.Link.SourcePort)
if err != nil { if err != nil {
return nil, status.Errorf(codes.Aborted, "%v", err) return nil, status.Errorf(codes.Aborted, "%v", err)
...@@ -67,7 +67,7 @@ func (t Topology) AddLink(ctx context.Context, request *apb.AddLinkRequest) (*ap ...@@ -67,7 +67,7 @@ func (t Topology) AddLink(ctx context.Context, request *apb.AddLinkRequest) (*ap
} }
// GetTopology returns the current topology in the form of all links // GetTopology returns the current topology in the form of all links
func (t Topology) GetTopology(ctx context.Context, request *apb.GetTopologyRequest) (*apb.GetTopologyResponse, error) { func (t *Topology) GetTopology(ctx context.Context, request *apb.GetTopologyRequest) (*apb.GetTopologyResponse, error) {
topo, err := t.topologyService.GetAll() topo, err := t.topologyService.GetAll()
if err != nil { if err != nil {
return nil, status.Errorf(codes.Aborted, "%v", err) return nil, status.Errorf(codes.Aborted, "%v", err)
...@@ -103,7 +103,7 @@ func (t Topology) GetTopology(ctx context.Context, request *apb.GetTopologyReque ...@@ -103,7 +103,7 @@ func (t Topology) GetTopology(ctx context.Context, request *apb.GetTopologyReque
}, nil }, nil
} }
func (t Topology) ensureNodeAndPortExists(incomingNode *apb.Node, incomingPort *apb.Port) (nodes.Node, ports.Port, error) { func (t *Topology) ensureNodeAndPortExists(incomingNode *apb.Node, incomingPort *apb.Port) (nodes.Node, ports.Port, error) {
node, err := t.nodeService.EnsureExists( node, err := t.nodeService.EnsureExists(
nodes.Node{ nodes.Node{
ID: getExistingOrCreateNewUUIDFromString(incomingNode.Id), ID: getExistingOrCreateNewUUIDFromString(incomingNode.Id),
......
...@@ -12,6 +12,7 @@ import ( ...@@ -12,6 +12,7 @@ import (
"code.fbi.h-da.de/danet/gosdn/controller/topology/nodes" "code.fbi.h-da.de/danet/gosdn/controller/topology/nodes"
"code.fbi.h-da.de/danet/gosdn/controller/topology/ports" "code.fbi.h-da.de/danet/gosdn/controller/topology/ports"
"code.fbi.h-da.de/danet/gosdn/controller/topology/store" "code.fbi.h-da.de/danet/gosdn/controller/topology/store"
"github.com/google/uuid" "github.com/google/uuid"
) )
...@@ -48,16 +49,21 @@ func getTestTopologyService() topology.Service { ...@@ -48,16 +49,21 @@ func getTestTopologyService() topology.Service {
return topologyService return topologyService
} }
func getTestTopologyServer() *Topology { func getTestTopologyServer(
t *testing.T,
nodesToAdd []nodes.Node,
portsToAdd []ports.Port,
linksToAdd []links.Link,
) *Topology {
eventService := eventservice.NewMockEventService() eventService := eventservice.NewMockEventService()
nodeStore := store.NewGenericStore[nodes.Node]() nodeStore := getTestStoreWithNodes(t, nodesToAdd)
nodeService := nodes.NewNodeService(nodeStore, eventService) nodeService := nodes.NewNodeService(nodeStore, eventService)
portStore := store.NewGenericStore[ports.Port]() portStore := getTestStoreWithPorts(t, portsToAdd)
portService := ports.NewPortService(portStore, eventService) portService := ports.NewPortService(portStore, eventService)
linkStore := store.NewGenericStore[links.Link]() linkStore := getTestStoreWithLinks(t, linksToAdd)
topologyService := topology.NewTopologyService(linkStore, nodeService, portService, eventService) topologyService := topology.NewTopologyService(linkStore, nodeService, portService, eventService)
s := NewTopologyServer(topologyService, nodeService, portService) s := NewTopologyServer(topologyService, nodeService, portService)
...@@ -65,6 +71,84 @@ func getTestTopologyServer() *Topology { ...@@ -65,6 +71,84 @@ func getTestTopologyServer() *Topology {
return s return s
} }
func getTestSourceNode() nodes.Node {
return nodes.Node{
ID: uuid.MustParse("44fb4aa4-c53c-4cf9-a081-5aabc61c7610"),
Name: "Test-Source-Node",
}
}
func getTestTargetNode() nodes.Node {
return nodes.Node{
ID: uuid.MustParse("44fb4aa4-c53c-4cf9-a081-5aabc61c7612"),
Name: "Test-Target-Node",
}
}
func getTestSourcePort() ports.Port {
return ports.Port{
ID: uuid.MustParse("1fa479e7-d393-4d45-822d-485cc1f05fce"),
Name: "Test-Source-Port",
}
}
func getTestTargetPort() ports.Port {
return ports.Port{
ID: uuid.MustParse("1fa479e7-d393-4d45-822d-485cc1f05fc2"),
Name: "Test-Target-Port",
}
}
func getTestLinkInternal() links.Link {
return links.Link{
ID: uuid.MustParse("5eb474f1-428e-4503-ba68-dcf9bef53467"),
Name: "Test-Link",
SourceNode: getTestSourceNode(),
TargetNode: getTestTargetNode(),
SourcePort: getTestSourcePort(),
TargetPort: getTestTargetPort(),
}
}
func getTestStoreWithLinks(t *testing.T, nodes []links.Link) topology.Store {
store := store.NewGenericStore[links.Link]()
for _, node := range nodes {
err := store.Add(node)
if err != nil {
t.Fatalf("failed to prepare test store while adding node: %v", err)
}
}
return store
}
func getTestStoreWithNodes(t *testing.T, nodesToAdd []nodes.Node) nodes.Store {
store := store.NewGenericStore[nodes.Node]()
for _, node := range nodesToAdd {
err := store.Add(node)
if err != nil {
t.Fatalf("failed to prepare test store while adding node: %v", err)
}
}
return store
}
func getTestStoreWithPorts(t *testing.T, portsToAdd []ports.Port) ports.Store {
store := store.NewGenericStore[ports.Port]()
for _, port := range portsToAdd {
err := store.Add(port)
if err != nil {
t.Fatalf("failed to prepare test store while adding port: %v", err)
}
}
return store
}
func getTestLink() *apb.Link { func getTestLink() *apb.Link {
return &apb.Link{ return &apb.Link{
Name: "test-link", Name: "test-link",
...@@ -96,7 +180,11 @@ func TestNewTopologyServer(t *testing.T) { ...@@ -96,7 +180,11 @@ func TestNewTopologyServer(t *testing.T) {
nodeService: getTestNodeService(), nodeService: getTestNodeService(),
portService: getTestPortService(), portService: getTestPortService(),
}, },
want: getTestTopologyServer(), want: &Topology{
topologyService: getTestTopologyService(),
nodeService: getTestNodeService(),
portService: getTestPortService(),
},
}, },
} }
for _, tt := range tests { for _, tt := range tests {
...@@ -109,18 +197,29 @@ func TestNewTopologyServer(t *testing.T) { ...@@ -109,18 +197,29 @@ func TestNewTopologyServer(t *testing.T) {
} }
func TestTopology_AddLink(t *testing.T) { func TestTopology_AddLink(t *testing.T) {
type fields struct {
ports []ports.Port
nodes []nodes.Node
links []links.Link
}
type args struct { type args struct {
ctx context.Context ctx context.Context
request *apb.AddLinkRequest request *apb.AddLinkRequest
} }
tests := []struct { tests := []struct {
name string name string
fields fields
args args args args
want *apb.AddLinkResponse want *apb.AddLinkResponse
wantErr bool wantErr bool
}{ }{
{ {
name: "should add a new link", name: "should add a new link",
fields: fields{
ports: []ports.Port{},
nodes: []nodes.Node{},
links: []links.Link{},
},
args: args{ args: args{
ctx: context.TODO(), ctx: context.TODO(),
request: &apb.AddLinkRequest{ request: &apb.AddLinkRequest{
...@@ -135,7 +234,7 @@ func TestTopology_AddLink(t *testing.T) { ...@@ -135,7 +234,7 @@ func TestTopology_AddLink(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) {
tr := getTestTopologyServer() tr := getTestTopologyServer(t, tt.fields.nodes, tt.fields.ports, tt.fields.links)
got, err := tr.AddLink(tt.args.ctx, tt.args.request) got, err := tr.AddLink(tt.args.ctx, tt.args.request)
if (err != nil) != tt.wantErr { if (err != nil) != tt.wantErr {
t.Errorf("Topology.AddLink() error = %v, wantErr %v", err, tt.wantErr) t.Errorf("Topology.AddLink() error = %v, wantErr %v", err, tt.wantErr)
...@@ -150,10 +249,9 @@ func TestTopology_AddLink(t *testing.T) { ...@@ -150,10 +249,9 @@ func TestTopology_AddLink(t *testing.T) {
func TestTopology_GetTopology(t *testing.T) { func TestTopology_GetTopology(t *testing.T) {
type fields struct { type fields struct {
UnimplementedTopologyServiceServer apb.UnimplementedTopologyServiceServer ports []ports.Port
topologyService topology.Service nodes []nodes.Node
nodeService nodes.Service links []links.Link
portService ports.Service
} }
type args struct { type args struct {
ctx context.Context ctx context.Context
...@@ -166,88 +264,54 @@ func TestTopology_GetTopology(t *testing.T) { ...@@ -166,88 +264,54 @@ func TestTopology_GetTopology(t *testing.T) {
want *apb.GetTopologyResponse want *apb.GetTopologyResponse
wantErr bool wantErr bool
}{ }{
// TODO: Add test cases. {
name: "should add a new link",
fields: fields{
ports: []ports.Port{getTestSourcePort(), getTestTargetPort()},
nodes: []nodes.Node{getTestSourceNode(), getTestTargetNode()},
links: []links.Link{getTestLinkInternal()},
},
args: args{
ctx: context.TODO(),
request: &apb.GetTopologyRequest{},
},
want: &apb.GetTopologyResponse{
Status: apb.Status_STATUS_OK,
Toplogy: &apb.Topology{
Links: []*apb.Link{
{
Id: "5eb474f1-428e-4503-ba68-dcf9bef53467",
Name: "Test-Link",
SourceNode: &apb.Node{
Id: "44fb4aa4-c53c-4cf9-a081-5aabc61c7610", Name: "Test-Source-Node",
},
SourcePort: &apb.Port{
Id: "1fa479e7-d393-4d45-822d-485cc1f05fce",
},
TargetNode: &apb.Node{
Id: "44fb4aa4-c53c-4cf9-a081-5aabc61c7612", Name: "Test-Target-Node",
},
TargetPort: &apb.Port{
Id: "1fa479e7-d393-4d45-822d-485cc1f05fc2",
},
},
},
},
},
wantErr: false,
},
} }
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
tr := Topology{ tr := getTestTopologyServer(t, tt.fields.nodes, tt.fields.ports, tt.fields.links)
UnimplementedTopologyServiceServer: tt.fields.UnimplementedTopologyServiceServer,
topologyService: tt.fields.topologyService,
nodeService: tt.fields.nodeService,
portService: tt.fields.portService,
}
got, err := tr.GetTopology(tt.args.ctx, tt.args.request) got, err := tr.GetTopology(tt.args.ctx, tt.args.request)
if (err != nil) != tt.wantErr { if (err != nil) != tt.wantErr {
t.Errorf("Topology.GetTopology() error = %v, wantErr %v", err, tt.wantErr) t.Errorf("Topology.GetTopology() error = %v, wantErr %v", err, tt.wantErr)
return return
} }
if !reflect.DeepEqual(got, tt.want) { if !reflect.DeepEqual(got.Toplogy, tt.want.Toplogy) {
t.Errorf("Topology.GetTopology() = %v, want %v", got, tt.want) t.Errorf("Topology.GetTopology() = %v, want %v", got, tt.want)
} }
}) })
} }
} }
func TestTopology_ensureNodeAndPortExists(t *testing.T) {
type fields struct {
UnimplementedTopologyServiceServer apb.UnimplementedTopologyServiceServer
topologyService topology.Service
nodeService nodes.Service
portService ports.Service
}
type args struct {
incomingNode *apb.Node
incomingPort *apb.Port
}
tests := []struct {
name string
fields fields
args args
want nodes.Node
want1 ports.Port
wantErr bool
}{
// TODO: Add test cases.
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
tr := Topology{
UnimplementedTopologyServiceServer: tt.fields.UnimplementedTopologyServiceServer,
topologyService: tt.fields.topologyService,
nodeService: tt.fields.nodeService,
portService: tt.fields.portService,
}
got, got1, err := tr.ensureNodeAndPortExists(tt.args.incomingNode, tt.args.incomingPort)
if (err != nil) != tt.wantErr {
t.Errorf("Topology.ensureNodeAndPortExists() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("Topology.ensureNodeAndPortExists() got = %v, want %v", got, tt.want)
}
if !reflect.DeepEqual(got1, tt.want1) {
t.Errorf("Topology.ensureNodeAndPortExists() got1 = %v, want %v", got1, tt.want1)
}
})
}
}
func Test_getExistingOrCreateNewUUIDFromString(t *testing.T) {
type args struct {
id string
}
tests := []struct {
name string
args args
want uuid.UUID
}{
// TODO: Add test cases.
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := getExistingOrCreateNewUUIDFromString(tt.args.id); !reflect.DeepEqual(got, tt.want) {
t.Errorf("getExistingOrCreateNewUUIDFromString() = %v, want %v", got, tt.want)
}
})
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment