Skip to content

Commit 8ea42c1

Browse files
Merge branch 'master' into future_pparam
2 parents 752f56e + f9c4937 commit 8ea42c1

18 files changed

+546
-167
lines changed

.github/regression.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ export CARDANO_NODE_SOCKET_PATH_CI="$WORKDIR/state-cluster0/bft1.socket"
9191
# assume we run tests on testnet when `BOOTSTRAP_DIR` is set
9292
if [ -n "${BOOTSTRAP_DIR:-""}" ]; then
9393
export CARDANO_NODE_SOCKET_PATH_CI="$WORKDIR/state-cluster0/relay1.socket"
94-
export MAKE_TARGET="${MAKE_TARGET:-"testnets"}"
94+
export RUN_TARGET="${RUN_TARGET:-"testnets"}"
9595
fi
9696

9797
echo "### Dependencies setup ###"
@@ -227,7 +227,7 @@ nix develop --accept-flake-config .#venv --command bash -c '
227227
export PATH="$PATH_PREPEND":"$PATH"
228228
export CARDANO_NODE_SOCKET_PATH="$CARDANO_NODE_SOCKET_PATH_CI"
229229
retval=0
230-
make "${MAKE_TARGET:-"tests"}" || retval="$?"
230+
. .github/run_tests.sh "${RUN_TARGET:-"tests"}" || retval="$?"
231231
df -h .
232232
echo "::endgroup::" # end group for "Testrun"
233233

.github/run_tests.sh

