#!/bin/bash

# This script runs flaky tests on various packages, optionally filtered by dbtype or rpc.
# Usage:
#     - To run all flaky tests, don't add any arguments.
#     - To run flaky tests for gob only, add `-rpc=*gob` as an argument to this script.
#     - To run flaky tests for a single dbtype, add `-dbtype=*mysql` as an argument.
# Example:
# ./flaky_tests.sh -dbtype=*mysql -rpc=*gob

packages=("agents" "apier/v1" "apier/v2" "cmd/cgr-loader" "dispatchers" "engine" "ers" "general_tests" "loaders" "registrarc" "sessions")
dbtypes=("*internal" "*mysql" "*mongo" "*postgres")

# Tests that are independent of the dbtype flag and run only once
single_run_packages=("analyzers" "config" "cores" "ees" "utils" "migrator" "services")

results=()

execute_test() {
    local pkg=$1
    shift # Remove the first argument, which is the package name, to pass the rest to go test
    echo "Executing: go test github.com/cgrates/cgrates/$pkg -tags=flaky $@"
    go test "github.com/cgrates/cgrates/$pkg" -tags="flaky" "$@"
    results+=($?)
}

go clean --cache

# Execute flaky tests based on passed arguments
if [ "$#" -ne 0 ]; then
    for pkg in "${packages[@]}"; do
        execute_test "$pkg" "$@"
    done
else
    # Execute flaky tests for all db types if no arguments have been passed
    for db in "${dbtypes[@]}"; do
        for pkg in "${packages[@]}"; do
            execute_test "$pkg" "-dbtype=$db"
        done
    done
fi

# Execute the flaky tests that run only once
for test in "${single_run_packages[@]}"; do
    execute_test "$test"
done

# Check the results and exit with an appropriate code
pass=0
for val in "${results[@]}"; do
    if [ "$val" -ne 0 ]; then
        pass=1
        break
    fi
done
exit $pass