summaryrefslogtreecommitdiff
path: root/test/tet/bin/munge-ts
diff options
context:
space:
mode:
Diffstat (limited to 'test/tet/bin/munge-ts')
-rwxr-xr-xtest/tet/bin/munge-ts168
1 files changed, 168 insertions, 0 deletions
diff --git a/test/tet/bin/munge-ts b/test/tet/bin/munge-ts
new file mode 100755
index 000000000000..a3d034ae0bec
--- /dev/null
+++ b/test/tet/bin/munge-ts
@@ -0,0 +1,168 @@
+#!/bin/sh
+#
+# $Id: munge-ts 2834 2012-12-30 16:34:47Z jkoshy $
+#
+# This shell script generates scaffolding for a TET C API test case
+# given a list of objects that use the TET C API.
+#
+# - If the TET extended API function "tet_isdefic" is present, then
+# no scaffolding is generated. In such cases, the test case
+# is assumed to be self-sufficient.
+#
+# - If the symbol "tet_testlist[]' is defined, then no scaffolding is
+# generated.
+#
+# - Otherwise, a "struct tet_testlist []" array is generated from the
+# names of public functions in the objects.
+#
+# Functions with names matching "^tp\(.*\)" are treated as test
+# purposes belonging to a test case named "Default".
+#
+# Functions with names matching '^tc\([a-zA-Z0-9_]+\)' are treated
+# as test case names.
+#
+# Functions with names matching '^tc\([a-zA-Z0-9_]*\)_tp.*'
+# are treated as test purposes belonging to the test case named
+# by the first regular expression. Test purposes in a given test
+# case are invoked in lexicographic sort order.
+#
+# - If variables "tet_startup" or "tet_cleanup" are not defined in the
+# objects given to the script, a suitable NULL pointer definition
+# is generated.
+#
+# - A scenario file that invokes each test case independently of the
+# others is generated. This scenario file is intended to be
+# included, using TET's ":include:" syntax, from a higher-level
+# scenario file.
+
+usage()
+{
+ echo Usage: `basename $0`: "[options] objects..."
+ echo
+ /bin/echo -e " Generate TET scaffolding from objects. " \
+ "Options include:"
+ /bin/echo -e "\t-o out\t\tcreate output file \"out\" " \
+ "[default \"tc.c\"]."
+ /bin/echo -e "\t-s scen\t\tcreate scenario file \"scen\" " \
+ "[default \"tet_scen\"]."
+ /bin/echo -e "\t-p prefix\t\tprefix for naming test cases"
+}
+
+output="tc.c"
+scen="tet_scen"
+
+args=`getopt o:p:s: $*`
+if [ ${?} -ne 0 ]; then
+ usage
+ exit 2
+fi
+
+set -- ${args}
+
+for i
+do
+ case "${i}" in
+ -o )
+ output="${2}";
+ shift; shift;;
+ -p )
+ prefix="${2}";
+ shift; shift;;
+ -s )
+ scen="${2}";
+ shift; shift;;
+ -- )
+ shift; break;;
+ esac
+done
+
+if [ ${#} -eq 0 ]; then
+ usage
+ exit 2
+fi
+
+exec > ${output}
+echo "\
+/*
+ * WARNING! WARNING! WARNING! WARNING! WARNING! WARNING!
+ *
+ * THIS FILE IS GENERATED FROM: ${@}
+ */
+#include <tet_api.h>"
+
+if ! nm ${*} | sort -k 3 | \
+ awk -v scen=${scen} -v prefix=${prefix} '
+ BEGIN { do_scaffolding = 1; tcseq[ntc++] = "Default"; }
+ $2 == "T" && $3 ~ "^tc" {
+ fnname = substr($3,3);
+
+ if (match(fnname, "^.*_tp"))
+ tcname = substr(fnname,RSTART,RLENGTH-3);
+ else
+ tcname = fnname;
+
+ if (ptc != tcname) {
+ tcseq[ntc++] = tcname;
+ ptc = tcname;
+ }
+
+ c = tc[tcname]++;
+ tp[tcname,c] = $3
+ }
+ $2 == "T" && $3 ~ "^tp" {
+ tcname = "Default";
+
+ c = tc[tcname]++;
+ tp[tcname,c++] = $3;
+ }
+ $2 == "T" && $3 == "tet_isdefic" { do_scaffolding = 0 }
+ $2 == "D" && $3 == "tet_testlist" { do_scaffolding = 0 }
+ $2 == "D" && $3 == "tet_cleanup" { has_tc_cleanup = 1 }
+ $2 == "D" && $3 == "tet_startup" { has_tc_startup = 1 }
+ $1 == "U" && $2 == "elfts_compare_files" {
+ printf("#include \"elfts-compare-files.c\"\n");
+ }
+ $1 == "U" && $2 == "elfts_copy_file" {
+ printf("#include \"elfts-copy-file.c\"\n");
+ }
+ $1 == "U" && $2 == "elfts_init_version" {
+ printf("#include \"elfts-initversion.c\"\n");
+ }
+ $1 == "U" && $2 == "elfts_open_file" {
+ printf("#include \"elfts-openfile.c\"\n");
+ }
+ END {
+ if (do_scaffolding == 0)
+ exit(1);
+
+ if (has_tc_startup == 0) {
+ printf("void (*tet_startup)(void) = NULL;\n");
+ }
+
+ if (has_tc_cleanup == 0) {
+ printf("void (*tet_cleanup)(void) = NULL;\n");
+ }
+
+ for (tcname in tc) {
+ nc = tc[tcname];
+ for (c = 0; c < nc; c++)
+ printf("void %s();\n", tp[tcname,c]);
+ }
+
+ printf("struct tet_testlist tet_testlist[] = {\n");
+
+ n = 0;
+ for (n = 0; n < ntc; n++) {
+ tcname = tcseq[n];
+ nc = tc[tcname];
+ for (c = 0; c < nc; c++) {
+ printf("\t{%s,%d},\n", tp[tcname,c], n);
+ }
+ if (nc > 0)
+ printf("/%s{%d}\n", prefix, n) > scen;
+ }
+ printf("\t{NULL,0} };\n");
+ }'; then
+ rm ${output} ${scen}
+ exit 1
+fi