mirror of
https://github.com/dolthub/dolt.git
synced 2026-04-25 19:50:32 -05:00
258 lines
7.5 KiB
Bash
258 lines
7.5 KiB
Bash
SERVER_REQS_INSTALLED="FALSE"
|
|
SERVER_PID=""
|
|
DEFAULT_DB=""
|
|
PYTHON_QUERY_SCRIPT="
|
|
import os
|
|
import sys
|
|
|
|
args = sys.argv[sys.argv.index('--') + 1:]
|
|
query_results = None
|
|
expected_exception = None
|
|
|
|
working_dir, database, port_str, auto_commit, query_strs = args[0:5]
|
|
if len(args) > 5:
|
|
query_results = args[5]
|
|
if len(args) > 6:
|
|
expected_exception = args[6]
|
|
|
|
print('Query Strings: ' + query_strs)
|
|
print('Working Dir: ' + working_dir)
|
|
print('Database: ' + database)
|
|
print('Port: ' + port_str)
|
|
print('Autocommit: ' + auto_commit)
|
|
print('Expected Results: ' + str(query_results))
|
|
|
|
os.chdir(working_dir)
|
|
|
|
if auto_commit == '1':
|
|
auto_commit = True
|
|
else:
|
|
auto_commit = False
|
|
|
|
from pytest import DoltConnection, csv_to_row_maps
|
|
|
|
if not database:
|
|
dc = DoltConnection(port=int(port_str), database=None, user='dolt', auto_commit=auto_commit)
|
|
else:
|
|
dc = DoltConnection(port=int(port_str), database=database, user='dolt', auto_commit=auto_commit)
|
|
|
|
dc.connect()
|
|
|
|
queries = query_strs.split(';')
|
|
expected = [None]*len(queries)
|
|
|
|
if query_results is not None:
|
|
expected = query_results.split(';')
|
|
if len(expected) < len(queries):
|
|
expected.extend(['']*(len(queries)-len(expected)))
|
|
|
|
for i in range(len(queries)):
|
|
query_str = queries[i].strip()
|
|
print('executing:', query_str)
|
|
|
|
actual_rows, num_rows = None, None
|
|
try:
|
|
actual_rows, num_rows = dc.query(query_str, False)
|
|
except BaseException as e:
|
|
print('caught exception', str(e))
|
|
if expected_exception is not None and len(expected_exception) > 0:
|
|
if expected_exception not in str(e):
|
|
print('expected exception: ', expected_exception, '\n got: ', str(e))
|
|
sys.exit(1)
|
|
continue
|
|
else:
|
|
sys.exit(1)
|
|
|
|
if expected[i] is not None:
|
|
expected_rows = csv_to_row_maps(expected[i])
|
|
if expected_rows != actual_rows:
|
|
print('expected:', expected_rows, '\n actual:', actual_rows)
|
|
sys.exit(1)
|
|
"
|
|
|
|
set_server_reqs_installed() {
|
|
SERVER_REQS_INSTALLED=$(python3 -c "
|
|
requirements_installed = True
|
|
try:
|
|
import mysql.connector
|
|
except:
|
|
requirements_installed = False
|
|
|
|
print(str(requirements_installed).upper())
|
|
")
|
|
}
|
|
|
|
wait_for_connection() {
|
|
PYTEST_DIR="$BATS_TEST_DIRNAME/helper"
|
|
python3 -c "
|
|
import os
|
|
import sys
|
|
|
|
args = sys.argv[sys.argv.index('--') + 1:]
|
|
working_dir, database, port_str, timeout_ms = args
|
|
os.chdir(working_dir)
|
|
|
|
from pytest import wait_for_connection
|
|
wait_for_connection(port=int(port_str), timeout_ms=int(timeout_ms), database=database, user='dolt')
|
|
" -- "$PYTEST_DIR" "$DEFAULT_DB" "$1" "$2"
|
|
}
|
|
|
|
start_sql_server() {
|
|
DEFAULT_DB="$1"
|
|
let PORT="$$ % (65536-1024) + 1024"
|
|
dolt sql-server --host 0.0.0.0 --port=$PORT --user dolt &
|
|
SERVER_PID=$!
|
|
wait_for_connection $PORT 5000
|
|
}
|
|
|
|
# like start_sql_server, but the second argument is a string with all
|
|
# arguments to dolt-sql-server (excluding --port, which is defined in
|
|
# this func)
|
|
start_sql_server_with_args() {
|
|
DEFAULT_DB=""
|
|
let PORT="$$ % (65536-1024) + 1024"
|
|
dolt sql-server "$@" --port=$PORT &
|
|
SERVER_PID=$!
|
|
wait_for_connection $PORT 5000
|
|
}
|
|
|
|
start_sql_server_with_config() {
|
|
DEFAULT_DB="$1"
|
|
let PORT="$$ % (65536-1024) + 1024"
|
|
echo "
|
|
log_level: debug
|
|
|
|
user:
|
|
name: dolt
|
|
|
|
listener:
|
|
host: 0.0.0.0
|
|
port: $PORT
|
|
max_connections: 10
|
|
|
|
behavior:
|
|
autocommit: false
|
|
" > .cliconfig.yaml
|
|
cat "$2" >> .cliconfig.yaml
|
|
dolt sql-server --config .cliconfig.yaml &
|
|
SERVER_PID=$!
|
|
wait_for_connection $PORT 5000
|
|
}
|
|
|
|
start_sql_multi_user_server() {
|
|
DEFAULT_DB="$1"
|
|
let PORT="$$ % (65536-1024) + 1024"
|
|
echo "
|
|
log_level: debug
|
|
|
|
user:
|
|
name: dolt
|
|
|
|
listener:
|
|
host: 0.0.0.0
|
|
port: $PORT
|
|
max_connections: 10
|
|
|
|
behavior:
|
|
autocommit: false
|
|
" > .cliconfig.yaml
|
|
dolt sql-server --config .cliconfig.yaml &
|
|
SERVER_PID=$!
|
|
wait_for_connection $PORT 5000
|
|
}
|
|
|
|
|
|
start_multi_db_server() {
|
|
DEFAULT_DB="$1"
|
|
let PORT="$$ % (65536-1024) + 1024"
|
|
dolt sql-server --host 0.0.0.0 --port=$PORT --user dolt --multi-db-dir ./ &
|
|
SERVER_PID=$!
|
|
wait_for_connection $PORT 5000
|
|
}
|
|
|
|
# stop_sql_server stops the SQL server. For cases where it's important
|
|
# to wait for the process to exit after the kill signal (e.g. waiting
|
|
# for an async replication push), pass 1.
|
|
stop_sql_server() {
|
|
wait=$1
|
|
if [ ! -z "$SERVER_PID" ]; then
|
|
kill $SERVER_PID
|
|
fi
|
|
if [ $wait ]; then
|
|
while ps -p $SERVER_PID > /dev/null; do
|
|
sleep .1;
|
|
done
|
|
fi;
|
|
|
|
SERVER_PID=
|
|
}
|
|
|
|
# server_query connects to a running mysql server, executes a query and compares the results against what is expected.
|
|
# In the event that the results do not match expectations, the python process will exit with an exit code of 1
|
|
# * param1 is the database name for the connection string
|
|
# * param2 is 1 for autocommit = true, 0 for autocommit = false
|
|
# * param3 is the query_str
|
|
# * param4 is a csv representing the expected result set. If a query is not expected to have a result set "" should
|
|
# be passed.
|
|
# * param5 is an expected exception string. Mutually exclusive with param4
|
|
server_query() {
|
|
let PORT="$$ % (65536-1024) + 1024"
|
|
PYTEST_DIR="$BATS_TEST_DIRNAME/helper"
|
|
echo Executing server_query
|
|
python3 -u -c "$PYTHON_QUERY_SCRIPT" -- "$PYTEST_DIR" "$1" "$PORT" "$2" "$3" "$4" "$5"
|
|
}
|
|
|
|
# server_query connects to a running mysql server, executes a query and compares the results against what is expected.
|
|
# In the event that the results do not match expectations, the python process will exit with an exit code of 1
|
|
# * param1 is the database name for the connection string
|
|
# * param2 is 1 for autocommit = true, 0 for autocommit = false
|
|
# * param3 is the query_str
|
|
multi_query() {
|
|
let PORT="$$ % (65536-1024) + 1024"
|
|
PYTEST_DIR="$BATS_TEST_DIRNAME/helper"
|
|
echo Executing multi_query
|
|
python3 -c "$PYTHON_QUERY_SCRIPT" -- "$PYTEST_DIR" "$1" "$PORT" "$2" "$3"
|
|
}
|
|
|
|
# update_query runs an update query and should be called with 3 parameters
|
|
# * param1 is the database name for the connection string
|
|
# * param2 is 1 for autocommit = true, 0 for autocommit = false
|
|
# * param3 is the query string
|
|
update_query() {
|
|
server_query "$1" "$2" "$3" ""
|
|
}
|
|
|
|
# insert_query runs an insert query and should be called with 3 parameters
|
|
# * param1 is the database name for the connection string
|
|
# * param2 is 1 for autocommit = true, 0 for autocommit = false
|
|
# * param3 is the query string
|
|
insert_query() {
|
|
server_query "$1" "$2" "$3" ""
|
|
}
|
|
|
|
# unselected_server_query connects to a running mysql server, but not to a particular database, executes a query and
|
|
# compares the results against what is expected.
|
|
# In the event that the results do not match expectations, the python process will exit with an exit code of 1
|
|
# * param1 is 1 for autocommit = true, 0 for autocommit = false
|
|
# * param2 is the query_str
|
|
unselected_server_query() {
|
|
let PORT="$$ % (65536-1024) + 1024"
|
|
PYTEST_DIR="$BATS_TEST_DIRNAME/helper"
|
|
echo Executing server_query
|
|
python3 -c "$PYTHON_QUERY_SCRIPT" -- "$PYTEST_DIR" "" "$PORT" "$1" "$2" "$3"
|
|
}
|
|
|
|
# unselected_update_query runs an update query and should be called with 2 parameters
|
|
# * param1 is 1 for autocommit = true, 0 for autocommit = false
|
|
# * param2 is the query string
|
|
unselected_update_query() {
|
|
unselected_server_query $1 "$2" ""
|
|
}
|
|
|
|
# unselected_insert_query runs an insert query and should be called with 2 parameters
|
|
# * param1 is 1 for autocommit = true, 0 for autocommit = false
|
|
# * param2 is the query string
|
|
unselected_insert_query() {
|
|
unselected_server_query $1 "$2" ""
|
|
}
|