summaryrefslogtreecommitdiffstats
path: root/pkg/runner/command_test.go
diff options
context:
space:
mode:
authorDaniel Baumann <daniel@debian.org>2024-10-20 23:07:42 +0200
committerDaniel Baumann <daniel@debian.org>2024-11-09 15:38:42 +0100
commit714c83b2736d7e308bc33c49057952490eb98be2 (patch)
tree1d9ba7035798368569cd49056f4d596efc908cd8 /pkg/runner/command_test.go
parentInitial commit. (diff)
downloadforgejo-act-714c83b2736d7e308bc33c49057952490eb98be2.tar.xz
forgejo-act-714c83b2736d7e308bc33c49057952490eb98be2.zip
Adding upstream version 1.21.4.HEADupstream/1.21.4upstreamdebian
Signed-off-by: Daniel Baumann <daniel@debian.org>
Diffstat (limited to 'pkg/runner/command_test.go')
-rw-r--r--pkg/runner/command_test.go189
1 files changed, 189 insertions, 0 deletions
diff --git a/pkg/runner/command_test.go b/pkg/runner/command_test.go
new file mode 100644
index 0000000..57c7de5
--- /dev/null
+++ b/pkg/runner/command_test.go
@@ -0,0 +1,189 @@
+package runner
+
+import (
+ "bytes"
+ "context"
+ "io"
+ "os"
+ "testing"
+
+ "github.com/sirupsen/logrus/hooks/test"
+ "github.com/stretchr/testify/assert"
+
+ "github.com/nektos/act/pkg/common"
+ "github.com/nektos/act/pkg/model"
+)
+
+func TestSetEnv(t *testing.T) {
+ a := assert.New(t)
+ ctx := context.Background()
+ rc := new(RunContext)
+ handler := rc.commandHandler(ctx)
+
+ handler("::set-env name=x::valz\n")
+ a.Equal("valz", rc.Env["x"])
+}
+
+func TestSetOutput(t *testing.T) {
+ a := assert.New(t)
+ ctx := context.Background()
+ rc := new(RunContext)
+ rc.StepResults = make(map[string]*model.StepResult)
+ handler := rc.commandHandler(ctx)
+
+ rc.CurrentStep = "my-step"
+ rc.StepResults[rc.CurrentStep] = &model.StepResult{
+ Outputs: make(map[string]string),
+ }
+ handler("::set-output name=x::valz\n")
+ a.Equal("valz", rc.StepResults["my-step"].Outputs["x"])
+
+ handler("::set-output name=x::percent2%25\n")
+ a.Equal("percent2%", rc.StepResults["my-step"].Outputs["x"])
+
+ handler("::set-output name=x::percent2%25%0Atest\n")
+ a.Equal("percent2%\ntest", rc.StepResults["my-step"].Outputs["x"])
+
+ handler("::set-output name=x::percent2%25%0Atest another3%25test\n")
+ a.Equal("percent2%\ntest another3%test", rc.StepResults["my-step"].Outputs["x"])
+
+ handler("::set-output name=x%3A::percent2%25%0Atest\n")
+ a.Equal("percent2%\ntest", rc.StepResults["my-step"].Outputs["x:"])
+
+ handler("::set-output name=x%3A%2C%0A%25%0D%3A::percent2%25%0Atest\n")
+ a.Equal("percent2%\ntest", rc.StepResults["my-step"].Outputs["x:,\n%\r:"])
+}
+
+func TestAddpath(t *testing.T) {
+ a := assert.New(t)
+ ctx := context.Background()
+ rc := new(RunContext)
+ handler := rc.commandHandler(ctx)
+
+ handler("::add-path::/zoo\n")
+ a.Equal("/zoo", rc.ExtraPath[0])
+
+ handler("::add-path::/boo\n")
+ a.Equal("/boo", rc.ExtraPath[0])
+}
+
+func TestStopCommands(t *testing.T) {
+ logger, hook := test.NewNullLogger()
+
+ a := assert.New(t)
+ ctx := common.WithLogger(context.Background(), logger)
+ rc := new(RunContext)
+ handler := rc.commandHandler(ctx)
+
+ handler("::set-env name=x::valz\n")
+ a.Equal("valz", rc.Env["x"])
+ handler("::stop-commands::my-end-token\n")
+ handler("::set-env name=x::abcd\n")
+ a.Equal("valz", rc.Env["x"])
+ handler("::my-end-token::\n")
+ handler("::set-env name=x::abcd\n")
+ a.Equal("abcd", rc.Env["x"])
+
+ messages := make([]string, 0)
+ for _, entry := range hook.AllEntries() {
+ messages = append(messages, entry.Message)
+ }
+
+ a.Contains(messages, " \U00002699 ::set-env name=x::abcd\n")
+}
+
+func TestAddpathADO(t *testing.T) {
+ a := assert.New(t)
+ ctx := context.Background()
+ rc := new(RunContext)
+ handler := rc.commandHandler(ctx)
+
+ handler("##[add-path]/zoo\n")
+ a.Equal("/zoo", rc.ExtraPath[0])
+
+ handler("##[add-path]/boo\n")
+ a.Equal("/boo", rc.ExtraPath[0])
+}
+
+func TestAddmask(t *testing.T) {
+ logger, hook := test.NewNullLogger()
+
+ a := assert.New(t)
+ ctx := context.Background()
+ loggerCtx := common.WithLogger(ctx, logger)
+
+ rc := new(RunContext)
+ handler := rc.commandHandler(loggerCtx)
+ handler("::add-mask::my-secret-value\n")
+
+ a.Equal(" \U00002699 ***", hook.LastEntry().Message)
+ a.NotEqual(" \U00002699 *my-secret-value", hook.LastEntry().Message)
+}
+
+// based on https://stackoverflow.com/a/10476304
+func captureOutput(t *testing.T, f func()) string {
+ old := os.Stdout
+ r, w, _ := os.Pipe()
+ os.Stdout = w
+
+ f()
+
+ outC := make(chan string)
+
+ go func() {
+ var buf bytes.Buffer
+ _, err := io.Copy(&buf, r)
+ if err != nil {
+ a := assert.New(t)
+ a.Fail("io.Copy failed")
+ }
+ outC <- buf.String()
+ }()
+
+ w.Close()
+ os.Stdout = old
+ out := <-outC
+
+ return out
+}
+
+func TestAddmaskUsemask(t *testing.T) {
+ rc := new(RunContext)
+ rc.StepResults = make(map[string]*model.StepResult)
+ rc.CurrentStep = "my-step"
+ rc.StepResults[rc.CurrentStep] = &model.StepResult{
+ Outputs: make(map[string]string),
+ }
+
+ a := assert.New(t)
+
+ config := &Config{
+ Secrets: map[string]string{},
+ InsecureSecrets: false,
+ }
+
+ re := captureOutput(t, func() {
+ ctx := context.Background()
+ ctx = WithJobLogger(ctx, "0", "testjob", config, &rc.Masks, map[string]interface{}{})
+
+ handler := rc.commandHandler(ctx)
+ handler("::add-mask::secret\n")
+ handler("::set-output:: token=secret\n")
+ })
+
+ a.Equal("[testjob] \U00002699 ***\n[testjob] \U00002699 ::set-output:: = token=***\n", re)
+}
+
+func TestSaveState(t *testing.T) {
+ rc := &RunContext{
+ CurrentStep: "step",
+ StepResults: map[string]*model.StepResult{},
+ }
+
+ ctx := context.Background()
+
+ handler := rc.commandHandler(ctx)
+ handler("::save-state name=state-name::state-value\n")
+
+ assert.Equal(t, "state-value", rc.IntraActionState["step"]["state-name"])
+}