From cea0eacfa2a9d78804397db06a07aeb88e66d760 Mon Sep 17 00:00:00 2001 From: Fabian Seidl <fabian.b.seidl@stud.h-da.de> Date: Wed, 17 Aug 2022 15:26:00 +0000 Subject: [PATCH] Resolve "Delete the store files after the unit testing" See merge request danet/gosdn!369 Co-authored-by: Fabian Seidl <fabian.seidl@h-da.de> --- controller/api/api_test.go | 30 +++++++++++++++ controller/api/api_test.toml | 2 +- .../nucleus/deviceFilesystemStore_test.go | 37 +++---------------- controller/nucleus/initialise_test.go | 24 +++++++++++- controller/nucleus/pndFilesystemStore_test.go | 27 ++------------ .../nucleus/principalNetworkDomain_test.go | 31 ++++++++++++---- controller/nucleus/sbiFilesystemStore_test.go | 36 ++++-------------- controller/nucleus/sbiStore.go | 4 -- controller/rbac/rbacTestUtil_test.go | 29 +++++++++++++++ controller/rbac/roleFileSystemStore_test.go | 32 +++------------- controller/rbac/userFileSystemStore_test.go | 32 +++------------- 11 files changed, 132 insertions(+), 152 deletions(-) create mode 100644 controller/rbac/rbacTestUtil_test.go diff --git a/controller/api/api_test.go b/controller/api/api_test.go index a789e65b1..f6e8e29a6 100644 --- a/controller/api/api_test.go +++ b/controller/api/api_test.go @@ -2,12 +2,15 @@ package api import ( "context" + "os" + "path/filepath" "testing" ppb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/pnd" spb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound" tpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/transport" "code.fbi.h-da.de/danet/gosdn/controller/nucleus" + "code.fbi.h-da.de/danet/gosdn/controller/store" log "github.com/sirupsen/logrus" "github.com/spf13/viper" ) @@ -28,7 +31,34 @@ func Test_GetIds(t *testing.T) { log.Info(resp) } +func ensureFilesForTestsAreRemoved() { + ensureStoreFileForTestsIsRemoved(store.SbiFilenameSuffix) + ensureStoreFileForTestsIsRemoved(store.DeviceFilenameSuffix) +} + +func ensureStoreFileForTestsIsRemoved(storeName string) { + if err := store.EnsureFilesystemStorePathExists(storeName); err != nil { + log.Println(err) + } + + wildcartFilename := "*" + storeName + path := store.GetCompletePathToFileStore(wildcartFilename) + + files, err := filepath.Glob(path) + + if err != nil { + log.Println(err) + } + for _, f := range files { + if err := os.Remove(f); err != nil { + log.Println(err) + } + } +} + func Test_AddPnd(t *testing.T) { + defer ensureFilesForTestsAreRemoved() + sbi, err := nucleus.NewSBI(spb.Type_TYPE_OPENCONFIG) if err != nil { t.Errorf("AddPnd() error = %v", err) diff --git a/controller/api/api_test.toml b/controller/api/api_test.toml index fb66a3754..caa343d3b 100644 --- a/controller/api/api_test.toml +++ b/controller/api/api_test.toml @@ -1 +1 @@ -cli_pnd = "2043519e-46d1-4963-9a8e-d99007e104b8" +cli_pnd = '2043519e-46d1-4963-9a8e-d99007e104b8' diff --git a/controller/nucleus/deviceFilesystemStore_test.go b/controller/nucleus/deviceFilesystemStore_test.go index 0e1337a99..0a6ae8605 100644 --- a/controller/nucleus/deviceFilesystemStore_test.go +++ b/controller/nucleus/deviceFilesystemStore_test.go @@ -1,8 +1,6 @@ package nucleus import ( - "os" - "path/filepath" "testing" spb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound" @@ -10,28 +8,8 @@ import ( "code.fbi.h-da.de/danet/gosdn/controller/interfaces/device" "code.fbi.h-da.de/danet/gosdn/controller/store" "github.com/google/uuid" - log "github.com/sirupsen/logrus" ) -func ensureDeviceFilesForTestAreRemoved() { - if err := store.EnsureFilesystemStorePathExists(store.DeviceFilenameSuffix); err != nil { - log.Error(err) - } - wildcartFilename := "*-" + store.DeviceFilenameSuffix - path := store.GetCompletePathToFileStore(wildcartFilename) - - files, err := filepath.Glob(path) - - if err != nil { - log.Println(err) - } - for _, f := range files { - if err := os.Remove(f); err != nil { - log.Println(err) - } - } -} - func returnBasicTransportOption() tpb.TransportOption { return tpb.TransportOption{ Address: "test:///", @@ -49,8 +27,7 @@ func returnBasicTransportOption() tpb.TransportOption { } func TestAddDevice(t *testing.T) { - ensureDeviceFilesForTestAreRemoved() - defer ensureDeviceFilesForTestAreRemoved() + defer ensureStoreFileForTestsIsRemoved(store.DeviceFilenameSuffix) pndID, _ := uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bad") deviceID, _ := uuid.Parse("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa") @@ -69,8 +46,7 @@ func TestAddDevice(t *testing.T) { } func TestGetAllDevices(t *testing.T) { - ensureDeviceFilesForTestAreRemoved() - defer ensureDeviceFilesForTestAreRemoved() + defer ensureStoreFileForTestsIsRemoved(store.DeviceFilenameSuffix) pndID, _ := uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bad") deviceStore := NewDeviceStore(pndID) @@ -123,8 +99,7 @@ func TestGetAllDevices(t *testing.T) { } func TestGetDevice(t *testing.T) { - ensureDeviceFilesForTestAreRemoved() - defer ensureDeviceFilesForTestAreRemoved() + defer ensureStoreFileForTestsIsRemoved(store.DeviceFilenameSuffix) pndID, _ := uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bad") deviceStore := NewDeviceStore(pndID) @@ -170,8 +145,7 @@ func TestGetDevice(t *testing.T) { } func TestUpdateDevice(t *testing.T) { - ensureDeviceFilesForTestAreRemoved() - defer ensureDeviceFilesForTestAreRemoved() + defer ensureStoreFileForTestsIsRemoved(store.DeviceFilenameSuffix) pndID, _ := uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bad") deviceID, _ := uuid.Parse("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa") @@ -212,8 +186,7 @@ func TestUpdateDevice(t *testing.T) { } func TestDeleteDevice(t *testing.T) { - ensureDeviceFilesForTestAreRemoved() - defer ensureDeviceFilesForTestAreRemoved() + defer ensureStoreFileForTestsIsRemoved(store.DeviceFilenameSuffix) pndID, _ := uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bad") deviceStore := NewDeviceStore(pndID) diff --git a/controller/nucleus/initialise_test.go b/controller/nucleus/initialise_test.go index bd7799944..3b1ace8cb 100644 --- a/controller/nucleus/initialise_test.go +++ b/controller/nucleus/initialise_test.go @@ -174,9 +174,9 @@ func newPnd() pndImplementation { } } -// removeTestPlugins removes the plugins created during running the test in the current directory based on their name consisting of a uuid +// removeTestGoStructs removes the plugins created during running the test in the current directory based on their name consisting of a uuid // and the time since they`ve been created. -func removeTestPlugins() { +func removeTestGoStructs() { currentDirectory := "./" // pattern to match plugin uuid used as dir name pattern := "*-*-*-*-*" @@ -212,3 +212,23 @@ func isDirYoungerThanSeconds(dirName string, seconds int64) bool { return fs.FileInfo.ModTime(fileInfo).Unix() > (time.Now().Unix() - seconds) } + +func ensureStoreFileForTestsIsRemoved(storeName string) { + if err := store.EnsureFilesystemStorePathExists(storeName); err != nil { + log.Println(err) + } + + wildcartFilename := "*" + storeName + path := store.GetCompletePathToFileStore(wildcartFilename) + + files, err := filepath.Glob(path) + + if err != nil { + log.Println(err) + } + for _, f := range files { + if err := os.Remove(f); err != nil { + log.Println(err) + } + } +} diff --git a/controller/nucleus/pndFilesystemStore_test.go b/controller/nucleus/pndFilesystemStore_test.go index abc08fa16..420c9d27b 100644 --- a/controller/nucleus/pndFilesystemStore_test.go +++ b/controller/nucleus/pndFilesystemStore_test.go @@ -1,8 +1,6 @@ package nucleus import ( - "log" - "os" "testing" "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain" @@ -10,22 +8,8 @@ import ( "github.com/google/uuid" ) -func ensurePndFileForTestIsRemoved() { - if err := store.EnsureFilesystemStorePathExists(store.PndFilename); err != nil { - log.Println(err) - } - - path := store.GetCompletePathToFileStore(store.PndFilename) - - err := os.Remove(path) - if err != nil { - log.Println(err) - } -} - func TestAddPnd(t *testing.T) { - ensurePndFileForTestIsRemoved() - defer ensurePndFileForTestIsRemoved() + defer ensureStoreFileForTestsIsRemoved(store.PndFilename) pndStore := NewPndStore() @@ -40,8 +24,7 @@ func TestAddPnd(t *testing.T) { } func TestGetAllPnds(t *testing.T) { - ensurePndFileForTestIsRemoved() - defer ensurePndFileForTestIsRemoved() + defer ensureStoreFileForTestsIsRemoved(store.PndFilename) pndStore := NewPndStore() pndID1, _ := uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bad") @@ -77,8 +60,7 @@ func TestGetAllPnds(t *testing.T) { } func TestGetPnd(t *testing.T) { - ensurePndFileForTestIsRemoved() - defer ensurePndFileForTestIsRemoved() + defer ensureStoreFileForTestsIsRemoved(store.PndFilename) pndStore := NewPndStore() pndID1, _ := uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bad") @@ -112,8 +94,7 @@ func TestGetPnd(t *testing.T) { } func TestDeletePnd(t *testing.T) { - ensurePndFileForTestIsRemoved() - defer ensurePndFileForTestIsRemoved() + defer ensureStoreFileForTestsIsRemoved(store.PndFilename) pndStore := NewPndStore() pndID1, _ := uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bad") diff --git a/controller/nucleus/principalNetworkDomain_test.go b/controller/nucleus/principalNetworkDomain_test.go index 8f5001121..8a5d69611 100644 --- a/controller/nucleus/principalNetworkDomain_test.go +++ b/controller/nucleus/principalNetworkDomain_test.go @@ -4,6 +4,7 @@ import ( "errors" "io" "reflect" + "sync" "testing" "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/csbi" @@ -1128,7 +1129,7 @@ func Test_pndImplementation_ConfirmedChanges(t *testing.T) { } func Test_pndImplementation_saveGoStructsToFile(t *testing.T) { - defer removeTestPlugins() + defer removeTestGoStructs() type genericGoStructClientArg struct { fn string @@ -1208,16 +1209,30 @@ func Test_pndImplementation_saveGoStructsToFile(t *testing.T) { wantErr: true, }, } + var wg sync.WaitGroup for _, tt := range tests { + wg.Add(1) tt := tt - t.Run(tt.name, func(t *testing.T) { - t.Parallel() - err := saveStreamToFile(tt.args.client, util.GoStructName, tt.args.id) - if (err != nil) != tt.wantErr { - t.Errorf("saveGoStructsToFile() error = %v, wantErr %v", err, tt.wantErr) - } - }) + + // waitgroup and extra func needed to be able to clean up generated pnd directories while running test cases in parallel mode, + // var x is just a dummy to be able to call the func, + // outer t.Run() required for defered wg.Done(). + // reference: https://stackoverflow.com/a/63609718 + x := func() { + defer wg.Done() + t.Run("parallel waiting func", func(t *testing.T) { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + err := saveStreamToFile(tt.args.client, util.GoStructName, tt.args.id) + if (err != nil) != tt.wantErr { + t.Errorf("saveGoStructsToFile() error = %v, wantErr %v", err, tt.wantErr) + } + }) + }) + } + x() } + wg.Wait() } func Test_pndImplementation_SubscribePath(t *testing.T) { diff --git a/controller/nucleus/sbiFilesystemStore_test.go b/controller/nucleus/sbiFilesystemStore_test.go index 179fe2b87..24ab4dae9 100644 --- a/controller/nucleus/sbiFilesystemStore_test.go +++ b/controller/nucleus/sbiFilesystemStore_test.go @@ -1,9 +1,6 @@ package nucleus import ( - "log" - "os" - "path/filepath" "testing" spb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound" @@ -12,29 +9,13 @@ import ( "github.com/google/uuid" ) -func ensureSbiFilesForTestAreRemoved() { - if err := store.EnsureFilesystemStorePathExists(store.SbiFilenameSuffix); err != nil { - log.Println(err) - } - - wildcartFilename := "*-" + store.SbiFilenameSuffix - path := store.GetCompletePathToFileStore(wildcartFilename) - - files, err := filepath.Glob(path) - - if err != nil { - log.Println(err) - } - for _, f := range files { - if err := os.Remove(f); err != nil { - log.Println(err) - } - } +func ensureStoreFilesForTestsAreRemoved() { + ensureStoreFileForTestsIsRemoved(store.SbiFilenameSuffix) + ensureStoreFileForTestsIsRemoved(store.DeviceFilenameSuffix) } func TestAddSbi(t *testing.T) { - ensureSbiFilesForTestAreRemoved() - defer ensureSbiFilesForTestAreRemoved() + defer ensureStoreFilesForTestsAreRemoved() pndID, _ := uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bad") sbiStore := NewSbiStore(pndID) @@ -50,8 +31,7 @@ func TestAddSbi(t *testing.T) { } func TestGetAllSbis(t *testing.T) { - ensureSbiFilesForTestAreRemoved() - defer ensureSbiFilesForTestAreRemoved() + defer ensureStoreFilesForTestsAreRemoved() pndID, _ := uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bad") sbiStore := NewSbiStore(pndID) @@ -89,8 +69,7 @@ func TestGetAllSbis(t *testing.T) { } func TestGetSbi(t *testing.T) { - ensureSbiFilesForTestAreRemoved() - defer ensureSbiFilesForTestAreRemoved() + defer ensureStoreFilesForTestsAreRemoved() pndID, _ := uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bad") @@ -122,8 +101,7 @@ func TestGetSbi(t *testing.T) { } func TestDeleteAllSbis(t *testing.T) { - ensureSbiFilesForTestAreRemoved() - defer ensureSbiFilesForTestAreRemoved() + defer ensureStoreFilesForTestsAreRemoved() pndID, _ := uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bad") sbiStore := NewSbiStore(pndID) diff --git a/controller/nucleus/sbiStore.go b/controller/nucleus/sbiStore.go index 5b07b69ea..81cfc077d 100644 --- a/controller/nucleus/sbiStore.go +++ b/controller/nucleus/sbiStore.go @@ -9,10 +9,6 @@ import ( "github.com/google/uuid" ) -// SbiStore is used to store SouthboundInterfaces. -type SbiStore struct { -} - // NewSbiStore returns a sbiStore. func NewSbiStore(pndUUID uuid.UUID) southbound.Store { storeMode := store.GetStoreMode() diff --git a/controller/rbac/rbacTestUtil_test.go b/controller/rbac/rbacTestUtil_test.go new file mode 100644 index 000000000..dd007e3b1 --- /dev/null +++ b/controller/rbac/rbacTestUtil_test.go @@ -0,0 +1,29 @@ +package rbac + +import ( + "log" + "os" + "path/filepath" + + "code.fbi.h-da.de/danet/gosdn/controller/store" +) + +func ensureStoreFileForTestsIsRemoved(storeName string) { + if err := store.EnsureFilesystemStorePathExists(storeName); err != nil { + log.Println(err) + } + + wildcartFilename := "*" + storeName + path := store.GetCompletePathToFileStore(wildcartFilename) + + files, err := filepath.Glob(path) + + if err != nil { + log.Println(err) + } + for _, f := range files { + if err := os.Remove(f); err != nil { + log.Println(err) + } + } +} diff --git a/controller/rbac/roleFileSystemStore_test.go b/controller/rbac/roleFileSystemStore_test.go index be1e55071..347b42853 100644 --- a/controller/rbac/roleFileSystemStore_test.go +++ b/controller/rbac/roleFileSystemStore_test.go @@ -1,9 +1,6 @@ package rbac import ( - "log" - "os" - "path/filepath" "reflect" "testing" @@ -12,26 +9,8 @@ import ( "github.com/google/uuid" ) -func ensureRoleFilesForTestAreRemoved() { - if err := store.EnsureFilesystemStorePathExists(store.RoleFilename); err != nil { - log.Fatal(err) - } - path := store.GetCompletePathToFileStore(store.RoleFilename) - - files, err := filepath.Glob(path) - - if err != nil { - log.Println(err) - } - for _, f := range files { - if err := os.Remove(f); err != nil { - log.Println(err) - } - } -} - func TestFileSystemRoleStore_Add(t *testing.T) { - ensureRoleFilesForTestAreRemoved() + defer ensureStoreFileForTestsIsRemoved(store.RoleFilename) type args struct { RoleToAdd rbac.Role @@ -55,7 +34,7 @@ func TestFileSystemRoleStore_Add(t *testing.T) { } func TestFileSystemRoleStore_Delete(t *testing.T) { - ensureRoleFilesForTestAreRemoved() + defer ensureStoreFileForTestsIsRemoved(store.RoleFilename) type args struct { RoleToDelete rbac.Role @@ -85,7 +64,7 @@ func TestFileSystemRoleStore_Delete(t *testing.T) { } func TestFileSystemRoleStore_Get(t *testing.T) { - ensureRoleFilesForTestAreRemoved() + defer ensureStoreFileForTestsIsRemoved(store.RoleFilename) type args struct { query store.Query @@ -126,7 +105,8 @@ func TestFileSystemRoleStore_Get(t *testing.T) { } func TestFileSystemRoleStore_GetAll(t *testing.T) { - ensureRoleFilesForTestAreRemoved() + defer ensureStoreFileForTestsIsRemoved(store.RoleFilename) + var idtest uuid.UUID var arrTest []string addRole1 := NewRole(idtest, "testRole1", "role1", arrTest) @@ -174,7 +154,7 @@ func TestFileSystemRoleStore_GetAll(t *testing.T) { } func TestFileSystemRoleStore_Update(t *testing.T) { - ensureRoleFilesForTestAreRemoved() + defer ensureStoreFileForTestsIsRemoved(store.RoleFilename) var idtest uuid.UUID var arrTest []string diff --git a/controller/rbac/userFileSystemStore_test.go b/controller/rbac/userFileSystemStore_test.go index d5f88cc25..29f76a6c3 100644 --- a/controller/rbac/userFileSystemStore_test.go +++ b/controller/rbac/userFileSystemStore_test.go @@ -1,9 +1,6 @@ package rbac import ( - "log" - "os" - "path/filepath" "reflect" "testing" @@ -12,27 +9,8 @@ import ( "github.com/google/uuid" ) -func ensureUserFilesForTestAreRemoved() { - if err := store.EnsureFilesystemStorePathExists(store.UserFilename); err != nil { - log.Fatal(err) - } - - path := store.GetCompletePathToFileStore(store.UserFilename) - - files, err := filepath.Glob(path) - - if err != nil { - log.Println(err) - } - for _, f := range files { - if err := os.Remove(f); err != nil { - log.Println(err) - } - } -} - func TestFileSystemUserStore_Add(t *testing.T) { - ensureUserFilesForTestAreRemoved() + defer ensureStoreFileForTestsIsRemoved(store.UserFilename) type args struct { UserToAdd rbac.User @@ -63,7 +41,7 @@ func TestFileSystemUserStore_Add(t *testing.T) { } func TestFileSystemUserStore_Delete(t *testing.T) { - ensureUserFilesForTestAreRemoved() + defer ensureStoreFileForTestsIsRemoved(store.UserFilename) type args struct { UserToDelete rbac.User @@ -96,7 +74,7 @@ func TestFileSystemUserStore_Delete(t *testing.T) { } func TestFileSystemUserStore_Get(t *testing.T) { - ensureUserFilesForTestAreRemoved() + defer ensureStoreFileForTestsIsRemoved(store.UserFilename) type args struct { query store.Query @@ -138,7 +116,7 @@ func TestFileSystemUserStore_Get(t *testing.T) { } func TestFileSystemUserStore_GetAll(t *testing.T) { - ensureUserFilesForTestAreRemoved() + defer ensureStoreFileForTestsIsRemoved(store.UserFilename) var idtest uuid.UUID var role map[string]string @@ -187,7 +165,7 @@ func TestFileSystemUserStore_GetAll(t *testing.T) { } func TestFileSystemUserStore_Update(t *testing.T) { - ensureUserFilesForTestAreRemoved() + defer ensureStoreFileForTestsIsRemoved(store.UserFilename) type args struct { userToUpdate rbac.User -- GitLab