]>
diplodocus.org Git - nmh/blob - test/inc/test-eom-align
2 # Test all combinations of alignment of the end-of-message delimiter
3 # with the end of a stdio buffer
7 if test -z "${MH_OBJ_DIR}"; then
8 srcdir
=`dirname "$0"`/..
/..
9 MH_OBJ_DIR
=`cd "$srcdir" && pwd`; export MH_OBJ_DIR
12 .
"$MH_OBJ_DIR/test/common.sh"
16 THISDIR
="$srcdir/test/inc"
18 if [ -z "$VALGRIND_ME" ]; then
22 # Lack of quotes here is important
23 VALGRIND
="valgrind --quiet --error-exitcode=1"
24 echo "Running tests under valgrind: takes ages!"
27 # First check that all our various pieces of text are
28 # intact. (Since we're dealing in exact byte alignment
29 # minor corruptions such as line ending changes could
30 # render the tests useless.)
33 echo `output_md5 $i`' '"$i" >> "$MH_TEST_DIR/inctest.md5sums"
35 check
"$THISDIR/md5sums" "$MH_TEST_DIR/inctest.md5sums" 'keep first'
37 FILLER
="$THISDIR/filler.txt"
38 FROMLINE
="$THISDIR/fromline.txt"
39 MMDF_DELIM
='printf "\x01\x01\x01\x01\x0a"'
40 HDR
="$THISDIR/msgheader.txt"
42 if grep From
"$FILLER" >/dev
/null
; then
43 echo "Somebody's messed with $FILLER -- it must not contain"
44 echo "anything that might look like a message delimiter!"
48 # a sort of worst-case guess for the buffer size;
49 # obviously a buffer boundary for this will be a boundary
50 # for any smaller power of two size.
51 # If you need to increase this you'll need to make filler.txt
55 FROMLINESZ
=`wc -c < "$FROMLINE"`
57 HDRSZ
=`wc -c < "$HDR"`
59 # makembox_A mboxname sz
60 # Assemble a mailbox into file mboxname, with two messages, such
61 # that the first is exactly sz bytes long (including its header
62 # and its initial 'From' line and the newline which terminates it
63 # but not the newline which mbox format demands after each message)
64 # We also leave the body of message one in mboxname.body
65 # (the body of message two is always $FILLER in its entirety)
70 arith_eval
$SZ - $HDRSZ - $FROMLINESZ - 1; WANTSZ
=$arith_val
71 dd if="$FILLER" of
="$MBOX.body" bs
="$WANTSZ" count
=1 2>/dev
/null
73 cat "$FROMLINE" "$HDR" "$MBOX.body" > "$MBOX"
75 cat "$FROMLINE" "$HDR" "$FILLER" >> "$MBOX"
79 # makemmdf_A mmdfboxname sz
84 arith_eval
$SZ - $HDRSZ - $MMDFDELIMLINESZ - 1; WANTSZ
=$arith_val
85 dd if="$FILLER" of
="$MBOX.body" bs
="$WANTSZ" count
=1 2>/dev
/null
87 #### The trailing $MMDF_DELIM's allows $MBOX to exactly match a file
88 #### created by packf.
89 (eval "$MMDF_DELIM"; cat "$HDR" "$MBOX.body"; eval "$MMDF_DELIM"; \
90 eval "$MMDF_DELIM"; cat "$HDR" "$FILLER"; eval "$MMDF_DELIM") > "$MBOX"
93 # make_mbox_B mboxname sz
94 # Test B makes a mailbox with one message of sz bytes long,
95 # which ends in a partial mbox delimiter (ie part of the string
96 # \n\nFrom '). To both do this and be a valid mbox this means
97 # it has to end with two newlines (one of which is in the message
98 # body and one of which is the mbox format mandated one)
103 arith_eval
$SZ - $HDRSZ - $FROMLINESZ - 1; WANTSZ
=$arith_val
104 dd if="$FILLER" of
="$MBOX.body" bs
="$WANTSZ" count
=1 2>/dev
/null
106 cat "$FROMLINE" "$HDR" "$MBOX.body" > "$MBOX"
110 # makemmdf_B mmdfboxname sz
115 arith_eval
$SZ - $HDRSZ - $MMDFDELIMLINESZ - 1; WANTSZ
=$arith_val
116 dd if="$FILLER" of
="$MBOX.body" bs
="$WANTSZ" count
=1 2>/dev
/null
118 #### The final $MMDF_DELIM allows $MBOX to exactly match a file
119 #### created by packf.
120 (eval "$MMDF_DELIM"; cat "$HDR" "$MBOX.body"; eval "$MMDF_DELIM") > "$MBOX"
123 # do_one_test_A sz mbox_type
124 # Do a single test with message one's body of size sz.
128 printf '%5s %s A\r' $SZ $MBOX_TYPE
130 mbox
) makembox_A
"$MH_TEST_DIR/eom-align.mbox" $SZ ;;
131 mmdf
) makemmdf_A
"$MH_TEST_DIR/eom-align.mbox" $SZ ;;
133 $VALGRIND inc
-silent -file "$MH_TEST_DIR/eom-align.mbox"
134 # We know the messages should be 11 and 12 in inbox
135 # Now get the bodies back out.
136 body1
="$MH_TEST_DIR/eom-align.inbox.body1"
137 body2
="$MH_TEST_DIR/eom-align.inbox.body2"
138 sed -e '1,/^$/d' "$MH_TEST_DIR/Mail/inbox/11" > "$body1"
139 sed -e '1,/^$/d' "$MH_TEST_DIR/Mail/inbox/12" > "$body2"
140 check
"$MH_TEST_DIR/eom-align.mbox.body" "$body1" 'keep first'
141 check
"$FILLER" "$body2" 'keep first'
145 # do_one_test_B sz mbox_type
150 printf '%5s %s B\r' $SZ $MBOX_TYPE
152 mbox
) makembox_B
"$MH_TEST_DIR/eom-align.mbox" $SZ ;;
153 mmdf
) makemmdf_B
"$MH_TEST_DIR/eom-align.mbox" $SZ ;;
155 $VALGRIND inc
-silent -file "$MH_TEST_DIR/eom-align.mbox"
156 # We know the message should be 11 in the inbox
157 body1
="$MH_TEST_DIR/eom-align.inbox.body1"
158 sed -e '1,/^$/d' "$MH_TEST_DIR/Mail/inbox/11" > "$body1"
159 check
"$MH_TEST_DIR/eom-align.mbox.body" "$body1" 'keep first'
163 # Cover a decent range around the stdio buffer size to make sure we catch
164 # any corner cases whether they relate to total message size equal to
165 # buffer size or to body size equal to buffer size.
166 arith_eval
$STDIO_BUFSZ - 16; START
=$arith_val
167 arith_eval
$STDIO_BUFSZ + $HDRSZ + $FROMLINESZ + 32; FINISH
=$arith_val
169 "Testing inc of files with various alignments of eom marker with buffer size..."
171 #### Trouble spots for the particular input, with BUFSZ of 8192:
172 for sz
in 3146 3147 7241 7242 7243 11338 11339 15433 15434 15435; do
173 do_one_test_A
$sz mbox
174 do_one_test_A
$sz mmdf
177 # Also 155, 174, 175, but they're too small for makembox_B to handle.
178 for sz
in 684 4074 4097 4148 4610 4611 5121 5122 6654 6655 8170 \
179 8193 8244 8364 12266 12289 12340 16362 16385 16436; do
180 do_one_test_B
$sz mbox
181 do_one_test_B
$sz mmdf
185 while test $i -le $FINISH; do
186 do_one_test_A
$i mbox
187 do_one_test_A
$i mmdf
188 do_one_test_B
$i mbox
189 do_one_test_B
$i mmdf
194 test ${failed:-0} -eq 0 && \
195 rm "$MH_TEST_DIR/eom-align.mbox" "$MH_TEST_DIR/eom-align.mbox.body"