summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorPádraig Brady <P@draigBrady.com>2010-12-08 08:33:15 +0000
committerPádraig Brady <P@draigBrady.com>2010-12-08 23:36:17 +0000
commit195c455d0ae3884ab2d9680ac3043aa36e9c8c3d (patch)
tree5b201f869b06aeb2c3e8820292090b6a2c7e4d14 /tests
parenta1629ba1ecc227a26be6adae596d17defc3ca324 (diff)
downloadcoreutils-195c455d0ae3884ab2d9680ac3043aa36e9c8c3d.tar.xz
split: fix a case where --elide-empty causes invalid chunking
When -n l/N is used and long lines are present that both span partitions and multiple buffers, one would get inconsistent chunk sizes. * src/split.c (main): Add a new undocumented ---io-blksize option to support full testing with varied buffer sizes. (cwrite): Refactor most handling of --elide-empty to here. (bytes_split): Remove handling of --elide-empty. (lines_chunk_split): Likewise. The specific issue here was the first handling of elide_empty_files interfered with the replenishing of the input buffer. * test/misc/split-lchunk: Add -e and the new ---io-blksize combinations to the test.
Diffstat (limited to 'tests')
-rwxr-xr-xtests/misc/split-lchunk65
1 files changed, 35 insertions, 30 deletions
diff --git a/tests/misc/split-lchunk b/tests/misc/split-lchunk
index 4c7c20e0e..7c55092d1 100755
--- a/tests/misc/split-lchunk
+++ b/tests/misc/split-lchunk
@@ -48,7 +48,6 @@ echo 'split: 16: invalid chunk number' > exp
split -n l/16/15 in 2>err && fail=1
compare err exp || fail=1
-: > out
printf '%s' "\
14 16 09 15 16 10
14 08 08 10 14 08 08 10
@@ -57,42 +56,48 @@ printf '%s' "\
06 00 08 00 02 06 00 02 06 00 08 00 01 07 00 02 06 00 08 00 02 16
" > exp || framework_failure
-# Note for full testing one should set bufsize to 1,2,5,10,80,100
-# at the start of lines_chunk_split(), for each run of this test.
+sed 's/00 *//g' exp > exp.elide_empty || framework_failure
DEBUGGING=
test "$DEBUGGING" && test "$VERBOSE" && set +x
-for N in 6 8 12 15 22; do
- rm -f x*
- split -n l/$N in
- echo $(stat -c "%02s" x*) >> out
-
- if test "$DEBUGGING"; then
- # Output partition pattern
- size=$(printf "%s" "$lines" | wc -c)
- chunk_size=$(($size/$N))
- end_size=$(($chunk_size + ($size % $N)))
- {
- yes "$(printf %${chunk_size}s ])" | head -n$(($N-1))
- printf %${end_size}s ]
- } | tr -d '\n' | sed "s/\\(^.\\{1,$size\\}\\).*/\\1/"
- echo
-
- # Output pattern generated for comparison
- for s in $(stat -c "%s" x*); do
- #s=0 transitions are not shown
- test "$m" = "_" && m=- || m=_
- printf "%${s}s" '' | tr ' ' $m
+for ELIDE_EMPTY in '' '-e'; do
+ for IO_BLKSIZE in 1 2 5 10 80 100; do
+ : > out
+ test "$DEBUGGING" && printf "\n---io-blk-size=$IO_BLKSIZE $ELIDE_EMPTY\n"
+ for N in 6 8 12 15 22; do
+ rm -f x*
+ split ---io-blksize=$IO_BLKSIZE $ELIDE_EMPTY -n l/$N in
+ echo $(stat -c "%02s" x*) >> out
+
+ if test "$DEBUGGING"; then
+ # Output partition pattern
+ size=$(printf "%s" "$lines" | wc -c)
+ chunk_size=$(($size/$N))
+ end_size=$(($chunk_size + ($size % $N)))
+ {
+ yes "$(printf %${chunk_size}s ])" | head -n$(($N-1))
+ printf %${end_size}s ]
+ } | tr -d '\n' | sed "s/\\(^.\\{1,$size\\}\\).*/\\1/"
+ echo
+
+ # Output pattern generated for comparison
+ for s in $(stat -c "%s" x*); do
+ #s=0 transitions are not shown
+ test "$m" = "_" && m=- || m=_
+ printf "%${s}s" '' | tr ' ' $m
+ done
+ echo
+
+ # Output lines for reference
+ echo "$lines"
+ fi
done
- echo
-
- # Output lines for reference
- echo "$lines"
- fi
+ test "$ELIDE_EMPTY" && EXP=exp.elide_empty || EXP=exp
+ compare out $EXP || fail=1
+ done
done
test "$DEBUGGING" && test "$VERBOSE" && set -x
-compare out exp || fail=1
# Check extraction of particular chunks
: > out