debian-forge-composer/internal/cloudapi/v2/v2_internal_test.go
Gianluca Zuccarelli d44703cdc8 rpmmd/repository: repoconfig pointers
Convert some of the fields in the `RepoConfig` struct
to pointers. Since `RepoConfig` will be used to convert
custom repositories to an array of `osbuild.YumRepository`,
we need to ensure that fields that are not set explicitly
are not saved to the `/etc/yum.repos.d` repository files.
2023-04-21 17:40:00 +02:00

232 lines
6.2 KiB
Go

package v2
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/osbuild/osbuild-composer/internal/common"
"github.com/osbuild/osbuild-composer/internal/rpmmd"
)
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)
// check lengths
assert.NoError(err)
assert.Equal(repos, expectedRepos)
}
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: 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: 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: 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: true,
MetadataExpire: "",
RHSM: true,
ImageTypeTags: nil,
},
},
}
for idx, tc := range testCases {
rc, err := genRepoConfig(tc.repo)
assert.NoError(err)
assert.Equal(&tc.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)
}
}