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  }