debian-forge-composer/internal/cloudapi/v2/v2_internal_test.go
Gianluca Zuccarelli 4d42808b6a internal/rpmmd: RepoConfig baseurl change
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
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: 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)
}
}