osi-tools/test/osi-mk.bats

231 lines
7.0 KiB
Bash

# Copyright (C) 2024 Umorpha Systems
# SPDX-License-Identifier: AGPL-3.0-or-later
bats_require_minimum_version 1.7.0
bats_load_library bats-support
bats_load_library bats-assert
bats_load_library bats-file
teardown() {
if [ -n "${tmpdir:-}" ]; then
if [[ -d "$tmpdir/tmp-dis" ]]; then
sudo fusermount -u "$tmpdir/tmp-dis" || true
rmdir "$tmpdir/tmp-dis"
fi
if [[ -d "$tmpdir/dir" ]]; then
sudo umount "$tmpdir/dir" || true
rmdir "$tmpdir/dir"
fi
temp_del "$tmpdir"
fi
}
@test "osi-mk needs arguments" {
LC_ALL=C run --separate-stderr osi-mk
assert_failure 2
assert_equal "$output" ''
assert [ ${#stderr_lines[@]} -gt 1 ]
assert_regex "${stderr_lines[-1]}" "^Try .*osi-mk --help' for more information\$"
}
@test "osi-mk shows help" {
LC_ALL=C run --separate-stderr osi-mk --help
assert_success
assert_equal "$stderr" ''
assert_regex "${lines[0]}" '^Usage: osi-mk '
LC_ALL=C run --separate-stderr osi-mk -h
assert_success
assert_equal "$stderr" ''
assert_regex "${lines[0]}" '^Usage: osi-mk'
}
@test "osi-mk shows version" {
LC_ALL=C run --separate-stderr osi-mk --version
assert_success
assert_equal "$stderr" ''
assert_regex "${lines[0]}" '^osi-mk \(osi-tools\) '
LC_ALL=C run --separate-stderr osi-mk -V
assert_success
assert_equal "$stderr" ''
assert_regex "${lines[0]}" '^osi-mk \(osi-tools\) '
}
@test "osi-mk balks at invalid --fmt=" {
tmpdir="$(temp_make)"
LC_ALL=C run --separate-stderr osi-mk --fmt=blarg --fmtconf=size=2G --package=base --package=linux-libre "$tmpdir/tst.img"
assert_failure 2
assert_equal "$output" ''
assert_regex "$stderr" '--fmt='
assert_regex "${stderr_lines[-1]}" "^Try .*osi-mk --help' for more information\$"
}
@test "osi-mk balks at invalid --fmtconf=" {
tmpdir="$(temp_make)"
LC_ALL=C run --separate-stderr osi-mk --fmt=btrfs --fmtconf=size=2G --fmtconf=x=y --package=base --package=linux-libre "$tmpdir/tst.img"
assert_failure 2
assert_equal "$output" ''
assert_regex "$stderr" '--fmtconf=x'
assert_regex "${stderr_lines[-1]}" "^Try .*osi-mk --help' for more information\$"
}
@test "osi-mk balks at invalid --conf=" {
tmpdir="$(temp_make)"
LC_ALL=C run --separate-stderr osi-mk --fmt=btrfs --fmtconf=size=2G --conf=size=2G --package=base --package=linux-libre "$tmpdir/tst.img"
assert_failure 2
assert_equal "$output" ''
assert_regex "$stderr" '--conf=size'
assert_regex "${stderr_lines[-1]}" "^Try .*osi-mk --help' for more information\$"
}
@test "osi-mk builds base" {
tmpdir="$(temp_make)"
echo 'Building image...'
osi-mk --fmt=btrfs --fmtconf=size=2G --package=base --package=linux-libre "$tmpdir/tst.img"
echo 'Checking that mkinitcpio ran correctly...'
mkdir "$tmpdir/mnt"
sudo osi-mount --user "$tmpdir/tst.img" "$tmpdir/mnt" -- test -f "$tmpdir/mnt/boot/initramfs-linux-libre.img"
echo 'Checking that mkinitcpio included all drivers...'
# shellcheck disable=SC2024
sudo osi-mount --root "$tmpdir/tst.img" "$tmpdir/mnt" -- bsdtar tf "$tmpdir/mnt/boot/initramfs-linux-libre.img" >"$tmpdir/initramfs.lst"
# shellcheck disable=SC2024
sudo osi-mount --root "$tmpdir/tst.img" "$tmpdir/mnt" -- bsdtar tf "$tmpdir/mnt/boot/initramfs-linux-libre-fallback.img" >"$tmpdir/initramfs-fallback.lst"
diff -u <(sort "$tmpdir/initramfs.lst") <(sort "$tmpdir/initramfs-fallback.lst")
}
@test "osi-mk builds base x86_64" {
tmpdir="$(temp_make)"
osi-mk --arch=x86_64 --fmt=btrfs --fmtconf=size=2G --package=base --package=linux-libre "$tmpdir/tst.img"
}
@test "osi-mk builds base armv7h" {
tmpdir="$(temp_make)"
osi-mk --arch=armv7h --fmt=btrfs --fmtconf=size=2G --package=base --package=linux-libre "$tmpdir/tst.img"
}
@test "osi-mk builds existing dir" {
tmpdir="$(temp_make)"
mkdir "$tmpdir/dir"
sudo mount -t tmpfs tmpfs:osi-mk-bats "$tmpdir/dir"
echo 'Building image...'
osi-mk --fmt=dir --conf=bootloader=none --edit --package=base --package=linux-libre "$tmpdir/dir"
echo 'Checking that mkinitcpio ran correctly...'
test -f "$tmpdir/dir/boot/initramfs-linux-libre.img"
}
@test "osi-mk builds erofs" {
tmpdir="$(temp_make)"
echo 'Building image...'
osi-mk --fmt=erofs --conf=bootloader=none --package=base --package=linux-libre "$tmpdir/tst.img"
echo 'Checking that mkinitcpio ran correctly...'
mkdir "$tmpdir/mnt"
sudo osi-mount --user "$tmpdir/tst.img" "$tmpdir/mnt" -- test -f "$tmpdir/mnt/boot/initramfs-linux-libre.img"
}
@test "osi-mk builds new dir" {
tmpdir="$(temp_make)"
mkdir "$tmpdir/dir"
sudo mount -t tmpfs tmpfs:osi-mk-bats "$tmpdir/dir"
echo 'Building image...'
osi-mk --fmt=dir --conf=bootloader=none --package=base --package=linux-libre "$tmpdir/dir/sub"
echo 'Checking permissions...'
assert_equal "$(stat --format='%u' "$tmpdir/dir/sub")" 0
echo 'Checking that mkinitcpio ran correctly...'
test -f "$tmpdir/dir/sub/boot/initramfs-linux-libre.img"
}
@test "osi-mk builds copy dir" {
tmpdir="$(temp_make)"
mkdir "$tmpdir/dir"
sudo mount -t tmpfs tmpfs:osi-mk-bats "$tmpdir/dir"
sudo install -Dm444 --owner=123 /dev/null "$tmpdir/dir/base/file"
echo 'Building image...'
osi-mk --fmt=dir --conf=bootloader=none --edit="$tmpdir/dir/base" --package=base --package=linux-libre "$tmpdir/dir/sub"
echo 'Checking permissions...'
assert_equal "$(stat --format='%u' "$tmpdir/dir/sub")" 0
assert_equal "$(stat --format='%u' "$tmpdir/dir/sub/file")" 123
assert_equal "$(stat --format='%a' "$tmpdir/dir/sub/file")" 444
echo 'Checking that mkinitcpio ran correctly...'
test -f "$tmpdir/dir/sub/boot/initramfs-linux-libre.img"
}
@test "osi-mk erofs is reproducible" {
tmpdir="$(temp_make)"
mkdir "$tmpdir/tmp-raw" "$tmpdir/tmp-dis"
sudo disorderfs --multi-user=yes --shuffle-dirents=yes "$tmpdir/tmp-raw" "$tmpdir/tmp-dis"
flags=(
--disorderfs
--fmt=erofs --fmtconf=fsuuid="$(uuidgen)"
--conf=bootloader=none
--conf=machine-id="$(uuidgen|tr -d -)"
--conf=SOURCE_DATE_EPOCH=auto
--package=base
# TODO: We simply delete the known non-reproducible
# files, to verify that we don't get *less*
# reproducible; but we aren't actually reproducible
# yet.
--module="$PWD/mod-reproducible.sh"
)
echo 'Building first image...'
TMPDIR="$tmpdir/tmp-dis" osi-mk "${flags[@]}" "$tmpdir/tst1.img"
echo 'Building second image...'
TMPDIR="$tmpdir/tmp-dis" osi-mk "${flags[@]}" "$tmpdir/tst2.img"
echo 'Comparing...'
cmp "$tmpdir/tst1.img" "$tmpdir/tst2.img"
}
@test "osi-mk tar is reproducible" {
tmpdir="$(temp_make)"
mkdir "$tmpdir/tmp-raw" "$tmpdir/tmp-dis"
sudo disorderfs --multi-user=yes --shuffle-dirents=yes "$tmpdir/tmp-raw" "$tmpdir/tmp-dis"
flags=(
--disorderfs
--fmt=tar
--conf=bootloader=none
--conf=machine-id="$(uuidgen|tr -d -)"
--conf=SOURCE_DATE_EPOCH=auto
--package=base
# TODO: We simply delete the known non-reproducible
# files, to verify that we don't get *less*
# reproducible; but we aren't actually reproducible
# yet.
--module="$PWD/mod-reproducible.sh"
)
echo 'Building first image...'
TMPDIR="$tmpdir/tmp-dis" osi-mk "${flags[@]}" "$tmpdir/tst1.img"
echo 'Building second image...'
TMPDIR="$tmpdir/tmp-dis" osi-mk "${flags[@]}" "$tmpdir/tst2.img"
echo 'Comparing...'
cmp "$tmpdir/tst1.img" "$tmpdir/tst2.img"
}