File: common.sh.in

package info (click to toggle)
nmh 1.6-2
  • links: PTS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 6,204 kB
  • ctags: 3,851
  • sloc: ansic: 48,922; sh: 16,422; makefile: 559; perl: 509; lex: 402; awk: 74
file content (307 lines) | stat: -rw-r--r-- 9,193 bytes parent folder | download | duplicates (2)
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
# Common helper routines for test shell scripts -- intended to be sourced by them
# @configure_input@


#### The following exported variables are set by "make check".  Ensure
#### that they are set here so that individual tests can be run
#### outside of make.  Requires that MH_OBJ_DIR be set on entry.
test -z "$MH_TEST_DIR"  &&  MH_TEST_DIR="$MH_OBJ_DIR/test/testdir"
test -z "$prefix"  &&  prefix=@prefix@
test -z "$datarootdir"  &&  datarootdir=@datarootdir@
test -z "$exec_prefix"  &&  exec_prefix=@exec_prefix@
test -z "$auxexecdir"  &&  auxexecdir="@libdir@"
test -z "$bindir"  &&  bindir="@bindir@"
test -z "$mandir"  &&  mandir="@mandir@"
test -z "$sysconfdir"  &&  sysconfdir="@sysconfdir@"
test -z "$supported_locks"  &&  supported_locks="@supported_locks@"
test -z "$default_locking"  &&  default_locking="@default_locking@"
test -z "$MULTIBYTE_ENABLED"  &&  MULTIBYTE_ENABLED="@MULTIBYTE_ENABLED@"
test -z "$ICONV_ENABLED"  &&  ICONV_ENABLED="@ICONV_ENABLED@"
export MH_TEST_DIR auxexecdir bindir mandir sysconfdir
export MULTIBYTE_ENABLED ICONV_ENABLED

test -z "$MH_INST_DIR"  &&  MH_INST_DIR="${MH_TEST_DIR}/inst"
export MH_INST_DIR

unset MAILDROP MHBUILD MHCONTEXT MHMTSUSERCONF MHN MHSHOW MHSTORE
unset MHLDEBUG MHPDEBUG MHWDEBUG PAGER
#### Set LC_ALL in individual tests as needed.  Unset these so
#### that we don't depend on user's settings in other tests.
unset LANG LC_ALL LC_CTYPE

#### Use a test dir for tmp files when MHTMPDIR applies.
MHTMPDIR=$MH_TEST_DIR/Mail
export MHTMPDIR

output_md5()
{
  #### Output just the checksum.  If the filename needs to appear on
  #### the same line, the caller needs to add it.  This avoids
  #### differences due to a leading '*' binary file indicator, for
  #### text files, on some platforms (Cygwin).
  @MD5SUM@ $* | @MD5FMT@ | awk '{print $1}'
}

#### Use built-in $((...)) in test suite if shell supports it.
#### Borrowed from configure's as_fn_arith.  The result is placed
#### in global arith_val.
#### Detected at run-time instead of by configure to allow testing
#### with different shells.
if (eval "test \$(( 1 + 1 )) = 2" 2>/dev/null); then
  eval 'arith_eval () { arith_val=$(( $* )); }'
else
  arith_eval () { arith_val=`expr "$@" || test $? -eq 1`; }
fi

test_skip ()
{
  WHY="$1"
  echo "$Test $0 SKIP ($WHY)"
  exit 77
}

# portable implementation of 'which' utility
findprog()
{
  PROG="$1"
  #### Don't need to save current IFS because this function is run in
  #### a subshell.
  IFS=:
  for D in $PATH; do
    if [ -z "$D" ]; then
      D=.
    fi
    if [ -f "$D/$PROG"  -a  -x "$D/$PROG" ]; then
      printf '%s\n' "$D/$PROG"
      break
    fi
  done
}

require_prog ()
{
  if [ -z "`findprog $1`" ]; then
    test_skip "missing $1"
  fi
}

