# 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" }