#!/usr/bin/env bash

set -exo pipefail

if [[ "$(id -u)" -ne 0 ]];then
    echo "Please run as superuser"
    exit 1
fi

if [[ -z "$1" ]]; then
    echo -e "Usage: podman-tests.sh TEST_TYPE STREAM\nTEST_TYPE can be 'e2e' or 'system'\nSTREAM can be 'upstream' or 'downstream'"
    exit 1
fi

TEST_TYPE=$1
STREAM=$2

# `rhel` macro exists on RHEL, CentOS Stream, and Fedora ELN
# `centos` macro exists only on CentOS Stream
CENTOS_VERSION=$(rpm --eval '%{?centos}')
RHEL_VERSION=$(rpm --eval '%{?rhel}')

# For upstream tests, we need to test with podman and other packages from the
# podman-next copr. For downstream tests (bodhi, errata), we don't need any
# additional setup
if [[ "$STREAM" == "upstream" ]]; then
    # Use CentOS Stream 10 copr target for RHEL-10 until EPEL 10 becomes
    # available
    if [[ -n $CENTOS_VERSION || $RHEL_VERSION -ge 10 ]]; then
        dnf -y copr enable rhcontainerbot/podman-next centos-stream-$CENTOS_VERSION
    else
        dnf -y copr enable rhcontainerbot/podman-next
    fi
    echo "priority=5" >> /etc/yum.repos.d/_copr:copr.fedorainfracloud.org:rhcontainerbot:podman-next.repo
fi

# Remove testing-farm repos if they exist as these interfere with the packages
# we want to install, especially when podman-next copr is involved
rm -f /etc/yum.repos.d/tag-repository.repo

# Fetch and extract latest podman source from the highest priority dnf repo
# NOTE: On upstream pull-requests, the srpm will be fetched from the
# podman-next copr while on bodhi updates, it will be fetched from Fedora's
# official repos.
PODMAN_DIR=$(mktemp -d)
pushd $PODMAN_DIR

# Download podman and podman-tests rpms, along with podman srpm
dnf download podman podman-tests
# Download srpm, srpm opts differ between dnf and dnf5
rpm -q dnf5 && dnf download --srpm podman || dnf download --source podman

# Ensure podman-tests RPM and podman SRPM version-release match
# NOTE: podman RPM and podman-tests RPM matching is ensured by podman.spec so
# matching podman-tests and podman srpm is sufficient here.
PODMAN_TESTS_VERSION=$(ls podman-tests* | sed -e "s/.$(uname -m).rpm//" -e "s/podman-tests-//")
PODMAN_SRPM_VERSION=$(ls podman*.src.rpm | sed -e "s/.src.rpm//" -e "s/podman-//")
if [[ "$PODMAN_TESTS_VERSION" != "$PODMAN_SRPM_VERSION" ]]; then
    echo "podman-tests and podman srpm version-release don't match"
    exit 1
fi

# Install downloaded podman and podman-tests rpms
dnf -y install ./podman*.$(uname -m).rpm

# Extract and untar podman source from srpm
rpm2cpio $(ls podman*.src.rpm) | cpio -di
tar zxf *.tar.gz

popd

# Enable EPEL on RHEL/CentOS Stream envs to fetch bats
if [[ -n $(rpm --eval '%{?rhel}') ]]; then
    # Until EPEL 10 is available use epel-9 for all RHEL and CentOS Stream
    dnf -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
    sed -i 's/$releasever/9/g' /etc/yum.repos.d/epel.repo
fi

# Install dependencies for running tests
dnf -y install bats golang

# Print versions of distro and installed packages
cat /etc/redhat-release
rpm -q bats container-selinux golang podman podman-tests selinux-policy

if [[ "$TEST_TYPE" == "e2e" ]]; then
    # /tmp is often unsufficient
    export TMPDIR=/var/tmp

    # dnf5 contains breaking changes
    # Either of `dnf` OR `dnf5` will be installed, never both.
    # To fetch srpm, dnf uses `--source`, dnf5 uses `--srpm`.
    #rpm -q dnf5 && SRPM_OPTS="--srpm" || SRPM_OPTS="--source"

    # Run podman e2e tests
    pushd $PODMAN_DIR/podman-*/test/e2e
    PODMAN_BINARY=/usr/bin/podman go test -v config.go config_amd64.go common_test.go libpod_suite_test.go run_selinux_test.go
    popd
fi

if [[ "$TEST_TYPE" == "system" ]]; then
    # Run podman system tests
    bats /usr/share/podman/test/system/410-selinux.bats
fi
