From 963d809ae9d2ff4bc4844d2ebaf64a74deb1ae7e Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Fri, 27 May 2011 00:54:53 +0200 Subject: tests: move tests/misc/split-* into tests/split/... * tests/split/suffix-length: Rename from tests/misc/split-a. * tests/split/b-chunk: Rename from misc/split-bchunk. * tests/split/fail: Rename from tests/misc/split-fail. * tests/split/lines: Rename from tests/misc/split-l. * tests/split/l-chunk: Rename from tests/misc/split-lchunk. * tests/split/r-chunk: Rename from tests/misc/split-rchunk. * tests/Makefile.am (TESTS): Reflect renaming. --- tests/Makefile.am | 12 ++-- tests/misc/split-a | 76 ------------------------- tests/misc/split-bchunk | 50 ----------------- tests/misc/split-fail | 81 --------------------------- tests/misc/split-l | 42 -------------- tests/misc/split-lchunk | 138 ---------------------------------------------- tests/misc/split-rchunk | 66 ---------------------- tests/split/b-chunk | 50 +++++++++++++++++ tests/split/fail | 81 +++++++++++++++++++++++++++ tests/split/l-chunk | 138 ++++++++++++++++++++++++++++++++++++++++++++++ tests/split/lines | 42 ++++++++++++++ tests/split/r-chunk | 66 ++++++++++++++++++++++ tests/split/suffix-length | 76 +++++++++++++++++++++++++ 13 files changed, 459 insertions(+), 459 deletions(-) delete mode 100755 tests/misc/split-a delete mode 100755 tests/misc/split-bchunk delete mode 100755 tests/misc/split-fail delete mode 100755 tests/misc/split-l delete mode 100755 tests/misc/split-lchunk delete mode 100755 tests/misc/split-rchunk create mode 100755 tests/split/b-chunk create mode 100755 tests/split/fail create mode 100755 tests/split/l-chunk create mode 100755 tests/split/lines create mode 100755 tests/split/r-chunk create mode 100755 tests/split/suffix-length diff --git a/tests/Makefile.am b/tests/Makefile.am index 9bff3f00f..a324dc1eb 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -249,12 +249,12 @@ TESTS = \ misc/sort-unique-segv \ misc/sort-version \ split/filter \ - misc/split-a \ - misc/split-bchunk \ - misc/split-fail \ - misc/split-l \ - misc/split-lchunk \ - misc/split-rchunk \ + split/suffix-length \ + split/b-chunk \ + split/fail \ + split/lines \ + split/l-chunk \ + split/r-chunk \ misc/stat-birthtime \ misc/stat-fmt \ misc/stat-hyphen \ diff --git a/tests/misc/split-a b/tests/misc/split-a deleted file mode 100755 index 7577aaa50..000000000 --- a/tests/misc/split-a +++ /dev/null @@ -1,76 +0,0 @@ -#!/bin/sh -# Show that split -a works. - -# Copyright (C) 2002-2011 Free Software Foundation, Inc. - -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -. "${srcdir=.}/init.sh"; path_prepend_ ../src -print_ver_ split - -a_z='a b c d e f g h i j k l m n o p q r s t u v w x y z' - -# Generate a 27-byte file -printf %s $a_z 0 |tr -d ' ' > in || framework_failure - -files= -for i in $a_z; do - files="${files}xa$i " -done -files="${files}xba" - -for f in $files; do - printf 'creating file `%s'\''\n' $f -done > exp || framework_failure - -echo split: output file suffixes exhausted \ - > exp-too-short || framework_failure - - -# This should fail. -split -b 1 -a 1 in 2> err && fail=1 -test -f xa || fail=1 -test -f xz || fail=1 -test -f xaa && fail=1 -test -f xaz && fail=1 -rm -f x* -compare err exp-too-short || fail=1 - -# With a longer suffix, it must succeed. -split --verbose -b 1 -a 2 in > err || fail=1 -compare err exp || fail=1 - -# Ensure that xbb is *not* created. -test -f xbb && fail=1 - -# Ensure that the 27 others files *were* created, and with expected contents. -n=1 -for f in $files; do - expected_byte=$(cut -b $n in) - b=$(cat $f) || fail=1 - test "$b" = "$expected_byte" || fail=1 - n=$(expr $n + 1) -done - -# Ensure that -a is independent of -[bCl] -split -a2 -b1000 < /dev/null || fail=1 -split -a2 -l1000 < /dev/null || fail=1 -split -a2 -C1000 < /dev/null || fail=1 - -# Ensure that -a fails early with a -n that is too large -rm -f x* -split -a2 -n1000 < /dev/null && fail=1 -test -f xaa && fail=1 - -Exit $fail diff --git a/tests/misc/split-bchunk b/tests/misc/split-bchunk deleted file mode 100755 index 48c57e077..000000000 --- a/tests/misc/split-bchunk +++ /dev/null @@ -1,50 +0,0 @@ -#!/bin/sh -# test splitting into 3 chunks - -# Copyright (C) 2010-2011 Free Software Foundation, Inc. - -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -. "${srcdir=.}/init.sh"; path_prepend_ ../src -print_ver_ split - -# N can be greater than the file size -# in which case no data is extracted, or empty files are written -split -n 10 /dev/null || fail=1 -test "$(stat -c %s x* | uniq -c | sed 's/^ *//; s/ /x/')" = "10x0" || fail=1 -rm x?? - -# Ensure --elide-empty-files is honored -split -e -n 10 /dev/null || fail=1 -stat x?? 2>/dev/null && fail=1 - -printf '1\n2\n3\n4\n5\n' > in || framework_failure - -split -n 3 in > out || fail=1 -split -n 1/3 in > b1 || fail=1 -split -n 2/3 in > b2 || fail=1 -split -n 3/3 in > b3 || fail=1 -printf '1\n2' > exp-1 -printf '\n3\n' > exp-2 -printf '4\n5\n' > exp-3 - -compare xaa exp-1 || fail=1 -compare xab exp-2 || fail=1 -compare xac exp-3 || fail=1 -compare b1 exp-1 || fail=1 -compare b2 exp-2 || fail=1 -compare b3 exp-3 || fail=1 -test -f xad && fail=1 - -Exit $fail diff --git a/tests/misc/split-fail b/tests/misc/split-fail deleted file mode 100755 index 1fe368cf2..000000000 --- a/tests/misc/split-fail +++ /dev/null @@ -1,81 +0,0 @@ -#!/bin/sh -# split must fail when given length/count of zero. - -# Copyright (C) 2003-2011 Free Software Foundation, Inc. - -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -. "${srcdir=.}/init.sh"; path_prepend_ ../src -print_ver_ split -getlimits_ - -touch in || framework_failure - - -split -a 0 in 2> /dev/null || fail=1 -split -b 0 in 2> /dev/null && fail=1 -split -C 0 in 2> /dev/null && fail=1 -split -l 0 in 2> /dev/null && fail=1 -split -n 0 in 2> /dev/null && fail=1 -split -n 1/0 in 2> /dev/null && fail=1 -split -n 0/1 in 2> /dev/null && fail=1 -split -n 2/1 in 2> /dev/null && fail=1 - -# Make sure -C doesn't create empty files. -rm -f x?? || fail=1 -echo x | split -C 1 || fail=1 -test -f xaa && test -f xab || fail=1 -test -f xac && fail=1 - -# Make sure that the obsolete -N notation still works -split -1 in 2> /dev/null || fail=1 - -# Then make sure that -0 evokes a failure. -split -0 in 2> /dev/null && fail=1 - -split --lines=$UINTMAX_MAX in || fail=1 -split --bytes=$OFF_T_MAX in || fail=1 -split --line-bytes=$OFF_T_OFLOW 2> /dev/null in && fail=1 -split --line-bytes=$SIZE_OFLOW 2> /dev/null in && fail=1 -if truncate -s$SIZE_OFLOW large; then - # Ensure we can split chunks of a large file on 32 bit hosts - split --number=$SIZE_OFLOW/$SIZE_OFLOW large >/dev/null || fail=1 -fi -split --number=r/$UINTMAX_MAX/$UINTMAX_MAX /dev/null || fail=1 -split --number=r/$UINTMAX_OFLOW /dev/null && fail=1 - -# Make sure that a huge obsolete option evokes the right failure. -split -99999999999999999991 2> out && fail=1 - -# On losing systems (x86 Solaris 5.9 c89), we get a message like this: -# split: line count option -9999999999... is too large -# while on most, we get this: -# split: line count option -99999999999999999991... is too large -# so map them both to -99*. -sed 's/99[19]*/99*/' out > out-t -mv -f out-t out - -cat <<\EOF > exp -split: line count option -99*... is too large -EOF -compare out exp || fail=1 - -# Make sure split fails when it can't read input -# (the current directory in this case) -if ! cat . >/dev/null; then - # can't read() directories - split . && fail=1 -fi - -Exit $fail diff --git a/tests/misc/split-l b/tests/misc/split-l deleted file mode 100755 index 932c178e5..000000000 --- a/tests/misc/split-l +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/sh -# show that `split --lines=2' works. - -# Copyright (C) 2002, 2006-2011 Free Software Foundation, Inc. - -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -. "${srcdir=.}/init.sh"; path_prepend_ ../src -print_ver_ split - -printf '1\n2\n3\n4\n5\n' > in || framework_failure - -split --lines=2 in > out || fail=1 -cat <<\EOF > exp-1 -1 -2 -EOF -cat <<\EOF > exp-2 -3 -4 -EOF -cat <<\EOF > exp-3 -5 -EOF - -compare xaa exp-1 || fail=1 -compare xab exp-2 || fail=1 -compare xac exp-3 || fail=1 -test -f xad && fail=1 - -Exit $fail diff --git a/tests/misc/split-lchunk b/tests/misc/split-lchunk deleted file mode 100755 index 8b4d157a1..000000000 --- a/tests/misc/split-lchunk +++ /dev/null @@ -1,138 +0,0 @@ -#!/bin/sh -# test splitting into newline delineated chunks (-n l/...) - -# Copyright (C) 2010-2011 Free Software Foundation, Inc. - -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -. "${srcdir=.}/init.sh"; path_prepend_ ../src -print_ver_ split - -# invalid number of chunks -echo 'split: 1o: invalid number of chunks' > exp -split -n l/1o 2>err && fail=1 -compare err exp || fail=1 - -echo "split: \`-': cannot determine file size" > exp -echo | split -n l/1 2>err && fail=1 -compare err exp || fail=1 - -# N can be greater than the file size -# in which case no data is extracted, or empty files are written -split -n l/10 /dev/null || fail=1 -test "$(stat -c %s x* | uniq -c | sed 's/^ *//; s/ /x/')" = "10x0" || fail=1 -rm x?? - -# Ensure the correct number of files written -# even if there is more data than the reported file size -split -n l/2 /dev/zero -test "$(stat -c %s x* | wc -l)" = '2' || fail=1 -rm x?? - -# Ensure --elide-empty-files is honored -split -e -n l/10 /dev/null || fail=1 -stat x?? 2>/dev/null && fail=1 - -# 80 bytes. ~ transformed to \n below -lines=\ -12345~1~12345~1~12345~1~12345~1~12345~~~12345~1~12345~1~12345~1~12345~1~12345~1~ - -printf "%s" "$lines" | tr '~' '\n' > in || framework_failure - -echo 'split: 16: invalid chunk number' > exp -split -n l/16/15 in 2>err && fail=1 -compare err exp || fail=1 - -printf '%s' "\ -14 16 09 15 16 10 -14 08 08 10 14 08 08 10 -06 08 08 02 06 08 08 02 06 08 08 10 -06 08 02 06 08 00 08 02 06 08 02 06 08 00 10 -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 - -sed 's/00 *//g' exp > exp.elide_empty || framework_failure - -DEBUGGING= -test "$DEBUGGING" && test "$VERBOSE" && set +x -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* - - if test -z "$ELIDE_EMPTY"; then - split ---io-blksize=$IO_BLKSIZE -n l/2/$N in > chunk.k - stat x* 2>/dev/null && fail=1 - fi - - split ---io-blksize=$IO_BLKSIZE $ELIDE_EMPTY -n l/$N in - echo $(stat -c "%02s" x*) >> out - - if test -z "$ELIDE_EMPTY"; then - compare chunk.k xab || fail=1 - fi - - 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 - test "$ELIDE_EMPTY" && EXP=exp.elide_empty || EXP=exp - compare out $EXP || fail=1 - done -done -test "$DEBUGGING" && test "$VERBOSE" && set -x - - -# Check extraction of particular chunks -: > out -printf '1\n12345\n' > exp -split -n l/13/15 in > out -compare out exp || fail=1 -: > out -printf '' > exp -split -n l/14/15 in > out -compare out exp || fail=1 -: > out -printf '1\n12345\n1\n' > exp -split -n l/15/15 in > out -compare out exp || fail=1 - -# test input with no \n at end -printf '12\n34\n5' > in -printf '5' > exp -split -n l/7/7 in > out -compare out exp || fail=1 - -Exit $fail diff --git a/tests/misc/split-rchunk b/tests/misc/split-rchunk deleted file mode 100755 index d3165fb79..000000000 --- a/tests/misc/split-rchunk +++ /dev/null @@ -1,66 +0,0 @@ -#!/bin/sh -# test splitting into round-robin chunks - -# Copyright (C) 2010-2011 Free Software Foundation, Inc. - -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -. "${srcdir=.}/init.sh"; path_prepend_ ../src -print_ver_ split - -require_ulimit_ - -# N can be greater than the file size -# in which case no data is extracted, or empty files are written -split -n r/10 /dev/null || fail=1 -test "$(stat -c %s x* | uniq -c | sed 's/^ *//; s/ /x/')" = "10x0" || fail=1 -rm x?? - -# Ensure --elide-empty-files is honored -split -e -n r/10 /dev/null || fail=1 -stat x?? 2>/dev/null && fail=1 - -printf '1\n2\n3\n4\n5\n' > in || framework_failure - -split -n r/3 in > out || fail=1 -test -s out && fail=1 - -split -n r/1/3 in > r1 || fail=1 -split -n r/2/3 in > r2 || fail=1 -split -n r/3/3 in > r3 || fail=1 - -printf '1\n4\n' > exp-1 -printf '2\n5\n' > exp-2 -printf '3\n' > exp-3 - -compare xaa exp-1 || fail=1 -compare xab exp-2 || fail=1 -compare xac exp-3 || fail=1 -compare r1 exp-1 || fail=1 -compare r2 exp-2 || fail=1 -compare r3 exp-3 || fail=1 -test -f xad && fail=1 - -# Test input without trailing \n -printf '1\n2\n3\n4\n5' | split -n r/2/3 > out -printf '2\n5' > exp -compare out exp || fail=1 - -# Ensure we fall back to appending to a file at a time -# if we hit the limit for the number of open files. -rm x* -(ulimit -n 20 && yes | head -n90 | split -n r/30 ) || fail=1 -test "$(stat -c %s x* | uniq -c | sed 's/^ *//; s/ /x/')" = "30x6" || fail=1 - -Exit $fail diff --git a/tests/split/b-chunk b/tests/split/b-chunk new file mode 100755 index 000000000..48c57e077 --- /dev/null +++ b/tests/split/b-chunk @@ -0,0 +1,50 @@ +#!/bin/sh +# test splitting into 3 chunks + +# Copyright (C) 2010-2011 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +. "${srcdir=.}/init.sh"; path_prepend_ ../src +print_ver_ split + +# N can be greater than the file size +# in which case no data is extracted, or empty files are written +split -n 10 /dev/null || fail=1 +test "$(stat -c %s x* | uniq -c | sed 's/^ *//; s/ /x/')" = "10x0" || fail=1 +rm x?? + +# Ensure --elide-empty-files is honored +split -e -n 10 /dev/null || fail=1 +stat x?? 2>/dev/null && fail=1 + +printf '1\n2\n3\n4\n5\n' > in || framework_failure + +split -n 3 in > out || fail=1 +split -n 1/3 in > b1 || fail=1 +split -n 2/3 in > b2 || fail=1 +split -n 3/3 in > b3 || fail=1 +printf '1\n2' > exp-1 +printf '\n3\n' > exp-2 +printf '4\n5\n' > exp-3 + +compare xaa exp-1 || fail=1 +compare xab exp-2 || fail=1 +compare xac exp-3 || fail=1 +compare b1 exp-1 || fail=1 +compare b2 exp-2 || fail=1 +compare b3 exp-3 || fail=1 +test -f xad && fail=1 + +Exit $fail diff --git a/tests/split/fail b/tests/split/fail new file mode 100755 index 000000000..1fe368cf2 --- /dev/null +++ b/tests/split/fail @@ -0,0 +1,81 @@ +#!/bin/sh +# split must fail when given length/count of zero. + +# Copyright (C) 2003-2011 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +. "${srcdir=.}/init.sh"; path_prepend_ ../src +print_ver_ split +getlimits_ + +touch in || framework_failure + + +split -a 0 in 2> /dev/null || fail=1 +split -b 0 in 2> /dev/null && fail=1 +split -C 0 in 2> /dev/null && fail=1 +split -l 0 in 2> /dev/null && fail=1 +split -n 0 in 2> /dev/null && fail=1 +split -n 1/0 in 2> /dev/null && fail=1 +split -n 0/1 in 2> /dev/null && fail=1 +split -n 2/1 in 2> /dev/null && fail=1 + +# Make sure -C doesn't create empty files. +rm -f x?? || fail=1 +echo x | split -C 1 || fail=1 +test -f xaa && test -f xab || fail=1 +test -f xac && fail=1 + +# Make sure that the obsolete -N notation still works +split -1 in 2> /dev/null || fail=1 + +# Then make sure that -0 evokes a failure. +split -0 in 2> /dev/null && fail=1 + +split --lines=$UINTMAX_MAX in || fail=1 +split --bytes=$OFF_T_MAX in || fail=1 +split --line-bytes=$OFF_T_OFLOW 2> /dev/null in && fail=1 +split --line-bytes=$SIZE_OFLOW 2> /dev/null in && fail=1 +if truncate -s$SIZE_OFLOW large; then + # Ensure we can split chunks of a large file on 32 bit hosts + split --number=$SIZE_OFLOW/$SIZE_OFLOW large >/dev/null || fail=1 +fi +split --number=r/$UINTMAX_MAX/$UINTMAX_MAX /dev/null || fail=1 +split --number=r/$UINTMAX_OFLOW /dev/null && fail=1 + +# Make sure that a huge obsolete option evokes the right failure. +split -99999999999999999991 2> out && fail=1 + +# On losing systems (x86 Solaris 5.9 c89), we get a message like this: +# split: line count option -9999999999... is too large +# while on most, we get this: +# split: line count option -99999999999999999991... is too large +# so map them both to -99*. +sed 's/99[19]*/99*/' out > out-t +mv -f out-t out + +cat <<\EOF > exp +split: line count option -99*... is too large +EOF +compare out exp || fail=1 + +# Make sure split fails when it can't read input +# (the current directory in this case) +if ! cat . >/dev/null; then + # can't read() directories + split . && fail=1 +fi + +Exit $fail diff --git a/tests/split/l-chunk b/tests/split/l-chunk new file mode 100755 index 000000000..8b4d157a1 --- /dev/null +++ b/tests/split/l-chunk @@ -0,0 +1,138 @@ +#!/bin/sh +# test splitting into newline delineated chunks (-n l/...) + +# Copyright (C) 2010-2011 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +. "${srcdir=.}/init.sh"; path_prepend_ ../src +print_ver_ split + +# invalid number of chunks +echo 'split: 1o: invalid number of chunks' > exp +split -n l/1o 2>err && fail=1 +compare err exp || fail=1 + +echo "split: \`-': cannot determine file size" > exp +echo | split -n l/1 2>err && fail=1 +compare err exp || fail=1 + +# N can be greater than the file size +# in which case no data is extracted, or empty files are written +split -n l/10 /dev/null || fail=1 +test "$(stat -c %s x* | uniq -c | sed 's/^ *//; s/ /x/')" = "10x0" || fail=1 +rm x?? + +# Ensure the correct number of files written +# even if there is more data than the reported file size +split -n l/2 /dev/zero +test "$(stat -c %s x* | wc -l)" = '2' || fail=1 +rm x?? + +# Ensure --elide-empty-files is honored +split -e -n l/10 /dev/null || fail=1 +stat x?? 2>/dev/null && fail=1 + +# 80 bytes. ~ transformed to \n below +lines=\ +12345~1~12345~1~12345~1~12345~1~12345~~~12345~1~12345~1~12345~1~12345~1~12345~1~ + +printf "%s" "$lines" | tr '~' '\n' > in || framework_failure + +echo 'split: 16: invalid chunk number' > exp +split -n l/16/15 in 2>err && fail=1 +compare err exp || fail=1 + +printf '%s' "\ +14 16 09 15 16 10 +14 08 08 10 14 08 08 10 +06 08 08 02 06 08 08 02 06 08 08 10 +06 08 02 06 08 00 08 02 06 08 02 06 08 00 10 +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 + +sed 's/00 *//g' exp > exp.elide_empty || framework_failure + +DEBUGGING= +test "$DEBUGGING" && test "$VERBOSE" && set +x +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* + + if test -z "$ELIDE_EMPTY"; then + split ---io-blksize=$IO_BLKSIZE -n l/2/$N in > chunk.k + stat x* 2>/dev/null && fail=1 + fi + + split ---io-blksize=$IO_BLKSIZE $ELIDE_EMPTY -n l/$N in + echo $(stat -c "%02s" x*) >> out + + if test -z "$ELIDE_EMPTY"; then + compare chunk.k xab || fail=1 + fi + + 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 + test "$ELIDE_EMPTY" && EXP=exp.elide_empty || EXP=exp + compare out $EXP || fail=1 + done +done +test "$DEBUGGING" && test "$VERBOSE" && set -x + + +# Check extraction of particular chunks +: > out +printf '1\n12345\n' > exp +split -n l/13/15 in > out +compare out exp || fail=1 +: > out +printf '' > exp +split -n l/14/15 in > out +compare out exp || fail=1 +: > out +printf '1\n12345\n1\n' > exp +split -n l/15/15 in > out +compare out exp || fail=1 + +# test input with no \n at end +printf '12\n34\n5' > in +printf '5' > exp +split -n l/7/7 in > out +compare out exp || fail=1 + +Exit $fail diff --git a/tests/split/lines b/tests/split/lines new file mode 100755 index 000000000..932c178e5 --- /dev/null +++ b/tests/split/lines @@ -0,0 +1,42 @@ +#!/bin/sh +# show that `split --lines=2' works. + +# Copyright (C) 2002, 2006-2011 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +. "${srcdir=.}/init.sh"; path_prepend_ ../src +print_ver_ split + +printf '1\n2\n3\n4\n5\n' > in || framework_failure + +split --lines=2 in > out || fail=1 +cat <<\EOF > exp-1 +1 +2 +EOF +cat <<\EOF > exp-2 +3 +4 +EOF +cat <<\EOF > exp-3 +5 +EOF + +compare xaa exp-1 || fail=1 +compare xab exp-2 || fail=1 +compare xac exp-3 || fail=1 +test -f xad && fail=1 + +Exit $fail diff --git a/tests/split/r-chunk b/tests/split/r-chunk new file mode 100755 index 000000000..d3165fb79 --- /dev/null +++ b/tests/split/r-chunk @@ -0,0 +1,66 @@ +#!/bin/sh +# test splitting into round-robin chunks + +# Copyright (C) 2010-2011 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +. "${srcdir=.}/init.sh"; path_prepend_ ../src +print_ver_ split + +require_ulimit_ + +# N can be greater than the file size +# in which case no data is extracted, or empty files are written +split -n r/10 /dev/null || fail=1 +test "$(stat -c %s x* | uniq -c | sed 's/^ *//; s/ /x/')" = "10x0" || fail=1 +rm x?? + +# Ensure --elide-empty-files is honored +split -e -n r/10 /dev/null || fail=1 +stat x?? 2>/dev/null && fail=1 + +printf '1\n2\n3\n4\n5\n' > in || framework_failure + +split -n r/3 in > out || fail=1 +test -s out && fail=1 + +split -n r/1/3 in > r1 || fail=1 +split -n r/2/3 in > r2 || fail=1 +split -n r/3/3 in > r3 || fail=1 + +printf '1\n4\n' > exp-1 +printf '2\n5\n' > exp-2 +printf '3\n' > exp-3 + +compare xaa exp-1 || fail=1 +compare xab exp-2 || fail=1 +compare xac exp-3 || fail=1 +compare r1 exp-1 || fail=1 +compare r2 exp-2 || fail=1 +compare r3 exp-3 || fail=1 +test -f xad && fail=1 + +# Test input without trailing \n +printf '1\n2\n3\n4\n5' | split -n r/2/3 > out +printf '2\n5' > exp +compare out exp || fail=1 + +# Ensure we fall back to appending to a file at a time +# if we hit the limit for the number of open files. +rm x* +(ulimit -n 20 && yes | head -n90 | split -n r/30 ) || fail=1 +test "$(stat -c %s x* | uniq -c | sed 's/^ *//; s/ /x/')" = "30x6" || fail=1 + +Exit $fail diff --git a/tests/split/suffix-length b/tests/split/suffix-length new file mode 100755 index 000000000..7577aaa50 --- /dev/null +++ b/tests/split/suffix-length @@ -0,0 +1,76 @@ +#!/bin/sh +# Show that split -a works. + +# Copyright (C) 2002-2011 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +. "${srcdir=.}/init.sh"; path_prepend_ ../src +print_ver_ split + +a_z='a b c d e f g h i j k l m n o p q r s t u v w x y z' + +# Generate a 27-byte file +printf %s $a_z 0 |tr -d ' ' > in || framework_failure + +files= +for i in $a_z; do + files="${files}xa$i " +done +files="${files}xba" + +for f in $files; do + printf 'creating file `%s'\''\n' $f +done > exp || framework_failure + +echo split: output file suffixes exhausted \ + > exp-too-short || framework_failure + + +# This should fail. +split -b 1 -a 1 in 2> err && fail=1 +test -f xa || fail=1 +test -f xz || fail=1 +test -f xaa && fail=1 +test -f xaz && fail=1 +rm -f x* +compare err exp-too-short || fail=1 + +# With a longer suffix, it must succeed. +split --verbose -b 1 -a 2 in > err || fail=1 +compare err exp || fail=1 + +# Ensure that xbb is *not* created. +test -f xbb && fail=1 + +# Ensure that the 27 others files *were* created, and with expected contents. +n=1 +for f in $files; do + expected_byte=$(cut -b $n in) + b=$(cat $f) || fail=1 + test "$b" = "$expected_byte" || fail=1 + n=$(expr $n + 1) +done + +# Ensure that -a is independent of -[bCl] +split -a2 -b1000 < /dev/null || fail=1 +split -a2 -l1000 < /dev/null || fail=1 +split -a2 -C1000 < /dev/null || fail=1 + +# Ensure that -a fails early with a -n that is too large +rm -f x* +split -a2 -n1000 < /dev/null && fail=1 +test -f xaa && fail=1 + +Exit $fail -- cgit v1.2.3-54-g00ecf