#!/bin/sh
. "$(dirname "$0")/host-vars.sh"
TEST_REL_PATH="${TEST_SCRIPT#$E2E_DIR/}"
INTERACTIVE="${INTERACTIVE:-}"
HOST_TZ="${TZ:-}"
if [ -z "$HOST_TZ" ] && [ -f /etc/timezone ]; then
HOST_TZ=$(cat /etc/timezone)
elif [ -z "$HOST_TZ" ] && [ -L /etc/localtime ]; then
HOST_TZ=$(readlink /etc/localtime | sed 's|.*/zoneinfo/||')
fi
if [ -z "$HOST_TZ" ]; then
HOST_TZ="UTC"
fi
export TZ="$HOST_TZ"
zoneinfo=$(readlink /etc/localtime)
if [ -z "$zoneinfo" ]; then
zoneinfo="/etc/localtime"
fi
DL_CACHE="${E2E_DOWNLOAD_CACHE:-$HOME/.cache/epkg/downloads}"
mkdir -p "$DL_CACHE"
E2E_LOG_DIR="${E2E_LOG_DIR:-$HOME/.cache/epkg/e2e-logs}"
mkdir -p "$E2E_LOG_DIR"
BUSYBOX_LINKS_DIR="$HOME/.epkg/busybox-bin"
mkdir -p "$BUSYBOX_LINKS_DIR"
E2E_BARE_ENV_EBIN="$HOME/.epkg/envs/$E2E_BARE_ENV/ebin"
if [ -x "$E2E_BARE_ENV_EBIN/busybox.static" ]; then
for util in dirname basename date awk sed grep cat head tail rm mkdir cp uname hostname cut ls chmod ln id ping sort shuf chown wc; do
ln -sf "$E2E_BARE_ENV_EBIN/busybox.static" "$BUSYBOX_LINKS_DIR/$util" 2>/dev/null || true
done
fi
ensure_e2e_bare_env() {
E2E_BARE_ENV_BASE="$HOME/.epkg/envs/$E2E_BARE_ENV"
if [ -f "$E2E_BARE_ENV_BASE/etc/epkg/env.yaml" ]; then
return 0
fi
echo "Creating in-vm harness environment '$E2E_BARE_ENV' (channel alpine)..." >&2
"$EPKG_BINARY" env create "$E2E_BARE_ENV" -c alpine || exit 1
"$EPKG_BINARY" -e "$E2E_BARE_ENV" --assume-yes install bash busybox-static shadow musl-utils || exit 1
}
ensure_e2e_bare_env
MOUNTS="-m tmpfs:/root"
EPKG_USER_HOST=$(whoami)
MOUNTS="$MOUNTS -m $HOME/.epkg:/home/$EPKG_USER_HOST/.epkg"
MOUNTS="$MOUNTS -m $HOME/.epkg/store:/opt/epkg/store:ro"
EPKG_CACHE_DIR="${HOME}/.cache/epkg"
mkdir -p "$EPKG_CACHE_DIR/downloads" "$EPKG_CACHE_DIR/e2e-logs"
MOUNTS="$MOUNTS -m $EPKG_CACHE_DIR:/home/$EPKG_USER_HOST/.cache/epkg"
E2E_LOG_DIR=/home/$EPKG_USER_HOST/.cache/epkg/e2e-logs
RESOLV_TMP="${TMPDIR:-/tmp}/epkg-e2e-resolv.$$"
if [ -n "${E2E_RESOLV_CONF:-}" ] && [ -r "$E2E_RESOLV_CONF" ]; then
cp -a "$E2E_RESOLV_CONF" "$RESOLV_TMP"
else
{
echo "nameserver 8.8.8.8"
echo "nameserver 1.1.1.1"
echo "nameserver 10.0.2.3"
if [ -r /run/systemd/resolve/resolv.conf ]; then
awk '/^nameserver[[:space:]]+/ { print $2 }' /run/systemd/resolve/resolv.conf | while read -r ns; do
case "$ns" in
127.*|0.0.0.0|::1) ;;
*) echo "nameserver $ns" ;;
esac
done
fi
} | awk '/^nameserver / { if (!seen[$2]++) print }' >"$RESOLV_TMP"
fi
MOUNTS="$MOUNTS -m $RESOLV_TMP:/etc/resolv.conf"
MOUNTS="$MOUNTS -m $PROJECT_ROOT:$PROJECT_ROOT:ro"
MOUNTS="$MOUNTS -m $zoneinfo:$zoneinfo:ro"
if [ "$TEST_REL_PATH" = "cases/bare-rootfs.sh" ]; then
E2E_BARE_CHROOT="${E2E_BARE_CHROOT:-/tmp/epkg-bare-chroot}"
fi
trap 'rm -f "$RESOLV_TMP"' EXIT INT HUP
VM_EXTRA=""
if [ -n "$E2E_VM_CPUS" ]; then
VM_EXTRA="$VM_EXTRA --cpus=$E2E_VM_CPUS"
fi
set -- \
"$EPKG_BINARY" -e "$E2E_BARE_ENV" run --isolate=vm \
-u root \
--vmm="$E2E_VMM" \
--memory="$E2E_VM_MEMORY" \
$VM_EXTRA \
$MOUNTS \
-- env \
PATH=/home/$EPKG_USER_HOST/.epkg/busybox-bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \
HOME=/root \
USER=root \
EPKG_USER="$EPKG_USER_HOST" \
EPKG_HOME="/home/$EPKG_USER_HOST" \
EPKG_HOST_OS="$(uname -s)" \
E2E_DIR="$E2E_DIR" \
EPKG_BINARY="$EPKG_GUEST_BINARY" \
TEST_REL_PATH="$TEST_REL_PATH" \
E2E_BACKEND=vm \
IN_E2E=1 \
E2E_BARE_ENV="$E2E_BARE_ENV" \
LIGHT_TEST="${LIGHT_TEST:-}" \
INTERACTIVE="${INTERACTIVE:-}" \
CONTAINER_NAME="${CONTAINER_NAME:-epkg-e2e-vm}" \
RUST_LOG="${RUST_LOG:-}" \
RUST_BACKTRACE="${RUST_BACKTRACE:-}" \
TZ="$TZ" \
E2E_OS="${E2E_OS:-}" \
E2E_VMM="${E2E_VMM:-}" \
E2E_COMBO="${E2E_COMBO:-}" \
E2E_BARE_CHROOT="${E2E_BARE_CHROOT:-}" \
E2E_LOG_DIR="$E2E_LOG_DIR" \
/bin/bash "$E2E_DIR/entry.sh" $ADDITIONAL_ARGS
echo "Running in-vm test: $*" >&2
exec "$@"