360 lines
9.6 KiB
Bash
Executable File
360 lines
9.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Copyright 2019 PingCAP, Inc.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
TIDB_TEST_STORE_NAME=$TIDB_TEST_STORE_NAME
|
|
TIKV_PATH=$TIKV_PATH
|
|
NEXT_GEN=$NEXT_GEN
|
|
|
|
build=1
|
|
mysql_tester="./mysql_tester"
|
|
tidb_server=""
|
|
portgenerator=""
|
|
mysql_tester_log="./integration-test.out"
|
|
tests=""
|
|
record=0
|
|
record_case=""
|
|
stats="s"
|
|
collation_opt=2
|
|
runs_on_port=0
|
|
|
|
set -eu
|
|
trap 'set +e; PIDS=$(jobs -p); for pid in $PIDS; do kill -9 $pid 2>/dev/null || true; done' EXIT
|
|
# make tests stable time zone wise
|
|
export TZ="Asia/Shanghai"
|
|
|
|
function help_message()
|
|
{
|
|
echo "Usage: $0 [options]
|
|
|
|
-h: Print this help message.
|
|
|
|
-d <y|Y|n|N|b|B>: \"y\" or \"Y\" for only enabling the new collation during test.
|
|
\"n\" or \"N\" for only disabling the new collation during test.
|
|
\"b\" or \"B\" for tests the prefix is 'collation', enabling and disabling new collation during test, and for other tests, only enabling the new collation [default].
|
|
Enable/Disable the new collation during the integration test.
|
|
|
|
-s <tidb-server-path>: Use tidb-server in <tidb-server-path> for testing.
|
|
eg. \"./run-tests.sh -s ./integrationtest_tidb-server\"
|
|
|
|
-b <y|Y|n|N>: \"y\" or \"Y\" for building test binaries [default \"y\" if this option is not specified].
|
|
\"n\" or \"N\" for not to build.
|
|
The building of tidb-server will be skiped if \"-s <tidb-server-path>\" is provided.
|
|
The building of portgenerator will be skiped if \"-s <portgenerator-path>\" is provided.
|
|
|
|
-r <test-name>|all: Run tests in file \"t/<test-name>.test\" and record result to file \"r/<test-name>.result\".
|
|
\"all\" for running all tests and record their results.
|
|
|
|
-t <test-name>: Run tests in file \"t/<test-name>.test\".
|
|
This option will be ignored if \"-r <test-name>\" is provided.
|
|
Run all tests if this option is not provided.
|
|
|
|
-P <port>: Use tidb-server running on <port> for testing.
|
|
|
|
"
|
|
}
|
|
|
|
# Function to find an available port starting from a given port
|
|
function find_available_port() {
|
|
local port=$1
|
|
|
|
while :; do
|
|
if [ "$port" -ge 65536 ]; then
|
|
echo "Error: No available ports found below 65536." >&2
|
|
exit 1
|
|
fi
|
|
if ! lsof -nP -i :"$port" &> /dev/null; then
|
|
echo $port
|
|
return 0
|
|
fi
|
|
((port++))
|
|
done
|
|
}
|
|
|
|
# Function to find multiple available ports starting from a given port
|
|
function find_multiple_available_ports() {
|
|
local start_port=$1
|
|
local count=$2
|
|
local ports=()
|
|
|
|
while [ ${#ports[@]} -lt $count ]; do
|
|
local available_port=$(find_available_port $start_port)
|
|
if [ $? -eq 0 ]; then
|
|
ports+=($available_port)
|
|
((start_port = available_port + 1))
|
|
else
|
|
echo "Error: Could not find an available port." >&2
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
echo "${ports[@]}"
|
|
}
|
|
|
|
function build_tidb_server()
|
|
{
|
|
tidb_server="$(pwd)/integrationtest_tidb-server"
|
|
echo "building tidb-server binary: $tidb_server"
|
|
rm -rf $tidb_server
|
|
if [ "${TIDB_TEST_STORE_NAME}" = "tikv" ]; then
|
|
make -C ../.. server SERVER_OUT=$tidb_server
|
|
else
|
|
make -C ../.. server SERVER_OUT=$tidb_server RACE_FLAG="-race"
|
|
fi
|
|
}
|
|
|
|
function build_mysql_tester()
|
|
{
|
|
echo "building mysql-tester binary: $mysql_tester"
|
|
rm -rf $mysql_tester
|
|
GOBIN=$PWD go install github.com/pingcap/mysql-tester/src@12f37562a884a2d680d5ca619df80c8d0a080aff
|
|
mv src mysql_tester
|
|
}
|
|
|
|
function extract_stats()
|
|
{
|
|
echo "extracting statistics: $stats"
|
|
rm -rf $stats
|
|
unzip -qq s.zip
|
|
}
|
|
|
|
while getopts "t:s:r:b:d:c:i:P:h" opt; do
|
|
case $opt in
|
|
P)
|
|
runs_on_port="$OPTARG"
|
|
port="$OPTARG"
|
|
build=0
|
|
;;
|
|
t)
|
|
tests="$OPTARG"
|
|
;;
|
|
s)
|
|
tidb_server="$OPTARG"
|
|
;;
|
|
r)
|
|
record=1
|
|
record_case="$OPTARG"
|
|
;;
|
|
b)
|
|
case $OPTARG in
|
|
y|Y)
|
|
build=1
|
|
;;
|
|
n|N)
|
|
build=0
|
|
;;
|
|
*)
|
|
help_message 1>&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
;;
|
|
d)
|
|
case $OPTARG in
|
|
y|Y)
|
|
collation_opt=1
|
|
;;
|
|
n|N)
|
|
collation_opt=0
|
|
;;
|
|
b|B)
|
|
collation_opt=2
|
|
;;
|
|
*)
|
|
help_message 1>&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
;;
|
|
h)
|
|
help_message
|
|
exit 0
|
|
;;
|
|
*)
|
|
help_message 1>&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
extract_stats
|
|
|
|
if [ $build -eq 1 ]; then
|
|
if [ -z "$tidb_server" ]; then
|
|
build_tidb_server
|
|
else
|
|
echo "skip building tidb-server, using existing binary: $tidb_server"
|
|
fi
|
|
build_mysql_tester
|
|
else
|
|
if [ -z "$tidb_server" ] && [ "$runs_on_port" -eq 0 ]; then
|
|
tidb_server="./integrationtest_tidb-server"
|
|
if [[ ! -f "$tidb_server" ]]; then
|
|
build_tidb_server
|
|
else
|
|
echo "skip building tidb-server, using existing binary: $tidb_server"
|
|
fi
|
|
fi
|
|
if [ -z "$mysql_tester" ]; then
|
|
mysql_tester="./mysql_tester"
|
|
if [[ ! -f "$mysql_tester" ]]; then
|
|
build_mysql_tester
|
|
else
|
|
echo "skip building mysql-tester, using existing binary: $mysql_tester"
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
rm -rf $mysql_tester_log
|
|
|
|
if [ "$runs_on_port" -eq 0 ]
|
|
then
|
|
ports=($(find_multiple_available_ports 4000 2))
|
|
port=${ports[0]}
|
|
status=${ports[1]}
|
|
fi
|
|
|
|
function start_tidb_server()
|
|
{
|
|
config_file="config.toml"
|
|
if [[ $enabled_new_collation = 0 ]]; then
|
|
config_file="disable_new_collation.toml"
|
|
fi
|
|
|
|
start_options="-P $port -status $status -config $config_file"
|
|
if [ "${TIDB_TEST_STORE_NAME}" = "tikv" ]; then
|
|
start_options="$start_options -store tikv -path ${TIKV_PATH}"
|
|
else
|
|
start_options="$start_options -store unistore -path ''"
|
|
fi
|
|
|
|
if [ -n "$NEXT_GEN" ] && [ "$NEXT_GEN" != "0" ] && [ "$NEXT_GEN" != "false" ]; then
|
|
start_options="$start_options -keyspace-name SYSTEM --tidb-service-scope dxf_service"
|
|
fi
|
|
|
|
echo "start tidb-server, log file: $mysql_tester_log"
|
|
$tidb_server -V
|
|
$tidb_server $start_options > $mysql_tester_log 2>&1 &
|
|
SERVER_PID=$!
|
|
echo "tidb-server(PID: $SERVER_PID) started"
|
|
}
|
|
|
|
function run_mysql_tester()
|
|
{
|
|
coll_disabled="false"
|
|
coll_msg="enabled new collation"
|
|
if [[ $enabled_new_collation = 0 ]]; then
|
|
coll_disabled="true"
|
|
coll_msg="disabled new collation"
|
|
fi
|
|
if [ $record -eq 1 ]; then
|
|
if [ "$record_case" = 'all' ]; then
|
|
echo "record all cases"
|
|
$mysql_tester -port "$port" --check-error=true --collation-disable=$coll_disabled --record
|
|
else
|
|
echo "record result for case: \"$record_case\""
|
|
$mysql_tester -port "$port" --check-error=true --collation-disable=$coll_disabled --record $record_case
|
|
fi
|
|
else
|
|
if [ -z "$tests" ]; then
|
|
echo "run all integration test cases ($coll_msg)"
|
|
else
|
|
echo "run integration test cases($coll_msg): $tests"
|
|
fi
|
|
$mysql_tester -port "$port" --check-error=true --collation-disable=$coll_disabled $tests
|
|
fi
|
|
}
|
|
|
|
function check_data_race() {
|
|
if [ "${TIDB_TEST_STORE_NAME}" = "tikv" ]; then
|
|
return
|
|
fi
|
|
race=`grep 'DATA RACE' $mysql_tester_log || true`
|
|
if [ ! -z "$race" ]; then
|
|
echo "tidb-server DATA RACE!"
|
|
cat $mysql_tester_log
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
enabled_new_collation=""
|
|
function check_case_name() {
|
|
if [ $collation_opt != 2 ]; then
|
|
return
|
|
fi
|
|
|
|
case=""
|
|
|
|
if [ $record -eq 0 ]; then
|
|
if [ -z "$tests" ]; then
|
|
return
|
|
fi
|
|
case=$tests
|
|
fi
|
|
|
|
if [ $record -eq 1 ]; then
|
|
if [ "$record_case" = 'all' ]; then
|
|
return
|
|
fi
|
|
case=$record_case
|
|
fi
|
|
|
|
IFS='/' read -ra parts <<< "$case"
|
|
|
|
last_part="${parts[${#parts[@]}-1]}"
|
|
|
|
if [[ $last_part == collation* || $tests == collation* ]]; then
|
|
collation_opt=2
|
|
else
|
|
collation_opt=1
|
|
fi
|
|
}
|
|
|
|
check_case_name
|
|
if [[ $collation_opt = 0 || $collation_opt = 2 ]]; then
|
|
enabled_new_collation=0
|
|
if [ "$runs_on_port" -eq 0 ]
|
|
then
|
|
start_tidb_server
|
|
fi
|
|
run_mysql_tester
|
|
if [ "$runs_on_port" -eq 0 ]
|
|
then
|
|
kill -15 $SERVER_PID
|
|
while ps -p $SERVER_PID > /dev/null; do
|
|
sleep 1
|
|
done
|
|
fi
|
|
check_data_race
|
|
fi
|
|
|
|
if [[ $collation_opt = 1 || $collation_opt = 2 ]]; then
|
|
enabled_new_collation=1
|
|
if [ "$runs_on_port" -eq 0 ]
|
|
then
|
|
start_tidb_server
|
|
fi
|
|
run_mysql_tester
|
|
if [ "$runs_on_port" -eq 0 ]
|
|
then
|
|
kill -15 $SERVER_PID
|
|
while ps -p $SERVER_PID > /dev/null; do
|
|
sleep 1
|
|
done
|
|
fi
|
|
check_data_race
|
|
fi
|
|
|
|
echo "integrationtest passed!"
|