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

Add more tests

parent f0f71bad
Branches
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 #104693 passed
...@@ -148,7 +148,7 @@ func TestNodeService_Update(t *testing.T) { ...@@ -148,7 +148,7 @@ func TestNodeService_Update(t *testing.T) {
{ {
name: "should update an existing node", name: "should update an existing node",
fields: fields{ fields: fields{
store: store.NewGenericStore[Node](), store: getTestStoreWithNodes(t, []Node{getTestNode()}),
}, },
args: args{ args: args{
node: getTestNode(), node: getTestNode(),
...@@ -194,7 +194,7 @@ func TestNodeService_Delete(t *testing.T) { ...@@ -194,7 +194,7 @@ func TestNodeService_Delete(t *testing.T) {
{ {
name: "should delete an existing node", name: "should delete an existing node",
fields: fields{ fields: fields{
store: store.NewGenericStore[Node](), store: getTestStoreWithNodes(t, []Node{getTestNode()}),
}, },
args: args{ args: args{
node: getTestNode(), node: getTestNode(),
...@@ -209,7 +209,7 @@ func TestNodeService_Delete(t *testing.T) { ...@@ -209,7 +209,7 @@ func TestNodeService_Delete(t *testing.T) {
args: args{ args: args{
node: getTestNode(), node: getTestNode(),
}, },
wantErr: false, wantErr: true,
}, },
} }
for _, tt := range tests { for _, tt := range tests {
...@@ -295,7 +295,7 @@ func TestNodeService_GetAll(t *testing.T) { ...@@ -295,7 +295,7 @@ func TestNodeService_GetAll(t *testing.T) {
wantErr bool wantErr bool
}{ }{
{ {
name: "should fail if a node does not exists", name: "should get all stored nodes",
fields: fields{ fields: fields{
store: getTestStoreWithNodes(t, []Node{getTestNode()}), store: getTestStoreWithNodes(t, []Node{getTestNode()}),
}, },
......
...@@ -148,7 +148,7 @@ func TestPortService_Update(t *testing.T) { ...@@ -148,7 +148,7 @@ func TestPortService_Update(t *testing.T) {
{ {
name: "should update an existing port", name: "should update an existing port",
fields: fields{ fields: fields{
store: store.NewGenericStore[Port](), store: getTestStoreWithPorts(t, []Port{getTestPort()}),
}, },
args: args{ args: args{
port: getTestPort(), port: getTestPort(),
...@@ -194,7 +194,7 @@ func TestPortService_Delete(t *testing.T) { ...@@ -194,7 +194,7 @@ func TestPortService_Delete(t *testing.T) {
{ {
name: "should delete an existing port", name: "should delete an existing port",
fields: fields{ fields: fields{
store: store.NewGenericStore[Port](), store: getTestStoreWithPorts(t, []Port{getTestPort()}),
}, },
args: args{ args: args{
port: getTestPort(), port: getTestPort(),
...@@ -209,7 +209,7 @@ func TestPortService_Delete(t *testing.T) { ...@@ -209,7 +209,7 @@ func TestPortService_Delete(t *testing.T) {
args: args{ args: args{
port: getTestPort(), port: getTestPort(),
}, },
wantErr: false, wantErr: true,
}, },
} }
for _, tt := range tests { for _, tt := range tests {
...@@ -295,7 +295,7 @@ func TestPortService_GetAll(t *testing.T) { ...@@ -295,7 +295,7 @@ func TestPortService_GetAll(t *testing.T) {
wantErr bool wantErr bool
}{ }{
{ {
name: "should fail if a port does not exists", name: "should get all stored ports",
fields: fields{ fields: fields{
store: getTestStoreWithPorts(t, []Port{getTestPort()}), store: getTestStoreWithPorts(t, []Port{getTestPort()}),
}, },
......
...@@ -25,7 +25,7 @@ func NewGenericStore[T storableConstraint]() *GenericStore[T] { ...@@ -25,7 +25,7 @@ func NewGenericStore[T storableConstraint]() *GenericStore[T] {
func (t *GenericStore[T]) Add(item T) error { func (t *GenericStore[T]) Add(item T) error {
_, ok := t.Store[item.GetID()] _, ok := t.Store[item.GetID()]
if ok { if ok {
return errors.New("item not found") return errors.New("item already exists")
} }
t.Store[item.GetID()] = item t.Store[item.GetID()] = item
...@@ -35,7 +35,7 @@ func (t *GenericStore[T]) Add(item T) error { ...@@ -35,7 +35,7 @@ func (t *GenericStore[T]) Add(item T) error {
func (t *GenericStore[T]) Update(item T) error { func (t *GenericStore[T]) Update(item T) error {
_, ok := t.Store[item.GetID()] _, ok := t.Store[item.GetID()]
if ok { if !ok {
return errors.New("item not found") return errors.New("item not found")
} }
...@@ -46,7 +46,7 @@ func (t *GenericStore[T]) Update(item T) error { ...@@ -46,7 +46,7 @@ func (t *GenericStore[T]) Update(item T) error {
func (t *GenericStore[T]) Delete(item T) error { func (t *GenericStore[T]) Delete(item T) error {
_, ok := t.Store[item.GetID()] _, ok := t.Store[item.GetID()]
if ok { if !ok {
return errors.New("item not found") return errors.New("item not found")
} }
......
package topology package topology
import "code.fbi.h-da.de/danet/gosdn/controller/topology/links" import (
"code.fbi.h-da.de/danet/gosdn/controller/topology/links"
"code.fbi.h-da.de/danet/gosdn/controller/topology/store"
)
// Service defines an interface for a Service // Service defines an interface for a Service
type Service interface { type Service interface {
AddLink(links.Link) error AddLink(links.Link) error
UpdateLink(links.Link) error UpdateLink(links.Link) error
DeleteLink(links.Link) error DeleteLink(links.Link) error
Get(store.Query) (links.Link, error)
GetAll() ([]links.Link, error) GetAll() ([]links.Link, error)
} }
...@@ -60,3 +64,13 @@ func (t *service) GetAll() ([]links.Link, error) { ...@@ -60,3 +64,13 @@ func (t *service) GetAll() ([]links.Link, error) {
} }
return topo, nil return topo, nil
} }
// GetAll returns the current topology
func (t *service) Get(query store.Query) (links.Link, error) {
link, err := t.store.Get(query)
if err != nil {
return link, err
}
return link, nil
}
package topology
import (
"reflect"
"testing"
"code.fbi.h-da.de/danet/gosdn/controller/topology/links"
"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/store"
"github.com/google/uuid"
)
func getTestNode() nodes.Node {
return nodes.Node{
ID: uuid.MustParse("44fb4aa4-c53c-4cf9-a081-5aabc61c7610"),
Name: "Test-Node",
}
}
func getTestPort() ports.Port {
return ports.Port{
ID: uuid.MustParse("1fa479e7-d393-4d45-822d-485cc1f05fce"),
Name: "Test-Port",
}
}
func getTestLink() links.Link {
return links.Link{
ID: uuid.MustParse("5eb474f1-428e-4503-ba68-dcf9bef53467"),
Name: "Test-Link",
SourceNode: getTestNode(),
TargetNode: nodes.Node{
ID: uuid.MustParse("44fb4aa4-c53c-4cf9-a081-5aabc61c7612"),
Name: "Test-Node",
},
SourcePort: getTestPort(),
TargetPort: ports.Port{
ID: uuid.MustParse("1fa479e7-d393-4d45-822d-485cc1f05fc2"),
Name: "Test-Port",
},
}
}
func getEmptyLink() links.Link {
return links.Link{}
}
func getTestStoreWithLinks(t *testing.T, nodes []links.Link) 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 TestNewTopologyService(t *testing.T) {
type args struct {
store Store
}
tests := []struct {
name string
args args
want Service
}{
{
name: "should create a new topology service",
args: args{
store: getTestStoreWithLinks(t, []links.Link{}),
},
want: NewTopologyService(getTestStoreWithLinks(t, []links.Link{})),
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := NewTopologyService(tt.args.store); !reflect.DeepEqual(got, tt.want) {
t.Errorf("NewNodeService() = %v, want %v", got, tt.want)
}
})
}
}
func TestTopologyService_AddLink(t *testing.T) {
type fields struct {
store Store
}
type args struct {
link links.Link
}
tests := []struct {
name string
fields fields
args args
want links.Link
wantErr bool
}{
{
name: "should add a link to the store",
fields: fields{
store: store.NewGenericStore[links.Link](),
},
args: args{
link: getTestLink(),
},
want: getTestLink(),
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
p := &service{
store: tt.fields.store,
}
err := p.AddLink(tt.args.link)
if (err != nil) != tt.wantErr {
t.Errorf("service.AddLink() error = %v, wantErr %v", err, tt.wantErr)
return
}
got, err := p.Get(store.Query{ID: tt.args.link.ID})
if (err != nil) != tt.wantErr {
t.Errorf("service.Get() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("service.Get() = %v, want %v", got, tt.want)
}
})
}
}
func TestTopologyService_Update(t *testing.T) {
type fields struct {
store Store
}
type args struct {
link links.Link
}
tests := []struct {
name string
fields fields
args args
want links.Link
wantErr bool
}{
{
name: "should update an existing link",
fields: fields{
store: getTestStoreWithLinks(t, []links.Link{getTestLink()}),
},
args: args{
link: getTestLink(),
},
want: getTestLink(),
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
p := &service{
store: tt.fields.store,
}
err := p.UpdateLink(tt.args.link)
if (err != nil) != tt.wantErr {
t.Errorf("service.Update() error = %v, wantErr %v", err, tt.wantErr)
return
}
got, err := p.Get(store.Query{ID: tt.args.link.ID})
if (err != nil) != tt.wantErr {
t.Errorf("service.Get() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("service.Get() = %v, want %v", got, tt.want)
}
})
}
}
func TestNodeService_Delete(t *testing.T) {
type fields struct {
store Store
}
type args struct {
link links.Link
}
tests := []struct {
name string
fields fields
args args
want links.Link
wantErr bool
}{
{
name: "should delete an existing link",
fields: fields{
store: getTestStoreWithLinks(t, []links.Link{getTestLink()}),
},
args: args{
link: getTestLink(),
},
wantErr: false,
},
{
name: "should fail if a node does not exists",
fields: fields{
store: store.NewGenericStore[links.Link](),
},
args: args{
link: getTestLink(),
},
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
p := &service{
store: tt.fields.store,
}
if err := p.DeleteLink(tt.args.link); (err != nil) != tt.wantErr {
t.Errorf("service.Delete() error = %v, wantErr %v", err, tt.wantErr)
}
})
}
}
func TestTopologyService_Get(t *testing.T) {
type fields struct {
store Store
}
type args struct {
query store.Query
}
tests := []struct {
name string
fields fields
args args
want links.Link
wantErr bool
}{
{
name: "should error if link with uuid is not in store",
fields: fields{
store: getTestStoreWithLinks(t, []links.Link{}),
},
args: args{
query: store.Query{
ID: getTestLink().ID,
Name: getTestLink().Name,
},
},
want: getEmptyLink(),
wantErr: true,
},
{
name: "should return link that is in the store",
fields: fields{
store: getTestStoreWithLinks(t, []links.Link{getTestLink()}),
},
args: args{
query: store.Query{
ID: getTestLink().ID,
Name: getTestLink().Name,
},
},
want: getTestLink(),
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
p := &service{
store: tt.fields.store,
}
got, err := p.Get(tt.args.query)
if (err != nil) != tt.wantErr {
t.Errorf("service.Get() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("service.Get() = %v, want %v", got, tt.want)
}
})
}
}
func TestTopologyService_GetAll(t *testing.T) {
type fields struct {
store Store
}
tests := []struct {
name string
fields fields
want []links.Link
wantErr bool
}{
{
name: "should get all stored links",
fields: fields{
store: getTestStoreWithLinks(t, []links.Link{getTestLink()}),
},
want: []links.Link{getTestLink()},
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
p := &service{
store: tt.fields.store,
}
got, err := p.GetAll()
if (err != nil) != tt.wantErr {
t.Errorf("service.GetAll() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("service.GetAll() = %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