DNF supports more than one GPG key. It is possible that one may be used for signing packages, and another to sign the repository metadata. This renamed GPGKey to GPGKeys internally. It does not change the on-disk repository json format.
235 lines
6.2 KiB
Go
235 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{
|
|
{BaseURL: "http://example.com/baseos", PackageSets: nil},
|
|
{BaseURL: "http://example.com/appstream", PackageSets: nil},
|
|
{BaseURL: "http://example.com/baseos-rhel7", PackageSets: []string{"build"}},
|
|
{BaseURL: "http://example.com/extra-tools", PackageSets: []string{"build", "archive"}},
|
|
{BaseURL: "http://example.com/custom-os-stuff", PackageSets: []string{"blueprint"}},
|
|
{BaseURL: "http://example.com/repoone", PackageSets: []string{"blueprint"}},
|
|
{BaseURL: "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: "",
|
|
BaseURL: "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: "",
|
|
BaseURL: "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: "",
|
|
BaseURL: "",
|
|
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: "",
|
|
BaseURL: "",
|
|
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(rc, &tc.repoConfig, "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{
|
|
Baseurl: nil,
|
|
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)
|
|
}
|
|
}
|