diff --git a/controller/northbound/server/topology_test.go b/controller/northbound/server/topology_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..00916e50994534309dfe112445af1e7d83a0925c
--- /dev/null
+++ b/controller/northbound/server/topology_test.go
@@ -0,0 +1,253 @@
+package server
+
+import (
+	"context"
+	"reflect"
+	"testing"
+
+	apb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/topology"
+	eventservice "code.fbi.h-da.de/danet/gosdn/controller/eventService"
+	"code.fbi.h-da.de/danet/gosdn/controller/topology"
+	"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 getTestNodeService() nodes.Service {
+	eventService := eventservice.NewMockEventService()
+
+	nodeStore := store.NewGenericStore[nodes.Node]()
+	nodeService := nodes.NewNodeService(nodeStore, eventService)
+
+	return nodeService
+}
+
+func getTestPortService() ports.Service {
+	eventService := eventservice.NewMockEventService()
+
+	portStore := store.NewGenericStore[ports.Port]()
+	portService := ports.NewPortService(portStore, eventService)
+
+	return portService
+}
+
+func getTestTopologyService() topology.Service {
+	eventService := eventservice.NewMockEventService()
+
+	nodeStore := store.NewGenericStore[nodes.Node]()
+	nodeService := nodes.NewNodeService(nodeStore, eventService)
+
+	portStore := store.NewGenericStore[ports.Port]()
+	portService := ports.NewPortService(portStore, eventService)
+
+	linkStore := store.NewGenericStore[links.Link]()
+	topologyService := topology.NewTopologyService(linkStore, nodeService, portService, eventService)
+
+	return topologyService
+}
+
+func getTestTopologyServer() *Topology {
+	eventService := eventservice.NewMockEventService()
+
+	nodeStore := store.NewGenericStore[nodes.Node]()
+	nodeService := nodes.NewNodeService(nodeStore, eventService)
+
+	portStore := store.NewGenericStore[ports.Port]()
+	portService := ports.NewPortService(portStore, eventService)
+
+	linkStore := store.NewGenericStore[links.Link]()
+	topologyService := topology.NewTopologyService(linkStore, nodeService, portService, eventService)
+
+	s := NewTopologyServer(topologyService, nodeService, portService)
+
+	return s
+}
+
+func getTestLink() *apb.Link {
+	return &apb.Link{
+		Name: "test-link",
+		SourceNode: &apb.Node{
+			Name: "test-source-node",
+		},
+		SourcePort: &apb.Port{},
+		TargetNode: &apb.Node{
+			Name: "test-target-node",
+		},
+		TargetPort: &apb.Port{},
+	}
+}
+func TestNewTopologyServer(t *testing.T) {
+	type args struct {
+		service     topology.Service
+		nodeService nodes.Service
+		portService ports.Service
+	}
+	tests := []struct {
+		name string
+		args args
+		want *Topology
+	}{
+		{
+			name: "should create a new topology service",
+			args: args{
+				service:     getTestTopologyService(),
+				nodeService: getTestNodeService(),
+				portService: getTestPortService(),
+			},
+			want: getTestTopologyServer(),
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			if got := NewTopologyServer(tt.args.service, tt.args.nodeService, tt.args.portService); !reflect.DeepEqual(got, tt.want) {
+				t.Errorf("NewTopologyServer() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func TestTopology_AddLink(t *testing.T) {
+	type args struct {
+		ctx     context.Context
+		request *apb.AddLinkRequest
+	}
+	tests := []struct {
+		name    string
+		args    args
+		want    *apb.AddLinkResponse
+		wantErr bool
+	}{
+		{
+			name: "should add a new link",
+			args: args{
+				ctx: context.TODO(),
+				request: &apb.AddLinkRequest{
+					Link: getTestLink(),
+				},
+			},
+			want: &apb.AddLinkResponse{
+				Status: apb.Status_STATUS_OK,
+			},
+			wantErr: false,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			tr := getTestTopologyServer()
+			got, err := tr.AddLink(tt.args.ctx, tt.args.request)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("Topology.AddLink() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			if !reflect.DeepEqual(got.Status, tt.want.Status) {
+				t.Errorf("Topology.AddLink() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func TestTopology_GetTopology(t *testing.T) {
+	type fields struct {
+		UnimplementedTopologyServiceServer apb.UnimplementedTopologyServiceServer
+		topologyService                    topology.Service
+		nodeService                        nodes.Service
+		portService                        ports.Service
+	}
+	type args struct {
+		ctx     context.Context
+		request *apb.GetTopologyRequest
+	}
+	tests := []struct {
+		name    string
+		fields  fields
+		args    args
+		want    *apb.GetTopologyResponse
+		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, err := tr.GetTopology(tt.args.ctx, tt.args.request)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("Topology.GetTopology() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			if !reflect.DeepEqual(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)
+			}
+		})
+	}
+}