Remove all the internal package that are now in the github.com/osbuild/images package and vendor it. A new function in internal/blueprint/ converts from an osbuild-composer blueprint to an images blueprint. This is necessary for keeping the blueprint implementation in both packages. In the future, the images package will change the blueprint (and most likely rename it) and it will only be part of the osbuild-composer internals and interface. The Convert() function will be responsible for converting the blueprint into the new configuration object.
225 lines
5.8 KiB
Go
225 lines
5.8 KiB
Go
// dnfjson_mock provides data and methods for testing the dnfjson package.
|
|
package dnfjson_mock
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"time"
|
|
|
|
"github.com/osbuild/images/pkg/rpmmd"
|
|
"github.com/osbuild/osbuild-composer/internal/dnfjson"
|
|
)
|
|
|
|
func generatePackageList() rpmmd.PackageList {
|
|
baseTime, err := time.Parse(time.RFC3339, "2006-01-02T15:04:05Z")
|
|
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
var packageList rpmmd.PackageList
|
|
|
|
for i := 0; i < 22; i++ {
|
|
basePackage := rpmmd.Package{
|
|
Name: fmt.Sprintf("package%d", i),
|
|
Summary: fmt.Sprintf("pkg%d sum", i),
|
|
Description: fmt.Sprintf("pkg%d desc", i),
|
|
URL: fmt.Sprintf("https://pkg%d.example.com", i),
|
|
Epoch: 0,
|
|
Version: fmt.Sprintf("%d.0", i),
|
|
Release: fmt.Sprintf("%d.fc30", i),
|
|
Arch: "x86_64",
|
|
BuildTime: baseTime.AddDate(0, i, 0),
|
|
License: "MIT",
|
|
}
|
|
|
|
secondBuild := basePackage
|
|
|
|
secondBuild.Version = fmt.Sprintf("%d.1", i)
|
|
secondBuild.BuildTime = basePackage.BuildTime.AddDate(0, 0, 1)
|
|
|
|
packageList = append(packageList, basePackage, secondBuild)
|
|
}
|
|
|
|
return packageList
|
|
}
|
|
|
|
// generateSearchResults creates results for use with the dnfjson search command
|
|
// which is used for listing a subset of modules and projects.
|
|
//
|
|
// The map key is a comma-separated list of the packages requested
|
|
// If no packages are included it returns all 22 packages, same as the mock dump
|
|
//
|
|
// nonexistingpkg returns an empty list
|
|
// badpackage1 returns a fetch error, same as when the package name is unknown
|
|
// baddepsolve returns package1, the test then tries to depsolve package1 using BadDepsolve()
|
|
// wich will return a depsolve error.
|
|
func generateSearchResults() map[string]interface{} {
|
|
allPackages := generatePackageList()
|
|
|
|
// This includes package16, package2, package20, and package21
|
|
var wildcardResults rpmmd.PackageList
|
|
wildcardResults = append(wildcardResults, allPackages[32], allPackages[33])
|
|
wildcardResults = append(wildcardResults, allPackages[4], allPackages[5])
|
|
for i := 40; i < 44; i++ {
|
|
wildcardResults = append(wildcardResults, allPackages[i])
|
|
}
|
|
|
|
fetchError := dnfjson.Error{
|
|
Kind: "FetchError",
|
|
Reason: "There was a problem when fetching packages.",
|
|
}
|
|
|
|
return map[string]interface{}{
|
|
"": allPackages,
|
|
"*": allPackages,
|
|
"nonexistingpkg": rpmmd.PackageList{},
|
|
"package1": rpmmd.PackageList{allPackages[2], allPackages[3]},
|
|
"package1,package2": rpmmd.PackageList{allPackages[2], allPackages[3], allPackages[4], allPackages[5]},
|
|
"package2*,package16": wildcardResults,
|
|
"package16": rpmmd.PackageList{allPackages[32], allPackages[33]},
|
|
"badpackage1": fetchError,
|
|
"baddepsolve": rpmmd.PackageList{allPackages[2], allPackages[3]},
|
|
}
|
|
}
|
|
|
|
func createBaseDepsolveFixture() []dnfjson.PackageSpec {
|
|
return []dnfjson.PackageSpec{
|
|
{
|
|
Name: "dep-package3",
|
|
Epoch: 7,
|
|
Version: "3.0.3",
|
|
Release: "1.fc30",
|
|
Arch: "x86_64",
|
|
RepoID: "REPOID", // added by mock-dnf-json
|
|
},
|
|
{
|
|
Name: "dep-package1",
|
|
Epoch: 0,
|
|
Version: "1.33",
|
|
Release: "2.fc30",
|
|
Arch: "x86_64",
|
|
RepoID: "REPOID", // added by mock-dnf-json
|
|
},
|
|
{
|
|
Name: "dep-package2",
|
|
Epoch: 0,
|
|
Version: "2.9",
|
|
Release: "1.fc30",
|
|
Arch: "x86_64",
|
|
RepoID: "REPOID", // added by mock-dnf-json
|
|
},
|
|
}
|
|
}
|
|
|
|
// BaseDeps is the expected list of dependencies (as rpmmd.PackageSpec) from
|
|
// the Base ResponseGenerator
|
|
func BaseDeps() []rpmmd.PackageSpec {
|
|
return []rpmmd.PackageSpec{
|
|
{
|
|
Name: "dep-package3",
|
|
Epoch: 7,
|
|
Version: "3.0.3",
|
|
Release: "1.fc30",
|
|
Arch: "x86_64",
|
|
CheckGPG: true,
|
|
},
|
|
{
|
|
Name: "dep-package1",
|
|
Epoch: 0,
|
|
Version: "1.33",
|
|
Release: "2.fc30",
|
|
Arch: "x86_64",
|
|
CheckGPG: true,
|
|
},
|
|
{
|
|
Name: "dep-package2",
|
|
Epoch: 0,
|
|
Version: "2.9",
|
|
Release: "1.fc30",
|
|
Arch: "x86_64",
|
|
CheckGPG: true,
|
|
},
|
|
}
|
|
}
|
|
|
|
type ResponseGenerator func(string) string
|
|
|
|
func Base(tmpdir string) string {
|
|
data := map[string]interface{}{
|
|
"depsolve": createBaseDepsolveFixture(),
|
|
"dump": generatePackageList(),
|
|
"search": generateSearchResults(),
|
|
}
|
|
path := filepath.Join(tmpdir, "base.json")
|
|
write(data, path)
|
|
return path
|
|
}
|
|
|
|
func NonExistingPackage(tmpdir string) string {
|
|
deps := dnfjson.Error{
|
|
Kind: "MarkingErrors",
|
|
Reason: "Error occurred when marking packages for installation: Problems in request:\nmissing packages: fash",
|
|
}
|
|
data := map[string]interface{}{
|
|
"depsolve": deps,
|
|
}
|
|
path := filepath.Join(tmpdir, "notexist.json")
|
|
write(data, path)
|
|
return path
|
|
}
|
|
|
|
func BadDepsolve(tmpdir string) string {
|
|
deps := dnfjson.Error{
|
|
Kind: "DepsolveError",
|
|
Reason: "There was a problem depsolving ['go2rpm']: \n Problem: conflicting requests\n - nothing provides askalono-cli needed by go2rpm-1-4.fc31.noarch",
|
|
}
|
|
|
|
data := map[string]interface{}{
|
|
"depsolve": deps,
|
|
"dump": generatePackageList(),
|
|
"search": generateSearchResults(),
|
|
}
|
|
path := filepath.Join(tmpdir, "baddepsolve.json")
|
|
write(data, path)
|
|
return path
|
|
}
|
|
|
|
func BadFetch(tmpdir string) string {
|
|
deps := dnfjson.Error{
|
|
Kind: "DepsolveError",
|
|
Reason: "There was a problem depsolving ['go2rpm']: \n Problem: conflicting requests\n - nothing provides askalono-cli needed by go2rpm-1-4.fc31.noarch",
|
|
}
|
|
pkgs := dnfjson.Error{
|
|
Kind: "FetchError",
|
|
Reason: "There was a problem when fetching packages.",
|
|
}
|
|
data := map[string]interface{}{
|
|
"depsolve": deps,
|
|
"dump": pkgs,
|
|
"search": generateSearchResults(),
|
|
}
|
|
path := filepath.Join(tmpdir, "badfetch.json")
|
|
write(data, path)
|
|
return path
|
|
}
|
|
|
|
func marshal(data interface{}) []byte {
|
|
jdata, err := json.Marshal(data)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return jdata
|
|
}
|
|
|
|
func write(data interface{}, path string) {
|
|
fp, err := os.Create(path)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
if _, err := fp.Write(marshal(data)); err != nil {
|
|
panic(err)
|
|
}
|
|
}
|