Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
quarto-dev
GitHub Repository: quarto-dev/quarto-cli
Path: blob/main/tests/run-tests.sh
6428 views
1
#!/usr/bin/env bash
2
3
# Determine the path to this script (we'll use this to figure out relative positions of other files)
4
SOURCE="${BASH_SOURCE[0]}"
5
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
6
SCRIPT_PATH="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )"
7
SOURCE="$(readlink "$SOURCE")"
8
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
9
done
10
export SCRIPT_PATH="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )"
11
12
# Check if verbose mode is enabled (GitHub Actions debug mode or explicit flag)
13
VERBOSE_MODE=false
14
if [[ "$RUNNER_DEBUG" == "1" ]] || [[ "$QUARTO_TEST_VERBOSE" == "true" ]]; then
15
VERBOSE_MODE=true
16
fi
17
18
# Check if keep-outputs mode is enabled
19
KEEP_OUTPUTS=false
20
FILTERED_ARGS=()
21
for arg in "$@"; do
22
case $arg in
23
--keep-outputs|-k)
24
KEEP_OUTPUTS=true
25
;;
26
*)
27
FILTERED_ARGS+=("$arg")
28
;;
29
esac
30
done
31
set -- "${FILTERED_ARGS[@]}"
32
33
if [[ "$KEEP_OUTPUTS" == "true" ]]; then
34
export QUARTO_TEST_KEEP_OUTPUTS=true
35
echo "> Keep outputs mode enabled - test artifacts will not be deleted"
36
fi
37
38
source $SCRIPT_PATH/../package/scripts/common/utils.sh
39
40
export QUARTO_ROOT="$(cd "$SCRIPT_PATH/.." > /dev/null 2>&1 && pwd)"
41
QUARTO_SRC_DIR="$QUARTO_ROOT/src"
42
43
# Architecture detection (preserve original DENO_DIR from environment)
44
DENO_ARCH_DIR=$DENO_DIR
45
46
# Set bin path explicitly (not derived from DENO_DIR)
47
QUARTO_BIN_PATH="$QUARTO_ROOT/package/dist/bin"
48
49
# Set DENO_DIR to cache location (respects QUARTO_DENO_DIR override)
50
if [ "$QUARTO_DENO_DIR" == "" ]; then
51
export DENO_DIR="$QUARTO_BIN_PATH/deno_cache"
52
else
53
export DENO_DIR="$QUARTO_DENO_DIR"
54
fi
55
56
# Local import map
57
QUARTO_IMPORT_MAP_ARG=--importmap=$QUARTO_SRC_DIR/import_map.json
58
59
export QUARTO_BIN_PATH
60
export QUARTO_SHARE_PATH="`cd "$QUARTO_ROOT/src/resources/";pwd`"
61
export QUARTO_DEBUG=true
62
63
QUARTO_DENO_OPTIONS="--config test-conf.json --v8-flags=--enable-experimental-regexp-engine,--max-old-space-size=8192,--max-heap-size=8192 --unstable-kv --unstable-ffi --no-lock --allow-all"
64
65
66
if [[ -z $GITHUB_ACTION ]] && [[ -z $QUARTO_TESTS_NO_CONFIG ]]
67
then
68
echo "> Checking and configuring environment for tests"
69
source configure-test-env.sh
70
fi
71
72
# Activating python virtualenv
73
# set QUARTO_TESTS_FORCE_NO_VENV env var to not activate the virtualenv located in the project
74
# QUARTO_TESTS_FORCE_NO_PIPENV is there for backward compatibility
75
if [[ -z $QUARTO_TESTS_FORCE_NO_VENV && -n $QUARTO_TESTS_FORCE_NO_PIPENV ]]; then
76
export QUARTO_TESTS_FORCE_NO_VENV=$QUARTO_TESTS_FORCE_NO_PIPENV
77
fi
78
if [[ -z $QUARTO_TESTS_FORCE_NO_VENV ]]
79
then
80
# Save possible activated virtualenv for later restauration
81
OLD_VIRTUAL_ENV=$VIRTUAL_ENV
82
if [[ "$VERBOSE_MODE" == "true" ]]; then
83
echo "> Activating virtualenv from .venv for Python tests in Quarto"
84
fi
85
source "${QUARTO_ROOT}/tests/.venv/bin/activate"
86
if [[ "$VERBOSE_MODE" == "true" ]]; then
87
echo "> Using Python from $(which python)"
88
echo "> VIRTUAL_ENV: ${VIRTUAL_ENV}"
89
fi
90
quarto_venv_activated="true"
91
fi
92
93
SMOKE_ALL_TEST_FILE="./smoke/smoke-all.test.ts"
94
95
# RUN FOR TIMING TESTS ONLY
96
if [ "$QUARTO_TEST_TIMING" != "" ] && [ "$QUARTO_TEST_TIMING" != "false" ]; then
97
if [ "$QUARTO_TEST_TIMING" == "true" ]; then
98
QUARTO_TEST_TIMING="timing.txt"
99
fi
100
echo "> Running tests with timing and writing to ${QUARTO_TEST_TIMING}"
101
rm -f $QUARTO_TEST_TIMING
102
FILES=$@
103
if [ "$FILES" == "" ]; then
104
FILES=`find . | grep \.test\.ts$ | sort`
105
fi
106
for i in $FILES; do
107
if [ "$i" == "./test.ts" ]; then
108
# ignoring this file as this is not a test file to time
109
continue
110
fi
111
# For smoke-all.test.ts, each smoke-all document test needs to be timed.
112
if [ "$i" == "$SMOKE_ALL_TEST_FILE" ]; then
113
echo "> Timing smoke-all tests"
114
SMOKE_ALL_FILES=`find docs/smoke-all/ -type f -regextype "posix-extended" -regex ".*/[^_][^/]*[.]qmd" -o -regex ".*/[^_][^/]*[.]md" -o -regex ".*/[^_][^/]*[.]ipynb"`
115
for j in $SMOKE_ALL_FILES; do
116
echo "${SMOKE_ALL_TEST_FILE} -- ${j}" >> "$QUARTO_TEST_TIMING"
117
/usr/bin/time -f " %e real %U user %S sys" -a -o ${QUARTO_TEST_TIMING} "${QUARTO_BIN_PATH}/tools/${DENO_ARCH_DIR}/deno" test ${QUARTO_DENO_OPTIONS} --no-check ${QUARTO_DENO_EXTRA_OPTIONS} "${QUARTO_IMPORT_MAP_ARG}" ${SMOKE_ALL_TEST_FILE} -- ${j}
118
done
119
continue
120
fi
121
# Otherwise we time the individual test.ts test
122
echo $i >> "$QUARTO_TEST_TIMING"
123
/usr/bin/time -f " %e real %U user %S sys" -a -o "$QUARTO_TEST_TIMING" "${QUARTO_BIN_PATH}/tools/${DENO_ARCH_DIR}/deno" test ${QUARTO_DENO_OPTIONS} --no-check ${QUARTO_DENO_EXTRA_OPTIONS} "${QUARTO_IMPORT_MAP_ARG}" $i
124
done
125
# exit the script with an error code if the timing file shows error
126
grep -q 'Command exited with non-zero status' $QUARTO_TEST_TIMING && SUCCESS=1 || SUCCESS=0
127
else
128
# RUN WHEN NO TIMING (GENERIC CASE)
129
130
## Short version syntax to run smoke-all.test.ts
131
## Only use if different than ./run-test.sh ./smoke/smoke-all.test.ts
132
if [[ "$1" =~ smoke-all\.test\.ts ]]; then
133
TESTS_TO_RUN=$@
134
else
135
# Check file argument
136
SMOKE_ALL_FILES=""
137
TESTS_TO_RUN=""
138
if [[ ! -z "$*" ]]; then
139
for file in "$*"; do
140
filename=$(basename "$file")
141
# smoke-all.test.ts works with .qmd, .md and .ipynb but will ignored file starting with _
142
if [[ $filename =~ ^[^_].*[.]qmd$ ]] || [[ $filename =~ ^[^_].*[.]ipynb$ ]] || [[ $filename =~ ^[^_].*[.]md$ ]]; then
143
SMOKE_ALL_FILES="${SMOKE_ALL_FILES} ${file}"
144
elif [[ $file =~ .*[.]ts$ ]]; then
145
TESTS_TO_RUN="${TESTS_TO_RUN} ${file}"
146
else
147
echo "#### WARNING"
148
echo "Only .ts, or .qmd, .md and .ipynb passed to smoke-all.test.ts are accepted (file starting with _ are ignored)."
149
echo "####"
150
exit 1
151
fi
152
done
153
fi
154
if [ "$SMOKE_ALL_FILES" != "" ]; then
155
if [ "$TESTS_TO_RUN" != "" ]; then
156
echo "#### WARNING"
157
echo "When passing .qmd, .md and/or .ipynb, only ./smoke/smoke-all.test.ts will be run. Other tests files are ignored."
158
echo "Ignoring ${TESTS_TO_RUN}."
159
echo "####"
160
fi
161
TESTS_TO_RUN="${SMOKE_ALL_TEST_FILE} -- ${SMOKE_ALL_FILES}"
162
fi
163
fi
164
"${QUARTO_BIN_PATH}/tools/${DENO_ARCH_DIR}/deno" test ${QUARTO_DENO_OPTIONS} --check ${QUARTO_DENO_EXTRA_OPTIONS} "${QUARTO_IMPORT_MAP_ARG}" $TESTS_TO_RUN
165
SUCCESS=$?
166
fi
167
168
if [[ $quarto_venv_activated == "true" ]]
169
then
170
if [[ "$VERBOSE_MODE" == "true" ]]; then
171
echo "> Exiting virtualenv activated for tests"
172
fi
173
deactivate
174
if [[ "$VERBOSE_MODE" == "true" ]]; then
175
echo "> Using Python from $(which python)"
176
echo "> VIRTUAL_ENV: ${VIRTUAL_ENV}"
177
fi
178
unset quarto_venv_activated
179
fi
180
if [[ -n $OLD_VIRTUAL_ENV ]]
181
then
182
if [[ "$VERBOSE_MODE" == "true" ]]; then
183
echo "> Reactivating original virtualenv"
184
fi
185
source $OLD_VIRTUAL_ENV/bin/activate
186
if [[ "$VERBOSE_MODE" == "true" ]]; then
187
echo "> Using Python from $(which python)"
188
echo "> VIRTUAL_ENV: ${VIRTUAL_ENV}"
189
fi
190
unset OLD_VIRTUAL_ENV
191
fi
192
193
# Generates the coverage report
194
if [[ $@ == *"--coverage"* ]]; then
195
196
# read the coverage value from the command
197
[[ $@ =~ .*--coverage=(.+) ]] && export COV="${BASH_REMATCH[1]}"
198
199
echo Generating coverage report...
200
${QUARTO_BIN_PATH}/tools/${DENO_ARCH_DIR}/deno coverage --unstable-kv --unstable-ffi ${COV} --lcov > ${COV}.lcov
201
genhtml -o ${COV}/html ${COV}.lcov
202
open ${COV}/html/index.html
203
fi
204
205
exit ${SUCCESS}
206
207