#!/usr/bin/env bats

load helpers

function setup() {
	requires root no_systemd

	setup_debian
	# CR = CreateRuntime, CC = CreateContainer
	HOOKLIBCR=librunc-hooks-create-runtime.so
	HOOKLIBCC=librunc-hooks-create-container.so
	LIBPATH="$(pwd)/rootfs/lib/"
}

function teardown() {
	if [ -v LIBPATH ]; then
		umount "$LIBPATH/$HOOKLIBCR".1.0.0 &>/dev/null || true
		umount "$LIBPATH/$HOOKLIBCC".1.0.0 &>/dev/null || true
		rm -f "$HOOKLIBCR".1.0.0 "$HOOKLIBCC".1.0.0
		unset LIBPATH HOOKLIBCR HOOKLIBCC
	fi
	teardown_bundle
}

@test "runc run (hooks library tests)" {
	# setup some dummy libs
	gcc -shared -Wl,-soname,"$HOOKLIBCR.1" -o "$HOOKLIBCR.1.0.0"
	gcc -shared -Wl,-soname,"$HOOKLIBCC.1" -o "$HOOKLIBCC.1.0.0"

	bundle=$(pwd)

	# To mount $HOOKLIBCR we need to do that in the container namespace
	create_runtime_hook="pid=\$(cat - | jq -r '.pid'); touch "$LIBPATH/$HOOKLIBCR.1.0.0" && \
		nsenter -m \$ns -t \$pid mount --bind "$bundle/$HOOKLIBCR.1.0.0" "$LIBPATH/$HOOKLIBCR.1.0.0""

	create_container_hook="touch ./lib/$HOOKLIBCC.1.0.0 && mount --bind $bundle/$HOOKLIBCC.1.0.0 ./lib/$HOOKLIBCC.1.0.0"

	# shellcheck disable=SC2016
	update_config --arg create_runtime_hook "$create_runtime_hook" --arg create_container_hook "$create_container_hook" '
		.hooks |= . + {"createRuntime": [{"path": "/bin/sh", "args": ["/bin/sh", "-c", $create_runtime_hook]}]} |
		.hooks |= . + {"createContainer": [{"path": "/bin/sh", "args": ["/bin/sh", "-c", $create_container_hook]}]} |
		.hooks |= . + {"startContainer": [{"path": "/bin/sh", "args": ["/bin/sh", "-c", "ldconfig"]}]} |
		.root.readonly |= false |
		.process.args = ["/bin/sh", "-c", "ldconfig -p | grep librunc"]'

	runc run test_debian
	[ "$status" -eq 0 ]

	echo "Checking create-runtime library"
	echo "$output" | grep "$HOOKLIBCR"

	echo "Checking create-container library"
	echo "$output" | grep "$HOOKLIBCC"
}
