Add infrastructure for generic mock tools
authorJacob Bachmeyer <jcb@gnu.org>
Wed, 17 Mar 2021 03:02:50 +0000 (22:02 -0500)
committerJacob Bachmeyer <jcb@gnu.org>
Wed, 17 Mar 2021 03:02:50 +0000 (22:02 -0500)
testsuite/lib/exec/mocktool [new file with mode: 0755]

diff --git a/testsuite/lib/exec/mocktool b/testsuite/lib/exec/mocktool
new file mode 100755 (executable)
index 0000000..cf836e4
--- /dev/null
@@ -0,0 +1,61 @@
+#!/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