Skip to content
Snippets Groups Projects
application_test.go 7.5 KiB
Newer Older
  • Learn to ignore specific revisions
  • package integration_test_application
    
    import (
    	"context"
    	"fmt"
    	"os"
    	"testing"
    
    	"code.fbi.h-da.de/danet/gosdn/api/go/gosdn/conflict"
    	mnepb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/networkelement"
    	apb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/rbac"
    	tpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/transport"
    	"code.fbi.h-da.de/danet/gosdn/application-framework/event"
    	integration_test_utils "code.fbi.h-da.de/danet/gosdn/integration-tests/integrationTestUtils"
    
    	"google.golang.org/grpc"
    )
    
    // Notes:
    // When adding tests take into account all the messages that get added to the message
    // queues during test setups and actual test cases. So make sure to read from the according eventChannels
    // of the application.
    //
    // Do not reset test setup in this because it causes weird interactions between test cases and RabbitMQ message queues.
    // Reason for that is that cleanup creates messages to be put into the queues of RabbitMQ.
    
    const targetAAdress = "gnmi-target_A:7030"
    const targetUserAndPW = "admin"
    const pndID = "5f20f34b-cbd0-4511-9ddc-c50cf6a3b49d"
    const pluginID = "d1c269a2-6482-4010-b0d8-679dff73153b"
    const mneID = "9ee7bf15-15ff-44b8-aafa-035487d1e97f"
    
    const userID = "23224223-aeb6-433b-a797-2d671d7424f0"
    const roleID = "679f7982-d740-452e-b78d-c1d133233694"
    
    // The connection to the controller to use in each test.
    var conn *grpc.ClientConn
    
    // The context containing the credentials when authenticated.
    var ctx context.Context
    
    // A defaultSDN config with default/empty values.
    var defaultSDNConfig string
    
    var application *Application
    
    func TestMain(m *testing.M) {
    	localConn, localCtx, err := integration_test_utils.CreateSecureConnection()
    	if err != nil {
    		fmt.Println(err.Error())
    	}
    	conn = localConn
    	ctx = localCtx
    
    	sndConfig, err := integration_test_utils.ExportCurrentSDNConfig(conn, ctx)
    	defaultSDNConfig = sndConfig
    	if err != nil {
    		fmt.Println(err.Error())
    	}
    
    	topics := []event.Topic{event.ManagedNetworkElement, event.User, event.Role}
    
    	rabbitMQAddress := ""
    
    	envVarRabbitmq := os.Getenv("INTEGRATION_TEST_RABBITMQ_HOSTNAME")
    
    	if envVarRabbitmq != "" {
    		rabbitMQAddress = envVarRabbitmq
    	}
    
    
    	controllerUrl := "localhost:55055"
    	controllerEnv := os.Getenv("INTEGRATION_TEST_CONTROLLER_URL")
    	if controllerEnv != "" {
    		controllerUrl = controllerEnv
    	}
    
    	application = NewApplication(ctx, conn, controllerUrl, topics, rabbitMQAddress)
    
    
    	eventTypeCallbackTuples := []event.TypeToCallbackTuple{
    		{
    			Type:     event.Add,
    			Callback: application.addCallback,
    		},
    		{
    			Type:     event.Update,
    			Callback: application.updateCallback,
    		},
    		{
    			Type:     event.Delete,
    			Callback: application.deleteCallback,
    		},
    		{
    			Type:     event.Subscribe,
    			Callback: application.subscribeCallback,
    		},
    	}
    	go application.Run(eventTypeCallbackTuples)
    
    	m.Run()
    }
    
    func TestNetworkElementAddAndSubscribeEvent(t *testing.T) {
    	// setup required parameters
    	opt := &tpb.TransportOption{
    		Address:  targetAAdress,
    		Username: targetUserAndPW,
    		Password: targetUserAndPW,
    		TransportOption: &tpb.TransportOption_GnmiTransportOption{
    			GnmiTransportOption: &tpb.GnmiTransportOption{},
    		},
    		Tls: true,
    	}
    
    	addListRequest := &mnepb.AddListRequest{
    		Timestamp: integration_test_utils.GetTimestamp(),
    		Mne: []*mnepb.SetMne{
    			{
    				MneId:           mneID,
    				Address:         "gnmi-target_A:7030",
    				Pid:             pndID,
    				PluginId:        pluginID,
    				MneName:         "Horst",
    				TransportOption: opt,
    			},
    		},
    		Pid: pndID,
    	}
    
    	deleteMneRequest := &mnepb.DeleteRequest{
    		Timestamp: integration_test_utils.GetTimestamp(),
    		Pid:       pndID,
    		Mneid:     mneID,
    	}
    
    	// setup gRPC services
    	mneService := mnepb.NewNetworkElementServiceClient(conn)
    
    	// add one device to the controller
    	_, err := mneService.AddList(ctx, addListRequest)
    	if err != nil {
    		t.Error(err)
    		t.FailNow()
    	}
    
    	// check if events are available and correct type and content
    	addEvent := <-application.addEventChannel
    	assertAddEvent(t, addEvent, mneID)
    
    	subscribeEvent := <-application.subscribeEventChannel
    	assertSubscribeEvent(t, subscribeEvent, mneID)
    
    	subscribeEvent = <-application.subscribeEventChannel
    	assertSubscribeEvent(t, subscribeEvent, mneID)
    
    	// TODO: add tests fot rhis event type when update function is implemented properly
    	// update mne and check events
    
    	// delete mne and check for events
    	_, err = mneService.Delete(ctx, deleteMneRequest)
    	if err != nil {
    		t.Error(err)
    		t.FailNow()
    	}
    
    	deleteEvent := <-application.deleteEventChannel
    	assertDeleteEvent(t, deleteEvent, mneID)
    }
    
    func TestUserEvents(t *testing.T) {
    	// setup required parameters
    	const newUserName = "new name"
    
    	addUserRequest := &apb.CreateUsersRequest{
    		Timestamp: integration_test_utils.GetTimestamp(),
    		User: []*apb.User{
    			{
    				Id:       userID,
    				Name:     "user",
    				Roles:    map[string]string{pndID: "admin"},
    				Password: targetUserAndPW,
    				Metadata: &conflict.Metadata{
    					ResourceVersion: 0,
    				},
    			},
    		},
    	}
    
    	updateUserRequest := &apb.UpdateUsersRequest{
    		Timestamp: integration_test_utils.GetTimestamp(),
    		User: []*apb.UpdateUser{
    			{
    				Id:       userID,
    				Name:     newUserName,
    				Metadata: &conflict.Metadata{},
    			},
    		},
    	}
    
    	deleteUserRequest := &apb.DeleteUsersRequest{
    		Timestamp: integration_test_utils.GetTimestamp(),
    		Username:  []string{newUserName},
    	}
    
    	// setup gRPC services
    	userService := apb.NewUserServiceClient(conn)
    
    	// add one device to the controller
    	_, err := userService.CreateUsers(ctx, addUserRequest)
    	if err != nil {
    		t.Error(err)
    		t.FailNow()
    	}
    
    	// check if event is available and correct type
    	addEvent := <-application.addEventChannel
    	assertAddEvent(t, addEvent, userID)
    
    	// update user and check for event
    	_, err = userService.UpdateUsers(ctx, updateUserRequest)
    	if err != nil {
    		t.Error(err)
    		t.FailNow()
    	}
    
    	updateEvent := <-application.updateEventChannel
    	assertUpdateEvent(t, updateEvent, userID)
    
    	// delete user and check for event
    	_, err = userService.DeleteUsers(ctx, deleteUserRequest)
    	if err != nil {
    		t.Error(err)
    		t.FailNow()
    	}
    
    	deleteEvent := <-application.deleteEventChannel
    	assertDeleteEvent(t, deleteEvent, userID)
    }
    
    func TestRoleEvents(t *testing.T) {
    	// setup required parameters
    	const roleName = "new role"
    
    	addRoleRequest := &apb.CreateRolesRequest{
    		Timestamp: integration_test_utils.GetTimestamp(),
    		Roles: []*apb.Role{
    			{
    				Id:          roleID,
    				Name:        roleName,
    				Description: "well, not much to see here",
    				Permissions: []string{"some permission"},
    			},
    		},
    	}
    
    	updateRolesRequest := &apb.UpdateRolesRequest{
    		Timestamp: integration_test_utils.GetTimestamp(),
    		Roles: []*apb.Role{
    			{
    				Id:          roleID,
    				Name:        roleName,
    				Description: "even less now",
    			},
    		},
    	}
    
    	deleteRoleRequest := &apb.DeleteRolesRequest{
    		Timestamp: integration_test_utils.GetTimestamp(),
    		RoleName:  []string{roleName},
    	}
    
    	// setup gRPC services
    	roleService := apb.NewRoleServiceClient(conn)
    
    	// add role and check add event
    	_, err := roleService.CreateRoles(ctx, addRoleRequest)
    	if err != nil {
    		t.Error(err)
    		t.FailNow()
    	}
    
    	addEvent := <-application.addEventChannel
    	assertAddEvent(t, addEvent, roleID)
    
    	// update role and check for event
    	_, err = roleService.UpdateRoles(ctx, updateRolesRequest)
    	if err != nil {
    		t.Error(err)
    		t.FailNow()
    	}
    
    	updateEvent := <-application.updateEventChannel
    	assertUpdateEvent(t, updateEvent, roleID)
    
    	// delete new role and check for event
    	_, err = roleService.DeleteRoles(ctx, deleteRoleRequest)
    	if err != nil {
    		t.Error(err)
    		t.FailNow()
    	}
    
    	deleteEvent := <-application.deleteEventChannel
    	assertDeleteEvent(t, deleteEvent, roleID)
    }