# Some stuff for doing silly progress indicators
if [ -t 1 ] ; then
  progress_update ()
  {
    THIS="$1"
    FIRST="$2"
    LAST="$3"
    arith_eval $LAST - $FIRST; RANGE=$arith_val
    arith_eval $THIS - $FIRST; PROG=$arith_val
    # this automatically rounds to nearest integer
    arith_eval 100 \* $PROG / $RANGE; PERC=$arith_val
    # note \r so next update will overwrite
    printf '%3d%%\r' $PERC
  }

  progress_done ()
  {
    printf '100%%\n'
  }
else
  # don't emit anything if stdout is not connected to a tty.
  progress_update ()
  {
	:
  }
  progress_done ()
  {
	:
  }
fi

check_for_hard_links () {
  set +e

  printf '' > "${MH_TEST_DIR}/$$-1"
  if link "${MH_TEST_DIR}/$$-1" "${MH_TEST_DIR}/$$-2" 2>/dev/null; then
    hard_links_supported=1
  else
    hard_links_supported=0
  fi
  rm -f "${MH_TEST_DIR}/$$-1" "${MH_TEST_DIR}/$$-2"

  set -e
}

#### Filter that squeezes blank lines, partially emulating GNU cat -s,
#### but sufficient for our purpose.
#### From http://www-rohan.sdsu.edu/doc/sed.html, compiled by Eric Pement.
squeeze_lines() {
  sed '/^$/N;/\n$/D'
}

#### Filter that converts non-breakable space U+00A0 to an ASCII space.
prepare_space() {
  sed 's/'"`printf '\\302\\240'`"'/ /g'
}

#### check() requires two arguments, each the name of a file to be
#### diff'ed.
#### If the contents are same, the second file is removed.  And the
####   first file is removed unless there's an optional argument with
####   a value of 'keep first'.
#### If different, global variable "failed" is incremented.
#### If there's an optional 'ignore space' argument, spacing differences
####   will not be considered signficant, emulating GNU diff -w.  It
####   is assumed that the first file has already been run through
####   prepare_space.
check() {
    first=$1; shift
    second=$1; shift
    keepfirst=
    ignorespace=
    while [ $# -gt 0 ]; do
        case $1 in
            'keep first')   keepfirst=1 ;;
            'ignore space') ignorespace=1 ;;
            *) echo "$0: invalid check() argument \"$1\" in test suite" >&2 ;;
        esac
        shift
    done

    success=
    if [ "$ignorespace" ]; then
        #### POSIX diff should support -b.
        prepare_space <"$second" | diff -b "$first" - >/dev/null  &&  success=1
    else
        cmp -s "$first" "$second"  &&  success=1
    fi

    if [ "$success" ]; then
        [ "$keepfirst" ]  ||  rm -f "$first"
        rm -f "$second"
    else
        echo
        #### POSIX diff should support -c.
        diff -c "$first" "$second" || true
        echo
        echo "$0: test failed, outputs are in $first and $second."
        failed=`expr ${failed:-0} + 1`
        #### Set return status of the function.
        [ $failed -eq 0 ]
    fi
}


#### Shortcut to enable use of valgrind:  set NMH_VALGRIND environment
#### variable (to anything) so run_* will use valgrind.
if [ "${NMH_VALGRIND}"  -a  -z "${NMH_TEST_PREFIX}" ]; then
  #### Need absolute path to valgrind.supp in case the test does a cd.
  NMH_TEST_PREFIX="valgrind --quiet --error-exitcode=1 \
                     --suppressions=`cd ${srcdir} && pwd`/test/valgrind.supp"
fi

#### Run test under another program by setting NMH_TEST_PREFIX
#### environment variable to, e.g., 'valgrind --quiet'.
run_prog() {
  case $1 in
    #### Don't run valgrind on shell built-in.
    eval\ *) "$@" ;;
    *) ${NMH_TEST_PREFIX} "$@" ;;
  esac
}


