--- /dev/null
+#!/bin/bash
+# -*- bash -*-
+
+# Copyright (C) 2021 Jacob Bachmeyer
+#
+# This file is part of a testsuite for the GNU FTP upload system.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Tool="${1?usage: mocktool <tool> <args>}"
+MockFile="${TEST_BASE_DIR:?}/mocks"
+
+if [ ! -f "$MockFile" ]; then
+ echo $0: line $LINENO: $MockFile not found 1>&2
+ exit 1
+fi
+
+shift # drop $Tool from args
+args="$Tool $*"
+sorted_args=$(echo $(for arg in "$@"; do echo $arg; done | sort) )
+sorted_args="$Tool $sorted_args"
+
+matched=false
+while read token rest ; do
+ if $matched; then
+ case $token in
+ ':'|':^') exit 0 ;;
+ '>') echo $rest ;;
+ '?') exit $rest ;;
+ esac
+ else
+ case $token in
+ ':')
+ if expr match "$args" "${rest}\$" >/dev/null; then
+ matched=true
+ fi
+ ;;
+ ':^')
+ if expr match "$sorted_args" "${rest}\$" >/dev/null; then
+ matched=true
+ fi
+ ;;
+ esac
+ fi
+done < "$MockFile"
+
+echo $0: line $LINENO: eof reached reading $MockFile 1>&2
+exit 1
+
+# EOF