#!/bin/bash

echo -e "mysql_test start\n"
# `set -eu` prevent referencing an var before setting it, so we set the env vars here
TIDB_TEST_STORE_NAME=$TIDB_TEST_STORE_NAME
TIKV_PATH=$TIKV_PATH

CACHE_ENABLED=$CACHE_ENABLED

normal_config="config.toml"
prepare_cache_config="config-ps-cache.toml"

mysql_test_log="./mysql-test.out"
TEST_BIN_PATH=./mysql_test

if [[ $CACHE_ENABLED -eq 1 ]];then
    echo -e "CACHE_ENABLED"
    TIDB_CONFIG=$prepare_cache_config
fi

if [[ -z "${TIDB_CONFIG}" || ! -e ${TIDB_CONFIG} ]]; then
    TIDB_CONFIG="./config.toml"
fi

set -e

rm -rf "$mysql_test_log"

./build.sh

if [[ -z $TIDB_SERVER_PATH || ! -e $TIDB_SERVER_PATH ]]; then
    echo -e "no tidb-server was found, build from source code"
    # This is likely to be failed, depending on whether tidb parser is well set up
    GO111MODULE=on go build -race -o mysql_test_tidb-server github.com/pingcap/tidb/tidb-server
    TIDB_SERVER_PATH=./mysql_test_tidb-server
fi

echo "start tidb-server, log file: $mysql_test_log"
if [[ $TIDB_TEST_STORE_NAME = tikv ]]; then
    "$TIDB_SERVER_PATH" -config "$TIDB_CONFIG" -store tikv -path "$TIKV_PATH" > "$mysql_test_log" 2>&1 &
    SERVER_PID=$!
else
    "$TIDB_SERVER_PATH" -config "$TIDB_CONFIG" -store unistore -path "" -lease 0s > "$mysql_test_log" 2>&1 &
    SERVER_PID=$!
fi
echo "tidb-server(PID: $SERVER_PID) started"
trap 'echo "tidb-server(PID: $SERVER_PID) stopped"; kill -9 "$SERVER_PID" || true' EXIT

sleep 5

blacklist=$1
part=$2
cases="${@:1}"

if [[ $blacklist -eq 1 ]]; then
    whitelist=`ls -l t | awk '{print $9}' | awk -F '.' '{print $1}' | grep -vE "^null$|^opt_hints$|^union$|^grant_explain_non_select$|^subquery_table_to_derived$|^sql_mode$|^group_by$|^information_schema_cs$|^type_temporal_fractional$|^partition_pruning$|^subquery_sj_all$|^subquery_mat_none$|^group_min_max$|^join_nested$|^order_by_all$|^host_cache_size_functionality$|^distinct$|^opt_hints_index$|^desc_index_innodb$|^rollback$|^subquery_exists$|^upd_del_single_to_multi$" | awk 'BEGIN{RS=EOF} {gsub(/\n/," "); print}'`
    echo "run test cases with whitelist: ${whitelist}"
    echo "-------------------------------------------"
    arr=($whitelist)
    len=${#arr[*]}
    if [[ $part -eq 1 ]]; then
        part1=`echo $whitelist | awk '{ for(i=1; i<=90; i++) {print $i} }'`
        echo $part1
       "$TEST_BIN_PATH" --xunitfile result.xml --port=4001 --log-level=error $part1
    elif [[ $part -eq 2 ]]; then
        part2=`echo $whitelist | awk '{ for(i=91; i<=180; i++) {print $i} }'`
        echo $part2
       "$TEST_BIN_PATH" --xunitfile result.xml --port=4001 --log-level=error $part2
    elif [[ $part -eq 3 ]]; then
        part3=`echo $whitelist | awk '{ for(i=181; i<=270; i++) {print $i} }'`
        echo $part3
       "$TEST_BIN_PATH" --xunitfile result.xml --port=4001 --log-level=error $part3
    elif [[ $part -eq 4 ]]; then
        part4=`echo $whitelist | awk '{ for(i=271; i<="'$len'"; i++) {print $i} }'`
        echo $part4
       "$TEST_BIN_PATH" --xunitfile result.xml --port=4001 --log-level=error $part4
    else
        echo $whitelist
       "$TEST_BIN_PATH" --xunitfile result.xml --port=4001 --log-level=error $whitelist
    fi
else
    echo "CASES: $cases"
    if [[ -z "$cases" ]]; then
        echo "run all mysql test cases"
       "$TEST_BIN_PATH" --xunitfile result.xml --port=4001 --log-level=error --all=true
    else
        echo "run test cases: ${cases}."
       "$TEST_BIN_PATH" --xunitfile result.xml --port=4001 --log-level=error $cases
    fi
fi

race=$(grep 'DATA RACE' "$mysql_test_log" || true)
if [[ -n $race ]]; then
    echo "tidb-server DATA RACE!"
    cat "$mysql_test_log"
    exit 1
fi
echo "mysqltest end"
