2019-09-11 14:50:06 -04:00
|
|
|
#!/bin/sh
|
|
|
|
# Copyright 2019, The Tor Project, Inc.
|
|
|
|
# See LICENSE for licensing information
|
|
|
|
|
|
|
|
# Integration test script for verifying that Tor configurations are parsed as
|
|
|
|
# we expect.
|
|
|
|
#
|
|
|
|
# Valid configurations are tested with --dump-config, which parses and
|
|
|
|
# validates the configuration before writing it out. We then make sure that
|
|
|
|
# the result is what we expect, before parsing and dumping it again to make
|
|
|
|
# sure that there is no change.
|
|
|
|
#
|
|
|
|
# Invalid configurations are tested with --verify-config, which parses
|
|
|
|
# and validates the configuration. We capture its output and make sure that
|
|
|
|
# it contains the error message we expect.
|
|
|
|
|
|
|
|
# This script looks for its test cases as individual directories in
|
|
|
|
# src/test/conf_examples/. Each test may have these files:
|
|
|
|
#
|
|
|
|
# torrc -- Usually needed. This file is passed to Tor on the command line
|
|
|
|
# with the "-f" flag. (If you omit it, you'll test Tor's behavior when
|
|
|
|
# it receives a nonexistent configuration file.)
|
|
|
|
#
|
|
|
|
# torrc.defaults -- Optional. If present, it is passed to Tor on the command
|
|
|
|
# line with the --defaults-torrc option. If this file is absent, an empty
|
|
|
|
# file is passed instead to prevent Tor from reading the system defaults.
|
|
|
|
#
|
|
|
|
# cmdline -- Optional. If present, it contains command-line arguments that
|
|
|
|
# will be passed to Tor.
|
|
|
|
#
|
|
|
|
# expected -- If this file is present, then it should be the expected result
|
|
|
|
# of "--dump-config short" for this test case. Exactly one of
|
|
|
|
# "expected" or "error" must be present, or the test will fail.
|
|
|
|
#
|
|
|
|
# error -- If this file is present, then it contains a regex that must be
|
|
|
|
# matched by some line in the output of "--verify-config", which must
|
|
|
|
# fail. Exactly one of "expected" or "error" must be present, or the
|
|
|
|
# test will fail.
|
|
|
|
|
|
|
|
umask 077
|
|
|
|
set -e
|
|
|
|
die() { echo "$1" >&2 ; exit 5; }
|
|
|
|
|
2019-09-13 16:45:58 -04:00
|
|
|
# emulate realpath(), in case coreutils or equivalent is not installed.
|
|
|
|
abspath() {
|
|
|
|
f=$@
|
|
|
|
if [ -d "$f" ]; then
|
|
|
|
dir="$f"
|
|
|
|
base=""
|
|
|
|
else
|
|
|
|
dir="$(dirname "$f")"
|
|
|
|
base="/$(basename "$f")"
|
|
|
|
fi
|
|
|
|
dir="$(cd "$dir" && pwd)"
|
|
|
|
echo "$dir$base"
|
|
|
|
}
|
|
|
|
|
2019-09-11 14:50:06 -04:00
|
|
|
# find the tor binary
|
|
|
|
if [ $# -ge 1 ]; then
|
|
|
|
TOR_BINARY="${1}"
|
|
|
|
shift
|
|
|
|
else
|
|
|
|
TOR_BINARY="${TESTING_TOR_BINARY:-./src/app/tor}"
|
|
|
|
fi
|
|
|
|
|
2019-09-13 16:45:58 -04:00
|
|
|
TOR_BINARY="$(abspath "$TOR_BINARY")"
|
|
|
|
|
2019-09-11 14:50:06 -04:00
|
|
|
# make a safe space for temporary files
|
|
|
|
DATA_DIR=$(mktemp -d -t tor_parseconf_tests.XXXXXX)
|
|
|
|
trap 'rm -rf "$DATA_DIR"' 0
|
|
|
|
touch "${DATA_DIR}/EMPTY" || die "Couldn't create empty file."
|
|
|
|
|
|
|
|
# This is where we look for examples
|
|
|
|
EXAMPLEDIR="$(dirname "$0")"/conf_examples
|
|
|
|
|
|
|
|
case "$(uname -s)" in
|
|
|
|
CYGWIN*) WINDOWS=1;;
|
|
|
|
MINGW*) WINDOWS=1;;
|
|
|
|
MSYS*) WINDOWS=1;;
|
|
|
|
*) WINDOWS=0;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
if test "$WINDOWS" = 1; then
|
|
|
|
FILTER="dos2unix"
|
|
|
|
else
|
|
|
|
FILTER="cat"
|
|
|
|
fi
|
|
|
|
|
|
|
|
for dir in "${EXAMPLEDIR}"/*; do
|
|
|
|
if ! test -d "${dir}"; then
|
|
|
|
# Only count directories.
|
|
|
|
continue
|
|
|
|
fi
|
|
|
|
|
|
|
|
testname="$(basename "${dir}")"
|
|
|
|
# We use printf since "echo -n" is not standard
|
|
|
|
printf "%s: " "$testname"
|
|
|
|
|
2019-09-13 16:45:58 -04:00
|
|
|
PREV_DIR="$(pwd)"
|
|
|
|
cd "${dir}"
|
|
|
|
|
|
|
|
if test -f "./torrc.defaults"; then
|
|
|
|
DEFAULTS="./torrc.defaults"
|
2019-09-11 14:50:06 -04:00
|
|
|
else
|
|
|
|
DEFAULTS="${DATA_DIR}/EMPTY"
|
|
|
|
fi
|
|
|
|
|
2019-09-13 16:45:58 -04:00
|
|
|
if test -f "./cmdline"; then
|
|
|
|
CMDLINE="$(cat ./cmdline)"
|
2019-09-11 14:50:06 -04:00
|
|
|
else
|
|
|
|
CMDLINE=""
|
|
|
|
fi
|
|
|
|
|
2019-09-13 16:45:58 -04:00
|
|
|
if test -f "./expected"; then
|
|
|
|
if test -f "./error"; then
|
2019-09-11 14:50:06 -04:00
|
|
|
echo "FAIL: Found both ${dir}/expected and ${dir}/error."
|
|
|
|
echo "(Only one of these files should exist.)"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
# This case should succeed: run dump-config and see if it does.
|
|
|
|
|
2019-09-13 16:45:58 -04:00
|
|
|
"${TOR_BINARY}" -f "./torrc" \
|
2019-09-11 14:50:06 -04:00
|
|
|
--defaults-torrc "${DEFAULTS}" \
|
|
|
|
--dump-config short \
|
|
|
|
${CMDLINE} \
|
|
|
|
| "${FILTER}" > "${DATA_DIR}/output.${testname}" \
|
|
|
|
|| die "Failure: Tor exited."
|
|
|
|
|
2019-09-13 16:45:58 -04:00
|
|
|
if cmp "./expected" "${DATA_DIR}/output.${testname}">/dev/null ; then
|
2019-09-11 14:50:06 -04:00
|
|
|
# Check round-trip.
|
|
|
|
"${TOR_BINARY}" -f "${DATA_DIR}/output.${testname}" \
|
|
|
|
--defaults-torrc "${DATA_DIR}/empty" \
|
|
|
|
--dump-config short \
|
|
|
|
| "${FILTER}" \
|
|
|
|
> "${DATA_DIR}/output_2.${testname}" \
|
|
|
|
|| die "Failure: Tor exited on round-trip."
|
|
|
|
|
|
|
|
if ! cmp "${DATA_DIR}/output.${testname}" \
|
|
|
|
"${DATA_DIR}/output_2.${testname}"; then
|
|
|
|
echo "Failure: did not match on round-trip."
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
echo "OK"
|
|
|
|
else
|
|
|
|
echo "FAIL"
|
2019-09-13 16:45:58 -04:00
|
|
|
diff -u "./expected" "${DATA_DIR}/output.${testname}"
|
2019-09-11 14:50:06 -04:00
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
2019-09-13 16:45:58 -04:00
|
|
|
elif test -f "./error"; then
|
2019-09-11 14:50:06 -04:00
|
|
|
# This case should fail: run verify-config and see if it does.
|
|
|
|
|
|
|
|
"${TOR_BINARY}" --verify-config \
|
2019-09-13 16:45:58 -04:00
|
|
|
-f ./torrc \
|
2019-09-11 14:50:06 -04:00
|
|
|
--defaults-torrc "${DEFAULTS}" \
|
|
|
|
${CMDLINE} \
|
|
|
|
> "${DATA_DIR}/output.${testname}" \
|
|
|
|
&& die "Failure: Tor did not report an error."
|
|
|
|
|
2019-09-13 16:45:58 -04:00
|
|
|
expect_err="$(cat ./error)"
|
2019-09-11 14:50:06 -04:00
|
|
|
if grep "${expect_err}" "${DATA_DIR}/output.${testname}" >/dev/null; then
|
|
|
|
echo "OK"
|
|
|
|
else
|
|
|
|
echo "FAIL"
|
|
|
|
echo "Expected error: ${expect_err}"
|
|
|
|
echo "Tor said:"
|
|
|
|
cat "${DATA_DIR}/output.${testname}"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
else
|
|
|
|
# This case is not actually configured with a success or a failure.
|
|
|
|
# call that an error.
|
|
|
|
|
|
|
|
echo "FAIL: Did not find ${dir}/expected or ${dir}/error."
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
2019-09-13 16:45:58 -04:00
|
|
|
cd "${PREV_DIR}"
|
|
|
|
|
2019-09-11 14:50:06 -04:00
|
|
|
done
|