From 94b2b58d999d8e15af17c584db57f0a0c4b4e3e5 Mon Sep 17 00:00:00 2001 From: "Brian C. Lane" Date: Mon, 4 Nov 2019 11:28:54 -0800 Subject: [PATCH] tests: Add a lorax boot.iso test This builds a boot.iso in the vm, copies it out, and boots it. The tests that run inside the boot.iso (/tests/lorax/test_boot_bootiso.sh) cannot use beakerlib so it needs to be a simple shell script returning 1 on failure along with a descriptive message. --- test/check-lorax | 57 ++++++++++++++++++++ test/run | 2 + tests/lorax/lib/lib.sh | 4 ++ tests/lorax/test_boot_bootiso.sh | 17 ++++++ tests/lorax/test_build_bootiso.sh | 29 +++++++++++ tests/test_lorax.sh | 86 +++++++++++++++++++++++++++++++ 6 files changed, 195 insertions(+) create mode 100755 test/check-lorax create mode 100755 tests/lorax/lib/lib.sh create mode 100755 tests/lorax/test_boot_bootiso.sh create mode 100755 tests/lorax/test_build_bootiso.sh create mode 100755 tests/test_lorax.sh diff --git a/test/check-lorax b/test/check-lorax new file mode 100755 index 00000000..21dbacac --- /dev/null +++ b/test/check-lorax @@ -0,0 +1,57 @@ +#!/usr/bin/python3 + + +import tempfile +import composertest + + +class LoraxTestCase(composertest.ComposerTestCase): + def setUp(self): + self.setUpTestMachine() + + # Upload the contents of the ./tests/ directory to the machine (it must have beakerlib already installed) + self.machine.upload(["../tests"], "/") + + def tearDown(self): + super().tearDownTestMachine() + + def runLoraxTest(self, script): + extra_env = [] + if self.sit: + extra_env.append("COMPOSER_TEST_FAIL_FAST=1") + + r = self.execute(["TEST=" + self.id(), + *extra_env, + "/tests/test_lorax.sh", script]) + self.assertEqual(r.returncode, 0) + + def runShellTest(self, script): + """Run a shell script directly, without the beakerlib wrapper""" + extra_env = [] + r = self.execute(["TEST=" + self.id(), + *extra_env, + script]) + self.assertEqual(r.returncode, 0) + + +class TestLorax(LoraxTestCase): + def test_boot_iso(self): + self.runLoraxTest("/tests/lorax/test_build_bootiso.sh") + + with tempfile.TemporaryDirectory(prefix="/var/tmp/lorax-test.") as tmpdir: + # Copy the resulting iso and shut down the VM + self.tearDownVirt(virt_dir="/var/tmp/test-results/*", local_dir=tmpdir) + + # Boot the image, login with ssh (no key needed) + self.setUpTestMachine(tmpdir + "/images/boot.iso") + + # Upload the contents of the ./tests/ directory to the machine + self.machine.upload(["../tests"], "/") + + # Run the test on the booted image + # NOTE: The boot.iso cannot run beakerlib so this test is called directly + self.runShellTest("/tests/lorax/test_boot_bootiso.sh") + + +if __name__ == '__main__': + composertest.main() diff --git a/test/run b/test/run index fe9d9cf4..33b9448d 100755 --- a/test/run +++ b/test/run @@ -11,6 +11,8 @@ if [ -n "$TEST_SCENARIO" ]; then test/check-cli TestQcow2 elif [ "$TEST_SCENARIO" == "tar" ]; then test/check-cli TestTar + elif [ "$TEST_SCENARIO" == "lorax" ]; then + test/check-lorax TestLorax else test/check-cloud TestCloud.test_$TEST_SCENARIO fi diff --git a/tests/lorax/lib/lib.sh b/tests/lorax/lib/lib.sh new file mode 100755 index 00000000..8df1f14a --- /dev/null +++ b/tests/lorax/lib/lib.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +# lorax specific functions + +. "$(dirname $0)/../cli/lib/lib.sh" diff --git a/tests/lorax/test_boot_bootiso.sh b/tests/lorax/test_boot_bootiso.sh new file mode 100755 index 00000000..c002c518 --- /dev/null +++ b/tests/lorax/test_boot_bootiso.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# Note: execute this file from inside the booted boot.iso +# We cannot use beakerlib because the boot.iso is missing some of the executables it depends on +# + +##### +# +# Test a booted boot.iso +# +##### + +set -e + +if ! grep anaconda /root/lorax-packages.log; then + echo "ERROR: anaconda not included in boot.iso package list" + exit 1 +fi diff --git a/tests/lorax/test_build_bootiso.sh b/tests/lorax/test_build_bootiso.sh new file mode 100755 index 00000000..938b60ec --- /dev/null +++ b/tests/lorax/test_build_bootiso.sh @@ -0,0 +1,29 @@ +#!/bin/bash +# Note: execute this file from the project root directory + +##### +# +# Builds a boot.iso with lorax +# +##### + +set -e + +. /usr/share/beakerlib/beakerlib.sh +. "$(dirname $0)/lib/lib.sh" + +CLI="${CLI:-./src/sbin/lorax}" + +# Make up a name (slightly unsafe), should not exist before running lorax so use -u +rlJournalStart + rlPhaseStartTest "Build lorax boot.iso" + rlAssertEquals "SELinux operates in enforcing mode" "$(getenforce)" "Enforcing" + lorax -p Fedora-Lorax-Test -v "$RELEASE" -r "$RELEASE" \ + --repo /etc/yum.repos.d/fedora.repo \ + --sharedir "$SHARE_DIR" /var/tmp/test-results/ + rlAssertEquals "exit code should be zero" $? 0 + IMAGE="/var/tmp/test-results/images/boot.iso" + rlAssertExists "$IMAGE" + rlPhaseEnd +rlJournalEnd +rlJournalPrintText diff --git a/tests/test_lorax.sh b/tests/test_lorax.sh new file mode 100755 index 00000000..aa9366dc --- /dev/null +++ b/tests/test_lorax.sh @@ -0,0 +1,86 @@ +#!/bin/bash +# Note: execute this file from the project root directory +# +# Test building a boot.iso using lorax + +set -eu + +BEAKERLIB_DIR=$(mktemp -d /tmp/lorax-test.XXXXXX) +CLI="${CLI:-}" +export BEAKERLIB_DIR +source /usr/share/beakerlib/beakerlib.sh + +RELEASE=$(awk -F: '{ print $5 }' /etc/system-release-cpe) +export RELEASE + +function setup_tests { + local share_dir=$1 + + # Make the boot.iso boot more quickly (isolinux.cfg) + for cfg in "$share_dir"/templates.d/99-generic/config_files/*/isolinux.cfg; do + sed -i.orig 's/^timeout.*/timeout 20/' "$cfg" + sed -i 's/quiet$/inst.sshd=1 console=ttyS0,115200n8/' "$cfg" + done + + # Make the boot.iso boot more quickly (grub.conf) + for cfg in "$share_dir"/templates.d/99-generic/config_files/*/grub.conf; do + sed -i.orig 's/^timeout.*/timeout 2/' "$cfg" + sed -i 's/quiet$/inst.sshd=1 console=ttyS0,115200n8/' "$cfg" + done + + # Make the boot.iso boot more quickly (grub2-efi.cfg) + for cfg in "$share_dir"/templates.d/99-generic/config_files/*/grub2-efi.cfg; do + sed -i.orig 's/^set timeout.*/set timeout=2/' "$cfg" + sed -i 's/\(.*linux .* ro$\)/\1 inst.sshd=1 console=ttyS0,115200n8/' "$cfg" + done + +} + +function teardown_tests { + local share_dir=$1 + + # Restore all the configuration files + for cfg in "$share_dir"/templates.d/99-generic/config_files/*/*.orig; do + mv "$cfg" "${cfg%%.orig}" + done +} + +SHARE_DIR=$(mktemp -d '/tmp/lorax-share.XXXXX') +export SHARE_DIR +if [ -z "$CLI" ]; then + cp -R /usr/share/lorax/* "$SHARE_DIR" +else + top_srcdir=$(pwd) + export top_srcdir + source ./tests/testenv.sh + cp -R ./share/* "$SHARE_DIR" +fi +chmod a+rx -R "$SHARE_DIR" +setup_tests "$SHARE_DIR" + +export BEAKERLIB_JOURNAL=0 + +if [ -z "$*" ]; then + # Run all the lorax tests + for t in ./tests/lorax/test_*sh; do + $t + done +else + # execute other tests which need more adjustments in the calling environment + # or can't be executed inside Travis CI + for TEST in "$@"; do + $TEST + done +fi + + +teardown_tests "$SHARE_DIR" + +source "$BEAKERLIB_DIR/TestResults" + +if [ $TESTRESULT_RESULT_ECODE != 0 ]; then + echo "Test failed. Leaving log in $BEAKERLIB_DIR" + exit $TESTRESULT_RESULT_ECODE +fi + +rm -rf "$BEAKERLIB_DIR"