// Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT package labels import ( "testing" "github.com/stretchr/testify/require" "gotest.tools/v3/assert" ) func TestPickPlatform(t *testing.T) { tests := []struct { name string labels []string runsOn []string want string }{ { name: "exact match host label", labels: []string{"linux-latest:host", "ubuntu:host"}, runsOn: []string{"linux-latest"}, want: "-self-hosted", }, { name: "exact match docker label", labels: []string{"ubuntu:docker://node:18"}, runsOn: []string{"ubuntu"}, want: "node:18", }, { name: "no match returns empty string to fail job", labels: []string{"linux:host", "debian:host"}, runsOn: []string{"unknown-label"}, want: "", }, { name: "no match on docker runner returns empty string", labels: []string{"ubuntu:docker://node:18", "linux:host"}, runsOn: []string{"unknown-label"}, want: "", }, { name: "empty labels returns empty string", labels: []string{}, runsOn: []string{"anything"}, want: "", }, { name: "multiple runsOn matches first available", labels: []string{"linux:host", "ubuntu:docker://node:18"}, runsOn: []string{"windows", "ubuntu"}, want: "node:18", }, { name: "runsOn with :host suffix matches host label", labels: []string{"germany-linux:host", "linux:host"}, runsOn: []string{"germany-linux:host"}, want: "-self-hosted", }, { name: "runsOn with :docker suffix matches docker label", labels: []string{"ubuntu:docker://node:18"}, runsOn: []string{"ubuntu:docker"}, want: "node:18", }, { name: "runsOn without suffix matches any schema", labels: []string{"linux:host"}, runsOn: []string{"linux"}, want: "-self-hosted", }, { name: "runsOn :docker does not match host label", labels: []string{"linux:host"}, runsOn: []string{"linux:docker"}, want: "", }, { name: "runsOn :host does not match docker label", labels: []string{"ubuntu:docker://node:18"}, runsOn: []string{"ubuntu:host"}, want: "", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { ls := Labels{} for _, l := range tt.labels { label, err := Parse(l) require.NoError(t, err) ls = append(ls, label) } got := ls.PickPlatform(tt.runsOn) assert.Equal(t, got, tt.want) }) } } func TestParse(t *testing.T) { tests := []struct { args string want *Label wantErr bool }{ { args: "ubuntu:docker://node:18", want: &Label{ Name: "ubuntu", Schema: "docker", Arg: "//node:18", }, wantErr: false, }, { args: "ubuntu:host", want: &Label{ Name: "ubuntu", Schema: "host", Arg: "", }, wantErr: false, }, { args: "ubuntu", want: &Label{ Name: "ubuntu", Schema: "host", Arg: "", }, wantErr: false, }, { args: "ubuntu:vm:ubuntu-18.04", want: nil, wantErr: true, }, } for _, tt := range tests { t.Run(tt.args, func(t *testing.T) { got, err := Parse(tt.args) if tt.wantErr { require.Error(t, err) return } require.NoError(t, err) assert.DeepEqual(t, got, tt.want) }) } }