abuild/tests/abuild_test
Sören Tempel 4a2a0337d0 abuild: Scan for binaries with extra setcap(8) capabilities
Similar to suid binaries, abuild will now error out if the package
includes binaries with setcap(8) capabilities but doesn't have `setcap`
in `$options`. This eases identifying package which ship binaries
with extra capabilities.

Furthermore, if these binaries are executable by others a warning is
emitted. This warning could be changed to an error in the future.
The recommendation is to make such binaries only executable by owner
and group, thereby requiring the system administrator to explicitly
add users to a specific group in order to give them accesses to these
capabilities.

See: https://gitlab.alpinelinux.org/alpine/tsc/-/issues/45

Discussion: This change requires abuild to depend on the `libcap`
package for the `getcap` binary. It does not seem to be possible
at the moment to use scanelf(1) to identify these binaries.
2022-07-03 14:30:15 +02:00

947 lines
20 KiB
Plaintext
Executable File

#!/usr/bin/env atf-sh
. $(atf_get_srcdir)/test_env.sh
init_tests \
abuild_help \
abuild_invalid_opt \
abuild_version \
abuild_simple_pkg_without_deps \
abuild_build_fail \
abuild_invalid_filename \
abuild_usr_lib64 \
abuild_dbg_subpackage \
abuild_SETFATTR_in_dbg \
abuild_reproducible \
abuild_checksum_generation \
abuild_checksum_duplicates \
abuild_subpkg_dep_leak \
abuild_py_providers_creation \
abuild_py_dependency_scan \
abuild_py_dependency_scan_conflict \
abuild_reject_init_with_improper_shebang \
abuild_valid_pkgnames \
abuild_invalid_pkgnames \
abuild_invalid_subpkgnames \
abuild_invalid_subpkg_version \
abuild_large_doc_subpackage \
abuild_bigdocs \
abuild_warn_pkgver_patch_version \
abuild_multiline_license \
abuild_git_ceiling \
abuild_package_size_zero \
abuild_package_size_nonzero \
abuild_amove \
abuild_doc \
abuild_dev \
abuild_devhelp_warn \
abuild_devhelp \
abuild_check_maintainer \
abuild_cleanoldpkg \
abuild_path_with_spaces \
abuild_pyc_warn \
abuild_pyc \
abuild_setcap_binary \
abuild_setcap_binary_with_option
export ABUILD_SHAREDIR=$(atf_get_srcdir)/..
export ABUILD_CONF=/dev/null
export ABUILD_APK_INDEX_OPTS="--allow-untrusted"
export GIT_CONFIG_GLOBAL="$(atf_get_srcdir)/testdata/gitconfig"
export REPODEST="$PWD"/packages
testrepo=$(atf_get_srcdir)/testrepo
# copy keys
init_keys() {
cp -ra "$(atf_get_srcdir)"/testdata/.abuild "$PWD"
}
abuild_help_body() {
atf_check -s exit:0 \
-o match:"usage:" \
abuild -h
}
abuild_invalid_opt_body() {
atf_check -s exit:1 \
-e match:"usage:" \
abuild -@
}
abuild_version_body() {
atf_check -s exit:0 \
-o match:"abuild [0-9]+\.[0-9]+" \
abuild -V
}
abuild_simple_pkg_without_deps_body() {
init_keys
cp -r "$testrepo"/pkg1 .
cd pkg1
atf_check -s exit:0 \
-e not-match:"WARNING" \
-e not-match:"fatal" \
abuild
}
abuild_build_fail_body() {
init_keys
mkdir buildfail
cat >buildfail/APKBUILD <<-EOF
# Maintainer: Joe User <juser@example.com>
pkgname="buildfail"
pkgver="1.0"
pkgrel=0
pkgdesc="Dummy test package that fails to build"
url="https://gitlab.alpinelinux.org/alpine/aports"
arch="noarch"
license="MIT"
subpackages="\$pkgname-dev \$pkgname-doc"
source=""
prepare() {
mkdir -p "\$builddir"
}
build() {
false
}
package() {
true
}
EOF
cd buildfail
atf_check -s exit:1 \
-e match:"ERROR: buildfail: build failed" \
abuild
}
abuild_invalid_filename_body() {
init_keys
mkdir invalid-filename
cd invalid-filename
cat >APKBUILD <<-EOF
# Maintainer: Joe User <juser@example.com>
pkgname="invalid-filename"
pkgver="1.0"
pkgrel=0
pkgdesc="Dummy test package that fails to build"
url="https://gitlab.alpinelinux.org/alpine/aports"
arch="noarch"
license="MIT"
prepare() {
mkdir -p "\$builddir"
}
build() {
touch $'bad\nfile'
}
check() {
true
}
package() {
mkdir -p "\$pkgdir"
cp -r * "\$pkgdir"/
}
EOF
atf_check -s exit:1 \
-e match:"ERROR:.*: Found filenames with newline" \
abuild
}
abuild_usr_lib64_body() {
init_keys
mkdir lib64test
cd lib64test
cat >APKBUILD <<-EOF
# Maintainer: Joe User <juser@example.com>
pkgname="lib64test"
pkgver="1.0"
pkgrel=0
pkgdesc="Dummy test package"
url="https://gitlab.alpinelinux.org/alpine/aports"
arch="noarch"
license="MIT"
source=""
prepare() {
mkdir -p "\$builddir"
}
build() {
mkdir -p usr/lib64
}
check() {
true
}
package() {
mkdir -p "\$pkgdir"
cp -r * "\$pkgdir"/
}
EOF
atf_check -s exit:1 \
-e match:"ERROR:.*: Packages must not put anything under /usr/lib64" \
abuild
options=lib64 atf_check -s exit:0 \
-e match:"Build complete" \
abuild
}
abuild_dbg_subpackage_body() {
init_keys
cp -ra "$testrepo" .
cd testrepo/dbgpkg
atf_check -s exit:0 \
-o match:"hello world" \
-e match:"Build complete" \
abuild
cd ../..
arch=$(abuild -A)
tar -zxf "$REPODEST"/testrepo/$arch/dbgpkg-1.0-r0.apk \
|| atf_fail "failed to extract dbgpkg-1.0-r0.apk"
if [ -e usr/lib/debug ]; then
atf_fail "usr/lib/debug should not exist"
fi
debuginfo=$(readelf -wk usr/bin/hello | grep '^ Separate debug info file: [^/]*\.debug$')
debuginfo_file=${debuginfo#" Separate debug info file: "}
atf_check -s exit:0 \
-e match:"nm: usr/bin/hello: no symbols" \
nm usr/bin/hello
if ! [ usr/bin/hello -ef usr/bin/hello-hard ]; then
atf_fail 'hello is not a hardlink of hello-hard'
fi
rm -r usr
tar -xf "$REPODEST"/testrepo/$arch/dbgpkg-dbg-1.0-r0.apk
if [ -e usr/bin ]; then
atf_fail "usr/bin should not exist"
fi
find usr
atf_check -s exit:0 \
-o match:"T main" \
nm usr/lib/debug/usr/bin/$debuginfo_file
if [ -e usr/lib/debug/usr/bin/hello-sym.debug ]; then
atf_fail "usr/lib/debug/usr/bin/hello-sym.debug should not exist"
fi
if [ -e usr/lib/debug/usr/bin/hello.debug ] && [ -e usr/lib/debug/usr/bin/hello-hard.debug ]; then
atf_fail "only one of hello.debug and hello-hard.debug should exist"
fi
}
abuild_SETFATTR_in_dbg_body() {
init_keys
cp -ra "$testrepo"/dbgpkg .
cd dbgpkg
SETFATTR=true atf_check -s exit:0 \
-o match:"hello world" \
-e match:"Build complete" \
abuild
}
abuild_reproducible_body() {
init_keys
cp -ra "$testrepo" .
cd testrepo/pkg1
# set timestamp of APKBUILD to 1 min older than current time
touch -d @$(( $(date -u +%s) - 60)) APKBUILD
arch=$(abuild -A)
pkgs=$(abuild listpkg)
abuild || atf_fail "first build failed"
checksums=$(cd "$REPODEST"/testrepo/$arch && md5sum $pkgs)
echo "$checksums"
rm -r "$REPODEST"/testrepo
abuild || atf_fail "rebuild failed"
checksums2=$(cd "$REPODEST"/testrepo/$arch && md5sum $pkgs)
echo "$checksums2"
if [ "$checksums" != "$checksums2" ]; then
atf_fail "checksums does not match"
fi
}
abuild_checksum_generation_body() {
mkdir foo
cat > foo/APKBUILD <<-EOF
pkgname="foo"
pkgver="1.0"
source="test.txt"
EOF
echo "foo" > foo/test.txt
cd foo
abuild checksum || atf_fail "checksum generation failed"
( . ./APKBUILD && echo "$sha512sums" | sed '/^$/d' > sums )
cat sums
sha512sum -c sums || atf_fail "checksum mismatch"
}
abuild_checksum_duplicates_body() {
mkdir -p foo/dir1 foo/dir2
cat > foo/APKBUILD <<-EOF
pkgname="foo"
pkgver="1.0"
source="dir1/testfile dir2/testfile"
EOF
echo "first" > foo/dir1/testfile
echo "second" > foo/dir2/testfile
cd foo
atf_check -s exit:1 \
-e match:"ERROR:.*duplicate found" \
abuild checksum
}
abuild_subpkg_dep_leak_body() {
mkdir -p testrepo/subpkg-dep-leak
cd testrepo/subpkg-dep-leak
cat > APKBUILD <<-EOF
# Maintainer: Natanael Copa <ncopa@alpinelinux.org>
pkgname="subpkg-dep-leak"
pkgver=1.0
pkgrel=0
pkgdesc="Dummy test package with subpackages and dependencies"
url="https://gitlab.alpinelinux.org/alpine/aports"
arch="noarch"
depends="tar scanelf"
license="MIT"
subpackages="\$pkgname-subpkg"
options="!check"
package() {
mkdir -p "\$pkgdir"
}
subpkg() {
depends="sed"
mkdir -p "\$subpkgdir"
}
EOF
abuild clean unpack prepare build rootpkg
grep 'depend = tar' pkg/.control.subpkg-dep-leak/.PKGINFO \
|| atf_fail "subpkg-dep-leak should depend on tar"
grep 'depend = scanelf' pkg/.control.subpkg-dep-leak/.PKGINFO \
|| atf_fail "subpkg-dep-leak should depend on scanelf"
! grep 'depend = sed' pkg/.control.subpkg-dep-leak/.PKGINFO \
|| atf_fail "subpkg-dep-leak should not depends on sed"
grep 'depend = sed' pkg/.control.subpkg-dep-leak-subpkg/.PKGINFO \
|| atf_fail "subpkg-dep-leak-subpkg should depend on sed"
! grep 'depend = tar' pkg/.control.subpkg-dep-leak-subpkg/.PKGINFO \
|| atf_fail "subpkg-dep-leak-subpkg should not depend on tar"
}
abuild_py_providers_creation_body() {
init_keys
cp -ra "$testrepo" .
cd testrepo/py3\ foo\ and\ bar
abuild rootpkg || atf_fail "abuild failed"
atf_check -s exit:0 \
-o match:"provides = py3.9:foo=1.0.0-r0" \
cat pkg/.control.py3-foo-and-bar/.PKGINFO
}
abuild_py_dependency_scan_body() {
init_keys
cp -ra "$testrepo" .
cd testrepo/py3\ foo\ and\ bar
abuild rootpkg || atf_fail "abuild failed"
atf_check -s exit:0 \
-o match:"depend = python3~3.9" \
cat pkg/.control.py3-foo-and-bar/.PKGINFO
}
abuild_py_dependency_scan_conflict_body() {
init_keys
cp -ra "$testrepo" .
cd testrepo/py3-conflicting-python-versions
atf_check -s exit:1 \
-e match:"ERROR.*package contains python3 modules for conflicting python3 versions" \
abuild rootpkg
}
abuild_reject_init_with_improper_shebang_body() {
mkdir invalid-initd
cd invalid-initd
cat >APKBUILD<<-EOF
# Maintainer: Natanael Copa <ncopa@alpinelinux.org>
pkgname="invalid-initd"
pkgver="1.0"
pkgrel=0
pkgdesc="Dummy test package"
url="https://gitlab.alpinelinux.org/alpine/aports"
arch="noarch"
license="MIT"
subpackages=""
source="test.initd"
prepare() {
mkdir -p "\$builddir"
}
EOF
cat >test.initd<<-EOF
#!/bin/sh
command="test"
EOF
abuild checksum
atf_check -s exit:1 \
-o match:"OK" \
-e match:"ERROR.*is not an openrc" \
abuild unpack
}
abuild_valid_pkgnames_body() {
cp -ra "$testrepo"/test-pkgname .
cd test-pkgname
atf_check -s exit:0 \
-e match:"Checking sanity" \
abuild sanitycheck
TESTNAME=foo atf_check -s exit:0 \
-e match:"Checking sanity" \
abuild sanitycheck
TESTSUBNAME=foo atf_check -s exit:0 \
-e match:"Checking sanity" \
abuild sanitycheck
}
abuild_invalid_pkgnames_body() {
init_keys
cp -ra "$testrepo"/test-pkgname .
cd test-pkgname
TESTNAME="" atf_check -s exit:1 \
-e match:"Checking sanity" \
abuild sanitycheck
TESTNAME="-foo" atf_check -s exit:1 \
-e match:"Checking sanity" \
abuild sanitycheck
TESTNAME="foo with spaces" atf_check -s exit:1 \
-e match:"Checking sanity" \
abuild sanitycheck
}
abuild_invalid_subpkgnames_body() {
init_keys
cp -ra "$testrepo"/test-pkgname .
cd test-pkgname
TESTSUBNAME="" atf_check -s exit:1 \
-e match:"Checking sanity" \
abuild sanitycheck
TESTSUBNAME="-foo" atf_check -s exit:1 \
-e match:"Checking sanity" \
abuild sanitycheck
}
abuild_invalid_subpkg_version_body() {
init_keys
cp -ra "$testrepo"/test-pkgname .
cd test-pkgname
TESTDEPVER="1.0-0" atf_check -s exit:1 \
-e match:"Invalid version" \
abuild all
}
abuild_large_doc_subpackage_body() {
init_keys
cp -ra "$testrepo"/large-doc-subpkg .
cd large-doc-subpkg
atf_check -s exit:0 \
-e match:"-doc subpackage is unusually large" \
abuild all
}
abuild_bigdocs_body() {
init_keys
cp -ra "$testrepo"/large-doc-subpkg .
cd large-doc-subpkg
options=bigdocs atf_check -s exit:0 \
-e not-match:"-doc subpackage is unusually large" \
abuild all
}
abuild_warn_pkgver_patch_version_body() {
cp -ra "$testrepo"/test-pkgname .
cd test-pkgname
TESTPKGVER=1.0_p1 atf_check -s exit:0 \
-e not-match:'WARNING' \
abuild sanitycheck
TESTPKGVER=1.0p1 atf_check -s exit:0 \
-e match:'WARNING.*1.0_p1' \
abuild sanitycheck
}
abuild_multiline_license_body() {
cp -ra "$testrepo"/test-licenses .
cd test-licenses
abuild rootpkg
atf_check -o match:'^license = MIT AND GPL-3.0-only OR GPL-3.0-or-later AND BSD-Clause-4$' \
cat pkg/.control.test-licenses/.PKGINFO
}
abuild_git_ceiling_body() {
init_keys
git init
mkdir git-pkg
cd git-pkg
cat >APKBUILD<<-EOF
# Maintainer: Joe User <juser@example.com>
pkgname="git-pkg"
pkgver="1.0"
pkgrel=0
pkgdesc="Dummy test package"
url="https://gitlab.alpinelinux.org/alpine/aports"
arch="noarch"
license="MIT"
prepare() {
mkdir -p "\$builddir"
}
build() {
git status
}
package() {
mkdir -p "\$pkgdir"
}
EOF
atf_check -s exit:1 \
-e match:"not a git repository" \
-e match:"ERROR: git-pkg: build failed" \
abuild
}
create_fake_du() {
mkdir -p bin
cat > bin/du <<-EOF
#!/bin/sh
echo 0
EOF
chmod +x bin/du
PATH="$PWD/bin:$PATH"
}
abuild_package_size_zero_body() {
init_keys
mkdir -p test-size
create_fake_du
cd test-size
cat > APKBUILD <<-EOF
# Maintainer: Test User 123 <123@example.com>
# test package
pkgname="test-size"
pkgver="1.0"
pkgrel=0
pkgdesc='Dummy test package that has no files'
url='https://gitlab.alpinelinux.org/alpine/aports'
arch='noarch'
license='MIT'
install="\$pkgname.post-install"
package() {
mkdir -p "\$pkgdir"
}
EOF
cat > test-size.post-install <<-EOF
#!/bin/sh
echo 1
EOF
abuild rootpkg
# should be set to 1
atf_check -o match:'^size = 1$' \
cat pkg/.control.test-size/.PKGINFO
}
abuild_package_size_nonzero_body() {
init_keys
mkdir -p test-size
cd test-size
cat > APKBUILD <<-EOF
# Maintainer: Test User 123 <123@example.com>
# test package
pkgname="test-size"
pkgver="1.0"
pkgrel=0
pkgdesc='Dummy test package that has files'
url='https://gitlab.alpinelinux.org/alpine/aports'
arch='noarch'
license='MIT'
package() {
mkdir -p "\$pkgdir"
printf "%s" "very important data" > "\$pkgdir"/testfile
}
EOF
abuild rootpkg
# should not be set to 1
atf_check -o not-match:'^size = 1$' \
cat pkg/.control.test-size/.PKGINFO
}
abuild_amove_body() {
init_keys
mkdir -p test-amove
cd test-amove
cat > APKBUILD <<-EOF
# Maintainer: Test User 123 <123@example.com>
# test package
pkgname="test-amove"
pkgver="1.0"
pkgrel=0
pkgdesc='Dummy test package - amove'
url='https://gitlab.alpinelinux.org/alpine/aports'
arch='noarch'
license='MIT'
subpackages="\$pkgname-file:_file
\$pkgname-etc:_etc
\$pkgname-bin:_bin
\$pkgname-sbin:_sbin
\$pkgname-var:_var
\$pkgname-usr:_usr"
package() {
mkdir -p "\$pkgdir"/etc \
"\$pkgdir"/bin \
"\$pkgdir"/sbin \
"\$pkgdir"/var/lib/\$pkgname \
"\$pkgdir"/usr/share
touch "\$pkgdir"/etc/file \
"\$pkgdir"/etc/\$pkgname.conf \
"\$pkgdir"/bin/hello \
"\$pkgdir"/sbin/shello \
"\$pkgdir"/var/lib/\$pkgname/testfile \
"\$pkgdir"/usr/share/a \
"\$pkgdir"/usr/share/b
}
_file() {
amove etc/file
}
_etc() {
# leading and trailing /
amove /etc/
}
_bin() {
# trailing /
amove bin/
}
_sbin() {
# no /
amove sbin/shello
}
_var() {
# leading /
amove /var/lib
}
_usr() {
# glob *
amove usr/share/*
}
EOF
abuild rootpkg || atf_fail "abuild rootpkg failed"
for i in \
test-amove-file/etc/file \
test-amove-etc/etc/test-amove.conf \
test-amove-bin/bin/hello \
test-amove-sbin/sbin/shello \
test-amove-var/var/lib/test-amove/testfile \
test-amove-usr/usr/share/a \
test-amove-usr/usr/share/b \
; do \
test -f pkg/$i || atf_fail "$i failed"
done
}
abuild_doc_body() {
init_keys
mkdir -p foo
cd foo
cat > APKBUILD <<-EOF
# Maintainer: Test User 123 <123@example.com>
# test package
pkgname="foo"
pkgver="1.0"
pkgrel=0
pkgdesc='Dummy test package - doc'
url='https://gitlab.alpinelinux.org/alpine/aports'
arch='noarch'
license='MIT'
subpackages="\$pkgname-doc"
build() {
touch foo foo.1 readme
}
package() {
install -Dt "\$pkgdir"/usr/bin foo
install -Dt "\$pkgdir"/usr/share/man/man1 foo.1
install -Dt "\$pkgdir"/usr/share/doc/foo readme
}
EOF
abuild build rootpkg || atf_fail "abuild rootpkg failed"
find pkg
for i in \
foo/usr/bin/foo \
foo-doc/usr/share/man/man1/foo.1.gz \
foo-doc/usr/share/doc/foo/readme \
; do \
test -f pkg/$i || atf_fail "$i failed"
done
}
abuild_dev_body() {
init_keys
mkdir -p foo
cd foo
cat > APKBUILD <<-EOF
# Maintainer: Test User 123 <123@example.com>
# test package
pkgname="foo"
pkgver="1.0"
pkgrel=0
pkgdesc='Dummy test package - dev'
url='https://gitlab.alpinelinux.org/alpine/aports'
arch='noarch'
license='MIT'
subpackages="\$pkgname-dev"
build() {
touch foo foo.h libfoo.so.1
}
package() {
install -Dt "\$pkgdir"/usr/bin foo
install -Dt "\$pkgdir"/usr/include foo.h
install -Dt "\$pkgdir"/usr/lib libfoo.so.1
ln -s libfoo.so.1 "\$pkgdir"/usr/lib/libfoo.so
}
EOF
abuild build rootpkg || atf_fail "abuild rootpkg failed"
find pkg
for i in \
foo/usr/bin/foo \
foo-dev/usr/include/foo.h \
; do \
test -f pkg/$i || atf_fail "$i failed"
done
test -L pkg/foo-dev/usr/lib/libfoo.so || atf_fail "libfoo.so failed"
}
abuild_devhelp_warn_body() {
init_keys
mkdir -p foo
cd foo
cat > APKBUILD <<-EOF
# Maintainer: Test User 123 <123@example.com>
pkgname="foo"
pkgver="1.0"
pkgrel=0
pkgdesc='Dummy test package that has devhelp'
url='https://gitlab.alpinelinux.org/alpine/aports'
arch='noarch'
license='MIT'
package() {
mkdir -p "\$pkgdir"/usr/share/devhelp/book
}
EOF
atf_check -e match:"WARNING:" \
abuild rootpkg
}
abuild_devhelp_body() {
init_keys
mkdir -p foo
cd foo
cat > APKBUILD <<-EOF
# Maintainer: Test User 123 <123@example.com>
pkgname="foo"
pkgver="1.0"
pkgrel=0
pkgdesc='Dummy test package that has devhelp'
url='https://gitlab.alpinelinux.org/alpine/aports'
arch='noarch'
license='MIT'
subpackages="\$pkgname-devhelp"
package() {
mkdir -p "\$pkgdir"/usr/share/devhelp/book
}
EOF
atf_check -e not-match:"WARNING:" \
-o match:'->' \
abuild rootpkg
}
abuild_check_maintainer_body() {
mkdir -p foo && cd foo
for m in "Test User 123 <123example.com>" \
"foo" \
"user@example.com" \
" Leading Space <n@example.com>" \
"Trailing Space <n@example.com> " \
"Foo<u@example.com>" \
'"Quotes <u@example.com>"'; do
printf "# Maintainer: %s\n%s\n" "$m" "pkgname=foo" > APKBUILD
atf_check -s not-exit:0 \
-e match:"ERROR:" \
abuild check_maintainer
done
for m in "Test User <123@example.com>" "Foo O'Brian <n@example.com>" "Łukasz Something <s@example.com>"; do
printf "# Maintainer: %s\n%s\n" "$m" "pkgname=foo" > APKBUILD
atf_check abuild check_maintainer
done
}
abuild_cleanoldpkg_body() {
init_keys
mkdir -p main/foo
cd main/foo
for arch in aarch64 x86_64; do
for v in 0.9 1.0 1.1; do
cat > APKBUILD <<-EOF
# Maintainer: Test User 123 <123@example.com>
# test package
pkgname="foo"
pkgver="$v"
pkgrel=0
pkgdesc='Dummy test package - dev'
url='https://gitlab.alpinelinux.org/alpine/aports'
arch='noarch'
license='MIT'
options='!check'
package() {
mkdir -p "\$pkgdir"
}
EOF
CARCH=$arch atf_check -e not-empty abuild
done
done
CARCH=aarch64 atf_check -e match:"Cleaning" abuild cleanoldpkg
find "$REPODEST"
# should keep the current APKBUILD version
for arch in aarch64 x86_64; do
f="$REPODEST"/main/$arch/foo-1.1-r0.apk
if ! test -e "$f"; then
atf_fail "$f was deleted"
fi
done
# should remove old packages of aarch64
for i in 0.9 1.0; do
f="$REPODEST"/main/aarch64/foo-$i-r0.apk
if test -e "$f"; then
atf_fail "$f was not deleted"
fi
done
# should not delete other arches than aarch64
for i in 0.9 1.0; do
f="$REPODEST"/main/x86_64/foo-$i-r0.apk
if ! test -e "$f"; then
atf_fail "$f was deleted"
fi
done
}
abuild_path_with_spaces_body() {
init_keys
cp -ra "$testrepo" .
cd testrepo/pkg\ path\ with\ spaces
atf_check -s exit:0 \
-o match:"hello world" \
-e match:"Build complete" \
abuild
}
abuild_pyc_warn_body() {
init_keys
mkdir -p pycachetest
cd pycachetest
cat >APKBUILD <<-EOF
# Maintainer: Joe User <juser@example.com>
pkgname="pycachetest"
pkgver="1.0"
pkgrel=0
pkgdesc="Dummy test package"
url="https://gitlab.alpinelinux.org/alpine/aports"
arch="noarch"
license="MIT"
source=""
package() {
mkdir -p "\$pkgdir"/usr/lib/python3.11/site-packages/test/__pycache__/
touch "\$pkgdir"/usr/lib/python3.11/site-packages/test/__pycache__/main.cpython-311.pyc
}
EOF
atf_check -e match:"WARNING.*pyc*" abuild rootpkg
}
abuild_pyc_body() {
init_keys
mkdir -p foo
cd foo
cat >APKBUILD <<-EOF
# Maintainer: Joe User <juser@example.com>
pkgname="foo"
pkgver="1.0"
pkgrel=0
pkgdesc="Dummy test package"
url="https://gitlab.alpinelinux.org/alpine/aports"
arch="noarch"
license="MIT"
source=""
subpackages="\$pkgname-pyc"
package() {
mkdir -p "\$pkgdir"/usr/lib/python3.11/site-packages/test/__pycache__/
touch "\$pkgdir"/usr/lib/python3.11/site-packages/test/__pycache__/main.cpython-311.pyc
}
EOF
atf_check -o match:"->" -e not-match:"WARNING.*pyc*" abuild rootpkg
atf_check -o match:"__pycache__" find pkg/foo-pyc -name '__pycache__'
# verify install_if is correct
atf_check -o match:"foo=1.0-r0" -o match:"pyc" \
grep install_if pkg/.control.foo-pyc/.PKGINFO
}
abuild_setcap_binary_body() {
init_keys
cp -ra "$testrepo"/setcap .
cd setcap
atf_check -s exit:1 \
-e match:"Found binary with extra capabilities" \
-e match:"Found setcap binary executable by others" \
abuild all
}
abuild_setcap_binary_with_option_body() {
init_keys
cp -ra "$testrepo"/setcap .
cd setcap
options=setcap atf_check -s exit:0 \
-e not-match:"Found binary with extra capabilities" \
-e match:"Found setcap binary executable by others" \
abuild all
}