1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
//go:build integration
// +build integration
package shells_test
import (
"io/ioutil"
"os"
"os/exec"
"path"
"path/filepath"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"gitlab.com/gitlab-org/gitlab-runner/shells"
"gitlab.com/gitlab-org/gitlab-runner/shells/shellstest"
)
func runShell(t *testing.T, shell, cwd string, writer shells.ShellWriter) {
var extension string
var cmdArgs []string
switch shell {
case "bash":
extension = "sh"
case "cmd":
extension = "cmd"
cmdArgs = append(cmdArgs, "/Q", "/C")
case "powershell", "pwsh":
extension = "ps1"
cmdArgs = append(cmdArgs, "-NoProfile", "-NonInteractive", "-ExecutionPolicy", "Bypass", "-Command")
default:
require.FailNow(t, "unknown shell %q", shell)
}
script := writer.Finish(false)
scriptFile := filepath.Join(cwd, shell+"-test-script."+extension)
err := ioutil.WriteFile(scriptFile, []byte(script), 0700)
require.NoError(t, err)
defer os.Remove(scriptFile)
cmdArgs = append(cmdArgs, scriptFile)
cmd := exec.Command(shell, cmdArgs...)
cmd.Dir = cwd
output, err := cmd.CombinedOutput()
require.NoError(t, err, "output: %s", string(output))
assert.Empty(t, string(output))
}
func TestMkDir(t *testing.T) {
const TestPath = "test-path"
tmpDir, err := ioutil.TempDir("", "runner-test")
require.NoError(t, err)
defer os.RemoveAll(tmpDir)
shellstest.OnEachShellWithWriter(t, func(t *testing.T, shell string, writer shells.ShellWriter) {
testTmpDir := writer.MkTmpDir(shell + "-mkdir-test")
writer.Cd(testTmpDir)
writer.MkDir(TestPath)
writer.MkDir(TestPath)
runShell(t, shell, tmpDir, writer)
createdPath := filepath.Join(tmpDir, testTmpDir, TestPath)
_, err := ioutil.ReadDir(createdPath)
assert.NoError(t, err)
})
}
func TestRmFile(t *testing.T) {
const TestPath = "test-path"
tmpDir, err := ioutil.TempDir("", "runner-test")
require.NoError(t, err)
defer os.RemoveAll(tmpDir)
shellstest.OnEachShellWithWriter(t, func(t *testing.T, shell string, writer shells.ShellWriter) {
tmpFile := path.Join(tmpDir, TestPath)
err = ioutil.WriteFile(tmpFile, []byte{}, 0600)
require.NoError(t, err)
writer.RmFile(TestPath)
runShell(t, shell, tmpDir, writer)
_, err = os.Stat(tmpFile)
require.True(t, os.IsNotExist(err), "tmpFile not deleted")
// check if the file do not exist
runShell(t, shell, tmpDir, writer)
})
}
func TestRmFilesRecursive(t *testing.T) {
const TestPath = "test-path"
tmpDir, err := ioutil.TempDir("", "runner-test")
require.NoError(t, err)
defer os.RemoveAll(tmpDir)
shellstest.OnEachShellWithWriter(t, func(t *testing.T, shell string, writer shells.ShellWriter) {
if shell == "cmd" {
t.Skip("cmd shell is no longer actively developed")
}
var tmpFiles []string
// lockfiles can be in multiple subdirs
for i := 0; i < 3; i++ {
tmpSubDir, err := ioutil.TempDir(tmpDir, "subdir")
require.NoError(t, err)
tmpFile := path.Join(tmpSubDir, TestPath)
err = ioutil.WriteFile(tmpFile, []byte{}, 0600)
require.NoError(t, err)
tmpFiles = append(tmpFiles, tmpFile)
}
writer.RmFilesRecursive(tmpDir, TestPath)
runShell(t, shell, tmpDir, writer)
for _, file := range tmpFiles {
_, err = os.Stat(file)
require.True(t, os.IsNotExist(err), "tmpFile not deleted")
}
})
}
|