Rombobjörn

summaryrefslogtreecommitdiff
path: root/testsuite/run_tests
blob: 06e9c4c65b88ea12d1cd703ca2b97098192296c3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#!/bin/sh

# Comfignat's testsuite
# Copyright 2013 - 2014 B. Persson, Bjorn@Rombobeorn.se
#
# This material is provided as is, with absolutely no warranty expressed
# or implied. Any use is at your own risk.
#
# Permission is hereby granted to use or copy this testsuite
# for any purpose, provided the above notices are retained on all copies.
# Permission to modify the code and to distribute modified code is granted,
# provided the above notices are retained, and a notice that the code was
# modified is included with the above copyright notice.


# It is hoped that this program will work in any Posix-compliant shell.

set -e

# Get the command line parameters.
outer_srcdir="$1"
outer_builddir="$2"

testsuitedir="${outer_srcdir}"/testsuite

# Initialize counters.
passed=0
failed=0

# The testcases should use their own build directories, not the one of the Make
# process that invoked the testsuite.
Comfignat_overriding_absolute_builddir=
Comfignat_overriding_absolute_objdir=
Comfignat_overriding_absolute_stagedir=

# variables that the testcases need:
export file_list          # absolute pathname of list of expected files
export srcdir             # testcase's source directory relative to testrundir
export builddir           # testcase's build directory relative to testrundir
export relative_builddir  # testcase's build directory relative to srcdir
export dirgpr="${testsuitedir}"/test_directories.gpr


pass () {
   # Report the current testcase as passed.
   echo "${test_name}: PASSED"
   passed=$((passed + 1))
}


fail () {
   # Report the current testcase as failed.
   # Parameters:
   #    1: a message about what went wrong
   #    2: the name of a file with details about the error
   echo "${test_name}: FAILED"
   echo "$1"
   cat "$2"
   echo
   failed=$((failed + 1))
}


# Clean out any old test results.
rm -Rf "${outer_builddir}"/testruns

for source_directory in "${testsuitedir}"/sources/* ; do
   for location_file in "${testsuitedir}"/locations/* ; do
      for input_script in "${testsuitedir}"/inputs/* ; do

         # Compose the name of the combined testcase.
         test_name=$(basename "${source_directory}")+$(basename "${location_file}")+$(basename "${input_script}")
         testrundir="${outer_builddir}"/testruns/"${test_name}"
         file_list="${testrundir}"/files.expected
         mkdir -p "${testrundir}"
         cd "${testrundir}"

         # Get the source and build directory names.
         . "${location_file}"
         mkdir -p "${srcdir}"
         if [ "${relative_builddir}" != . ] ; then
            echo "${builddir}" >>files.expected
         fi

         # Populate the source directory.
         cp -RHp "${source_directory}"/* "${srcdir}"
         cp -p "${outer_srcdir}"/comfignat.* "${srcdir}"
         find "${srcdir}" >>files.expected

         # Run the testcase in a child process.
         # The child process first loads the function library and then runs the
         # input script.
         if sh -e -c ". ${testsuitedir}/library; . ${input_script}" >output 2>&1 ; then

            # Check that the expected files and no others are present.
            # Sort the list of expected files and remove duplicates.
            LC_COLLATE=C sort -u -o files.expected files.expected
            # List all files in the build directory except for the directory
            # where intermediate files are suposed to be. List the files in the
            # source directory separately if the directories are separate. Sort
            # the combined list the same way as the list of expected files is
            # sorted. Then compare the lists.
            if ( find "${builddir}" | grep -v ^"${builddir}"/obj ; test "${relative_builddir}" != . && find "${srcdir}" ) | LC_COLLATE=C sort | diff files.expected - >files.diff ; then

               # Check that the source files haven't been mangled.
               cd "${source_directory}"
               find . -type f ! -exec cmp -s "{}" "${testrundir}/${srcdir}/{}" \; -print >> "${testrundir}"/changed_sources
               cd "${outer_srcdir}"
               for file in comfignat.* ; do
                  if ! cmp -s ${file} "${testrundir}/${srcdir}/${file}" ; then
                     echo ${file} >> "${testrundir}"/changed_sources
                  fi
               done
               if [ -s "${testrundir}"/changed_sources ] ; then
                  fail "Changed soure files:" "${testrundir}"/changed_sources
               else
                  pass
               fi
            else
               fail "Difference from the list of expected files:" files.diff
            fi
         else
            fail "Error code: $?" output
         fi

      done
   done
done

echo
echo "passed: ${passed}, failed: ${failed}"
exit ${failed}