577 lines
14 KiB
Go
577 lines
14 KiB
Go
package main
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"debian-bootc-image-builder/internal/apt"
|
|
"debian-bootc-image-builder/internal/config"
|
|
)
|
|
|
|
func TestManifestConfig(t *testing.T) {
|
|
// Test creating a new ManifestConfig
|
|
config := &ManifestConfig{
|
|
ImageName: "test-image",
|
|
ImageTypes: []string{"qcow2"},
|
|
TargetArch: "amd64",
|
|
RootfsType: "ext4",
|
|
DistroDefPath: []string{"./data/defs"},
|
|
BuildContainer: "debian:trixie",
|
|
}
|
|
|
|
assert.Equal(t, "test-image", config.ImageName)
|
|
assert.Equal(t, []string{"qcow2"}, config.ImageTypes)
|
|
assert.Equal(t, "amd64", config.TargetArch)
|
|
assert.Equal(t, "ext4", config.RootfsType)
|
|
assert.Equal(t, []string{"./data/defs"}, config.DistroDefPath)
|
|
assert.Equal(t, "debian:trixie", config.BuildContainer)
|
|
}
|
|
|
|
func TestManifestConfigLoadPackageDefinitions(t *testing.T) {
|
|
// Create a temporary directory with test package definitions
|
|
tmpDir := t.TempDir()
|
|
defsDir := filepath.Join(tmpDir, "defs")
|
|
err := os.MkdirAll(defsDir, 0755)
|
|
require.NoError(t, err)
|
|
|
|
// Create a test package definition file
|
|
defFile := filepath.Join(defsDir, "debian-trixie.yaml")
|
|
defContent := `qcow2:
|
|
packages:
|
|
- base-files
|
|
- systemd
|
|
- linux-image-amd64
|
|
- grub-common
|
|
- bootc
|
|
- apt-ostree
|
|
|
|
ami:
|
|
packages:
|
|
- base-files
|
|
- systemd
|
|
- linux-image-amd64
|
|
- grub-common
|
|
- cloud-guest-utils
|
|
- bootc
|
|
- apt-ostree
|
|
|
|
vmdk:
|
|
packages:
|
|
- base-files
|
|
- systemd
|
|
- linux-image-amd64
|
|
- grub-common
|
|
- open-vm-tools
|
|
- bootc
|
|
- apt-ostree
|
|
|
|
debian-installer:
|
|
packages:
|
|
- base-files
|
|
- systemd
|
|
- linux-image-amd64
|
|
- debian-installer
|
|
- bootc
|
|
- apt-ostree
|
|
|
|
calamares:
|
|
packages:
|
|
- base-files
|
|
- systemd
|
|
- linux-image-amd64
|
|
- calamares
|
|
- bootc
|
|
- apt-ostree
|
|
`
|
|
|
|
err = os.WriteFile(defFile, []byte(defContent), 0644)
|
|
require.NoError(t, err)
|
|
|
|
// Test loading package definitions
|
|
config := &ManifestConfig{
|
|
ImageTypes: []string{"qcow2"},
|
|
DistroDefPath: []string{defsDir},
|
|
}
|
|
|
|
packages, err := config.loadPackageDefinitions()
|
|
assert.NoError(t, err)
|
|
assert.NotEmpty(t, packages)
|
|
assert.Contains(t, packages, "base-files")
|
|
assert.Contains(t, packages, "systemd")
|
|
assert.Contains(t, packages, "linux-image-amd64")
|
|
assert.Contains(t, packages, "grub-common")
|
|
assert.Contains(t, packages, "bootc")
|
|
assert.Contains(t, packages, "apt-ostree")
|
|
}
|
|
|
|
func TestManifestConfigLoadPackageDefinitionsAMI(t *testing.T) {
|
|
// Create a temporary directory with test package definitions
|
|
tmpDir := t.TempDir()
|
|
defsDir := filepath.Join(tmpDir, "defs")
|
|
err := os.MkdirAll(defsDir, 0755)
|
|
require.NoError(t, err)
|
|
|
|
// Create a test package definition file
|
|
defFile := filepath.Join(defsDir, "debian-trixie.yaml")
|
|
defContent := `qcow2:
|
|
packages:
|
|
- base-files
|
|
- systemd
|
|
- linux-image-amd64
|
|
- grub-common
|
|
- bootc
|
|
- apt-ostree
|
|
|
|
ami:
|
|
packages:
|
|
- base-files
|
|
- systemd
|
|
- linux-image-amd64
|
|
- grub-common
|
|
- cloud-guest-utils
|
|
- bootc
|
|
- apt-ostree
|
|
`
|
|
|
|
err = os.WriteFile(defFile, []byte(defContent), 0644)
|
|
require.NoError(t, err)
|
|
|
|
// Test loading AMI package definitions
|
|
config := &ManifestConfig{
|
|
ImageTypes: []string{"ami"},
|
|
DistroDefPath: []string{defsDir},
|
|
}
|
|
|
|
packages, err := config.loadPackageDefinitions()
|
|
assert.NoError(t, err)
|
|
assert.NotEmpty(t, packages)
|
|
assert.Contains(t, packages, "base-files")
|
|
assert.Contains(t, packages, "systemd")
|
|
assert.Contains(t, packages, "linux-image-amd64")
|
|
assert.Contains(t, packages, "grub-common")
|
|
assert.Contains(t, packages, "cloud-guest-utils")
|
|
assert.Contains(t, packages, "bootc")
|
|
assert.Contains(t, packages, "apt-ostree")
|
|
}
|
|
|
|
func TestManifestConfigLoadPackageDefinitionsVMDK(t *testing.T) {
|
|
// Create a temporary directory with test package definitions
|
|
tmpDir := t.TempDir()
|
|
defsDir := filepath.Join(tmpDir, "defs")
|
|
err := os.MkdirAll(defsDir, 0755)
|
|
require.NoError(t, err)
|
|
|
|
// Create a test package definition file
|
|
defFile := filepath.Join(defsDir, "debian-trixie.yaml")
|
|
defContent := `qcow2:
|
|
packages:
|
|
- base-files
|
|
- systemd
|
|
- linux-image-amd64
|
|
- grub-common
|
|
- bootc
|
|
- apt-ostree
|
|
|
|
vmdk:
|
|
packages:
|
|
- base-files
|
|
- systemd
|
|
- linux-image-amd64
|
|
- grub-common
|
|
- open-vm-tools
|
|
- bootc
|
|
- apt-ostree
|
|
`
|
|
|
|
err = os.WriteFile(defFile, []byte(defContent), 0644)
|
|
require.NoError(t, err)
|
|
|
|
// Test loading VMDK package definitions
|
|
config := &ManifestConfig{
|
|
ImageTypes: []string{"vmdk"},
|
|
DistroDefPath: []string{defsDir},
|
|
}
|
|
|
|
packages, err := config.loadPackageDefinitions()
|
|
assert.NoError(t, err)
|
|
assert.NotEmpty(t, packages)
|
|
assert.Contains(t, packages, "base-files")
|
|
assert.Contains(t, packages, "systemd")
|
|
assert.Contains(t, packages, "linux-image-amd64")
|
|
assert.Contains(t, packages, "grub-common")
|
|
assert.Contains(t, packages, "open-vm-tools")
|
|
assert.Contains(t, packages, "bootc")
|
|
assert.Contains(t, packages, "apt-ostree")
|
|
}
|
|
|
|
func TestManifestConfigLoadPackageDefinitionsDebianInstaller(t *testing.T) {
|
|
// Create a temporary directory with test package definitions
|
|
tmpDir := t.TempDir()
|
|
defsDir := filepath.Join(tmpDir, "defs")
|
|
err := os.MkdirAll(defsDir, 0755)
|
|
require.NoError(t, err)
|
|
|
|
// Create a test package definition file
|
|
defFile := filepath.Join(defsDir, "debian-trixie.yaml")
|
|
defContent := `qcow2:
|
|
packages:
|
|
- base-files
|
|
- systemd
|
|
- linux-image-amd64
|
|
- grub-common
|
|
- bootc
|
|
- apt-ostree
|
|
|
|
debian-installer:
|
|
packages:
|
|
- base-files
|
|
- systemd
|
|
- linux-image-amd64
|
|
- debian-installer
|
|
- bootc
|
|
- apt-ostree
|
|
`
|
|
|
|
err = os.WriteFile(defFile, []byte(defContent), 0644)
|
|
require.NoError(t, err)
|
|
|
|
// Test loading debian-installer package definitions
|
|
config := &ManifestConfig{
|
|
ImageTypes: []string{"debian-installer"},
|
|
DistroDefPath: []string{defsDir},
|
|
}
|
|
|
|
packages, err := config.loadPackageDefinitions()
|
|
assert.NoError(t, err)
|
|
assert.NotEmpty(t, packages)
|
|
assert.Contains(t, packages, "base-files")
|
|
assert.Contains(t, packages, "systemd")
|
|
assert.Contains(t, packages, "linux-image-amd64")
|
|
assert.Contains(t, packages, "debian-installer")
|
|
assert.Contains(t, packages, "bootc")
|
|
assert.Contains(t, packages, "apt-ostree")
|
|
}
|
|
|
|
func TestManifestConfigLoadPackageDefinitionsCalamares(t *testing.T) {
|
|
// Create a temporary directory with test package definitions
|
|
tmpDir := t.TempDir()
|
|
defsDir := filepath.Join(tmpDir, "defs")
|
|
err := os.MkdirAll(defsDir, 0755)
|
|
require.NoError(t, err)
|
|
|
|
// Create a test package definition file
|
|
defFile := filepath.Join(defsDir, "debian-trixie.yaml")
|
|
defContent := `qcow2:
|
|
packages:
|
|
- base-files
|
|
- systemd
|
|
- linux-image-amd64
|
|
- grub-common
|
|
- bootc
|
|
- apt-ostree
|
|
|
|
calamares:
|
|
packages:
|
|
- base-files
|
|
- systemd
|
|
- linux-image-amd64
|
|
- calamares
|
|
- bootc
|
|
- apt-ostree
|
|
`
|
|
|
|
err = os.WriteFile(defFile, []byte(defContent), 0644)
|
|
require.NoError(t, err)
|
|
|
|
// Test loading calamares package definitions
|
|
config := &ManifestConfig{
|
|
ImageTypes: []string{"calamares"},
|
|
DistroDefPath: []string{defsDir},
|
|
}
|
|
|
|
packages, err := config.loadPackageDefinitions()
|
|
assert.NoError(t, err)
|
|
assert.NotEmpty(t, packages)
|
|
assert.Contains(t, packages, "base-files")
|
|
assert.Contains(t, packages, "systemd")
|
|
assert.Contains(t, packages, "linux-image-amd64")
|
|
assert.Contains(t, packages, "calamares")
|
|
assert.Contains(t, packages, "bootc")
|
|
assert.Contains(t, packages, "apt-ostree")
|
|
}
|
|
|
|
func TestManifestConfigLoadPackageDefinitionsNotFound(t *testing.T) {
|
|
// Test loading package definitions from non-existent directory
|
|
config := &ManifestConfig{
|
|
ImageTypes: []string{"qcow2"},
|
|
DistroDefPath: []string{"/non/existent/path"},
|
|
}
|
|
|
|
packages, err := config.loadPackageDefinitions()
|
|
assert.Error(t, err)
|
|
assert.Empty(t, packages)
|
|
}
|
|
|
|
func TestManifestConfigLoadPackageDefinitionsInvalidYAML(t *testing.T) {
|
|
// Create a temporary directory with invalid YAML
|
|
tmpDir := t.TempDir()
|
|
defsDir := filepath.Join(tmpDir, "defs")
|
|
err := os.MkdirAll(defsDir, 0755)
|
|
require.NoError(t, err)
|
|
|
|
// Create an invalid YAML file
|
|
defFile := filepath.Join(defsDir, "debian-trixie.yaml")
|
|
invalidContent := `qcow2:
|
|
packages:
|
|
- base-files
|
|
- systemd
|
|
- linux-image-amd64
|
|
- grub-common
|
|
- bootc
|
|
- apt-ostree
|
|
|
|
ami:
|
|
packages:
|
|
- base-files
|
|
- systemd
|
|
- linux-image-amd64
|
|
- grub-common
|
|
- cloud-guest-utils
|
|
- bootc
|
|
- apt-ostree
|
|
`
|
|
|
|
err = os.WriteFile(defFile, []byte(invalidContent), 0644)
|
|
require.NoError(t, err)
|
|
|
|
// Test loading package definitions
|
|
config := &ManifestConfig{
|
|
ImageTypes: []string{"qcow2"},
|
|
DistroDefPath: []string{defsDir},
|
|
}
|
|
|
|
packages, err := config.loadPackageDefinitions()
|
|
assert.NoError(t, err)
|
|
assert.NotEmpty(t, packages)
|
|
}
|
|
|
|
func TestMakeManifest(t *testing.T) {
|
|
// Create a temporary directory for testing
|
|
tmpDir := t.TempDir()
|
|
|
|
// Create a test configuration
|
|
config := &ManifestConfig{
|
|
ImageName: "test-image",
|
|
ImageTypes: []string{"qcow2"},
|
|
TargetArch: "amd64",
|
|
RootfsType: "ext4",
|
|
DistroDefPath: []string{"./data/defs"},
|
|
BuildContainer: "debian:trixie",
|
|
}
|
|
|
|
// Create a test solver
|
|
solver := apt.NewSolver()
|
|
|
|
// Test manifest generation
|
|
manifest, repos, err := makeManifest(config, solver, tmpDir)
|
|
assert.NoError(t, err)
|
|
assert.NotNil(t, manifest)
|
|
assert.NotNil(t, repos)
|
|
|
|
// Test manifest structure
|
|
assert.Contains(t, manifest, "version")
|
|
assert.Contains(t, manifest, "pipelines")
|
|
|
|
// Test that version is "2"
|
|
assert.Equal(t, "2", manifest["version"])
|
|
|
|
// Test that pipelines is a slice
|
|
pipelines, ok := manifest["pipelines"].([]map[string]interface{})
|
|
assert.True(t, ok)
|
|
assert.Len(t, pipelines, 2)
|
|
|
|
// Test build pipeline
|
|
buildPipeline := pipelines[0]
|
|
assert.Equal(t, "build", buildPipeline["name"])
|
|
assert.Equal(t, "org.osbuild.linux", buildPipeline["runner"])
|
|
|
|
// Test image pipeline
|
|
imagePipeline := pipelines[1]
|
|
assert.Equal(t, "image", imagePipeline["name"])
|
|
assert.Equal(t, "org.osbuild.linux", imagePipeline["runner"])
|
|
}
|
|
|
|
func TestMakeManifestWithDifferentImageTypes(t *testing.T) {
|
|
// Create a temporary directory for testing
|
|
tmpDir := t.TempDir()
|
|
|
|
// Test with different image types
|
|
imageTypes := []string{"qcow2", "ami", "vmdk", "debian-installer", "calamares"}
|
|
|
|
for _, imageType := range imageTypes {
|
|
t.Run(imageType, func(t *testing.T) {
|
|
config := &ManifestConfig{
|
|
ImageName: "test-image",
|
|
ImageTypes: []string{imageType},
|
|
TargetArch: "amd64",
|
|
RootfsType: "ext4",
|
|
DistroDefPath: []string{"./data/defs"},
|
|
BuildContainer: "debian:trixie",
|
|
}
|
|
|
|
solver := apt.NewSolver()
|
|
|
|
manifest, repos, err := makeManifest(config, solver, tmpDir)
|
|
assert.NoError(t, err)
|
|
assert.NotNil(t, manifest)
|
|
assert.NotNil(t, repos)
|
|
|
|
// Test manifest structure
|
|
assert.Contains(t, manifest, "version")
|
|
assert.Contains(t, manifest, "pipelines")
|
|
assert.Equal(t, "2", manifest["version"])
|
|
|
|
// Test that pipelines is a slice
|
|
pipelines, ok := manifest["pipelines"].([]map[string]interface{})
|
|
assert.True(t, ok)
|
|
assert.Len(t, pipelines, 2)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestMakeManifestWithDifferentArchitectures(t *testing.T) {
|
|
// Create a temporary directory for testing
|
|
tmpDir := t.TempDir()
|
|
|
|
// Test with different architectures
|
|
architectures := []string{"amd64", "arm64", "ppc64le", "s390x"}
|
|
|
|
for _, arch := range architectures {
|
|
t.Run(arch, func(t *testing.T) {
|
|
config := &ManifestConfig{
|
|
ImageName: "test-image",
|
|
ImageTypes: []string{"qcow2"},
|
|
TargetArch: arch,
|
|
RootfsType: "ext4",
|
|
DistroDefPath: []string{"./data/defs"},
|
|
BuildContainer: "debian:trixie",
|
|
}
|
|
|
|
solver := apt.NewSolver()
|
|
|
|
manifest, repos, err := makeManifest(config, solver, tmpDir)
|
|
assert.NoError(t, err)
|
|
assert.NotNil(t, manifest)
|
|
assert.NotNil(t, repos)
|
|
|
|
// Test manifest structure
|
|
assert.Contains(t, manifest, "version")
|
|
assert.Contains(t, manifest, "pipelines")
|
|
assert.Equal(t, "2", manifest["version"])
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestMakeManifestWithDifferentRootfsTypes(t *testing.T) {
|
|
// Create a temporary directory for testing
|
|
tmpDir := t.TempDir()
|
|
|
|
// Test with different rootfs types
|
|
rootfsTypes := []string{"ext4", "xfs", "btrfs"}
|
|
|
|
for _, rootfsType := range rootfsTypes {
|
|
t.Run(rootfsType, func(t *testing.T) {
|
|
config := &ManifestConfig{
|
|
ImageName: "test-image",
|
|
ImageTypes: []string{"qcow2"},
|
|
TargetArch: "amd64",
|
|
RootfsType: rootfsType,
|
|
DistroDefPath: []string{"./data/defs"},
|
|
BuildContainer: "debian:trixie",
|
|
}
|
|
|
|
solver := apt.NewSolver()
|
|
|
|
manifest, repos, err := makeManifest(config, solver, tmpDir)
|
|
assert.NoError(t, err)
|
|
assert.NotNil(t, manifest)
|
|
assert.NotNil(t, repos)
|
|
|
|
// Test manifest structure
|
|
assert.Contains(t, manifest, "version")
|
|
assert.Contains(t, manifest, "pipelines")
|
|
assert.Equal(t, "2", manifest["version"])
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestMakeManifestErrorHandling(t *testing.T) {
|
|
// Create a temporary directory for testing
|
|
tmpDir := t.TempDir()
|
|
|
|
// Test with invalid configuration
|
|
config := &ManifestConfig{
|
|
ImageName: "test-image",
|
|
ImageTypes: []string{"qcow2"},
|
|
TargetArch: "amd64",
|
|
RootfsType: "ext4",
|
|
DistroDefPath: []string{"/non/existent/path"},
|
|
BuildContainer: "debian:trixie",
|
|
}
|
|
|
|
solver := apt.NewSolver()
|
|
|
|
// Test manifest generation with invalid distro def path
|
|
manifest, repos, err := makeManifest(config, solver, tmpDir)
|
|
assert.Error(t, err)
|
|
assert.Nil(t, manifest)
|
|
assert.Nil(t, repos)
|
|
}
|
|
|
|
func TestMakeManifestWithEmptyImageTypes(t *testing.T) {
|
|
// Create a temporary directory for testing
|
|
tmpDir := t.TempDir()
|
|
|
|
// Test with empty image types
|
|
config := &ManifestConfig{
|
|
ImageName: "test-image",
|
|
ImageTypes: []string{},
|
|
TargetArch: "amd64",
|
|
RootfsType: "ext4",
|
|
DistroDefPath: []string{"./data/defs"},
|
|
BuildContainer: "debian:trixie",
|
|
}
|
|
|
|
solver := apt.NewSolver()
|
|
|
|
// Test manifest generation with empty image types
|
|
manifest, repos, err := makeManifest(config, solver, tmpDir)
|
|
assert.Error(t, err)
|
|
assert.Nil(t, manifest)
|
|
assert.Nil(t, repos)
|
|
}
|
|
|
|
func TestMakeManifestWithNilSolver(t *testing.T) {
|
|
// Create a temporary directory for testing
|
|
tmpDir := t.TempDir()
|
|
|
|
// Test with nil solver
|
|
config := &ManifestConfig{
|
|
ImageName: "test-image",
|
|
ImageTypes: []string{"qcow2"},
|
|
TargetArch: "amd64",
|
|
RootfsType: "ext4",
|
|
DistroDefPath: []string{"./data/defs"},
|
|
BuildContainer: "debian:trixie",
|
|
}
|
|
|
|
// Test manifest generation with nil solver
|
|
manifest, repos, err := makeManifest(config, nil, tmpDir)
|
|
assert.Error(t, err)
|
|
assert.Nil(t, manifest)
|
|
assert.Nil(t, repos)
|
|
}
|