#!/bin/bash

set -eu

IMAGE_ID=$1
DIST=$2
PLATFORM=${3:-amd64}
function desc() {
    echo "================================"
    echo -n "TEST: "
    echo "$@"
    echo "================================"
}

function test() {
    test_extra_args '' "$@"
}

bind_mounts=( )
docker_platform_args=( )
if [[ "$PLATFORM" == "arm64" ]]; then
    if [[ "$(uname -m)" == *arm* || "$(uname -m)" == *aarch64* ]]; then
        echo "Running in arm host. QEMU is not needed"
    else
        echo "Setting up qemu static"
        for qemu_static_file in /usr/bin/qemu-*-static; do
            bind_mounts+=( -v="$qemu_static_file:$qemu_static_file" )
        done
        docker_platform_args+=( --platform "linux/arm64" )
    fi
fi

function test_extra_args() {
    local extra_args=$1
    shift
    docker run "${docker_platform_args[@]}" --rm "${bind_mounts[@]}" $extra_args -e DEBIAN_FRONTEND=noninteractive "$IMAGE_ID" "$@"
    echo ""
    echo TEST: OK
    echo ""
}

desc "Checking that apt is installed"
test dpkg -l apt

desc "Arch matches"
if [[ "$PLATFORM" == "amd64" ]]; then
    test bash -c 'echo "$(uname -m)" && [[ "$(uname -m)" == *x86_64* ]]'
elif [[ "$PLATFORM" == "arm64" ]]; then
    test bash -c 'echo "$(uname -m)" && [[ "$(uname -m)" == *arm* || "$(uname -m)" == *aarch64* ]]'
else
    echo Unknown platform $PLATFORM >&2
    exit 1
fi
desc "Checking that a package can be installed with apt"
test bash -c 'apt-get update && apt-get -y install less && less --help >/dev/null'

desc "Checking that a package can be installed with install_packages and that it removes cache dirs"
test bash -c 'install_packages less  && less --help >/dev/null && [ ! -e /var/cache/apt/archives ] && [ ! -e /var/lib/apt/lists ]'

desc "Checking that the debootstrap dir wasn't left in the image"
test bash -c '[ ! -e /debootstrap ]'

desc "Check that all base packages are correctly installed, including dependencies"
# Ask apt to install all packages that are already installed, has the effect of checking the
# dependencies are correctly available
test bash -c 'apt-get update && (dpkg-query -W -f \${Package} | while read pkg; do apt-get install $pkg; done)'

desc "Check that install_packages doesn't loop forever on failures"
# This won't install and will fail. The key is that the retry loop will stop after a few iterations.
# We check that we didn't install the package afterwards, just in case a package gets added with that name.
# We wrap the whole thing in a timeout so that it doesn't loop forever. It's not ideal to have a timeout as there may be spurious failures if the network is slow.
test bash -c 'timeout 360 bash -c "(install_packages thispackagebetternotexist || true) && ! dpkg -l thispackagebetternotexist"'

# See https://github.com/bitnami/minideb/issues/17
desc "Checking that the terminfo is valid when running with -t (#17)"
echo "" | test_extra_args '-t' bash -c 'install_packages procps && top -d1 -n1 -b'

MYSQL_PACKAGE=default-mysql-server
if [[ "$DIST" == "jessie"* ]]; then
    MYSQL_PACKAGE=mysql-server
fi

# See https://github.com/bitnami/minideb/issues/16
desc "Check that we can install mysql-server (#16)"
test install_packages $MYSQL_PACKAGE

function shadow_check() {
    local path=$1
    test bash -c "(! cut -d: -f3 < $path | grep -v 17885 >/dev/null) || (cat $path && false)"
}

desc "Check that all users have a fixed day as the last password change date in /etc/shadow"
shadow_check /etc/shadow

desc "Check that all users have a fixed day as the last password change date in /etc/shadow-"
shadow_check /etc/shadow-
