debian-forge-composer/internal/cloudapi/v2/v2_internal_test.go
Sanne Raymaekers 7652af83d7 cloudapi/v2: adapt to new oapi-codegen
Fixed distribution list type, function signatures (later versions parse
uuids in the generated code), defaults actually being set and added
x-go-type where needed.
2025-03-26 11:13:14 +01:00

362 lines
9 KiB
Go

package v2
import (
"io"
"testing"
"github.com/sirupsen/logrus"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/osbuild/images/pkg/osbuild"
"github.com/osbuild/images/pkg/rpmmd"
"github.com/osbuild/osbuild-composer/internal/common"
)
func init() {
// logrus is creating so much output that it drowns the useful
// test output and we don't get test anything logrus related
// anyway so silence it by default
logrus.SetOutput(io.Discard)
}
func TestSplitExtension(t *testing.T) {
tests := []struct {
filename string
extension string
}{
{filename: "image.qcow2", extension: ".qcow2"},
{filename: "image.tar.gz", extension: ".tar.gz"},
{filename: "", extension: ""},
{filename: ".htaccess", extension: ""},
{filename: ".weirdfile.txt", extension: ".txt"},
}
for _, tt := range tests {
t.Run(tt.filename, func(t *testing.T) {
require.Equal(t, tt.extension, splitExtension(tt.filename))
})
}
}
func TestCollectRepos(t *testing.T) {
assert := assert.New(t)
// user repositories from request customizations
customRepos := []Repository{
{
Baseurl: common.ToPtr("http://example.com/repoone"),
},
{
Baseurl: common.ToPtr("http://example.com/repotwo"),
PackageSets: &[]string{"should-be-ignored"},
},
}
// repos from the image request (standard repos + package set repos)
irRepos := []Repository{
{
Baseurl: common.ToPtr("http://example.com/baseos"), // empty field -> all package sets
},
{
Baseurl: common.ToPtr("http://example.com/appstream"), // empty field -> all package sets
},
{
Baseurl: common.ToPtr("http://example.com/baseos-rhel7"), // build only
PackageSets: &[]string{"build"},
},
{
Baseurl: common.ToPtr("http://example.com/extra-tools"), // build and archive
PackageSets: &[]string{"build", "archive"},
},
{
Baseurl: common.ToPtr("http://example.com/custom-os-stuff"), // blueprint only
PackageSets: &[]string{"blueprint"},
},
}
expectedRepos := []rpmmd.RepoConfig{
{BaseURLs: []string{"http://example.com/baseos"}, PackageSets: nil},
{BaseURLs: []string{"http://example.com/appstream"}, PackageSets: nil},
{BaseURLs: []string{"http://example.com/baseos-rhel7"}, PackageSets: []string{"build"}},
{BaseURLs: []string{"http://example.com/extra-tools"}, PackageSets: []string{"build", "archive"}},
{BaseURLs: []string{"http://example.com/custom-os-stuff"}, PackageSets: []string{"blueprint"}},
{BaseURLs: []string{"http://example.com/repoone"}, PackageSets: []string{"blueprint"}},
{BaseURLs: []string{"http://example.com/repotwo"}, PackageSets: []string{"blueprint"}},
}
payloadPkgSets := []string{"blueprint"}
repos, err := convertRepos(irRepos, customRepos, payloadPkgSets)
assert.NoError(err)
// check lengths
assert.NoError(err)
assert.Equal(expectedRepos, repos)
}
func TestRepoConfigConversion(t *testing.T) {
assert := assert.New(t)
type testCase struct {
repo Repository
repoConfig rpmmd.RepoConfig
}
testCases := []testCase{
{
repo: Repository{
Baseurl: common.ToPtr("http://base.url"),
CheckGpg: common.ToPtr(true),
Gpgkey: common.ToPtr("some-kind-of-key"),
IgnoreSsl: common.ToPtr(false),
Metalink: nil,
Mirrorlist: nil,
Rhsm: common.ToPtr(false),
PackageSets: nil,
},
repoConfig: rpmmd.RepoConfig{
Name: "",
BaseURLs: []string{"http://base.url"},
Metalink: "",
MirrorList: "",
GPGKeys: []string{"some-kind-of-key"},
CheckGPG: common.ToPtr(true),
IgnoreSSL: common.ToPtr(false),
MetadataExpire: "",
RHSM: false,
ImageTypeTags: nil,
},
},
{
repo: Repository{
Baseurl: common.ToPtr("http://base.url"),
CheckGpg: nil,
Gpgkey: nil,
IgnoreSsl: common.ToPtr(true),
Metalink: common.ToPtr("http://example.org/metalink"),
Mirrorlist: common.ToPtr("http://example.org/mirrorlist"),
Rhsm: common.ToPtr(false),
PackageSets: nil,
},
repoConfig: rpmmd.RepoConfig{
Name: "",
BaseURLs: []string{"http://base.url"},
Metalink: "", // since BaseURL is specified, MetaLink is not copied
MirrorList: "", // since BaseURL is specified, MirrorList is not copied
CheckGPG: nil,
IgnoreSSL: common.ToPtr(true),
MetadataExpire: "",
RHSM: false,
ImageTypeTags: nil,
},
},
{
repo: Repository{
Baseurl: nil,
CheckGpg: nil,
Gpgkey: nil,
IgnoreSsl: common.ToPtr(true),
Metalink: common.ToPtr("http://example.org/metalink"),
Mirrorlist: common.ToPtr("http://example.org/mirrorlist"),
Rhsm: common.ToPtr(false),
PackageSets: nil,
},
repoConfig: rpmmd.RepoConfig{
Name: "",
Metalink: "", // since MirrorList is specified, MetaLink is not copied
MirrorList: "http://example.org/mirrorlist",
CheckGPG: nil,
IgnoreSSL: common.ToPtr(true),
MetadataExpire: "",
RHSM: false,
ImageTypeTags: nil,
},
},
{
repo: Repository{
Baseurl: nil,
CheckGpg: nil,
Gpgkey: nil,
IgnoreSsl: common.ToPtr(true),
Metalink: common.ToPtr("http://example.org/metalink"),
Mirrorlist: nil,
Rhsm: common.ToPtr(true),
PackageSets: nil,
},
repoConfig: rpmmd.RepoConfig{
Name: "",
Metalink: "http://example.org/metalink",
MirrorList: "",
CheckGPG: nil,
IgnoreSSL: common.ToPtr(true),
MetadataExpire: "",
RHSM: true,
ImageTypeTags: nil,
},
},
}
for idx, tc := range testCases {
repoConfig := tc.repoConfig
rc, err := genRepoConfig(tc.repo)
assert.NoError(err)
assert.Equal(&repoConfig, rc, "mismatch in test case %d", idx)
}
errorTestCases := []struct {
repo Repository
err string
}{
// invalid repo
{
repo: Repository{
Baseurl: nil,
CheckGpg: nil,
Gpgkey: nil,
IgnoreSsl: nil,
Metalink: nil,
Mirrorlist: nil,
Rhsm: common.ToPtr(true),
PackageSets: nil,
},
err: HTTPError(ErrorInvalidRepository).Error(),
},
// check gpg required but no gpgkey given
{
repo: Repository{
CheckGpg: common.ToPtr(true),
Gpgkey: nil,
IgnoreSsl: common.ToPtr(true),
Metalink: common.ToPtr("http://example.org/metalink"),
Mirrorlist: nil,
Rhsm: common.ToPtr(true),
PackageSets: nil,
},
err: HTTPError(ErrorNoGPGKey).Error(),
},
}
for _, tc := range errorTestCases {
rc, err := genRepoConfig(tc.repo)
assert.Nil(rc)
assert.EqualError(err, tc.err)
}
}
func TestStagesToPackageMetadata(t *testing.T) {
assert := assert.New(t)
type testCase struct {
stages []osbuild.RPMStageMetadata
pkgs []PackageMetadata
}
testCases := []testCase{
{
stages: []osbuild.RPMStageMetadata{
{
Packages: []osbuild.RPMPackageMetadata{
{
Name: "vim-minimal",
Version: "8.0.1763",
Release: "15.el8",
Epoch: common.ToPtr("2"),
Arch: "x86_64",
SigMD5: "v",
SigPGP: "v",
SigGPG: "v",
},
{
Name: "unique",
Version: "1.90",
Release: "10",
Epoch: nil,
Arch: "aarch64",
SigMD5: "v",
SigPGP: "v",
SigGPG: "v",
},
},
},
},
pkgs: []PackageMetadata{
{
Type: "rpm",
Name: "vim-minimal",
Version: "8.0.1763",
Release: "15.el8",
Epoch: common.ToPtr("2"),
Arch: "x86_64",
Signature: common.ToPtr("v"),
Sigmd5: "v",
},
{
Type: "rpm",
Name: "unique",
Version: "1.90",
Release: "10",
Epoch: nil,
Arch: "aarch64",
Signature: common.ToPtr("v"),
Sigmd5: "v",
},
},
},
{
stages: []osbuild.RPMStageMetadata{
{
Packages: []osbuild.RPMPackageMetadata{
{
Name: "vim-minimal",
Version: "8.0.1763",
Release: "15.el8",
Epoch: common.ToPtr("2"),
Arch: "x86_64",
SigMD5: "v",
SigPGP: "v",
SigGPG: "v",
},
},
},
{
Packages: []osbuild.RPMPackageMetadata{
{
Name: "unique",
Version: "1.90",
Release: "10",
Epoch: nil,
Arch: "aarch64",
SigMD5: "v",
SigPGP: "v",
SigGPG: "v",
},
},
},
},
pkgs: []PackageMetadata{
{
Type: "rpm",
Name: "vim-minimal",
Version: "8.0.1763",
Release: "15.el8",
Epoch: common.ToPtr("2"),
Arch: "x86_64",
Signature: common.ToPtr("v"),
Sigmd5: "v",
},
{
Type: "rpm",
Name: "unique",
Version: "1.90",
Release: "10",
Epoch: nil,
Arch: "aarch64",
Signature: common.ToPtr("v"),
Sigmd5: "v",
},
},
},
}
for idx, tc := range testCases {
assert.Equal(tc.pkgs, stagesToPackageMetadata(tc.stages), "mismatch in test case %d", idx)
}
}