summaryrefslogtreecommitdiff
path: root/tests/split
diff options
context:
space:
mode:
authorJim Meyering <meyering@redhat.com>2011-05-27 00:54:53 +0200
committerJim Meyering <meyering@redhat.com>2011-05-28 13:52:17 +0200
commit963d809ae9d2ff4bc4844d2ebaf64a74deb1ae7e (patch)
treecbbbe6a2de00a4ce0dcfcaa4609d99fb64f5103b /tests/split
parent54a49f22ae158470142f92e00af69fbb3b774699 (diff)
downloadcoreutils-963d809ae9d2ff4bc4844d2ebaf64a74deb1ae7e.tar.xz
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.
Diffstat (limited to 'tests/split')
-rwxr-xr-xtests/split/b-chunk50
-rwxr-xr-xtests/split/fail81
-rwxr-xr-xtests/split/l-chunk138
-rwxr-xr-xtests/split/lines42
-rwxr-xr-xtests/split/r-chunk66
-rwxr-xr-xtests/split/suffix-length76
6 files changed, 453 insertions, 0 deletions
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 <http://www.gnu.org/licenses/>.
+
+. "${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 <http://www.gnu.org/licenses/>.
+
+. "${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 >/dev/null || fail=1
+split --number=r/$UINTMAX_OFLOW </dev/null 2>/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 <http://www.gnu.org/licenses/>.
+
+. "${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 <http://www.gnu.org/licenses/>.
+
+. "${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 <http://www.gnu.org/licenses/>.
+
+. "${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 <http://www.gnu.org/licenses/>.
+
+. "${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