50 echo "Usage: $NAME [OPTION]... [--] [CUCUMBER_ARGS]...
51 Sets up an appropriate environment and invokes cucumber. Note that this script
52 must be run from the Tails source directory root.
54 Options for '@product' features:
55 --artifacts-base-uri URI
56 Pretend that the artifact is located at URI when printing
57 its location during a scenario failure. This is useful if
58 you intend to serve the artifacts via the web, for
60 --capture Captures failed scenarios into videos stored in the
61 temporary directory (see --tmpdir below) using x264
62 encoding. Requires x264.
63 --capture-all Keep videos for all scenarios, including those that
64 succeed (implies --capture).
65 --interactive-debugging
66 On failure, pause test suite until pressing Enter. Also
67 offer the option to open an interactive Ruby shell (pry)
68 in the Cucumber world's context.
69 --keep-snapshots Don't ever delete any snapshots (including ones marked as
70 temporary). This can be a big time saver when debugging new
72 --retry-find Print a warning whenever Sikuli fails to find an image
73 and allow *one* retry after pressing ENTER. This is useful
74 for updating outdated images.
75 --tmpdir Directory where various temporary files are written
76 during a test, e.g. VM snapshots and memory dumps,
77 failure screenshots, pcap files and disk images
78 (default is TMPDIR in the environment, and if unset,
80 --view Shows the test session in a windows. Requires x11vnc
82 --vnc-server-only Starts a VNC server for the test session. Requires x11vnc.
83 --iso IMAGE Test '@product' features using IMAGE.
84 --old-iso IMAGE For some '@product' features (e.g. usb_install) we need
85 an older version of Tails, which this options sets to
86 IMAGE. If none is given, it defaults to the same IMAGE
87 given by --iso, which will be good enough for most testing
90 Note that '@source' features has no relevant options.
92 CUCUMBER_ARGS can be used to specify which features to be run, but also any
93 cucumber option, although then you must pass \`--\` first to let this wrapper
94 script know that we're done with *its* options. For debugging purposes, a
95 'debug' formatter has been added so pretty debugging can be enabled with
96 \`--format debug\`. You could even combine the default (pretty) formatter with
97 pretty debugging printed to a file with \`--format pretty --format debug
103 echo "${NAME}: error: ${*}" >&2
108 package_installed
() {
111 if dpkg
-s "${1}" 2>/dev
/null |
grep -q "^Status:.*installed"; then
120 check_dependencies
() {
121 while [ -n "${1:-}" ]; do
122 if ! which "${1}" >/dev
/null
&& ! package_installed
"${1}" ; then
123 error
"'${1}' is missing, please install it and run again."
130 [ -e "/tmp/.X${1#:}-lock" ] ||
[ -e "/tmp/.X11-unix/X${1#:}" ]
133 next_free_display
() {
135 while display_in_use
":${display_nr}"; do
136 display_nr
=$
((display_nr
+1))
138 echo ":${display_nr}"
141 test_suite_cleanup
() {
142 (kill -0 ${XVFB_PID} 2>/dev
/null
&& kill ${XVFB_PID}) ||
/bin
/true
146 Xvfb
$TARGET_DISPLAY -screen 0 1024x768x24
+32 >/dev
/null
2>&1 &
148 # Wait for Xvfb to run on TARGET_DISPLAY
149 until display_in_use
$TARGET_DISPLAY; do
152 echo "Virtual X framebuffer started on display ${TARGET_DISPLAY}"
153 # Hide the mouse cursor so it won't mess up Sikuli's screen scanning
154 unclutter
-display $TARGET_DISPLAY -root -idle 0.1 >/dev
/null
2>&1 &
158 check_dependencies x11vnc
159 VNC_SERVER_PORT
="$(x11vnc -listen localhost -display ${TARGET_DISPLAY} \
160 -bg -nopw -forever 2>&1 | \
161 grep -m 1 "^PORT
=[0-9]\
+" | sed 's/^PORT=//')"
162 echo "VNC server running on: localhost:${VNC_SERVER_PORT}"
166 check_dependencies tigervnc-viewer
167 xtigervncviewer
-nojpeg -viewonly localhost
:${VNC_SERVER_PORT} 1>/dev
/null
2>&1 &
171 check_dependencies libvpx1
172 echo "Capturing guest display into ${CAPTURE_FILE}"
173 avconv
-f x11grab
-s 1024x768
-r 15 -i ${TARGET_DISPLAY}.0 -an \
174 -vcodec libvpx
-y "${CAPTURE_FILE}" >/dev
/null
2>&1 &
179 # Unset all environment variables used by this script to pass options
180 # to cucumber, except TMPDIR since we explicitly want to support
181 # setting it that way.
188 INTERACTIVE_DEBUGGING
=
190 SIKULI_RETRY_FINDFAILED
=
194 LONGOPTS
="artifacts-base-uri:,view,vnc-server-only,capture,capture-all,help,tmpdir:,keep-snapshots,retry-find,iso:,old-iso:,interactive-debugging"
195 OPTS
=$
(getopt
-o "" --longoptions $LONGOPTS -n "${NAME}" -- "$@")
197 while [ $# -gt 0 ]; do
199 --artifacts-base-uri)
201 export ARTIFACTS_BASE_URI
="${1}"
212 check_dependencies x264
216 check_dependencies x264
218 export CAPTURE_ALL
="yes"
220 --interactive-debugging)
221 export INTERACTIVE_DEBUGGING
="yes"
224 export KEEP_SNAPSHOTS
="yes"
227 export SIKULI_RETRY_FINDFAILED
="yes"
231 export TMPDIR
="$(readlink -f $1)"
235 export TAILS_ISO
="$(readlink -f $1)"
239 export OLD_TAILS_ISO
="$(readlink -f $1)"
253 trap "test_suite_cleanup" EXIT HUP INT QUIT TERM
255 check_dependencies
${GENERAL_DEPENDENCIES}
257 TARGET_DISPLAY
=$
(next_free_display
)
261 if [ -n "${VNC_SERVER:-}" ]; then
264 if [ -n "${VNC_VIEWER:-}" ]; then
268 export SIKULI_HOME
="/usr/share/java"
269 export DISPLAY
=${TARGET_DISPLAY}