github.com/ActiveState/cli@v0.0.0-20240508170324-6801f60cd051/pkg/platform/runtime/executors/executors_test.go (about)

     1  package executors
     2  
     3  import (
     4  	"os"
     5  	"path/filepath"
     6  	"runtime"
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/require"
    10  
    11  	"github.com/ActiveState/cli/internal/errs"
    12  	"github.com/ActiveState/cli/internal/fileutils"
    13  	"github.com/ActiveState/cli/pkg/platform/runtime/target"
    14  )
    15  
    16  func TestExecutor(t *testing.T) {
    17  	tmpDir, err := os.MkdirTemp("", "as-executor-test")
    18  	require.NoError(t, err, errs.JoinMessage(err))
    19  	defer func() { _ = os.RemoveAll(tmpDir) }()
    20  
    21  	dummyExecData := []byte("junk state-exec junk")
    22  	dummyExecSrc := filepath.Join(tmpDir, "_SRC")
    23  
    24  	err = fileutils.WriteFile(dummyExecSrc, dummyExecData)
    25  	require.NoError(t, err, errs.JoinMessage(err))
    26  
    27  	target := target.NewCustomTarget("owner", "project", "1234abcd-1234-abcd-1234-abcd1234abcd", "dummy/path", target.NewExecTrigger("test"))
    28  	execDir := filepath.Join(tmpDir, "exec")
    29  	execInit := New(execDir)
    30  	execInit.altExecSrcPath = dummyExecSrc
    31  
    32  	exec := func(in string) string { return filepath.Join(tmpDir, in) }
    33  	exes := make(map[string]string) // map[string]string{ "executable": "executor" }
    34  	switch runtime.GOOS {
    35  	case "windows":
    36  		exes["a.exe"] = "exec/a.exe"
    37  		exes["b.bat"] = "exec/b.exe"
    38  		exes["c.cmd"] = "exec/c.exe"
    39  
    40  	default:
    41  		exes["bin/a"] = "exec/a"
    42  		exes["bin/b.sh"] = "exec/b.sh"
    43  	}
    44  	env := map[string]string{"PATH": execDir}
    45  	var inputExes []string
    46  	for exe := range exes {
    47  		inputExes = append(inputExes, exe)
    48  	}
    49  
    50  	t.Run("Create executors", func(t *testing.T) {
    51  		err = execInit.Apply("/sock-path", target, env, inputExes)
    52  		require.NoError(t, err, errs.JoinMessage(err))
    53  	})
    54  
    55  	// Verify executors
    56  	for _, utor := range exes {
    57  		executor := exec(utor)
    58  
    59  		t.Run("Executor Exists", func(t *testing.T) {
    60  			if !fileutils.FileExists(executor) {
    61  				t.Errorf("Could not locate executor: %s", executor)
    62  			}
    63  		})
    64  
    65  		t.Run("Executor contains expected executable", func(t *testing.T) {
    66  			contains, err := fileutils.FileContains(executor, dummyExecData)
    67  			require.NoError(t, err, errs.JoinMessage(err))
    68  			if !contains {
    69  				t.Errorf("File %s does not contain %q, contents: %q", executor, dummyExecData, fileutils.ReadFileUnsafe(executor))
    70  			}
    71  		})
    72  	}
    73  
    74  	// add legacy files - deprecated
    75  	require.NoError(t, fileutils.WriteFile(exec("exec/old_exec"), []byte(legacyExecutorDenoter)))
    76  	require.NoError(t, fileutils.WriteFile(exec("exec/old_shim"), []byte(legacyShimDenoter)))
    77  
    78  	t.Run("Cleanup old executors", func(t *testing.T) {
    79  		err = execInit.Clean()
    80  		require.NoError(t, err, errs.JoinMessage(err))
    81  
    82  		files, err := fileutils.ListDirSimple(exec("exec"), false)
    83  		require.NoError(t, err, errs.JoinMessage(err))
    84  		require.Len(t, files, 0, "Cleanup should remove all exes")
    85  	})
    86  }