File: test-eom-align

package info (click to toggle)
nmh 1.6-16
  • links: PTS
  • area: main
  • in suites: stretch
  • size: 6,312 kB
  • ctags: 3,934
  • sloc: ansic: 48,921; sh: 16,427; makefile: 560; perl: 509; lex: 402; awk: 74
file content (143 lines) | stat: -rwxr-xr-x 4,539 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
#!/bin/sh
# Test all combinations of alignment of the end-of-message delimiter
# with the end of a stdio buffer

set -e

if test -z "${MH_OBJ_DIR}"; then
    srcdir=`dirname "$0"`/../..
    MH_OBJ_DIR=`cd "$srcdir" && pwd`; export MH_OBJ_DIR
fi

. "$MH_OBJ_DIR/test/common.sh"

setup_test

THISDIR="$srcdir/test/inc"

if [ -z "$VALGRIND_ME" ]; then
    VALGRIND=
else
    require_prog valgrind
    # Lack of quotes here is important
    VALGRIND="valgrind --quiet --error-exitcode=1"
    echo "Running tests under valgrind: takes ages!"
fi

# First check that all our various pieces of text are
# intact. (Since we're dealing in exact byte alignment
# minor corruptions such as line ending changes could
# render the tests useless.)
(cd "$THISDIR"  && \
 for i in *.txt; do
   echo `output_md5 $i`'  '"$i" >> "$MH_TEST_DIR/inctest.md5sums"
 done)
check "$THISDIR/md5sums" "$MH_TEST_DIR/inctest.md5sums" 'keep first'

FILLER="$THISDIR/filler.txt"
FROMLINE="$THISDIR/fromline.txt"
HDR="$THISDIR/msgheader.txt"

if grep From "$FILLER" >/dev/null; then
   echo "Somebody's messed with $FILLER -- it must not contain"
   echo "anything that might look like a message delimiter!"
   exit 1
fi

# a sort of worst-case guess for the buffer size;
# obviously a buffer boundary for this will be a boundary
# for any smaller power of two size.
# If you need to increase this you'll need to make filler.txt
# bigger as well.
STDIO_BUFSZ=16384

FROMLINESZ=`wc -c < "$FROMLINE"`
HDRSZ=`wc -c < "$HDR"`

# makembox_A mboxname sz
# Assemble a mailbox into file mboxname, with two messages, such
# that the first is exactly sz bytes long (including its header
# and its initial 'From' line and the newline which terminates it
# but not the newline which mbox format demands after each message)
# We also leave the body of message one in mboxname.body
# (the body of message two is always $FILLER in its entirety)
makembox_A () {
  MBOX="$1"
  SZ=$2

  arith_eval $SZ - $HDRSZ - $FROMLINESZ - 1; WANTSZ=$arith_val
  dd if="$FILLER" of="$MBOX.body" bs="$WANTSZ" count=1 2>/dev/null
  echo >> "$MBOX.body"
  cat "$FROMLINE" "$HDR" "$MBOX.body" > "$MBOX"
  echo >> "$MBOX"
  cat "$FROMLINE" "$HDR" "$FILLER" >> "$MBOX"
  echo >> "$MBOX"
}

# make_mbox_B mboxname sz
# Test B makes a mailbox with one message of sz bytes long,
# which ends in a partial mbox delimiter (ie part of the string
# \n\nFrom '). To both do this and be a valid mbox this means
# it has to end with two newlines (one of which is in the message
# body and one of which is the mbox format mandated one)
makembox_B () {
  MBOX="$1"
  SZ=$2

  arith_eval $SZ - $HDRSZ - $FROMLINESZ - 1; WANTSZ=$arith_val
  dd if="$FILLER" of="$MBOX.body" bs="$WANTSZ" count=1 2>/dev/null
  echo >> "$MBOX.body"
  cat "$FROMLINE" "$HDR" "$MBOX.body" > "$MBOX"
  echo >> "$MBOX"
}

# do_one_test_A sz
# Do a single test with message one's body of size sz.
do_one_test_A () {
  SZ=$1
  makembox_A "$MH_TEST_DIR/eom-align.mbox" $STDIO_BUFSZ
  $VALGRIND inc -silent -file "$MH_TEST_DIR/eom-align.mbox"
  # We know the messages should be 11 and 12 in inbox
  # Now get the bodies back out.
  body1="$MH_TEST_DIR/eom-align.inbox.body1"
  body2="$MH_TEST_DIR/eom-align.inbox.body2"
  sed -e '1,/^$/d' "$MH_TEST_DIR/Mail/inbox/11" > "$body1"
  sed -e '1,/^$/d' "$MH_TEST_DIR/Mail/inbox/12" > "$body2"
  check "$MH_TEST_DIR/eom-align.mbox.body" "$body1" 'keep first'
  check "$FILLER" "$body2" 'keep first'
  rmm 11 12
}

# do_one_test_B sz
# Do a test type B
do_one_test_B () {
  SZ=$1
  makembox_B "$MH_TEST_DIR/eom-align.mbox" $STDIO_BUFSZ
  $VALGRIND inc -silent -file "$MH_TEST_DIR/eom-align.mbox"
  # We know the message should be 11 in the inbox
  body1="$MH_TEST_DIR/eom-align.inbox.body1"
  sed -e '1,/^$/d' "$MH_TEST_DIR/Mail/inbox/11" > "$body1"
  check "$MH_TEST_DIR/eom-align.mbox.body" "$body1" 'keep first'
  rmm 11
}

# Cover a decent range around the stdio buffer size to make sure we catch
# any corner cases whether they relate to total message size equal to
# buffer size or to body size equal to buffer size.
arith_eval $STDIO_BUFSZ - 16; START=$arith_val
arith_eval $STDIO_BUFSZ + $HDRSZ + $FROMLINESZ + 32; FINISH=$arith_val
[ -t 1 ]  &&  echo \
"Testing inc of files with various alignments of eom marker with buffer size..."
i="$START"
while test $i -le $FINISH; do
  progress_update $i $START $FINISH
  do_one_test_A $i
  do_one_test_B $i
  i=`expr $i + 1`
done
progress_done

test ${failed:-0} -eq 0  &&  \
rm "$MH_TEST_DIR/eom-align.mbox" "$MH_TEST_DIR/eom-align.mbox.body"

exit $failed