summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/.gitignore1
-rw-r--r--test/aur-test.sh30
-rw-r--r--test/is_built-test.sh60
-rw-r--r--test/lib-blacklist-test.sh132
-rw-r--r--test/lib-conf-test.sh43
-rw-r--r--test/lib-messages-test.sh48
-rw-r--r--test/librechroot-test.sh76
-rw-r--r--test/librelib-test.sh73
-rw-r--r--test/libremakepkg-test.sh63
-rw-r--r--test/libremakepkg.d/PKGBUILD-hello19
-rw-r--r--test/librestage-test.sh85
-rw-r--r--test/librestage.d/PKGBUILD-hello19
-rw-r--r--test/librestage.d/PKGBUILD-split42
-rw-r--r--test/pkgbuild-check-licenses-test.sh27
-rw-r--r--test/pkgbuild-check-nonfree-test.sh71
-rw-r--r--test/pkgbuild-check-nonfree.d/PKGBUILD.free18
-rw-r--r--test/pkgbuild-check-nonfree.d/PKGBUILD.nonfree18
-rw-r--r--test/pkgbuild-check-nonfree.d/PKGBUILD.nonfree-replacement18
-rw-r--r--test/test-common.sh38
-rwxr-xr-xtest/testenv60
20 files changed, 941 insertions, 0 deletions
diff --git a/test/.gitignore b/test/.gitignore
new file mode 100644
index 0000000..2226ac6
--- /dev/null
+++ b/test/.gitignore
@@ -0,0 +1 @@
+.roundup.*
diff --git a/test/aur-test.sh b/test/aur-test.sh
new file mode 100644
index 0000000..1fbe659
--- /dev/null
+++ b/test/aur-test.sh
@@ -0,0 +1,30 @@
+#!/usr/bin/env roundup
+
+describe aur
+
+. ./test-common.sh
+
+before() {
+ _before
+}
+
+after() {
+ _after
+}
+
+it_displays_help() {
+ LANG=C aur -h >$tmpdir/stdout 2>$tmpdir/stderr
+
+ [[ "$(sed 1q $tmpdir/stdout)" =~ Usage:.* ]]
+ [[ -z "$(cat $tmpdir/stderr)" ]]
+}
+
+it_fails_with_0_args() {
+ aur >$tmpdir/stdout 2>$tmpdir/stderr || stat=$?
+
+ [[ $stat != 0 ]]
+ [[ -z "$(cat $tmpdir/stdout)" ]]
+ [[ -n "$(cat $tmpdir/stderr)" ]]
+}
+
+# TODO: Actually test
diff --git a/test/is_built-test.sh b/test/is_built-test.sh
new file mode 100644
index 0000000..62847e5
--- /dev/null
+++ b/test/is_built-test.sh
@@ -0,0 +1,60 @@
+#!/usr/bin/env roundup
+
+describe is_built
+
+. ./test-common.sh
+
+before() {
+ _before
+}
+
+after() {
+ _after
+}
+
+it_displays_help() {
+ LANG=C is_built -h >$tmpdir/stdout 2>$tmpdir/stderr
+
+ [[ "$(sed 1q $tmpdir/stdout)" =~ Usage:.* ]]
+ [[ -z "$(cat $tmpdir/stderr)" ]]
+}
+
+it_fails_with_0_args() {
+ is_built >$tmpdir/stdout 2>$tmpdir/stderr || stat=$?
+
+ [[ $stat -gt 1 ]]
+ [[ -z "$(cat $tmpdir/stdout)" ]]
+ [[ -n "$(cat $tmpdir/stderr)" ]]
+}
+
+it_succeeds_with_1_arg() {
+ is_built sh >$tmpdir/stdout 2>$tmpdir/stderr
+
+ [[ -z "$(cat $tmpdir/stdout)" ]]
+ [[ -z "$(cat $tmpdir/stderr)" ]]
+}
+
+it_returns_1_for_non_existent_package() {
+ is_built phony-ne-package 100 >$tmpdir/stdout 2>$tmpdir/stderr || stat=$?
+
+ [[ $stat == 1 ]]
+ [[ -z "$(cat $tmpdir/stdout)" ]]
+ [[ -z "$(cat $tmpdir/stderr)" ]]
+}
+
+it_returns_1_for_future_packages() {
+ # If emacs ever goes rapid release, we might need to change this :P
+ is_built emacs 100 >$tmpdir/stdout 2>$tmpdir/stderr || stat=$?
+
+ [[ $stat == 1 ]]
+ [[ -z "$(cat $tmpdir/stdout)" ]]
+ [[ -z "$(cat $tmpdir/stderr)" ]]
+}
+
+it_returns_0_for_past_packages() {
+ # If emacs ever goes rapid release, we might need to change this :P
+ is_built emacs 1 >$tmpdir/stdout 2>$tmpdir/stderr
+
+ [[ -z "$(cat $tmpdir/stdout)" ]]
+ [[ -z "$(cat $tmpdir/stderr)" ]]
+}
diff --git a/test/lib-blacklist-test.sh b/test/lib-blacklist-test.sh
new file mode 100644
index 0000000..c496167
--- /dev/null
+++ b/test/lib-blacklist-test.sh
@@ -0,0 +1,132 @@
+#!/usr/bin/env roundup
+
+describe libreblacklist
+
+. ./test-common.sh
+
+before() {
+ _before
+}
+
+after() {
+ _after
+}
+
+it_works_with_just_pkgname() {
+ v="$(libreblacklist normalize <<<skype)"; [[ $v == 'skype::' ]]
+ v="$(libreblacklist get-pkg <<<skype)"; [[ $v == skype ]]
+ v="$(libreblacklist get-rep <<<skype)"; [[ -z $v ]]
+ v="$(libreblacklist get-reason <<<skype)"; [[ -z $v ]]
+}
+
+it_works_with_everything_set() {
+ line='linux:linux-libre:nonfree blobs and firmwares'
+ v="$(libreblacklist normalize <<<"$line")"; [[ $v == "$line" ]]
+ v="$(libreblacklist get-pkg <<<"$line")"; [[ $v == 'linux' ]]
+ v="$(libreblacklist get-rep <<<"$line")"; [[ $v == 'linux-libre' ]]
+ v="$(libreblacklist get-reason <<<"$line")"; [[ $v == 'nonfree blobs and firmwares' ]]
+}
+
+it_normalizes_correctly() {
+ v="$(libreblacklist normalize <<<pkg)"; [[ $v == 'pkg::' ]]
+ v="$(libreblacklist normalize <<<pkg:)"; [[ $v == 'pkg::' ]]
+ v="$(libreblacklist normalize <<<pkg::)"; [[ $v == 'pkg::' ]]
+ v="$(libreblacklist normalize <<<pkg:rep)"; [[ $v == 'pkg:rep:' ]]
+ v="$(libreblacklist normalize <<<pkg:rep:)"; [[ $v == 'pkg:rep:' ]]
+ v="$(libreblacklist normalize <<<pkg:rep:reason)"; [[ $v == 'pkg:rep:reason' ]]
+ v="$(libreblacklist normalize <<<pkg:rep:reason:)"; [[ $v == 'pkg:rep:reason:' ]]
+}
+
+it_works_with_colons_in_reason() {
+ line='package:replacement:my:reason'
+ v="$(libreblacklist normalize <<<"$line")"; [[ $v == "$line" ]]
+ v="$(libreblacklist get-pkg <<<"$line")"; [[ $v == 'package' ]]
+ v="$(libreblacklist get-rep <<<"$line")"; [[ $v == 'replacement' ]]
+ v="$(libreblacklist get-reason <<<"$line")"; [[ $v == 'my:reason' ]]
+}
+
+it_fails_update_when_there_is_no_blacklist_or_network() {
+ mkdir -p $XDG_CONFIG_HOME/libretools
+ echo "BLACKLIST='phony://example.com'" >$XDG_CONFIG_HOME/libretools/libretools.conf
+
+ libreblacklist update >$tmpdir/stdout 2>$tmpdir/stderr || stat=$?
+
+ [[ $stat != 0 ]]
+ [[ -z "$(cat $tmpdir/stdout)" ]]
+ [[ -n "$(cat $tmpdir/stderr)" ]]
+}
+
+it_fails_cat_when_there_is_no_blacklist_or_network() {
+ mkdir -p $XDG_CONFIG_HOME/libretools
+ echo "BLACKLIST='phony://example.com'" >$XDG_CONFIG_HOME/libretools/libretools.conf
+
+ libreblacklist cat >$tmpdir/stdout 2>$tmpdir/stderr || stat=$?
+
+ [[ $stat != 0 ]]
+ [[ -z "$(cat $tmpdir/stdout)" ]]
+ [[ -n "$(cat $tmpdir/stderr)" ]]
+}
+
+it_fails_update_when_BLACKLIST_is_unset() {
+ mkdir -p $XDG_CONFIG_HOME/libretools
+ echo "BLACKLIST=" >$XDG_CONFIG_HOME/libretools/libretools.conf
+
+ libreblacklist update >$tmpdir/stdout 2>$tmpdir/stderr || stat=$?
+
+ [[ $stat != 0 ]]
+ [[ -z "$(cat $tmpdir/stdout)" ]]
+ [[ -n "$(cat $tmpdir/stderr)" ]]
+}
+
+it_fails_cat_when_syntax_error_in_conf() {
+ mkdir -p $XDG_CONFIG_HOME/libretools
+ # there is a stray single quote in there
+ echo "BLACKLIST='https://repo.parabolagnulinux.org/docs/blacklist.txt" >$XDG_CONFIG_HOME/libretools/libretools.conf
+
+ libreblacklist cat >$tmpdir/stdout 2>$tmpdir/stderr || stat=$?
+
+ [[ $stat != 0 ]]
+ [[ -z "$(cat $tmpdir/stdout)" ]]
+ [[ -n "$(cat $tmpdir/stderr)" ]]
+}
+
+it_downloads_the_blacklist_as_needed() {
+ require network || return 0
+ mkdir -p $XDG_CONFIG_HOME/libretools
+ echo "BLACKLIST=https://repo.parabolagnulinux.org/docs/blacklist.txt" >$XDG_CONFIG_HOME/libretools/libretools.conf
+
+ libreblacklist cat >$tmpdir/stdout 2>$tmpdir/stderr
+
+ [[ -n "$(cat $tmpdir/stdout)" ]]
+}
+
+it_downloads_the_blacklist_repeatedly() {
+ require network || return 0
+ mkdir -p $XDG_CONFIG_HOME/libretools
+ echo "BLACKLIST=https://repo.parabolagnulinux.org/docs/blacklist.txt" >$XDG_CONFIG_HOME/libretools/libretools.conf
+
+ libreblacklist update
+ libreblacklist update
+}
+
+it_displays_help_and_fails_with_no_args() {
+ LANG=C libreblacklist >$tmpdir/stdout 2>$tmpdir/stderr || stat=$?
+
+ [[ $stat != 0 ]]
+ [[ -z "$(cat $tmpdir/stdout)" ]]
+ [[ "$(sed 1q $tmpdir/stderr)" =~ 'Usage: libreblacklist ' ]]
+}
+
+it_displays_help_when_given_h() {
+ LANG=C libreblacklist -h >$tmpdir/stdout 2>$tmpdir/stderr
+
+ [[ "$(sed 1q $tmpdir/stdout)" =~ 'Usage: libreblacklist ' ]]
+ [[ -z "$(cat $tmpdir/stderr)" ]]
+}
+
+it_displays_help_when_given_h_cat() {
+ LANG=C libreblacklist -h cat >$tmpdir/stdout 2>$tmpdir/stderr
+
+ [[ "$(sed 1q $tmpdir/stdout)" == 'Usage: libreblacklist cat' ]]
+ [[ -z "$(cat $tmpdir/stderr)" ]]
+}
diff --git a/test/lib-conf-test.sh b/test/lib-conf-test.sh
new file mode 100644
index 0000000..0d028b8
--- /dev/null
+++ b/test/lib-conf-test.sh
@@ -0,0 +1,43 @@
+#!/usr/bin/env roundup
+
+describe lib/conf.sh
+
+. ./test-common.sh
+
+before() {
+ _before test-conf.sh
+}
+
+after() {
+ _after
+}
+
+it_sets_makepkg_vars_in_custom_file() {
+ unset PKGDEST
+ touch "$tmpdir/makepkg.conf"
+ . $(librelib conf.sh)
+ MAKEPKG_CONF="$tmpdir/makepkg.conf" set_conf_makepkg PKGDEST /pkgdest
+ . "$tmpdir/makepkg.conf"
+ [[ $PKGDEST == /pkgdest ]]
+}
+
+it_figures_out_HOME_when_root() {
+ require sudo || return 0
+ # This one is tricky, because it does the job too well, it will find
+ # the actual HOME, instead of the test environment HOME. Therefore, we
+ # will just check that [[ $HOME != /root ]]
+ cd "$tmpdir"
+ echo '. $(librelib conf.sh); echo "$LIBREHOME"' > test.sh
+ LIBREHOME=$(testsudo bash ./test.sh)
+ [[ $LIBREHOME != /root ]]
+}
+
+it_respects_custom_HOME() {
+ cd "$tmpdir"
+ echo '. $(librelib conf.sh); echo "$LIBREHOME"' > test.sh
+
+ export HOME=/foo
+ LIBREHOME=$(bash ./test.sh)
+
+ [[ $LIBREHOME == /foo ]]
+}
diff --git a/test/lib-messages-test.sh b/test/lib-messages-test.sh
new file mode 100644
index 0000000..826556b
--- /dev/null
+++ b/test/lib-messages-test.sh
@@ -0,0 +1,48 @@
+#!/usr/bin/env roundup
+
+describe libremessages
+
+. ./test-common.sh
+
+before() {
+ _before
+}
+
+after() {
+ _after
+}
+
+it_can_be_included_twice() (
+ . libremessages
+ . libremessages
+)
+
+it_can_be_included_with_set_euE() (
+ set -euE
+ . libremessages
+)
+
+it_works_with_no_color_and_set_euE() (
+ (
+ unset TERM
+ set -euE
+ . libremessages
+ msg Foo
+ ) >$tmpdir/stdout 2>$tmpdir/stderr
+
+ [[ -z "$(cat $tmpdir/stdout)" ]]
+ [[ -n "$(cat $tmpdir/stderr)" ]]
+)
+
+it_can_be_called_without_including() {
+ libremessages msg Foo >$tmpdir/stdout 2>$tmpdir/stderr
+
+ [[ -z "$(cat $tmpdir/stdout)" ]]
+ [[ -n "$(cat $tmpdir/stderr)" ]]
+}
+
+it_fails_with_msg_and_no_args() {
+ ret=0
+ libremessages msg || ret=$?
+ [[ $ret != 0 ]]
+}
diff --git a/test/librechroot-test.sh b/test/librechroot-test.sh
new file mode 100644
index 0000000..76afb56
--- /dev/null
+++ b/test/librechroot-test.sh
@@ -0,0 +1,76 @@
+#!/usr/bin/env roundup
+
+describe librechroot
+
+. ./test-common.sh
+
+before() {
+ _before librechroot
+ mkdir -p "$XDG_CONFIG_HOME"/libretools
+ echo "CHROOTDIR='$tmpdir/chrootdir'" > "$XDG_CONFIG_HOME"/libretools/chroot.conf
+ echo "CHROOT='default'" >> "$XDG_CONFIG_HOME"/libretools/chroot.conf
+ echo "CHROOTEXTRAPKG=()" >> "$XDG_CONFIG_HOME"/libretools/chroot.conf
+}
+
+after() {
+ _after_sudo
+}
+
+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 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 make
+ testsudo librechroot clean-repo
+ testsudo librechroot run test -r /repo/repo.db
+ # TODO: inspect /repo/* more
+}
+
+it_displays_help_as_normal_user() {
+ rm -rf "$XDG_CONFIG_HOME"
+ LANG=C librechroot help >$tmpdir/stdout 2>$tmpdir/stderr
+
+ [[ "$(sed 1q $tmpdir/stdout)" =~ Usage:.* ]]
+ [[ -z "$(cat $tmpdir/stderr)" ]]
+}
+
+it_otherwise_fails_as_normal_user() {
+ librechroot run true >$tmpdir/stdout 2>$tmpdir/stderr || stat=$?
+
+ [[ $stat != 0 ]]
+ [[ -z "$(cat $tmpdir/stdout)" ]]
+ [[ -n "$(cat $tmpdir/stderr)" ]]
+}
+
+it_displays_help_and_fails_with_0_args() {
+ LANG=C librechroot >$tmpdir/stdout 2>$tmpdir/stderr || stat=$?
+
+ [[ $stat != 0 ]]
+ [[ -z "$(cat $tmpdir/stdout)" ]]
+ [[ "$(sed 1q $tmpdir/stderr)" =~ Usage:.* ]]
+}
+
+# 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 ]]
+ [[ -z "$(cat $tmpdir/stdout)" ]]
+ [[ -n "$(cat $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 ]]
+ [[ -z "$(cat $tmpdir/stdout)" ]]
+ [[ -n "$(cat $tmpdir/stderr)" ]]
+}
diff --git a/test/librelib-test.sh b/test/librelib-test.sh
new file mode 100644
index 0000000..e86dffe
--- /dev/null
+++ b/test/librelib-test.sh
@@ -0,0 +1,73 @@
+#!/usr/bin/env roundup
+
+describe librelib
+
+. ./test-common.sh
+
+before() {
+ _before
+}
+
+after() {
+ _after
+}
+
+it_displays_help_and_fails_with_0_args() {
+ ret=0
+ librelib >$tmpdir/stdout 2>$tmpdir/stderr || ret=$?
+
+ [[ -z "$(cat $tmpdir/stdout)" ]]
+ [[ "$(sed 1q $tmpdir/stderr)" =~ Usage:.* ]]
+ [[ $ret != 0 ]]
+}
+
+it_fails_with_2_args() {
+ ret=0
+ librelib a b >$tmpdir/stdout 2>$tmpdir/stderr || ret=$?
+
+ [[ -z "$(cat $tmpdir/stdout)" ]]
+ [[ -n "$(cat $tmpdir/stderr)" ]]
+ [[ $ret != 0 ]]
+}
+
+it_displays_usage_text() {
+ librelib -h >$tmpdir/stdout 2>$tmpdir/stderr
+
+ [[ "$(sed 1q $tmpdir/stdout)" =~ Usage:.* ]]
+ [[ -z "$(cat $tmpdir/stderr)" ]]
+}
+
+# libremessages is executable
+it_finds_messages() {
+ v1=$(librelib messages)
+ v2=$(librelib libremessages)
+ v3=$(librelib messages.sh)
+ v4=$(librelib libremessages.sh)
+
+ [[ -x "$v1" ]]
+ [[ "$v1" == "$v2" ]]
+ [[ "$v1" == "$v3" ]]
+ [[ "$v1" == "$v4" ]]
+}
+
+# conf.sh is non-executable
+it_finds_conf() {
+ v1=$(librelib conf)
+ v2=$(librelib libreconf)
+ v3=$(librelib conf.sh)
+ v4=$(librelib libreconf.sh)
+
+ [[ -r "$v1" && ! -x "$v1" ]]
+ [[ "$v1" == "$v2" ]]
+ [[ "$v1" == "$v3" ]]
+ [[ "$v1" == "$v4" ]]
+}
+
+it_fails_to_find_phony() {
+ ret=0
+ librelib phony >$tmpdir/stdout 2>$tmpdir/stderr || ret=$?
+
+ [[ -z "$(cat $tmpdir/stdout)" ]]
+ [[ -n "$(cat $tmpdir/stderr)" ]]
+ [[ $ret != 0 ]]
+}
diff --git a/test/libremakepkg-test.sh b/test/libremakepkg-test.sh
new file mode 100644
index 0000000..be19e17
--- /dev/null
+++ b/test/libremakepkg-test.sh
@@ -0,0 +1,63 @@
+#!/usr/bin/env roundup
+
+describe libremakepkg
+
+. ./test-common.sh
+
+before() {
+ _before libremakepkg
+
+ mkdir -p "$XDG_CONFIG_HOME"/libretools
+
+ echo "BLACKLIST=https://repo.parabolagnulinux.org/docs/blacklist.txt" >"$XDG_CONFIG_HOME"/libretools/libretools.conf
+
+ echo "CHROOTDIR='$tmpdir/chrootdir'" > "$XDG_CONFIG_HOME"/libretools/chroot.conf
+ echo "CHROOT='default'" >> "$XDG_CONFIG_HOME"/libretools/chroot.conf
+ echo "CHROOTEXTRAPKG=()" >> "$XDG_CONFIG_HOME"/libretools/chroot.conf
+}
+
+after() {
+ _after_sudo
+}
+
+it_builds_a_trivial_package() {
+ require network sudo || return 0
+ cp libremakepkg.d/PKGBUILD-hello "$tmpdir/PKGBUILD"
+ cd "$tmpdir"
+
+ libremessages msg 'Creating a chroot, may take a few minutes' &>/dev/tty
+ testsudo libremakepkg
+
+ [[ -f $(echo libretools-hello-1.0-1-any.pkg.tar.?z) ]]
+}
+
+it_handles_PKGDEST_not_existing() {
+ require network sudo || return 0
+ cp libremakepkg.d/PKGBUILD-hello "$tmpdir/PKGBUILD"
+ cd "$tmpdir"
+
+ libremessages msg 'Creating a chroot, may take a few minutes' &>/dev/tty
+ testsudo env PKGDEST="$tmpdir/dest/pkgdest" libremakepkg
+
+ [[ -f $(echo dest/pkgdest/libretools-hello-1.0-1-any.pkg.tar.?z) ]]
+}
+
+it_displays_help_as_normal_user() {
+ rm -rf "$XDG_CONFIG_HOME"
+ LANG=C libremakepkg -h >$tmpdir/stdout 2>$tmpdir/stderr
+
+ [[ "$(sed 1q $tmpdir/stdout)" =~ Usage:.* ]]
+ [[ -z "$(cat $tmpdir/stderr)" ]]
+}
+
+it_otherwise_fails_as_normal_user() {
+ # I do this to give it a chance of passing
+ cp libremakepkg.d/PKGBUILD-hello "$tmpdir/PKGBUILD"
+ cd "$tmpdir"
+
+ libremakepkg >$tmpdir/stdout 2>$tmpdir/stderr || stat=$?
+
+ [[ $stat != 0 ]]
+ [[ -z "$(cat $tmpdir/stdout)" ]]
+ [[ -n "$(cat $tmpdir/stderr)" ]]
+}
diff --git a/test/libremakepkg.d/PKGBUILD-hello b/test/libremakepkg.d/PKGBUILD-hello
new file mode 100644
index 0000000..706cb24
--- /dev/null
+++ b/test/libremakepkg.d/PKGBUILD-hello
@@ -0,0 +1,19 @@
+pkgname='libretools-hello'
+pkgver=1.0
+license=('GPL')
+url='https://parabolagnulinux.org'
+
+pkgrel=1
+arch=(any)
+depends=(sh)
+
+build() {
+ cd "$srcdir"
+ echo '#!/bin/sh' > hello.sh
+ echo 'echo Hello, world!' >> hello.sh
+}
+
+package() {
+ cd "$srcdir"
+ install -Dm755 hello.sh "$pkgdir"/usr/bin/libretools-hello
+}
diff --git a/test/librestage-test.sh b/test/librestage-test.sh
new file mode 100644
index 0000000..849a68c
--- /dev/null
+++ b/test/librestage-test.sh
@@ -0,0 +1,85 @@
+#!/usr/bin/env roundup
+
+describe librestage
+
+. ./test-common.sh
+
+before() {
+ _before
+
+ mkdir -p $XDG_CONFIG_HOME/libretools
+ echo "WORKDIR='$tmpdir/workdir'" >$XDG_CONFIG_HOME/libretools/libretools.conf
+ echo "ARCHES=('x86_64' 'i686' 'misp64el')" >>$XDG_CONFIG_HOME/libretools/libretools.conf
+
+ export HOME=$XDG_CONFIG_HOME
+ echo 'PKGEXT=.pkg.tar.gz' > $HOME/.makepkg.conf
+ echo "PKGDEST='$tmpdir/workdir/pkgdest'" >> $HOME/.makepkg.conf
+ mkdir -p "$tmpdir/workdir/pkgdest"
+}
+
+after() {
+ _after
+}
+
+it_displays_usage_text() {
+ rm -rf "$XDG_CONFIG_HOME"
+ LANG=C librestage -h >$tmpdir/stdout 2>$tmpdir/stderr
+
+ [[ "$(sed 1q "$tmpdir/stdout")" =~ Usage:.* ]]
+ [[ -z "$(cat "$tmpdir/stderr")" ]]
+}
+
+it_fails_with_0_args() {
+ librestage >$tmpdir/stdout 2>$tmpdir/stderr || stat=$?
+
+ [[ $stat != 0 ]]
+ [[ -z "$(cat "$tmpdir/stdout")" ]]
+ [[ -n "$(cat "$tmpdir/stderr")" ]]
+}
+
+it_fails_with_invalid_args() {
+ librestage -q >$tmpdir/stdout 2>$tmpdir/stderr || stat=$?
+
+ [[ $stat != 0 ]]
+ [[ -z "$(cat "$tmpdir/stdout")" ]]
+ [[ -n "$(cat "$tmpdir/stderr")" ]]
+}
+
+# This was an actual bug I hit with md/emacs-mdmua a long time ago; solution was
+# to use $(get_full_version)
+it_stages_split_packages_with_different_versions() {
+ cp librestage.d/PKGBUILD-split "$tmpdir/PKGBUILD"
+ cd "$tmpdir"
+
+ makepkg
+ librestage '~lukeshu'
+
+ # peak at the PKGBUILD to get this info
+ [[ -f $tmpdir/workdir/staging/~lukeshu/md-0.81-4-any.pkg.tar.gz ]]
+ [[ -f $tmpdir/workdir/staging/~lukeshu/emacs-mdmua-0.72-4-any.pkg.tar.gz ]]
+}
+
+it_stages_packages_to_multiple_repos() {
+ cp librestage.d/PKGBUILD-hello "$tmpdir/PKGBUILD"
+ cd "$tmpdir"
+
+ makepkg
+ librestage repo1 repo2 repo3
+
+ [[ -f $tmpdir/workdir/staging/repo1/libretools-hello-1.0-1-any.pkg.tar.gz ]]
+ [[ -f $tmpdir/workdir/staging/repo2/libretools-hello-1.0-1-any.pkg.tar.gz ]]
+ [[ -f $tmpdir/workdir/staging/repo3/libretools-hello-1.0-1-any.pkg.tar.gz ]]
+}
+
+
+it_stages_packages_without_PKGDEST() {
+ echo "PKGDEST=''" >> $HOME/.makepkg.conf
+
+ cp librestage.d/PKGBUILD-hello "$tmpdir/PKGBUILD"
+ cd "$tmpdir"
+
+ makepkg
+ librestage repo1
+
+ [[ -f $tmpdir/workdir/staging/repo1/libretools-hello-1.0-1-any.pkg.tar.gz ]]
+}
diff --git a/test/librestage.d/PKGBUILD-hello b/test/librestage.d/PKGBUILD-hello
new file mode 100644
index 0000000..706cb24
--- /dev/null
+++ b/test/librestage.d/PKGBUILD-hello
@@ -0,0 +1,19 @@
+pkgname='libretools-hello'
+pkgver=1.0
+license=('GPL')
+url='https://parabolagnulinux.org'
+
+pkgrel=1
+arch=(any)
+depends=(sh)
+
+build() {
+ cd "$srcdir"
+ echo '#!/bin/sh' > hello.sh
+ echo 'echo Hello, world!' >> hello.sh
+}
+
+package() {
+ cd "$srcdir"
+ install -Dm755 hello.sh "$pkgdir"/usr/bin/libretools-hello
+}
diff --git a/test/librestage.d/PKGBUILD-split b/test/librestage.d/PKGBUILD-split
new file mode 100644
index 0000000..a8ec1ef
--- /dev/null
+++ b/test/librestage.d/PKGBUILD-split
@@ -0,0 +1,42 @@
+# Maintainer: Luke Shumaker <lukeshu@sbcglobal.net>
+
+pkgname=("md" "emacs-mdmua")
+pkgver=0.81
+pkgrel=4
+arch=('any')
+url="https://github.com/nicferrier/$_pkgname"
+license=('GPL3')
+
+#makedepends=(python-distribute)
+
+#__gitbranch=1d69744 # This is the commit that is 0.81
+__gitbranch=455b6b4 # this is currently HEAD (has bugfixes)
+#source=("nicferrier-md-${__gitbranch}.tar.gz::https://github.com/nicferrier/$pkgname/tarball/${__gitbranch}")
+
+#build() {
+# cd "${srcdir}/nicferrier-md-${__gitbranch}"
+#
+# # fix typo
+# sed -i 's/pyprofyfs/pyproxyfs/' setup.py
+#}
+
+package_md() {
+ pkgdesc="A maildir client and library."
+ depends=('python' 'python-pyproxyfs')
+
+# cd "${srcdir}/nicferrier-md-${__gitbranch}"
+# python setup.py install --root="$pkgdir/" --optimize=1
+}
+
+package_emacs-mdmua() {
+ pkgdesc="An Emacs mail user agent (MUA) build around md."
+ pkgver='0.72'
+ depends=("md=0.81" 'emacs>=24')
+
+# cd "${srcdir}/nicferrier-md-${__gitbranch}"
+# cd useragents/emacs
+# install -d ${pkgdir}/usr/share/emacs/site-lisp
+# install -m 644 *.el ${pkgdir}/usr/share/emacs/site-lisp
+}
+
+#md5sums=('452727348df2f51d7eddade709aceb1c')
diff --git a/test/pkgbuild-check-licenses-test.sh b/test/pkgbuild-check-licenses-test.sh
new file mode 100644
index 0000000..220ef6b
--- /dev/null
+++ b/test/pkgbuild-check-licenses-test.sh
@@ -0,0 +1,27 @@
+#!/usr/bin/env roundup
+
+# avoid carpel tunnel
+pcl=pkgbuild-check-licenses
+
+describe $pcl
+
+. ./test-common.sh
+
+before() {
+ _before
+}
+
+after() {
+ _after
+}
+
+it_displays_usage_text() {
+ # This test seems silly, but it makes sure that it is executable,
+ # syntactically correct, and loading libraries works.
+ LANG=C $pcl -h >$tmpdir/stdout 2>$tmpdir/stderr
+ stat=$?
+
+ [[ "$(sed 1q $tmpdir/stdout)" =~ Usage:.* ]]
+ [[ -z "$(cat $tmpdir/stderr)" ]]
+ [[ $stat == 0 ]]
+}
diff --git a/test/pkgbuild-check-nonfree-test.sh b/test/pkgbuild-check-nonfree-test.sh
new file mode 100644
index 0000000..d547e24
--- /dev/null
+++ b/test/pkgbuild-check-nonfree-test.sh
@@ -0,0 +1,71 @@
+#!/usr/bin/env roundup
+
+# avoid carpel tunnel
+pcn=pkgbuild-check-nonfree
+
+describe $pcn
+
+. ./test-common.sh
+
+before() {
+ _before
+
+ mkdir -p $XDG_CONFIG_HOME/libretools
+ echo "BLACKLIST='phony://example.com'" >$XDG_CONFIG_HOME/libretools/libretools.conf
+
+ local blacklist=$XDG_CACHE_HOME/libretools/blacklist.txt
+ mkdir -p "${blacklist%/*}"
+ echo 'linux:linux-libre:nonfree blobs and firmwares' >$blacklist
+ echo 'skype' >>$blacklist
+}
+
+after() {
+ _after
+}
+
+it_displays_usage_text() {
+ # This test seems silly, but it makes sure that it is executable,
+ # syntactically correct, and loading libraries works.
+ LANG=C $pcn -h >$tmpdir/stdout 2>$tmpdir/stderr
+ stat=$?
+
+ [[ "$(sed 1q $tmpdir/stdout)" =~ Usage:.* ]]
+ [[ -z "$(cat $tmpdir/stderr)" ]]
+ [[ $stat == 0 ]]
+}
+
+it_succeeds_for_free_depends() {
+ $pcn $pcn.d/PKGBUILD.free >$tmpdir/stdout 2>$tmpdir/stderr || stat=$?
+
+ [[ -z "$(cat $tmpdir/stdout)" ]]
+ [[ -n "$(cat $tmpdir/stderr)" ]]
+ [[ $stat == 0 ]]
+}
+
+it_succeeds_for_nonfree_depend_with_replacement() {
+ $pcn $pcn.d/PKGBUILD.nonfree-replacement >$tmpdir/stdout 2>$tmpdir/stderr || stat=$?
+
+ [[ -z "$(cat $tmpdir/stdout)" ]]
+ [[ -n "$(cat $tmpdir/stderr)" ]]
+ [[ $stat == 0 ]]
+}
+
+it_fails_with_15_for_nonfree_depend() {
+ $pcn $pcn.d/PKGBUILD.nonfree >$tmpdir/stdout 2>$tmpdir/stderr || stat=$?
+
+ [[ -z "$(cat $tmpdir/stdout)" ]]
+ [[ -n "$(cat $tmpdir/stderr)" ]]
+ [[ $stat == 15 ]]
+}
+
+it_fails_when_there_is_no_blacklist() {
+ mkdir -p $XDG_CONFIG_HOME/libretools
+ echo "BLACKLIST='phony://example.com'" >$XDG_CONFIG_HOME/libretools/libretools.conf
+ rm $XDG_CACHE_HOME/libretools/blacklist.txt
+
+ $pcn $pcn.d/PKGBUILD.free >$tmpdir/stdout 2>$tmpdir/stderr || stat=$?
+
+ [[ -z "$(cat $tmpdir/stdout)" ]]
+ [[ -n "$(cat $tmpdir/stderr)" ]]
+ [[ $stat != 0 ]] && [[ $stat != 15 ]]
+}
diff --git a/test/pkgbuild-check-nonfree.d/PKGBUILD.free b/test/pkgbuild-check-nonfree.d/PKGBUILD.free
new file mode 100644
index 0000000..4b8f0dd
--- /dev/null
+++ b/test/pkgbuild-check-nonfree.d/PKGBUILD.free
@@ -0,0 +1,18 @@
+pkgname=wmii
+pkgver=3.9.2
+pkgrel=3
+pkgdesc="A small, dynamic window manager for X11"
+arch=('i686' 'x86_64')
+license=('MIT')
+url="http://wmii.suckless.org/"
+depends=('libxft' 'libxrandr' 'libxinerama' 'dash')
+source=()
+md5sums=()
+
+build() {
+ :
+}
+
+package() {
+ :
+}
diff --git a/test/pkgbuild-check-nonfree.d/PKGBUILD.nonfree b/test/pkgbuild-check-nonfree.d/PKGBUILD.nonfree
new file mode 100644
index 0000000..3a7afa4
--- /dev/null
+++ b/test/pkgbuild-check-nonfree.d/PKGBUILD.nonfree
@@ -0,0 +1,18 @@
+pkgname=wmii
+pkgver=3.9.2
+pkgrel=3
+pkgdesc="A small, dynamic window manager for X11"
+arch=('i686' 'x86_64')
+license=('MIT')
+url="http://wmii.suckless.org/"
+depends=('skype') # random non-free package with no other information
+source=()
+md5sums=()
+
+build() {
+ :
+}
+
+package() {
+ :
+}
diff --git a/test/pkgbuild-check-nonfree.d/PKGBUILD.nonfree-replacement b/test/pkgbuild-check-nonfree.d/PKGBUILD.nonfree-replacement
new file mode 100644
index 0000000..7855bdc
--- /dev/null
+++ b/test/pkgbuild-check-nonfree.d/PKGBUILD.nonfree-replacement
@@ -0,0 +1,18 @@
+pkgname=wmii
+pkgver=3.9.2
+pkgrel=3
+pkgdesc="A small, dynamic window manager for X11"
+arch=('i686' 'x86_64')
+license=('MIT')
+url="http://wmii.suckless.org/"
+depends=('linux') # random non-free package with a replacement
+source=()
+md5sums=()
+
+build() {
+ :
+}
+
+package() {
+ :
+}
diff --git a/test/test-common.sh b/test/test-common.sh
new file mode 100644
index 0000000..01b1b35
--- /dev/null
+++ b/test/test-common.sh
@@ -0,0 +1,38 @@
+#!/bin/bash
+
+if [[ $HOME == "$(eval echo ~$USER)" ]]; then
+ libremessages error "\$HOME is the default for %s; use testenv: %s" "$USER" "$HOME"
+ exit 1
+fi
+
+_before() {
+ tmpdir="$(mktemp -d --tmpdir "test-${roundup_desc//\//-}.XXXXXXXXXXXX")"
+ stat=0
+}
+
+_after() {
+ rm -rf -- "$tmpdir" "$XDG_CONFIG_HOME" "$XDG_CACHE_HOME"
+}
+
+_after_sudo() {
+ if [[ $SUDO ]]; then
+ sudo rm -rf -- "$tmpdir" "$XDG_CONFIG_HOME" "$XDG_CACHE_HOME"
+ else
+ rm -rf -- "$tmpdir" "$XDG_CONFIG_HOME" "$XDG_CACHE_HOME"
+ fi
+}
+
+require() {
+ local missing=()
+ if libremessages in_array "network" "$@" && ! [[ $NETWORK ]]; then
+ missing+=('networking')
+ fi
+ if libremessages in_array "sudo" "$@" && ! [[ $SUDO ]]; then
+ missing+=('sudo')
+ fi
+ if (( ${#missing[@]} )); then
+ libremessages warning "Next test requires %s; Skipping (passing)..." "$(echo "${missing[*]}"|sed 's/ /, /g')" &>/dev/tty
+ return 1
+ fi
+ return 0;
+}
diff --git a/test/testenv b/test/testenv
new file mode 100755
index 0000000..e6c882f
--- /dev/null
+++ b/test/testenv
@@ -0,0 +1,60 @@
+#!/bin/bash
+
+# Parse the arguments
+NETWORK=true
+SUDO=true
+while [[ $# -gt 0 ]]; do
+ case "$1" in
+ --no-network) shift; unset NETWORK;;
+ --network) shift; NETWORK=true;;
+ --no-sudo) shift; unset SUDO;;
+ --sudo) shift; SUDO=true;;
+ --) shift; break;;
+ *) break;;
+ esac
+done
+export NETWORK SUDO
+
+# Set up the working directory, and add the hook to clean it up
+export TMPDIR="$(mktemp --tmpdir -d libretools-test.XXXXXXXXXX)"
+trap "rm -rf '$TMPDIR'" EXIT
+
+# Set up the install to work with
+destdir=$TMPDIR/destdir
+
+old_pwd="$(pwd)"
+if [[ -f $0 ]]; then
+ cd "${0%/*}"
+fi
+make -C .. install DESTDIR=$destdir &>/dev/null || {
+ echo 'error creating local install, cannot run tests'
+ exit 1
+}
+cd "$old_pwd"
+
+# Set up the environment
+export PATH="$destdir/usr/bin:$PATH"
+export LIBRETOOLS_LIBDIR="$destdir/usr/lib/libretools"
+export HOME=$TMPDIR/home
+export XDG_CACHE_HOME="$HOME/.cache"
+export XDG_CONFIG_HOME="$HOME/.config"
+
+# Hack to respect our variables in sudo
+_sudo() {
+ local vars=(TMPDIR PATH LIBRETOOLS_LIBDIR XDG_CACHE_HOME XDG_CONFIG_HOME)
+ local args=()
+ local var
+ for var in "${vars[@]}"; do
+ args+=("$var=${!var}")
+ done
+ sudo env "${args[@]}" "$@"
+}
+printf '%s\n' \
+ '#!/bin/bash' \
+ "$(declare -f _sudo)" \
+ '_sudo "$@"' \
+ > "$destdir/usr/bin/testsudo"
+chmod 755 "$destdir/usr/bin/testsudo"
+
+# Run the tests
+eval "$@"