#!/usr/bin/env roundup describe librechroot . ./test-common.sh setup_chrootdir it_creates_repo_for_new_chroots() { require network sudo || return 0 libremessages msg 'Creating a chroot, may take a few minutes' &>/dev/tty testsudo librechroot -l "$roundup_test_name" run test -r /repo/repo.db } it_cleans_the_local_repo_correctly() { require network sudo || return 0 libremessages msg 'Creating a chroot, may take a few minutes' &>/dev/tty testsudo librechroot -l "$roundup_test_name" make testsudo librechroot -l "$roundup_test_name" clean-repo testsudo librechroot -l "$roundup_test_name" run test -r /repo/repo.db # TODO: inspect /repo/* more } it_respects_exit_status_if_out_isnt_a_tty() ( require network sudo || return 0 set -o pipefail libremessages msg 'Creating a chroot, may take a few minutes' &>/dev/tty r=0 { testsudo librechroot -l "$roundup_test_name" run bash -c 'exit 3' | cat; } || r=$? [[ $r == 3 ]] ) it_creates_ca_certificates() { require network sudo || return 0 libremessages msg 'Creating a chroot, may take a few minutes' &>/dev/tty testsudo librechroot -l "$roundup_test_name" run test -r /etc/ssl/certs/ca-certificates.crt } it_disables_networking_when_requested() { require network sudo || return 0 libremessages msg 'Creating a chroot, may take a few minutes' &>/dev/tty testsudo librechroot -l "$roundup_test_name" run curl https://repo.parabola.nu/ >/dev/null not testsudo librechroot -l "$roundup_test_name" -N run curl https://repo.parabola.nu/ >/dev/null } it_handles_CHROOTEXTRAPKG_correctly() { require network sudo || return 0 libremessages msg 'Creating a chroot, may take a few minutes' &>/dev/tty not testsudo librechroot -l "$roundup_test_name" run lsof echo "CHROOTEXTRAPKG=(lsof)" >> "$XDG_CONFIG_HOME"/libretools/chroot.conf testsudo librechroot -l "$roundup_test_name" install-name lsof testsudo librechroot -l "$roundup_test_name" clean-pkgs testsudo librechroot -l "$roundup_test_name" run lsof echo "CHROOTEXTRAPKG=()" >> "$XDG_CONFIG_HOME"/libretools/chroot.conf testsudo librechroot -l "$roundup_test_name" clean-pkgs not testsudo librechroot -l "$roundup_test_name" run lsof } it_obeys_depends_in_PKGBUILD() { require network sudo || return 0 libremessages msg 'Creating a chroot, may take a few minutes' &>/dev/tty # Make sure it's not in the base install not testsudo librechroot -l "$roundup_test_name" run lsof # Make sure it removes it without the PKGBUILD testsudo librechroot -l "$roundup_test_name" install-name lsof testsudo librechroot -l "$roundup_test_name" run lsof testsudo librechroot -l "$roundup_test_name" clean-pkgs not testsudo librechroot -l "$roundup_test_name" run lsof # Make sure it leaves it with the PKGBUILD testsudo librechroot -l "$roundup_test_name" install-name lsof testsudo librechroot -l "$roundup_test_name" run sh -c 'printf "%s\n" "$1" > /startdir/PKGBUILD' -- "$(cat librechroot.d/PKGBUILD)" # uid=99 is 'nobody', but we say '99' because sometimes 'nobody' is uid=65534. # https://bugs.archlinux.org/task/56828 testsudo librechroot -l "$roundup_test_name" run chown -R 99:99 /startdir testsudo librechroot -l "$roundup_test_name" clean-pkgs testsudo librechroot -l "$roundup_test_name" run lsof } it_displays_help_as_normal_user() { rm -rf "$XDG_CONFIG_HOME" LC_ALL=C librechroot help >$tmpdir/stdout 2>$tmpdir/stderr [[ "$(sed 1q $tmpdir/stdout)" =~ Usage:.* ]] empty $tmpdir/stderr } it_otherwise_fails_as_normal_user() { librechroot -l "$roundup_test_name" run true >$tmpdir/stdout 2>$tmpdir/stderr || stat=$? [[ $stat != 0 ]] empty $tmpdir/stdout not empty $tmpdir/stderr } it_displays_help_and_fails_with_0_args() { LC_ALL=C librechroot -l "$roundup_test_name" >$tmpdir/stdout 2>$tmpdir/stderr || stat=$? [[ $stat != 0 ]] empty $tmpdir/stdout [[ "$(sed -n 2p $tmpdir/stderr)" =~ Usage:.* ]] } it_obeys_the_n_flag() { require network sudo || return 0 not test -f "$chrootdir/$roundup_test_name/$roundup_test_name/$roundup_test_name.stamp" libremessages msg 'Creating a chroot, may take a few minutes' &>/dev/tty testsudo librechroot -n "$roundup_test_name" -l "$roundup_test_name" run touch /"$roundup_test_name.stamp" test -f "$chrootdir/$roundup_test_name/$roundup_test_name/$roundup_test_name.stamp" } # requires sudo so we know it's not failing because it needs root it_fails_for_unknown_commands() { require sudo || return 0 testsudo librechroot phony >$tmpdir/stdout 2>$tmpdir/stderr || stat=$? [[ $stat != 0 ]] empty $tmpdir/stdout not empty $tmpdir/stderr } # requires sudo so we know it's not failing because it needs root it_fails_for_unknown_flags() { require sudo || return 0 testsudo librechroot -q >$tmpdir/stdout 2>$tmpdir/stderr || stat=$? [[ $stat != 0 ]] empty $tmpdir/stdout not empty $tmpdir/stderr } it_fails_when_syncing_a_copy_with_itself() { require sudo || return 0 testsudo timeout 5 librechroot -l root sync || stat=$? case $stat in 0|124|137) # success|timeout+TERM|timeout+KILL false;; *) true;; esac } it_deletes_copies() { require network sudo || return 0 libremessages msg 'Creating a chroot, may take a few minutes' &>/dev/tty testsudo librechroot -l "$roundup_test_name" make test -d "$chrootdir/default/$roundup_test_name" testsudo librechroot -l "$roundup_test_name" delete not test -e "$chrootdir/default/$roundup_test_name" } it_deletes_subvolumes_recursively() { require network sudo btrfs || return 0 libremessages msg 'Creating a chroot, may take a few minutes' &>/dev/tty testsudo librechroot -l "$roundup_test_name" make testsudo librechroot -l "$roundup_test_name" install-name btrfs-progs test -d "$chrootdir/default/$roundup_test_name" not test -e "$chrootdir/default/$roundup_test_name/var/subvolume" testsudo librechroot -l "$roundup_test_name" run btrfs subvolume create /var/subvolume test -d "$chrootdir/default/$roundup_test_name/var/subvolume" testsudo librechroot -l "$roundup_test_name" delete not test -e "$chrootdir/default/$roundup_test_name" } it_cleans_up_TMPDIR() { require network sudo || return 0 local dir="$tmpdir/tmp" mkdir -- "$dir" libremessages msg 'Creating a chroot, may take a few minutes' &>/dev/tty TMPDIR=$dir testsudo librechroot -l "$roundup_test_name" -A x86_64 make # Make sure $dir is now empty rmdir -- "$dir" }