From e43a30e4cfa309f0da78c8911b61a0a22b6d3ea4 Mon Sep 17 00:00:00 2001 From: Martin Sehnoutka Date: Tue, 24 Mar 2020 10:51:15 +0100 Subject: [PATCH] osbuild-dnf-json-tests: Introduce depsolving test This test makes sure we can run depsolve for all build packages sets and base packages sets for all image types for all architectures for all defined Fedora versions. In could run the same for RHEL, but I haven't yet implemented it, because such tests cannot run in public Internet. --- cmd/osbuild-dnf-json-tests/main_test.go | 61 +++++++++++++++++++++++-- 1 file changed, 57 insertions(+), 4 deletions(-) diff --git a/cmd/osbuild-dnf-json-tests/main_test.go b/cmd/osbuild-dnf-json-tests/main_test.go index b2d2a2152..0ff22b62c 100644 --- a/cmd/osbuild-dnf-json-tests/main_test.go +++ b/cmd/osbuild-dnf-json-tests/main_test.go @@ -6,12 +6,18 @@ package main import ( "fmt" - "github.com/stretchr/testify/assert" - "path" - "testing" - + "github.com/osbuild/osbuild-composer/internal/distro" + "github.com/osbuild/osbuild-composer/internal/distro/fedora30" + "github.com/osbuild/osbuild-composer/internal/distro/fedora31" + "github.com/osbuild/osbuild-composer/internal/distro/fedora32" "github.com/osbuild/osbuild-composer/internal/rpmmd" "github.com/osbuild/osbuild-composer/internal/test" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "io/ioutil" + "os" + "path" + "testing" ) func TestFetchChecksum(t *testing.T) { @@ -32,3 +38,50 @@ func TestFetchChecksum(t *testing.T) { assert.Nilf(t, err, "Failed to fetch checksum: %v", err) assert.NotEqual(t, "", c["repo"], "The checksum is empty") } + +// This test loads all the repositories available in /repositories directory +// and tries to run depsolve for each architecture. With N architectures available +// this should run cross-arch dependency solving N-1 times. +func TestCrossArchDepsolve(t *testing.T) { + // Set up temporary directory for rpm/dnf cache + dir, err := ioutil.TempDir("/tmp", "rpmmd-test-") + require.Nilf(t, err, "Failed to create tmp dir for depsolve test: %v", err) + defer os.RemoveAll(dir) + rpm := rpmmd.NewRPMMD(dir) + + // Load repositories from the definition we provide in the RPM package + repositories := "/usr/share/osbuild-composer" + + // NOTE: we can add RHEL, but don't make it hard requirement because it will fail outside of VPN + for _, distroStruct := range []distro.Distro{fedora30.New(), fedora31.New(), fedora32.New()} { + repoConfig, err := rpmmd.LoadRepositories([]string{repositories}, distroStruct.Name()) + assert.Nilf(t, err, "Failed to LoadRepositories from %v for %v: %v", repositories, distroStruct.Name(), err) + if err != nil { + // There is no point in running the tests without having repositories, but we can still run tests + // for the remaining distros + continue + } + for _, archStr := range distroStruct.ListArchs() { + arch, err := distroStruct.GetArch(archStr) + assert.Nilf(t, err, "Failed to GetArch from %v structure: %v", distroStruct.Name(), err) + if err != nil { + continue + } + for _, imgTypeStr := range arch.ListImageTypes() { + imgType, err := arch.GetImageType(imgTypeStr) + assert.Nilf(t, err, "Failed to GetImageType for %v on %v: %v", distroStruct.Name(), arch.Name(), err) + if err != nil { + continue + } + + buildPackages := imgType.BuildPackages() + _, _, err = rpm.Depsolve(buildPackages, []string{}, repoConfig[archStr], distroStruct.ModulePlatformID(), archStr) + assert.Nilf(t, err, "Failed to Depsolve build packages for %v %v %v image: %v", distroStruct.Name(), imgType.Name(), arch.Name(), err) + + basePackagesInclude, basePackagesExclude := imgType.BasePackages() + _, _, err = rpm.Depsolve(basePackagesInclude, basePackagesExclude, repoConfig[archStr], distroStruct.ModulePlatformID(), archStr) + assert.Nilf(t, err, "Failed to Depsolve base packages for %v %v %v image: %v", distroStruct.Name(), imgType.Name(), arch.Name(), err) + } + } + } +}