Update the internal RepoConfig object to accept a slice of baseurls rather than a single field. This change was needed to align RepoConfig with the dnf spec [1]. Additionally, this change adds custom json marshal and unmarshal functions to ensure backwards compatibility with older workers. Add json tags to the internal rpmmd config since this is serialized in dnfjson. Add unit tests to check the serialization is okay. [1] See dnf.config
232 lines
6.2 KiB
Go
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: 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: false,
|
|
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: false,
|
|
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: false,
|
|
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)
|
|
}
|
|
}
|