fix tests

Signed-off-by: Casey Lee <cplee@nektos.com>
This commit is contained in:
Casey Lee 2020-02-13 11:47:38 -08:00
parent e40ab0145f
commit 09773f7c5c
No known key found for this signature in database
GPG key ID: 1899120ECD0A1784
7 changed files with 160 additions and 30 deletions

View file

@ -21,7 +21,7 @@ test:
go test -cover -short ./...
check:
$(ACT) -rj ci
$(ACT) -orj ci
build: check
$(eval export SNAPSHOT_VERSION=$(VERSION))

View file

@ -2,7 +2,6 @@ package runner
import (
"context"
"fmt"
"regexp"
"strings"
@ -72,10 +71,7 @@ func (rc *RunContext) setOutput(ctx context.Context, kvPairs map[string]string,
}
func (rc *RunContext) addPath(ctx context.Context, arg string) {
common.Logger(ctx).Infof(" \U00002699 ::add-path:: %s", arg)
if rc.Env == nil {
rc.Env = make(map[string]string)
}
rc.Env["PATH"] = fmt.Sprintf("%s:%s", arg, rc.Env["PATH"])
rc.ExtraPath = append(rc.ExtraPath, arg)
}
func parseKeyValuePairs(kvPairs string) map[string]string {

View file

@ -34,10 +34,10 @@ func TestAddpath(t *testing.T) {
handler := rc.commandHandler(ctx)
handler("::add-path::/zoo\n")
assert.Equal("/zoo:", rc.Env["PATH"])
assert.Equal("/zoo", rc.ExtraPath[0])
handler("::add-path::/booo\n")
assert.Equal("/booo:/zoo:", rc.Env["PATH"])
handler("::add-path::/boo\n")
assert.Equal("/boo", rc.ExtraPath[1])
}
func TestStopCommands(t *testing.T) {

View file

@ -75,7 +75,17 @@ func (rc *RunContext) newVM() *otto.Otto {
vmFormat,
vmJoin,
vmToJSON,
vmHashFiles(rc.Config.Workdir),
vmAlways,
vmCancelled,
rc.vmHashFiles(),
rc.vmSuccess(),
rc.vmFailure(),
rc.vmGithub(),
rc.vmEnv(),
rc.vmJob(),
rc.vmSteps(),
rc.vmRunner(),
}
vm := otto.New()
for _, configer := range configers {
@ -85,12 +95,12 @@ func (rc *RunContext) newVM() *otto.Otto {
}
func vmContains(vm *otto.Otto) {
vm.Set("contains", func(searchString interface{}, searchValue string) bool {
_ = vm.Set("contains", func(searchString interface{}, searchValue string) bool {
if searchStringString, ok := searchString.(string); ok {
return strings.Contains(strings.ToLower(searchStringString), strings.ToLower(searchValue))
} else if searchStringArray, ok := searchString.([]string); ok {
for _, s := range searchStringArray {
if strings.ToLower(s) == strings.ToLower(searchValue) {
if strings.EqualFold(s, searchValue) {
return true
}
}
@ -100,19 +110,19 @@ func vmContains(vm *otto.Otto) {
}
func vmStartsWith(vm *otto.Otto) {
vm.Set("startsWith", func(searchString string, searchValue string) bool {
_ = vm.Set("startsWith", func(searchString string, searchValue string) bool {
return strings.HasPrefix(strings.ToLower(searchString), strings.ToLower(searchValue))
})
}
func vmEndsWith(vm *otto.Otto) {
vm.Set("endsWith", func(searchString string, searchValue string) bool {
_ = vm.Set("endsWith", func(searchString string, searchValue string) bool {
return strings.HasSuffix(strings.ToLower(searchString), strings.ToLower(searchValue))
})
}
func vmFormat(vm *otto.Otto) {
vm.Set("format", func(s string, vals ...string) string {
_ = vm.Set("format", func(s string, vals ...string) string {
for i, v := range vals {
s = strings.ReplaceAll(s, fmt.Sprintf("{%d}", i), v)
}
@ -121,7 +131,7 @@ func vmFormat(vm *otto.Otto) {
}
func vmJoin(vm *otto.Otto) {
vm.Set("join", func(element interface{}, optionalElem string) string {
_ = vm.Set("join", func(element interface{}, optionalElem string) string {
slist := make([]string, 0)
if elementString, ok := element.(string); ok {
slist = append(slist, elementString)
@ -136,7 +146,7 @@ func vmJoin(vm *otto.Otto) {
}
func vmToJSON(vm *otto.Otto) {
vm.Set("toJSON", func(o interface{}) string {
_ = vm.Set("toJSON", func(o interface{}) string {
rtn, err := json.MarshalIndent(o, "", " ")
if err != nil {
logrus.Errorf("Unable to marsal: %v", err)
@ -146,10 +156,10 @@ func vmToJSON(vm *otto.Otto) {
})
}
func vmHashFiles(workdir string) func(*otto.Otto) {
func (rc *RunContext) vmHashFiles() func(*otto.Otto) {
return func(vm *otto.Otto) {
vm.Set("hashFiles", func(path string) string {
files, _, err := glob.Glob([]string{filepath.Join(workdir, path)})
_ = vm.Set("hashFiles", func(path string) string {
files, _, err := glob.Glob([]string{filepath.Join(rc.Config.Workdir, path)})
if err != nil {
logrus.Error(err)
return ""
@ -169,3 +179,99 @@ func vmHashFiles(workdir string) func(*otto.Otto) {
})
}
}
func (rc *RunContext) vmSuccess() func(*otto.Otto) {
return func(vm *otto.Otto) {
_ = vm.Set("success", func() bool {
return !rc.PriorStepFailed
})
}
}
func (rc *RunContext) vmFailure() func(*otto.Otto) {
return func(vm *otto.Otto) {
_ = vm.Set("failure", func() bool {
return rc.PriorStepFailed
})
}
}
func vmAlways(vm *otto.Otto) {
_ = vm.Set("always", func() bool {
return true
})
}
func vmCancelled(vm *otto.Otto) {
_ = vm.Set("cancelled", func() bool {
return false
})
}
func (rc *RunContext) vmGithub() func(*otto.Otto) {
github := map[string]interface{}{
"event": make(map[string]interface{}),
"event_path": "/github/workflow/event.json",
"workflow": rc.Run.Workflow.Name,
"run_id": "1",
"run_number": "1",
"actor": "nektos/act",
// TODO
"repository": "",
"event_name": "",
"sha": "",
"ref": "",
"head_ref": "",
"base_ref": "",
"token": "",
"workspace": rc.Config.Workdir,
"action": "",
}
err := json.Unmarshal([]byte(rc.EventJSON), github["event"])
if err != nil {
logrus.Error(err)
}
return func(vm *otto.Otto) {
_ = vm.Set("github", github)
}
}
func (rc *RunContext) vmEnv() func(*otto.Otto) {
env := map[string]interface{}{}
// TODO
return func(vm *otto.Otto) {
_ = vm.Set("env", env)
}
}
func (rc *RunContext) vmJob() func(*otto.Otto) {
job := map[string]interface{}{}
// TODO
return func(vm *otto.Otto) {
_ = vm.Set("job", job)
}
}
func (rc *RunContext) vmSteps() func(*otto.Otto) {
steps := map[string]interface{}{}
// TODO
return func(vm *otto.Otto) {
_ = vm.Set("steps", steps)
}
}
func (rc *RunContext) vmRunner() func(*otto.Otto) {
runner := map[string]interface{}{
"os": "Linux",
"temp": "/tmp",
"tool_cache": "/tmp",
}
return func(vm *otto.Otto) {
_ = vm.Set("runner", runner)
}
}

View file

@ -3,6 +3,7 @@ package runner
import (
"testing"
"github.com/nektos/act/pkg/model"
"github.com/stretchr/testify/assert"
)
@ -12,6 +13,12 @@ func TestEvaluate(t *testing.T) {
Config: &Config{
Workdir: ".",
},
Run: &model.Run{
JobID: "job1",
Workflow: &model.Workflow{
Name: "test-workflow",
},
},
}
ee := rc.NewExpressionEvaluator()
@ -36,6 +43,15 @@ func TestEvaluate(t *testing.T) {
{"join('hello','mona')", "hello mona", ""},
{"toJSON({'foo':'bar'})", "{\n \"foo\": \"bar\"\n}", ""},
{"hashFiles('**/package-lock.json')", "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ""},
{"success()", "true", ""},
{"failure()", "false", ""},
{"always()", "true", ""},
{"cancelled()", "false", ""},
{"github.workflow", "test-workflow", ""},
{"github.actor", "nektos/act", ""},
{"github.run_id", "1", ""},
{"github.run_number", "1", ""},
{"runner.os", "Linux", ""},
}
for _, table := range tables {
@ -59,6 +75,12 @@ func TestInterpolate(t *testing.T) {
Config: &Config{
Workdir: ".",
},
Run: &model.Run{
JobID: "job1",
Workflow: &model.Workflow{
Name: "test-workflow",
},
},
}
ee := rc.NewExpressionEvaluator()

View file

@ -28,15 +28,14 @@ type RunContext struct {
Env map[string]string
Outputs map[string]string
Tempdir string
PriorStepFailed bool
ExtraPath []string
}
// GetEnv returns the env for the context
func (rc *RunContext) GetEnv() map[string]string {
if rc.Env == nil {
rc.Env = mergeMaps(rc.Run.Workflow.Env, rc.Run.Job().Env)
if rc.Env["PATH"] == "" {
rc.Env["PATH"] = "/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin"
}
}
return rc.Env
}
@ -64,8 +63,10 @@ func (rc *RunContext) Executor() common.Executor {
err := rc.newStepExecutor(s)(ctx)
if err == nil {
common.Logger(ctx).Infof(" \u2705 Success - %s", s)
rc.PriorStepFailed = false
} else {
common.Logger(ctx).Errorf(" \u274C Failure - %s", s)
rc.PriorStepFailed = true
}
return err
})

View file

@ -163,7 +163,12 @@ func (rc *RunContext) setupShellCommand(containerSpec *model.ContainerSpec, shel
return err
}
if _, err := tempScript.Write([]byte(run)); err != nil {
_, err = tempScript.WriteString(fmt.Sprintf("PATH=\"%s:${PATH}\"\n", strings.Join(rc.ExtraPath, ":")))
if err != nil {
return err
}
if _, err := tempScript.WriteString(run); err != nil {
return err
}
log.Debugf("Wrote command '%s' to '%s'", run, tempScript.Name())