#!/bin/bash

# This is the expected entry point for Cockpit CI; will be called without
# arguments but with an appropriate $TEST_OS, and optionally $TEST_SCENARIO

# Currently supported scenarios:
# devel           - runs tests with coverage enabled and generates a html file
#                   with coverage information and `NODE_ENV=development`
#                   to get additional React checks and useful stack traces.
# pybridge        - runs tests with the Python bridge
# firefox         - runs tests using the Firefox browser instead of Chrome
# networking      - networking related tests
# storage         - storage related tests
# expensive       - expensive tests (usually tests which reboot/generate a new initramfs)
# other           - non-networking/storage/expensive tests
# daily           - runs tests with dnf-nightly and udisks-daily repositories enabled
# updates-testing - runs tests with updates-testing installed

set -eu

test/common/make-bots
test/common/pixel-tests pull

PREPARE_OPTS=""
RUN_OPTS=""
ALL_TESTS="$(test/common/run-tests --test-dir test/verify -l)"

RE_NETWORKING='Networking|Bonding|TestBridge|WireGuard|Firewall|Team|IPA|AD'
RE_STORAGE='Storage'
RE_EXPENSIVE='HostSwitching|MultiMachine|Updates|Superuser|Kdump|Pages'

# every known case needs to set RUN_OPTS to something non-empty, so that we can check if we hit any branch
case "${TEST_SCENARIO:=}" in
    *devel*) RUN_OPTS="$RUN_OPTS --coverage"; export NODE_ENV=development ;;&
    *pybridge*) RUN_OPTS="$RUN_OPTS "; PREPARE_OPTS="$PREPARE_OPTS --python" ;;&
    *firefox*) RUN_OPTS="$RUN_OPTS "; export TEST_BROWSER=firefox ;;&

    *daily*)
        bots/image-customize --fresh -v --run-command 'dnf -y copr enable rpmsoftwaremanagement/dnf-nightly && dnf -y copr enable @storage/udisks-daily && dnf -y --setopt=install_weak_deps=False update >&2' "$TEST_OS"
        RUN_OPTS="$RUN_OPTS "
        PREPARE_OPTS="$PREPARE_OPTS --overlay"
        ;;&
   *updates-testing*)
        bots/image-customize --fresh -v --run-command 'dnf -y update --enablerepo=updates-testing --setopt=install_weak_deps=False >&2' "$TEST_OS"
        RUN_OPTS="$RUN_OPTS "
        PREPARE_OPTS="$PREPARE_OPTS --overlay"
        ;;&

    # split tests into roughly equal scenarios for more parallelism
    *networking*)
        RUN_OPTS="$RUN_OPTS $(echo "$ALL_TESTS" | grep -E "$RE_NETWORKING")"
        PREPARE_OPTS="$PREPARE_OPTS --quick"
        ;;&
    *storage*)
        RUN_OPTS="$RUN_OPTS $(echo "$ALL_TESTS" | grep -E "$RE_STORAGE")"
        PREPARE_OPTS="$PREPARE_OPTS --quick"
        ;;&
    *expensive*)
        RUN_OPTS="$RUN_OPTS $(echo "$ALL_TESTS" | grep -E "$RE_EXPENSIVE")"
        PREPARE_OPTS="$PREPARE_OPTS --quick"
        ;;&
    *other*)
        RUN_OPTS="$RUN_OPTS $(echo "$ALL_TESTS" | grep -Ev "$RE_NETWORKING|$RE_STORAGE|$RE_EXPENSIVE")"
        ;;&

esac

if [ -n "$TEST_SCENARIO" ] && [ -z "$RUN_OPTS" ]; then
    echo "Unknown test scenario: $TEST_SCENARIO"
    exit 1
fi

test/image-prepare --verbose ${PREPARE_OPTS} "$TEST_OS"
test/common/run-tests --jobs ${TEST_JOBS:-1} --test-dir test/verify --track-naughties ${RUN_OPTS}
