123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- #!/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; }
- # 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"
- }
- # find the tor binary
- if [ $# -ge 1 ]; then
- TOR_BINARY="${1}"
- shift
- else
- TOR_BINARY="${TESTING_TOR_BINARY:-./src/app/tor}"
- fi
- TOR_BINARY="$(abspath "$TOR_BINARY")"
- # 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"
- PREV_DIR="$(pwd)"
- cd "${dir}"
- if test -f "./torrc.defaults"; then
- DEFAULTS="./torrc.defaults"
- else
- DEFAULTS="${DATA_DIR}/EMPTY"
- fi
- if test -f "./cmdline"; then
- CMDLINE="$(cat ./cmdline)"
- else
- CMDLINE=""
- fi
- if test -f "./expected"; then
- if test -f "./error"; then
- 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.
- "${TOR_BINARY}" -f "./torrc" \
- --defaults-torrc "${DEFAULTS}" \
- --dump-config short \
- ${CMDLINE} \
- | "${FILTER}" > "${DATA_DIR}/output.${testname}" \
- || die "Failure: Tor exited."
- if cmp "./expected" "${DATA_DIR}/output.${testname}">/dev/null ; then
- # 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"
- diff -u "./expected" "${DATA_DIR}/output.${testname}"
- exit 1
- fi
- elif test -f "./error"; then
- # This case should fail: run verify-config and see if it does.
- "${TOR_BINARY}" --verify-config \
- -f ./torrc \
- --defaults-torrc "${DEFAULTS}" \
- ${CMDLINE} \
- > "${DATA_DIR}/output.${testname}" \
- && die "Failure: Tor did not report an error."
- expect_err="$(cat ./error)"
- 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
- cd "${PREV_DIR}"
- done
|