package cli import ( "context" "fmt" "log" "os" "strings" "testing" "time" ) // Specficy project against which to run tests. Ex: 'ret-edge-3u27t1ttkk4ngtkmk842b' const gcpProjectID string = "" const folderPath string = "testdata/rundata" const exeData string = "testdata/exedata" var dirPath string // Runs setupSuite when the test starts to setup test data func setupSuite() func(t *testing.T) { //nolint log.Println("setup suite") projectID = gcpProjectID // delete all the policies in projectID before starting the tests deleteArgs.labels = "policy-owner:observability" if deleteErr := runDelete(context.Background(), []string{}); deleteErr != nil { fmt.Printf("Test setup error Delete %s \n", deleteErr) } // create AlertPolicies to support the tests createArgs.templatePath = exeData if CreateErr := runCreate(context.Background(), []string{}); CreateErr != nil { fmt.Printf("Test setup error Create %s \n", CreateErr) } // add a 1:00 min pause before test execution starts duration := time.Duration(60) * time.Second time.Sleep(duration) // Return a function to teardown the test return func(_ *testing.T) { log.Println("teardown suite") // Open the directory and read all its files. dirRead, _ := os.Open(folderPath) dirFiles, _ := dirRead.Readdir(0) // Loop over the directory's files. for index := range dirFiles { fileHere := dirFiles[index] // Get name of file and its full path. nameHere := fileHere.Name() fullPath := folderPath + "/" + nameHere // Remove the file. if !strings.Contains(nameHere, "UnitTestPolicy") { os.Remove(fullPath) fmt.Println("Removed file:", fullPath) } } } } func TestRunner(t *testing.T) { // Comment to run the tests locally only. Uncomment before pushing changes. t.SkipNow() // Find and set temporary directory for the test data downloaded at runtime dirPath = os.TempDir() log.Printf("the temp dir path is %s\n", dirPath) teardownSuite := setupSuite() defer teardownSuite(t) testCases := []struct { name string args []string cmd map[string]string cmdbool map[string]bool wantErr bool }{ // TODO: Add test cases. { name: "Create_AlertPolicy1", args: []string{"Create", "--project", gcpProjectID}, cmd: map[string]string{"createArgs.templatePath": folderPath + "/UnitTestPolicy1.json"}, wantErr: false, }, { name: "Create_AlertPolicy2", args: []string{"Create", "--project", gcpProjectID}, cmd: map[string]string{"createArgs.templatePath": folderPath + "/UnitTestPolicy2.json"}, wantErr: false, }, { name: "Create_AlertPolicy3", args: []string{"Create", "--project", gcpProjectID}, cmd: map[string]string{"createArgs.templatePath": folderPath + "/UnitTestPolicy3.json"}, wantErr: false, }, { name: "Create_AlertPolicyWrongPath", args: []string{"Create", "--project", gcpProjectID}, cmd: map[string]string{"createArgs.templatePath": folderPath + "/UnitTestPolicy0.json"}, wantErr: false, }, { name: "Get_SaveSinglePolicyAllFields", args: []string{"get", "--project", gcpProjectID}, cmd: map[string]string{"getArgs.name": "Test Channels", "getArgs.templatePath": dirPath}, cmdbool: map[string]bool{"getArgs.overwrite": true, "getArgs.templateFormat": true}, wantErr: false, }, { name: "Get_SaveSinglePolicyTemplateFormat", args: []string{"get", "--project", gcpProjectID}, cmd: map[string]string{"getArgs.name": "Test Channels", "getArgs.templatePath": dirPath}, cmdbool: map[string]bool{"getArgs.overwrite": true}, wantErr: false, }, { name: "Get_SaveAllPolicies", args: []string{"get", "--project", gcpProjectID}, cmd: map[string]string{"getArgs.templatePath": dirPath}, cmdbool: map[string]bool{"getArgs.overwrite": true}, wantErr: false, }, { name: "Get_SaveAllPoliciesWrongPath", args: []string{"get", "--project", gcpProjectID}, cmd: map[string]string{"getArgs.templatePath": dirPath + "/wrongpath"}, cmdbool: map[string]bool{"getArgs.overwrite": true}, wantErr: false, }, { name: "Update_AddSingleLabel", args: []string{"update", "--project", gcpProjectID}, cmd: map[string]string{"updateArgs.name": "Unit Test Policy 2", "updateArgs.addUserLabels": "testlabel1:multilabel1"}, wantErr: false, }, { name: "Update_AddMultiLabelsWithCorrectDelimiter", args: []string{"update", "--project", gcpProjectID}, cmd: map[string]string{"updateArgs.name": "Unit Test Policy 2", "updateArgs.addUserLabels": " testlabel2 : multilabel2 , testlabel3 : multilabel3 testlabel4 : multilabel4 , testlabel5 : multilabel5 testlabel6 : multilabel6 testlabel7 : multilabel7 testlabel8 : multilabel8"}, wantErr: false, }, { name: "Update_ChangeExistingLabelValue", args: []string{"update", "--project", gcpProjectID}, cmd: map[string]string{"updateArgs.name": "Unit Test Policy 2", "updateArgs.addUserLabels": "testlabel6:updatedmultilabel6"}, wantErr: false, }, { name: "Update_DeleteSingleLabel", args: []string{"update", "--project", gcpProjectID}, cmd: map[string]string{"updateArgs.name": "Unit Test Policy 2", "updateArgs.delUserLabels": "testlabel6:updatedmultilabel6"}, wantErr: false, }, { name: "Update_DeleteSingleLabelByKey", args: []string{"update", "--project", gcpProjectID}, cmd: map[string]string{"updateArgs.name": "Unit Test Policy 2", "updateArgs.delUserLabels": "testlabel5:"}, wantErr: false, }, { name: "Update_DeleteMultiLabelByKey", args: []string{"update", "--project", gcpProjectID}, cmd: map[string]string{"updateArgs.name": "Unit Test Policy 2", "updateArgs.delUserLabels": "testlabel4: , testlabel3: , testlabel2:,testlabel1: "}, wantErr: false, }, { name: "Update_BulkAddSingleLabel", args: []string{"update", "--project", gcpProjectID}, cmd: map[string]string{"updateArgs.filter": "user_labels='unit-test'", "updateArgs.addUserLabels": "bulk-update1: test1 "}, wantErr: false, }, { name: "Update_BulkAddMultiLabels", args: []string{"update", "--project", gcpProjectID}, cmd: map[string]string{"updateArgs.filter": "user_labels='unit-test'", "updateArgs.addUserLabels": "bulk-update2: test2 bulk-update3: test3, bulk-update4: test4 bulk-update5: test5 "}, wantErr: false, }, { name: "Update_BulkDeleteSingleLabel", args: []string{"update", "--project", gcpProjectID}, cmd: map[string]string{"updateArgs.filter": "user_labels='unit-test'", "updateArgs.delUserLabels": "bulk-update1: test1 "}, wantErr: false, }, { name: "Update_BulkDeleteMultiLabels", args: []string{"update", "--project", gcpProjectID}, cmd: map[string]string{"updateArgs.filter": "user_labels='unit-test'", "updateArgs.delUserLabels": "bulk-update2: test2 bulk-update3: test3"}, wantErr: false, }, { name: "Update_BulkDeleteMultiLabelsByKey", args: []string{"update", "--project", gcpProjectID}, cmd: map[string]string{"updateArgs.filter": "user_labels='unit-test'", "updateArgs.delUserLabels": "bulk-update4: , bulk-update5: "}, wantErr: false, }, { name: "Update_DeleteMultiLabelsWithDelimiter", args: []string{"update", "--project", gcpProjectID}, cmd: map[string]string{"updateArgs.name": "Unit Test Policy 2", "updateArgs.delUserLabels": "testlabel7 : multilabel7 testlabel8 : multilabel8 "}, wantErr: false, }, { name: "Update_DeleteSingleMissingLabel", args: []string{"update", "--project", gcpProjectID}, cmd: map[string]string{"updateArgs.name": "Unit Test Policy 2", "updateArgs.delUserLabels": "testlabel6:multilabel6"}, wantErr: true, }, { name: "Update_DeleteMultiMissingLabels", args: []string{"update", "--project", gcpProjectID}, cmd: map[string]string{"updateArgs.name": "Unit Test Policy 2", "updateArgs.delUserLabels": " testlabel3 : multilabel3 , testlabel4 : multilabel4 testlabel5 : multilabel5 "}, wantErr: true, }, { name: "Update_AddLabelsNonExistingPolicy", args: []string{"update", "--project", gcpProjectID}, cmd: map[string]string{"updateArgs.name": "Unit Test Policy", "updateArgs.addUserLabels": " testlabel3 : multilabel3 , testlabel4 : multilabel4 testlabel5 : multilabel5 "}, wantErr: true, }, { name: "Update_DeleteLabelsNonExistingPolicy", args: []string{"update", "--project", gcpProjectID}, cmd: map[string]string{"updateArgs.name": "Unit Test Policy", "updateArgs.delUserLabels": " testlabel3 : multilabel3 , testlabel4 : multilabel4 testlabel5 : multilabel5 "}, wantErr: true, }, { name: "Update_PolicyFromTemplate", args: []string{"update", "--project", gcpProjectID}, cmd: map[string]string{"updateArgs.name": "Unit Test Policy 2", "updateArgs.templatePath": folderPath + "/UnitTestPolicyTemplate.json"}, wantErr: false, }, { name: "Update_EnablePolicy", args: []string{"update", "--project", gcpProjectID}, cmd: map[string]string{"updateArgs.name": "Unit Test Policy Template"}, cmdbool: map[string]bool{"updateArgs.enable": true}, wantErr: false, }, { name: "Update_EnableActivePolicy", args: []string{"update", "--project", gcpProjectID}, cmd: map[string]string{"updateArgs.name": "Unit Test Policy Template"}, cmdbool: map[string]bool{"updateArgs.enable": true}, wantErr: true, }, { name: "Update_EnableNonExistingPolicy", args: []string{"update", "--project", gcpProjectID}, cmd: map[string]string{"updateArgs.name": "Unit Test Policy"}, cmdbool: map[string]bool{"updateArgs.enable": true}, wantErr: true, }, { name: "Update_DisablePolicy", args: []string{"update", "--project", gcpProjectID}, cmd: map[string]string{"updateArgs.name": "Unit Test Policy Template"}, cmdbool: map[string]bool{"updateArgs.disable": true}, wantErr: false, }, { name: "Update_DisableInactivePolicy", args: []string{"update", "--project", gcpProjectID}, cmd: map[string]string{"updateArgs.name": "Unit Test Policy Template"}, cmdbool: map[string]bool{"updateArgs.disable": true}, wantErr: true, }, { name: "Update_DisableNonExistingPolicy", args: []string{"update", "--project", gcpProjectID}, cmd: map[string]string{"updateArgs.name": "Unit Test Policy"}, cmdbool: map[string]bool{"updateArgs.disable": true}, wantErr: true, }, { name: "Update_BulkEnablePolicy", args: []string{"update", "--project", gcpProjectID}, cmd: map[string]string{"updateArgs.filter": "user_labels=\"unit-test\""}, cmdbool: map[string]bool{"updateArgs.enable": true}, wantErr: false, }, { name: "Update_BulkEnableActivePolicy", args: []string{"update", "--project", gcpProjectID}, cmd: map[string]string{"updateArgs.filter": "user_labels='unit-test'"}, cmdbool: map[string]bool{"updateArgs.enable": true}, wantErr: true, }, { name: "Update_RenamePolicy", args: []string{"update", "--project", gcpProjectID}, cmd: map[string]string{"updateArgs.name": "Unit Test Policy Template", "updateArgs.rename": "Unit Test Policy 2"}, wantErr: false, }, { name: "Update_RenameToExistingPolicy", args: []string{"update", "--project", gcpProjectID}, cmd: map[string]string{"updateArgs.name": "Unit Test Policy 2", "updateArgs.rename": "Unit Test Policy 3"}, wantErr: true, }, { name: "Update_RenameToNonExistingPolicy", args: []string{"update", "--project", gcpProjectID}, cmd: map[string]string{"updateArgs.name": "Unit Test Policy 4", "updateArgs.rename": "Unit Test Policy 3"}, wantErr: true, }, { name: "Update_BulkDisablePolicy", args: []string{"update", "--project", gcpProjectID}, cmd: map[string]string{"updateArgs.filter": "(user_labels='unit-test')"}, cmdbool: map[string]bool{"updateArgs.disable": true}, wantErr: false, }, { name: "Update_BulkDisableActivePolicy", args: []string{"update", "--project", gcpProjectID}, cmd: map[string]string{"updateArgs.filter": "(user_labels='unit-test')"}, cmdbool: map[string]bool{"updateArgs.disable": true}, wantErr: true, }, { name: "Sync_Verify", args: []string{"sync", "--project", gcpProjectID}, cmd: map[string]string{"syncArgs.templatePath": folderPath}, wantErr: false, }, { name: "Sync_Push", args: []string{"sync", "--project", gcpProjectID}, cmd: map[string]string{"syncArgs.templatePath": folderPath}, cmdbool: map[string]bool{"syncArgs.push": true}, wantErr: false, }, { name: "Delete_AlertPolicyByLabel", args: []string{"delete", "--project", gcpProjectID}, cmd: map[string]string{"deleteArgs.labels": "unit-test:test"}, cmdbool: map[string]bool{"deleteArgs.deleteAll": false}, wantErr: false, }, { name: "Delete_NonExistingAlertPolicy", args: []string{"delete", "--project", gcpProjectID}, cmd: map[string]string{"deleteArgs.name": "Unit Test Policy"}, cmdbool: map[string]bool{"deleteArgs.deleteAll": false}, wantErr: true, }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { createArgs.templatePath = tc.cmd["createArgs.templatePath"] getArgs.name = tc.cmd["getArgs.name"] getArgs.templatePath = tc.cmd["getArgs.templatePath"] getArgs.overwrite = tc.cmdbool["getArgs.overwrite"] getArgs.templateFormat = tc.cmdbool["getArgs.templateFormat"] updateArgs.name = tc.cmd["updateArgs.name"] updateArgs.addUserLabels = tc.cmd["updateArgs.addUserLabels"] updateArgs.delUserLabels = tc.cmd["updateArgs.delUserLabels"] updateArgs.enable = tc.cmdbool["updateArgs.enable"] updateArgs.disable = tc.cmdbool["updateArgs.disable"] updateArgs.rename = tc.cmd["updateArgs.rename"] updateArgs.templatePath = tc.cmd["updateArgs.templatePath"] updateArgs.filter = tc.cmd["updateArgs.filter"] deleteArgs.name = tc.cmd["deleteArgs.name"] deleteArgs.labels = tc.cmd["deleteArgs.labels"] deleteArgs.deleteAll = tc.cmdbool["deleteArgs.deleteAll"] syncArgs.push = tc.cmdbool["syncArgs.push"] syncArgs.templatePath = tc.cmd["syncArgs.templatePath"] if err := Run(tc.args); (err != nil) != tc.wantErr { t.Errorf("Run() error = %v, wantErr %v", err, tc.wantErr) } }) } }