Files
atomic-swap/scripts/run-integration-tests.sh

197 lines
4.9 KiB
Bash
Executable File

#!/usr/bin/env bash
PROJECT_ROOT="$(dirname "$(dirname "$(realpath "$0")")")"
cd "${PROJECT_ROOT}" || exit 1
./scripts/cleanup-test-processes.sh
ALL=true ./scripts/build.sh || exit 1
source "scripts/testlib.sh"
check-set-swap-test-data-dir
# The first 5 ganache keys are reserved for use by integration tests and dev swapd
# instances. For now, we are only using 3: Alice, Bob, Charlie.
GANACHE_KEYS=(
"4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d" # Key 0
"6cbed15c793ce57650b9877cf6fa156fbef513c4e6134f022a85b1ffdd59b2a1" # Key 1
"6370fd033278c143179d81c5526140625662b8daa446c22ee2d73db3707e620c" # Key 2
"646f1ce2fdad0e6deeeb5c7e8e5543bdde65e86029e2fd9fc169899c440a7913" # Key 3 (placeholder)
)
KEY_USERS=(
"alice"
"bob"
"charlie"
)
create-eth-keys() {
local i
for i in "${!KEY_USERS[@]}"; do
local key_file="${SWAP_TEST_DATA_DIR}/${KEY_USERS[${i}]}/eth.key"
mkdir -p "$(dirname "${key_file}")"
echo "${GANACHE_KEYS[${i}]}" >"${key_file}"
done
}
LOG_LEVEL=debug
BOOTNODE_RPC_PORT=4999
ALICE_RPC_PORT=5000
BOB_RPC_PORT=5001
CHARLIE_RPC_PORT=5002
start-bootnode() {
local flags=(
"--rpc-port=${BOOTNODE_RPC_PORT}"
"--bootnodes="
"--libp2p-ip=127.0.0.1"
"--log-level=${LOG_LEVEL}"
)
local log_file="${SWAP_TEST_DATA_DIR}/bootnode.log"
echo "Starting bootnode, logs in ${log_file}"
./bin/bootnode "${flags[@]}" &>"${log_file}" &
local pid="${!}"
echo "${pid}" >"${SWAP_TEST_DATA_DIR}/bootnode.pid"
if wait-rpc-started "bootnode" "${pid}" "${BOOTNODE_RPC_PORT}"; then
return 0 # success
fi
echo "Failed to start bootnode"
echo "=============== Failed logs ==============="
cat "${log_file}"
echo "============================================"
stop-daemons
exit 1
}
stop-bootnode() {
stop-program "bootnode"
}
start-swapd() {
local swapd_user="${1:?}"
local rpc_port="${2:?}"
local swapd_flags=(
"${@:3}"
--env=dev
"--rpc-port=${rpc_port}"
"--log-level=${LOG_LEVEL}"
)
local log_file="${SWAP_TEST_DATA_DIR}/${swapd_user}-swapd.log"
echo "Starting ${swapd_user^}'s swapd, logs in ${log_file}"
./bin/swapd "${swapd_flags[@]}" &>"${log_file}" &
local swapd_pid="${!}"
echo "${swapd_pid}" >"${SWAP_TEST_DATA_DIR}/${swapd_user}-swapd.pid"
if wait-rpc-started "${swapd_user}" "${swapd_pid}" "${rpc_port}"; then
return 0 # success, bypass failure code below
fi
echo "Failed to start ${swapd_user^}'s swapd"
echo "=============== Failed logs ==============="
cat "${log_file}"
echo "============================================"
stop-daemons
exit 1
}
stop-swapd() {
local swapd_user="${1}"
stop-program "${swapd_user}-swapd"
}
# Waits for up to 60 seconds for the RPC port to be listening.
# If the passed PID exits, we stop waiting. This method only
# returns success(0)/failure(1) and will not exit the script.
wait-rpc-started() {
local user="${1}"
local pid="${2}"
local port="${3}"
# Wait up to 60 seconds for the daemon's port to be listening
for i in {1..60}; do
sleep 1
# Test if pid is still alive, fail if it isn't
if ! kill -0 "${pid}" 2>/dev/null; then
return 1 # fail
fi
# Test if RPC port is listening, return success if it is
if is-port-open "${port}"; then
echo "${user^}'s instance is listening after ${i} seconds"
return 0 # success
fi
done
return 1 # fail
}
start-daemons() {
start-monerod-regtest
start-ganache
start-bootnode
local bootnode_addr
bootnode_addr="$(./bin/swapcli addresses --swapd-port ${BOOTNODE_RPC_PORT} | grep '^1:' | sed 's/.* //')"
start-swapd alice "${ALICE_RPC_PORT}" \
--dev-xmrtaker \
"--bootnodes=${bootnode_addr}" \
"--data-dir=${SWAP_TEST_DATA_DIR}/alice" \
--deploy
local contract_addr
contract_addr="$(./bin/swapcli version | grep '^swap creator address' | sed 's/.*: //')"
if [[ -z "${contract_addr}" ]]; then
echo "Failed to get Alice's deployed contract addresses"
stop-daemons
exit 1
fi
start-swapd bob "${BOB_RPC_PORT}" \
--dev-xmrmaker \
"--bootnodes=${bootnode_addr}" \
"--data-dir=${SWAP_TEST_DATA_DIR}/bob" \
--libp2p-port=9944 \
"--contract-address=${contract_addr}"
start-swapd charlie "${CHARLIE_RPC_PORT}" \
"--bootnodes=${bootnode_addr}" \
--data-dir "${SWAP_TEST_DATA_DIR}/charlie" \
--libp2p-port=9955 \
"--contract-address=${contract_addr}" \
"--relayer"
}
stop-daemons() {
stop-swapd charlie
stop-swapd bob
stop-swapd alice
stop-bootnode
stop-monerod-regtest
stop-ganache
}
# run tests
echo "running integration tests..."
create-eth-keys
start-daemons
TESTS=integration go test ./tests -v -count=1 -timeout=30m
OK="${?}"
KEEP_TEST_DATA="${OK}" stop-daemons
# Cleanup test files if we succeeded
if [[ "${OK}" -eq 0 ]]; then
rm -f "${CHARLIE_ETH_KEY}"
rm -f "${SWAP_TEST_DATA_DIR}/"{alice,bob,charlie}/monero-wallet-rpc.log
rm -f "${SWAP_TEST_DATA_DIR}/"{alice,bob,charlie}/{net,eth}.key
rm -rf "${SWAP_TEST_DATA_DIR}/"{alice,bob,charlie}/{wallet,libp2p-datastore,db}
rmdir "${SWAP_TEST_DATA_DIR}/"{alice,bob,charlie}
remove-test-data-dir
fi
exit "${OK}"