1// SPDX-License-Identifier: MIT23package cmd45import (6 "bytes"7 "context"8 "os"9 "testing"1011 runnerv1 "code.gitea.io/actions-proto-go/runner/v1"12 "connectrpc.com/connect"13 "gitea.com/gitea/act_runner/internal/pkg/client"14 "gitea.com/gitea/act_runner/internal/pkg/config"15 "gitea.com/gitea/act_runner/internal/pkg/ver"1617 "github.com/spf13/cobra"18 "github.com/stretchr/testify/assert"19 "gopkg.in/yaml.v3"20)2122func executeCommand(ctx context.Context, cmd *cobra.Command, args ...string) (string, error) {23 buf := new(bytes.Buffer)24 cmd.SetOut(buf)25 cmd.SetErr(buf)26 cmd.SetArgs(args)2728 err := cmd.ExecuteContext(ctx)2930 return buf.String(), err31}3233func Test_createRunnerFileCmd(t *testing.T) {34 configFile := "config.yml"35 ctx := context.Background()36 cmd := createRunnerFileCmd(ctx, &configFile)37 output, err := executeCommand(ctx, cmd)38 assert.ErrorContains(t, err, `required flag(s) "instance", "secret" not set`)39 assert.Contains(t, output, "Usage:")40}4142func Test_validateSecret(t *testing.T) {43 assert.ErrorContains(t, validateSecret("abc"), "exactly 40 characters")44 assert.ErrorContains(t, validateSecret("ZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"), "must be an hexadecimal")45}4647func Test_uuidFromSecret(t *testing.T) {48 uuid, err := uuidFromSecret("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")49 assert.NoError(t, err)50 assert.EqualValues(t, uuid, "41414141-4141-4141-4141-414141414141")51}5253func Test_ping(t *testing.T) {54 cfg := &config.Config{}55 address := os.Getenv("FORGEJO_URL")56 if address == "" {57 address = "https://code.forgejo.org"58 }59 reg := &config.Registration{60 Address: address,61 UUID: "create-runner-file_test.go",62 }63 assert.NoError(t, ping(cfg, reg))64}6566func Test_runCreateRunnerFile(t *testing.T) {67 //68 // Set the .runner file to be in a temporary directory69 //70 dir := t.TempDir()71 configFile := dir + "/config.yml"72 runnerFile := dir + "/.runner"73 cfg, err := config.LoadDefault("")74 cfg.Runner.File = runnerFile75 yamlData, err := yaml.Marshal(cfg)76 assert.NoError(t, err)77 assert.NoError(t, os.WriteFile(configFile, yamlData, 0o666))7879 instance, has := os.LookupEnv("FORGEJO_URL")80 if !has {81 instance = "https://code.forgejo.org"82 }83 secret, has := os.LookupEnv("FORGEJO_RUNNER_SECRET")84 assert.True(t, has)85 name := "testrunner"8687 //88 // Run create-runner-file89 //90 ctx := context.Background()91 cmd := createRunnerFileCmd(ctx, &configFile)92 output, err := executeCommand(ctx, cmd, "--connect", "--secret", secret, "--instance", instance, "--name", name)93 assert.NoError(t, err)94 assert.EqualValues(t, "", output)9596 //97 // Read back the runner file and verify its content98 //99 reg, err := config.LoadRegistration(runnerFile)100 assert.NoError(t, err)101 assert.EqualValues(t, secret, reg.Token)102 assert.EqualValues(t, instance, reg.Address)103104 //105 // Verify that fetching a task successfully returns there is106 // no task for this runner107 //108 cli := client.New(109 reg.Address,110 cfg.Runner.Insecure,111 reg.UUID,112 reg.Token,113 ver.Version(),114 )115 resp, err := cli.FetchTask(ctx, connect.NewRequest(&runnerv1.FetchTaskRequest{}))116 assert.NoError(t, err)117 assert.Nil(t, resp.Msg.Task)118}