Lines changed: 214 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,214 @@
1+
#!/usr/bin/env bash
2+
3+
# Run test suites.
4+
#
5+
# Targets: tests | testpr | testnets
6+
# Usage:
7+
# ./run_tests.sh tests
8+
# ./run_tests.sh testpr
9+
# ./run_tests.sh testnets
10+
#
11+
# Env vars:
12+
# TESTS_DIR: directory with tests to run (default: cardano_node_tests/)
13+
# ARTIFACTS_DIR: directory to save artifacts into (default: .artifacts)
14+
# COVERAGE_DIR: directory to save CLI coverage data into (default: .cli_coverage)
15+
# REPORTS_DIR: directory to save Allure test reports into (default: .reports)
16+
# MARKEXPR: pytest mark expression to filter tests, without the `-m` flag
17+
# NO_ARTIFACTS: if set, do not save artifacts
18+
# PYTEST_ARGS: additional args to pass to pytest
19+
# CI_ARGS: additional args to pass to pytest (for CI runs)
20+
# TEST_THREADS: number of pytest workers (defaults vary per target)
21+
# DESELECT_FROM_FILE: path to file with tests to deselect
22+
# CLUSTERS_COUNT: number of local testnet clusters to launch
23+
# FORBID_RESTART: if set to 1, do not restart clusters between tests
24+
#
25+
# Notes:
26+
# - If PYTEST_ARGS is provided, we disable cleanup and the initial "skip all" pass.
27+
# - If DESELECT_FROM_FILE is provided, we disable the initial "skip all" pass.
28+
# - If NO_ARTIFACTS is unset, we save artifacts under ARTIFACTS_DIR.
29+
# - HTML/JUnit reports are generated only when PYTEST_ARGS is unset.
30+
31+
set -Eeuo pipefail
32+
33+
# Defaults
34+
TESTS_DIR="${TESTS_DIR:-cardano_node_tests/}"
35+
ARTIFACTS_DIR="${ARTIFACTS_DIR:-.artifacts}"
36+
COVERAGE_DIR="${COVERAGE_DIR:-.cli_coverage}"
37+
REPORTS_DIR="${REPORTS_DIR:-.reports}"
38+
39+
# Helpers
40+
usage() {
41+
cat <<EOF
42+
Usage: "$0" [tests|testpr|testnets]
43+
44+
Targets:
45+
tests Run all tests (default TEST_THREADS=20), DbSyncAbortOnPanic=1
46+
testpr Run PR-level tests (default CLUSTERS_COUNT=5, TEST_THREADS=20, MARKEXPR="smoke")
47+
testnets Run tests that can run on public testnets (CLUSTERS_COUNT=1, FORBID_RESTART=1,
48+
default TEST_THREADS=15, MARKEXPR="testnets")
49+
50+
All targets respect the same env vars as the original Makefile.
51+
EOF
52+
}
53+
54+
pytest_w_echo() {
55+
echo "Running: PYTEST_ADDOPTS='${PYTEST_ADDOPTS:-}' pytest $*"
56+
pytest "$@"
57+
}
58+
59+
ensure_dirs() {
60+
mkdir -p "$ARTIFACTS_DIR" "$COVERAGE_DIR" "$REPORTS_DIR"
61+
}
62+
63+
# Set common env vars that affect test runs.
64+
set_common_env() {
65+
# Cleanup / skip logic
66+
CLEANUP="yes"
67+
RUN_SKIPS="yes"
68+
69+
if [[ -n "${PYTEST_ARGS:-}" ]]; then
70+
CLEANUP="no"
71+
RUN_SKIPS="no"
72+
export PYTEST_ADDOPTS="${PYTEST_ADDOPTS:+$PYTEST_ADDOPTS }${PYTEST_ARGS}"
73+
fi
74+
75+
if [[ -n "${DESELECT_FROM_FILE:-}" ]]; then
76+
RUN_SKIPS="no"
77+
fi
78+
79+
if [[ -n "${CI_ARGS:-}" ]]; then
80+
export PYTEST_ADDOPTS="${PYTEST_ADDOPTS:+$PYTEST_ADDOPTS }${CI_ARGS}"
81+
fi
82+
}
83+
84+
# Compute args that depend on current environment.
85+
compute_common_args() {
86+
# MARKEXPR handling
87+
if [[ -n "${MARKEXPR:-}" ]]; then
88+
MARKEXPR_ARR=( -m "$MARKEXPR" )
89+
else
90+
MARKEXPR_ARR=()
91+
fi
92+
93+
# It may not be always necessary to save artifacts, e.g. when running tests on local cluster
94+
# on local machine.
95+
if [[ -n "${NO_ARTIFACTS+x}" ]]; then
96+
ARTIFACTS_ARR=()
97+
else
98+
ARTIFACTS_ARR=( "--artifacts-base-dir=$ARTIFACTS_DIR" )
99+
fi
100+
101+
# Test run report args only when PYTEST_ARGS is unset.
102+
if [[ -z "${PYTEST_ARGS:-}" ]]; then
103+
TESTRUN_REPORT_ARR=(
104+
"--html=$REPORTS_DIR/testrun-report.html"
105+
"--self-contained-html"
106+
"--junitxml=$REPORTS_DIR/testrun-report.xml"
107+
)
108+
else
109+
TESTRUN_REPORT_ARR=()
110+
fi
111+
112+
# Deselect-from-file
113+
if [[ -n "${DESELECT_FROM_FILE:-}" ]]; then
114+
DESELECT_FROM_FILE_ARR=( "--deselect-from-file=$DESELECT_FROM_FILE" )
115+
else
116+
DESELECT_FROM_FILE_ARR=()
117+
fi
118+
}
119+
120+
cleanup_previous_run() {
121+
if [[ "$CLEANUP" == "yes" ]]; then
122+
# Remove previous reports and coverage artifacts.
123+
rm -f "$REPORTS_DIR"/{*-attachment.txt,*-result.json,*-container.json,testrun-report.*} || true
124+
rm -f "$COVERAGE_DIR"/cli_coverage_* || true
125+
fi
126+
}
127+
128+
initial_skip_pass() {
129+
if [[ "$RUN_SKIPS" == "yes" ]]; then
130+
echo "Initial pass: skipping all tests to register them with Allure"
131+
pytest -s "$TESTS_DIR" "${MARKEXPR_ARR[@]}" --skipall --alluredir="$REPORTS_DIR" >/dev/null
132+
fi
133+
}
134+
135+
run_real_tests() {
136+
pytest_w_echo \
137+
"$TESTS_DIR" \
138+
"${MARKEXPR_ARR[@]}" \
139+
"${DESELECT_FROM_FILE_ARR[@]}" \
140+
-n "${TEST_THREADS}" \
141+
"${ARTIFACTS_ARR[@]}" \
142+
--cli-coverage-dir="$COVERAGE_DIR" \
143+
--alluredir="$REPORTS_DIR" \
144+
"${TESTRUN_REPORT_ARR[@]}" \
145+
"$@"
146+
}
147+
148+
# Provide default MARKEXPR if none was given from env/CLI.
149+
ensure_markexpr_default() {
150+
local default_expr="$1"
151+
if [[ -z "${MARKEXPR:-}" ]]; then
152+
MARKEXPR="$default_expr"
153+
fi
154+
}
155+
156+
# Targets
157+
target_tests() {
158+
export DbSyncAbortOnPanic="${DbSyncAbortOnPanic:-1}"
159+
TEST_THREADS="${TEST_THREADS:-20}"
160+
161+
ensure_dirs
162+
set_common_env
163+
compute_common_args
164+
cleanup_previous_run
165+
initial_skip_pass
166+
run_real_tests "$@"
167+
}
168+
169+
target_testpr() {
170+
export TESTPR=1
171+
export CLUSTERS_COUNT="${CLUSTERS_COUNT:-5}"
172+
TEST_THREADS="${TEST_THREADS:-20}"
173+
ensure_markexpr_default "smoke"
174+
175+
ensure_dirs
176+
set_common_env
177+
compute_common_args
178+
cleanup_previous_run
179+
initial_skip_pass
180+
run_real_tests "$@"
181+
}
182+
183+
target_testnets() {
184+
export CLUSTERS_COUNT=1
185+
export FORBID_RESTART=1
186+
TEST_THREADS="${TEST_THREADS:-15}"
187+
ensure_markexpr_default "testnets"
188+
189+
ensure_dirs
190+
set_common_env
191+
compute_common_args
192+
cleanup_previous_run
193+
initial_skip_pass
194+
run_real_tests "$@"
195+
}
196+
197+
# Dispatch
198+
main() {
199+
command -v pytest >/dev/null 2>&1 || {
200+
echo "Error: pytest not found in PATH." >&2
201+
exit 127
202+
}
203+
204+
local cmd="${1:-tests}"
205+
case "$cmd" in
206+
tests) shift; target_tests "$@";;
207+
testpr) shift; target_testpr "$@";;
208+
testnets) shift; target_testnets "$@";;
209+
-h|--help) usage;;
210+
*) echo "Unknown target: $cmd" >&2; usage; exit 2;;
211+
esac
212+
}
213+
214+
main "$@"

