github.com/kubeshop/testkube@v1.17.23/cmd/kubectl-testkube/commands/tests/common_test.go (about) 1 package tests 2 3 import ( 4 "fmt" 5 "os" 6 "testing" 7 "time" 8 9 "github.com/stretchr/testify/assert" 10 11 "github.com/kubeshop/testkube/pkg/api/v1/client" 12 ) 13 14 func Test_readCopyFiles(t *testing.T) { 15 t.Run("Files exist, files are properly read", func(t *testing.T) { 16 files, err := createCopyFiles() 17 assert.NoError(t, err) 18 19 copyFiles := []string{} 20 for _, f := range files { 21 copyFiles = append(copyFiles, fmt.Sprintf("%s:%s_b", f.Name(), f.Name())) 22 } 23 24 gotFiles, err := readCopyFiles(copyFiles) 25 assert.NoError(t, err) 26 27 for _, f := range gotFiles { 28 assert.Contains(t, f, "config file #") 29 } 30 31 err = cleanup(files) 32 assert.NoError(t, err) 33 }) 34 t.Run("Files don't exist, an error is thrown", func(t *testing.T) { 35 copyFiles := []string{"/tmp/file_does_not_exist:/path_not_important"} 36 _, err := readCopyFiles(copyFiles) 37 assert.Error(t, err) 38 }) 39 } 40 41 func Test_mergeCopyFiles(t *testing.T) { 42 t.Run("Two empty lists should return empty list", func(t *testing.T) { 43 testFiles := []string{} 44 executionFiles := []string{} 45 46 result, err := mergeCopyFiles(testFiles, executionFiles) 47 assert.NoError(t, err) 48 assert.Empty(t, result) 49 }) 50 t.Run("First list populated, second list empty should return first list", func(t *testing.T) { 51 testFiles := []string{ 52 "/test/file:/tmp/test/file", 53 } 54 executionFiles := []string{} 55 56 result, err := mergeCopyFiles(testFiles, executionFiles) 57 assert.NoError(t, err) 58 assert.Equal(t, testFiles, result) 59 }) 60 t.Run("First list empty, second list populated should return second list", func(t *testing.T) { 61 testFiles := []string{} 62 executionFiles := []string{ 63 "/test/file:/tmp/test/file", 64 } 65 66 result, err := mergeCopyFiles(testFiles, executionFiles) 67 assert.NoError(t, err) 68 assert.Equal(t, executionFiles, result) 69 }) 70 t.Run("Two populated lists with no overlapping should return merged list", func(t *testing.T) { 71 testFiles := []string{ 72 "/test/file1:/tmp/test/file1", 73 "/test/file2:/tmp/test/file2", 74 "/test/file3:/tmp/test/file3", 75 } 76 executionFiles := []string{ 77 "/test/file4:/tmp/test/file4", 78 "/test/file5:/tmp/test/file5", 79 "/test/file6:/tmp/test/file6", 80 } 81 82 result, err := mergeCopyFiles(testFiles, executionFiles) 83 assert.NoError(t, err) 84 assert.Equal(t, 6, len(result)) 85 }) 86 t.Run("Two populated lists with one overlapping element should return merged list with no duplicates", func(t *testing.T) { 87 testFiles := []string{ 88 "/test/file1:/tmp/test/file1", 89 "/test/file2:/tmp/test/file2", 90 "/test/file3:/tmp/test/file3", 91 } 92 executionFiles := []string{ 93 "/test/file4:/tmp/test/file4", 94 "/test/file5:/tmp/test/file5", 95 "/test/file1:/tmp/test/file1", 96 } 97 98 result, err := mergeCopyFiles(testFiles, executionFiles) 99 assert.NoError(t, err) 100 assert.Equal(t, 5, len(result)) 101 }) 102 } 103 104 func createCopyFiles() ([]*os.File, error) { 105 files := []*os.File{} 106 for i := 0; i < 5; i++ { 107 file, err := os.CreateTemp("/tmp", fmt.Sprintf("config_%d", i)) 108 if err != nil { 109 return files, err 110 } 111 112 _, err = file.WriteString(fmt.Sprintf("config file #%d", i)) 113 if err != nil { 114 return files, err 115 } 116 files = append(files, file) 117 } 118 return files, nil 119 } 120 121 // createTempFile creates temporary file with the given content 122 func createTempFile(content string) (*os.File, error) { 123 file, err := os.CreateTemp("", "variables.txt") 124 if err != nil { 125 return nil, err 126 } 127 128 _, err = file.WriteString(content) 129 if err != nil { 130 return nil, err 131 } 132 133 return file, nil 134 } 135 136 // createLargeFile creates temporary file of the given size 137 func createLargeFile(size int64) (*os.File, error) { 138 fd, err := os.CreateTemp("", "variables.txt") 139 if err != nil { 140 return nil, err 141 } 142 _, err = fd.Seek(size-1, 0) 143 if err != nil { 144 return nil, err 145 } 146 _, err = fd.Write([]byte{0}) 147 if err != nil { 148 return nil, err 149 } 150 err = fd.Close() 151 if err != nil { 152 return nil, err 153 } 154 return fd, nil 155 } 156 157 func cleanup(files []*os.File) error { 158 for _, f := range files { 159 err := os.Remove(f.Name()) 160 if err != nil { 161 return err 162 } 163 } 164 return nil 165 } 166 167 func Test_PrepareVariablesFile(t *testing.T) { 168 t.Run("File does not exist should return error", func(t *testing.T) { 169 _, _, err := PrepareVariablesFile(client.APIClient{}, "parent", client.Test, "/this-file-does-not-exist", 0) 170 assert.Error(t, err) 171 }) 172 t.Run("File small enough should return contents", func(t *testing.T) { 173 fileContent := "variables file" 174 file, err := createTempFile(fileContent) 175 assert.NoError(t, err) 176 assert.NotEmpty(t, file) 177 178 contents, isUploaded, err := PrepareVariablesFile(client.APIClient{}, "parent", client.Test, file.Name(), 0) 179 assert.NoError(t, err) 180 assert.False(t, isUploaded) 181 assert.Equal(t, fileContent, contents) 182 }) 183 t.Run("Big file should be uploaded", func(t *testing.T) { 184 file, err := createLargeFile(maxArgSize + 1) 185 assert.NoError(t, err) 186 assert.NotEmpty(t, file) 187 188 isCalled := false 189 mockClient := client.APIClient{ 190 CopyFileClient: &client.MockCopyFileAPI{ 191 UploadFileFn: func(parentName string, parentType client.TestingType, filePath string, fileContent []byte, timeout time.Duration) error { 192 isCalled = true 193 return nil 194 }, 195 }, 196 } 197 path, isUploaded, err := PrepareVariablesFile(mockClient, "parent", client.Test, file.Name(), 0) 198 assert.NoError(t, err) 199 assert.True(t, isUploaded) 200 assert.Contains(t, path, "variables.txt") 201 assert.True(t, isCalled) 202 }) 203 }