Splux Linux

source-based Linux using SPS

SPS · log · files · refs · tags · releases · people · languages · GitHub · file

tests/test_pkstat_count.sh


Shell

2778 bytes at 2909919 · GitHub

#!/bin/sh
# pkstat --count: integer of installed records with a regular meta file.

set -eu

case $0 in */*) test_dir=${0%/*} ;; *) test_dir=. ;; esac
project_dir=$(CDPATH= cd "$test_dir/.." 2>/dev/null && pwd) || exit 1

fail()
{
	printf 'test_pkstat_count: %s\n' "$*" >&2
	exit 1
}

run_sps()
{
	SPS_ROOT=$root \
	SPS_DB=$db \
	SPS_CACHE=$cache \
	SPS_BUILD=$build \
	SPS_CONFIG=/dev/null \
	SPS_REPOS_CONFIG=/dev/null \
	SPS_LIBDIR=$project_dir/lib \
	"$@"
}

install_named()
{
	package_name=$1
	stage=$tmp/stage-$package_name
	rm -rf "$stage"
	mkdir -p "$stage/.SPS" "$stage/usr/share/$package_name"
	printf '%s\n' "$package_name" >"$stage/usr/share/$package_name/id"
	{
		printf 'format\t1\n'
		printf 'name\t%s\n' "$package_name"
		printf 'version\t1.0\n'
		printf 'release\t1\n'
		printf 'arch\tany\n'
		printf 'description\tcount fixture %s\n' "$package_name"
	} >"$stage/.SPS/meta"
	: >"$stage/.SPS/files.unsorted"
	(CDPATH= cd "$stage" && find . ! -name . ! -path './.SPS' ! -path './.SPS/*' -print) |
		sed 's#^\./##' | while IFS= read -r package_entry; do
			if [ -d "$stage/$package_entry" ] && [ ! -L "$stage/$package_entry" ]; then
				printf '%s/\n' "$package_entry"
			else
				printf '%s\n' "$package_entry"
			fi
		done >"$stage/.SPS/files.unsorted"
	LC_ALL=C sort "$stage/.SPS/files.unsorted" >"$stage/.SPS/files"
	rm -f "$stage/.SPS/files.unsorted"
	: >"$stage/.SPS/hashes"
	printf 'sha256\t%s\t%s\n' \
		"$(sha256sum "$stage/usr/share/$package_name/id" | awk '{ print $1 }')" \
		"usr/share/$package_name/id" >>"$stage/.SPS/hashes"
	tar -C "$stage" -cf "$tmp/$package_name.pkg.tar" .
	run_sps "$project_dir/bin/pkin" --dependency "$tmp/$package_name.pkg.tar" \
		>/dev/null
}

tmp=$(mktemp -d "${TMPDIR:-/tmp}/sps-test-pkstat-count.XXXXXX") || fail mktemp
trap 'rm -rf "$tmp"' 0 HUP INT TERM
root=$tmp/root
db=$tmp/db
cache=$tmp/cache
build=$tmp/build
mkdir -p "$root" "$cache" "$build"

[ "$(run_sps "$project_dir/bin/pkstat" --count)" = 0 ] ||
	fail 'empty database must print 0'

install_named one
[ "$(run_sps "$project_dir/bin/pkstat" --count)" = 1 ] ||
	fail 'one installed package must print 1'

install_named two
install_named three
[ "$(run_sps "$project_dir/bin/pkstat" --count)" = 3 ] ||
	fail 'three installed packages must print 3'

# Junk next to real records is not a package.
printf 'not a record\n' >"$db/installed/readme.txt"
mkdir -p "$db/installed/empty-dir"
ln -s one "$db/installed/alias"
ln -s /tmp "$db/installed/outside"
[ "$(run_sps "$project_dir/bin/pkstat" --count)" = 3 ] ||
	fail 'files, empty dirs, and symlinks must not count'

run_sps "$project_dir/bin/pkstat" --count >/dev/null
run_sps "$project_dir/bin/pkstat" --count | grep -qx '3' ||
	fail 'count must be a single integer line'

printf '%s\n' 'test_pkstat_count: ok'