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
|