.github/setup_venv.sh

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,14 @@ fi
1717
# shellcheck disable=SC1090,SC1091
1818
. "$_VENV_DIR/bin/activate"
1919

20-
PYTHONPATH="$(echo "$VIRTUAL_ENV"/lib/python3*/site-packages):$PYTHONPATH"
21-
export PYTHONPATH
20+
# Filter out nix python packages from PYTHONPATH.
21+
# This avoids conflicts between nix-installed packages and poetry virtual environment packages.
22+
PYTHONPATH="$(echo "${PYTHONPATH:-}" | tr ":" "\n" | grep -v "/nix/store/.*/site-packages" | tr "\n" ":" | sed 's/:*$//')"
23+
if [ -n "${PYTHONPATH:-}" ]; then
24+
export PYTHONPATH
25+
else
26+
unset PYTHONPATH
27+
fi
2228

2329
if [ -z "$_REQS_INSTALLED" ]; then
2430
poetry install -n

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ __pycache__/
2626

2727
# Env variables
2828
/.source*
29+
!/.source.dev
2930

3031
# Distribution / packaging
3132
.Python

.source.dev

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
#!/bin/bash
2+
3+
# An environment setup script for cardano-node-tests local development.
4+
#
5+
# Create a `.source` script in the root of the repository.
6+
# Source this file from the .source script. You can also include additional environment
7+
# variables such as DBSYNC_SCHEMA_DIR and GITHUB_TOKEN in that file, or change INSTANCE_NUM.
8+
#
9+
# export DBSYNC_SCHEMA_DIR="$HOME/Source/repos/cardano-db-sync/schema"
10+
# export GITHUB_TOKEN=ghp_....
11+
INSTANCE_NUM="${INSTANCE_NUM:-0}"
12+
13+
# Ensure we are in the correct directory
14+
if [[ "${PWD##*/}" != "cardano-node-tests"* ]]; then
15+
echo "Must be in cardano-node-tests* directory" >&2
16+
return 1
17+
fi
18+
19+
# Activate poetry virtual environment
20+
if [ -z "${VIRTUAL_ENV:-}" ]; then
21+
# shellcheck disable=SC2091
22+
$(poetry env activate)
23+
fi
24+
25+
# Filter out nix python packages from PYTHONPATH.
26+
# This avoids conflicts between nix-installed packages and poetry virtual environment packages.
27+
PYTHONPATH="$(echo "${PYTHONPATH:-}" | tr ":" "\n" | grep -v "/nix/store/.*/site-packages" | tr "\n" ":" | sed 's/:*$//')"
28+
if [ -n "${PYTHONPATH:-}" ]; then
29+
export PYTHONPATH
30+
else
31+
unset PYTHONPATH
32+
fi
33+
34+
# Set Cardano Node socket path and other environment variables
35+
export CARDANO_NODE_SOCKET_PATH="/var/tmp/cardonnay/state-cluster${INSTANCE_NUM}/bft1.socket"
36+
export DEV_CLUSTER_RUNNING=1 CLUSTERS_COUNT=1 FORBID_RESTART=1 NO_ARTIFACTS=1
37+
unset BOOTSTRAP_DIR
38+
39+
mkdir -p "${CARDANO_NODE_SOCKET_PATH%/*}"
40+
41+
# Set temporary directory for this instance
42+
TMPDIR="$PWD/tmp"
43+
if [ "$INSTANCE_NUM" != 0 ]; then
44+
TMPDIR="$PWD/tmp${INSTANCE_NUM}"
45+
fi
46+
mkdir -p "$TMPDIR"
47+
export TMPDIR
48+
49+
# Remove ghcup from PATH to avoid conflicts with nix environment
50+
PATH="$(echo "$PATH" | tr ":" "\n" | grep -v "ghcup" | tr "\n" ":" | sed 's/:*$//')"
51+
export PATH
52+
53+
# Prepend instance-specific .bin directory to PATH if it exists and if not already present
54+
if [ -e "$PWD/.bin${INSTANCE_NUM}" ] && [[ ":$PATH:" != *":$PWD/.bin${INSTANCE_NUM}:"* ]]; then
55+
export PATH="$PWD/.bin${INSTANCE_NUM}:$PATH"
56+
fi
57+
58+
# Prepend default .bin directory to PATH for instance 0 if it exists and if not already present
59+
if [ "$INSTANCE_NUM" = 0 ] && [ -e "$PWD/.bin" ] && [[ ":$PATH:" != *":$PWD/.bin:"* ]]; then
60+
export PATH="$PWD/.bin:$PATH"
61+
fi
62+
63+
# Set database connection environment variables for db-sync
64+
export PGHOST=localhost PGUSER=postgres
65+
66+
# Enable SMASH server if available
67+
if [ -n "${DBSYNC_SCHEMA_DIR:-}" ] && command -v cardano-smash-server >/dev/null 2>&1; then
68+
export SMASH=true
69+
fi
70+
71+
# Enable cardano-cli bash completion
72+
if ! command -v _cardano-cli >/dev/null 2>&1 && command -v cardano-cli >/dev/null 2>&1; then
73+
# shellcheck disable=SC1090
74+
. <(cardano-cli --bash-completion-script cardano-cli)
75+
fi
76+
77+
unset INSTANCE_NUM

0 commit comments

Comments
 (0)