From 9d3b78ca08101250415a2f4aa2c2dcd7393d4cd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vin=C3=ADcius=20Ferr=C3=A3o?= <2031761+viniciusferrao@users.noreply.github.com> Date: Thu, 8 Oct 2026 16:15:05 -0300 Subject: [PATCH] test(boot): cover Genesis selection across installer consumers --- xCAT-test/unit/genesis_boot_selection.t | 66 +++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 xCAT-test/unit/genesis_boot_selection.t diff --git a/xCAT-test/unit/genesis_boot_selection.t b/xCAT-test/unit/genesis_boot_selection.t new file mode 100644 index 000000000..ecb3af8be --- /dev/null +++ b/xCAT-test/unit/genesis_boot_selection.t @@ -0,0 +1,66 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use FindBin; +use lib "$FindBin::Bin/../lib"; +use lib "$FindBin::Bin/../../perl-xCAT"; +use lib "$FindBin::Bin/../../xCAT-server/lib/perl"; +use File::Path qw(make_path); +use File::Slurper qw(write_text); +use File::Temp qw(tempdir); +use Test::More; +use XCAT::Test::File qw(repo_path); + +my $root = tempdir(CLEANUP => 1); +$ENV{XCATROOT} = repo_path('xCAT-server'); +$ENV{XCATCFG} = "$root/config"; +make_path($ENV{XCATCFG}, "$root/xcat"); +require(repo_path('xCAT-server/lib/xcat/plugins/anaconda.pm')); +require(repo_path('xCAT-server/lib/xcat/plugins/sles.pm')); +my @owners = ( + ['Anaconda', \&xCAT_plugin::anaconda::_find_genesis_boot_files], + ['SLES', \&xCAT_plugin::sles::_find_genesis_boot_files], +); + +sub selection { + my ($arch, $expected, $description) = @_; + for my $owner (@owners) { + is_deeply([$owner->[1]->($root, $arch)], $expected, "$owner->[0]: $description"); + } +} + +for my $arch (qw(x86 x86_64 ppc64 ppc64le aarch64 armv7hf riscv64 s390x)) { + selection($arch, [], "$arch without kernel is not selected"); + write_text("$root/xcat/genesis.kernel.$arch", 'kernel'); + selection($arch, [], "$arch without initrd is not selected"); + write_text("$root/xcat/genesis.fs.$arch.gz", 'initrd'); + selection($arch, ["genesis.kernel.$arch", "genesis.fs.$arch.gz"], "$arch selects its exact files"); + link("$root/xcat/genesis.fs.$arch.gz", "$root/xcat/genesis.fs.$arch.lzma") or die $!; + selection($arch, ["genesis.kernel.$arch", "genesis.fs.$arch.lzma"], "$arch prefers LZMA on equal ctime"); +} +write_text("$root/xcat/genesis.kernel.x86_64-extra", 'kernel'); +write_text("$root/xcat/genesis.fs.x86_64-extra.gz", 'initrd'); +for my $arch (undef, '', '../x86_64', "x86_64\n", 'ppc64el', 'x86_64-extra') { + selection($arch, [], 'no fallback or partial architecture match'); +} + +unlink "$root/xcat/genesis.fs.x86_64.gz" or die $!; +sleep 1; +write_text("$root/xcat/genesis.fs.x86_64.gz", 'new gzip'); +selection('x86_64', ['genesis.kernel.x86_64', 'genesis.fs.x86_64.gz'], 'newer gzip wins'); +sleep 1; +write_text("$root/xcat/genesis.fs.x86_64.lzma", 'new lzma'); +selection('x86_64', ['genesis.kernel.x86_64', 'genesis.fs.x86_64.lzma'], 'newer LZMA wins'); + +SKIP: { + skip 'root can read mode-000 files', 6 if $< == 0; + chmod 0000, "$root/xcat/genesis.fs.x86_64.lzma" or die $!; + selection('x86_64', ['genesis.kernel.x86_64', 'genesis.fs.x86_64.gz'], 'unreadable LZMA is ignored'); + chmod 0000, "$root/xcat/genesis.fs.x86_64.gz" or die $!; + selection('x86_64', [], 'unreadable initrds yield no partial selection'); + chmod 0644, "$root/xcat/genesis.fs.x86_64.gz" or die $!; + chmod 0000, "$root/xcat/genesis.kernel.x86_64" or die $!; + selection('x86_64', [], 'unreadable kernel yields no selection'); +} + +done_testing();