forgejo-runner

git clone git://git.lin.moe/forgejo-runner.git

  1// SPDX-License-Identifier: MIT
  2
  3package cmd
  4
  5import (
  6	"bytes"
  7	"context"
  8	"os"
  9	"testing"
 10
 11	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"
 16
 17	"github.com/spf13/cobra"
 18	"github.com/stretchr/testify/assert"
 19	"gopkg.in/yaml.v3"
 20)
 21
 22func 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)
 27
 28	err := cmd.ExecuteContext(ctx)
 29
 30	return buf.String(), err
 31}
 32
 33func 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}
 41
 42func 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}
 46
 47func 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}
 52
 53func 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}
 65
 66func Test_runCreateRunnerFile(t *testing.T) {
 67	//
 68	// Set the .runner file to be in a temporary directory
 69	//
 70	dir := t.TempDir()
 71	configFile := dir + "/config.yml"
 72	runnerFile := dir + "/.runner"
 73	cfg, err := config.LoadDefault("")
 74	cfg.Runner.File = runnerFile
 75	yamlData, err := yaml.Marshal(cfg)
 76	assert.NoError(t, err)
 77	assert.NoError(t, os.WriteFile(configFile, yamlData, 0o666))
 78
 79	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"
 86
 87	//
 88	// Run create-runner-file
 89	//
 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)
 95
 96	//
 97	// Read back the runner file and verify its content
 98	//
 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)
103
104	//
105	// Verify that fetching a task successfully returns there is
106	// no task for this runner
107	//
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}