Technically osbuild/osbuild-composer#4564 broke the api spec by marking a required field as non-required. Fix this by using allOf.
370 lines
9.3 KiB
Go
370 lines
9.3 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{
|
|
{
|
|
PackageMetadataCommon: PackageMetadataCommon{
|
|
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",
|
|
},
|
|
{
|
|
PackageMetadataCommon: PackageMetadataCommon{
|
|
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{
|
|
{
|
|
PackageMetadataCommon: PackageMetadataCommon{
|
|
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",
|
|
},
|
|
{
|
|
PackageMetadataCommon: PackageMetadataCommon{
|
|
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)
|
|
}
|
|
}
|