#### run_test() requires two arguments, the first is a program and
#### arguments, the second is its expected one-line output string.
#### If the actual output does not match that string:
#### an error message is printed and global variable "failed" is incremented;
#### if there is an optional third argument, it is used in the error message.
run_test() {
  set +e
  case $1 in
    #### Don't run valgrind on shell built-in.
    eval\ *) actual_output=`$1 2>&1` ;;
    *) actual_output=`${NMH_TEST_PREFIX} $1 2>&1` ;;
  esac
  set -e
  if test x"$actual_output" != x"$2"; then
    echo "$0: ${3:-\"$1\"} expected:" 1>&2
    echo "    '$2'" 1>&2
    echo "but instead got:" 1>&2
    echo "    '$actual_output'" 1>&2
    failed=`expr ${failed:-0} + 1`
  fi
}

setup_test ()
{
  MH="${MH_TEST_DIR}/Mail/.mh_profile"
  MHMTSCONF="${MH_INST_DIR}${sysconfdir}/mts.conf"
  MH_LIB_DIR="${MH_INST_DIR}${auxexecdir}"
  export MH MHMTSCONF MH_LIB_DIR

  #
  # Only install once
  #
  if [ -d "${MH_INST_DIR}${bindir}" ]; then
    :
  else
    (cd "${MH_OBJ_DIR}" &&
      make DESTDIR="${MH_INST_DIR}" SETGID_MAIL= install) ||
      exit 1

    #### Don't test with sendmail because it would really send the
    #### mail.  If configured to use sendmail, change to smtp instead
    #### so that we use fakesmtp.
    #### And set up the maildrop in the test directory so tests don't
    #### use the user's real maildrop.
    #### test-slocal needs to look at the original mts.conf, so save it.
    mv -f "${MHMTSCONF}" "${MHMTSCONF}.old"
    sed -e 's/mts: *.*/mts: smtp/' \
        -e "s%mmdfldir: *.*%mmdfldir: ${MH_TEST_DIR}/Mail%" \
        -e 's%mmdflfil: *.*%mmdflfil: maildrop%' \
        "${MHMTSCONF}.old" >"${MHMTSCONF}"
  fi

  #### On Solaris, must set PATH after the install!
  PATH="${MH_INST_DIR}${bindir}:${PATH}"
  export PATH

  # clean old test data
  trap "cd $MH_TEST_DIR; rm -rf '$MH_TEST_DIR/Mail'" 0
  # setup test data
  mkdir -p "$MH_TEST_DIR/Mail" || exit 1
  cat > "$MH" <<EOF || exit 1
Path: ${MH_TEST_DIR}/Mail
buildmimeproc: ${MH_INST_DIR}${bindir}/mhbuild
fileproc: ${MH_INST_DIR}${bindir}/refile
libdir: ${MH_LIB_DIR}
mhbuild: -nocontentid
mhlproc: ${MH_LIB_DIR}/mhl
moreproc: cat
postproc: ${MH_LIB_DIR}/post
showproc: ${MH_LIB_DIR}/mhl
EOF

  for f in MailAliases components digestcomps distcomps forwcomps mhl.body \
           mhl.digest mhl.format mhl.forward mhl.headers mhl.reply \
           mhn.defaults rcvdistcomps replcomps replgroupcomps scan.MMDDYY \
           scan.YYYYMMDD scan.curses scan.default scan.highlighted scan.mailx \
	   scan.nomime scan.size scan.time scan.timely scan.unseen
  do
    cp "${MH_INST_DIR}${sysconfdir}/${f}" "${MH_TEST_DIR}/Mail" || exit 1
  done

  folder -create +inbox > /dev/null
  # create 10 basic messages
  for i in 1 2 3 4 5 6 7 8 9 10;
  do
    cat > $MH_TEST_DIR/Mail/inbox/$i <<EOF || exit 1
From: Test$i <test$i@example.com>
To: Some User <user@example.com>
Date: Fri, 29 Sep 2006 00:00:00
Message-Id: $i@test.nmh
Subject: Testing message $i

This is message number $i
EOF
  done
}