Importing NetBSD "Kyua" test framework

To do so, a few dependencies have been imported:

 * external/bsd/lutok
 * external/mit/lua
 * external/public-domain/sqlite
 * external/public-domain/xz

The Kyua framework is the new generation of ATF (Automated Test
Framework), it is composed of:

 * external/bsd/atf
 * external/bsd/kyua-atf-compat
 * external/bsd/kyua-cli
 * external/bsd/kyua-tester
 * tests

Kyua/ATF being written in C++, it depends on libstdc++ which is
provided by GCC. As this is not part of the sources, Kyua is only
compiled when the native GCC utils are installed.

To install Kyua do the following:

 * In a cross-build enviromnent, add the following to the build.sh
   commandline: -V MKBINUTILS=yes -V MKGCCCMDS=yes

WARNING:
  At this point the import is still experimental, and not supported
  on native builds (a.k.a make build).

Change-Id: I26aee23c5bbd2d64adcb7c1beb98fe0d479d7ada
This commit is contained in:
2013-02-26 09:24:42 +01:00
committed by Gerrit Code Review
parent 003ff52ebb
commit 11be35a165
2893 changed files with 502052 additions and 2630 deletions

47
tests/Makefile Normal file
View File

@@ -0,0 +1,47 @@
# $NetBSD: Makefile,v 1.44 2013/02/25 00:33:19 jmmv Exp $
.include <bsd.own.mk>
.if ${MKATF} != "no"
TESTSDIR= ${TESTSBASE}
# LSC: Unsupported on MINIX:
# kernel net
TESTS_SUBDIRS= bin dev games include lib libexec
TESTS_SUBDIRS+= sbin sys usr.bin usr.sbin
. if (${MKRUMP} != "no")
TESTS_SUBDIRS+= fs rump
. if ${MKKMOD} != "no"
TESTS_SUBDIRS+= modules
. endif
. endif
. if ${MKCRYPTO} != "no"
TESTS_SUBDIRS+= crypto
. endif
. if ${MKIPFILTER} != "no"
TESTS_SUBDIRS+= ipf
. endif
. if ${MKSHARE} != "no"
TESTS_SUBDIRS+= share
. endif
. if ${MKATF} != "no"
ATFFILE_EXTRA_SUBDIRS+= atf
. endif
. if ${MKKYUA} != "no"
ATFFILE_EXTRA_SUBDIRS+= kyua-atf-compat kyua-cli kyua-testers
. endif
.include <bsd.test.mk>
.else
.include <bsd.subdir.mk>
.endif

3
tests/Makefile.inc Normal file
View File

@@ -0,0 +1,3 @@
# $NetBSD: Makefile.inc,v 1.2 2011/09/16 16:30:18 joerg Exp $
WARNS ?= 4
CWARNFLAGS+= -Wno-missing-noreturn

20
tests/README Normal file
View File

@@ -0,0 +1,20 @@
$NetBSD: README,v 1.4 2012/05/18 15:36:21 jruoho Exp $
When adding new tests, please try to follow the following conventions.
1. For library routines, including system calls, the directory structure of
the tests should follow the directory structure of the real source tree.
For instance, interfaces available via the C library should follow:
src/lib/libc/gen -> src/tests/lib/libc/gen
src/lib/libc/sys -> src/tests/lib/libc/sys
...
2. Equivalently, all tests for userland utilities should try to follow their
location in the source tree. If this can not be satisfied, the tests for
a utility should be located under the directory to which the utility is
installed. Thus, a test for env(1) should go to src/tests/usr.bin/env.
Likewise, a test for tcpdump(8) should be in src/tests/usr.sbin/tcpdump,
even though the source code for the program is located under src/external.
3. Otherwise use your own discretion.

10
tests/bin/Makefile Normal file
View File

@@ -0,0 +1,10 @@
# $NetBSD: Makefile,v 1.3 2012/03/30 15:49:24 njoly Exp $
.include <bsd.own.mk>
TESTSDIR= ${TESTSBASE}/bin
# LSC FIXME df test is ignored
TESTS_SUBDIRS= cat cp dd expr pax ps sh sleep tar
.include <bsd.test.mk>

12
tests/bin/cat/Makefile Normal file
View File

@@ -0,0 +1,12 @@
# $NetBSD: Makefile,v 1.1 2012/03/27 08:16:33 jruoho Exp $
.include <bsd.own.mk>
TESTSDIR= ${TESTSBASE}/bin/cat
TESTS_SH= t_cat
FILESDIR= ${TESTSDIR}
FILES+= d_align.in
FILES+= d_align.out
.include <bsd.test.mk>

3
tests/bin/cat/d_align.in Normal file
View File

@@ -0,0 +1,3 @@
a b c
1 2 3
x y z

View File

@@ -0,0 +1,3 @@
1 a b c$
2 1 2 3$
3 x y z$

59
tests/bin/cat/t_cat.sh Normal file
View File

@@ -0,0 +1,59 @@
# $NetBSD: t_cat.sh,v 1.2 2012/03/27 17:57:02 jruoho Exp $
#
# Copyright (c) 2012 The NetBSD Foundation, Inc.
# All rights reserved.
#
# This code is derived from software contributed to The NetBSD Foundation
# by Jukka Ruohonen.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
atf_test_case align
align_head() {
atf_set "descr" "Test that cat(1) aligns the output " \
"right with options '-be' (PR bin/4841)"
}
align_body() {
atf_check -s ignore -o file:$(atf_get_srcdir)/d_align.out \
-x "cat -be $(atf_get_srcdir)/d_align.in"
}
atf_test_case nonexistent
nonexistent_head() {
atf_set "descr" "Test that cat(1) doesn't return zero exit " \
"status for a nonexistent file (PR bin/3538)"
}
nonexistent_body() {
atf_check -s not-exit:0 -o empty -e not-empty \
-x "cat /some/name/that/does/not/exist"
}
atf_init_test_cases()
{
atf_add_test_case align
atf_add_test_case nonexistent
}

8
tests/bin/cp/Makefile Normal file
View File

@@ -0,0 +1,8 @@
# $NetBSD: Makefile,v 1.1 2012/03/17 16:33:10 jruoho Exp $
.include <bsd.own.mk>
TESTSDIR= ${TESTSBASE}/bin/cp
TESTS_SH= t_cp
.include <bsd.test.mk>

294
tests/bin/cp/t_cp.sh Normal file
View File

@@ -0,0 +1,294 @@
# $NetBSD: t_cp.sh,v 1.1 2012/03/17 16:33:10 jruoho Exp $
#
# Copyright (c) 2007, 2008 The NetBSD Foundation, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
FILES="file file2 file3 link dir dir2 dirlink target"
cleanup() {
rm -fr ${FILES}
}
cp_compare() {
echo "Ensuring that $2 and $3 are identical"
cmp -s $2 $3 || atf_fail "$2 and $3 are different"
}
reset() {
cleanup
echo "I'm a file" > file
echo "I'm a file, 2" > file2
echo "I'm a file, 3" > file3
ln -s file link
mkdir dir
ln -s dir dirlink
}
atf_test_case file_to_file
file_to_file_head() {
atf_set "descr" "Checks the copy of a file to a file"
}
file_to_file_body() {
reset
file_to_file_simple
file_to_file_preserve
file_to_file_noflags
}
file_to_file_simple() {
rm -f file2
umask 022
chmod 777 file
atf_check -s eq:0 -o empty -e empty cp file file2
cp_compare file_to_file_simple file file2
if [ `stat -f "%Lp" file2` != "755" ]; then
atf_fail "new file not created with umask"
fi
chmod 644 file
chmod 777 file2
cp_compare file_to_file_simple file file2
if [ `stat -f "%Lp" file2` != "777" ]; then
atf_fail "existing files permissions not retained"
fi
}
file_to_file_preserve() {
rm file3
chmod 644 file
chflags nodump file
atf_check -s eq:0 -o empty -e empty cp -p file file3
finfo=`stat -f "%p%u%g%m%z%f" file`
f3info=`stat -f "%p%u%g%m%z%f" file3`
if [ $finfo != $f3info ]; then
atf_fail "attributes not preserved"
fi
}
file_to_file_noflags() {
rm file3
chmod 644 file
chflags nodump file
atf_check -s eq:0 -o empty -e empty cp -p -N file file3
finfo=`stat -f "%f" file`
f3info=`stat -f "%f" file3`
if [ $finfo = $f3info ]; then
atf_fail "-p -N preserved file flags"
fi
}
atf_test_case file_to_link
file_to_link_head() {
atf_set "descr" "Checks the copy of a file to a symbolic link"
}
file_to_link_body() {
reset
atf_check -s eq:0 -o empty -e empty cp file2 link
cp_compare file_to_link file file2
}
atf_test_case link_to_file
link_to_file_head() {
atf_set "descr" "Checks the copy of a symbolic link to a file"
}
link_to_file_body() {
reset
# file and link are identical (not copied).
atf_check -s eq:1 -o empty -e ignore cp link file
atf_check -s eq:0 -o empty -e empty cp link file2
cp_compare link_to_file file file2
}
atf_test_case file_over_link
file_over_link_head() {
atf_set "descr" "Checks the copy of a file to a symbolic link" \
"without following it"
}
file_over_link_body() {
reset
atf_check -s eq:0 -o empty -e empty cp -P file link
cp_compare file_over_link file link
}
atf_test_case link_over_file
link_over_file_head() {
atf_set "descr" "Checks the copy of a symbolic link to a file" \
"without following the former"
}
link_over_file_body() {
reset
atf_check -s eq:0 -o empty -e empty cp -P link file
if [ `readlink link` != `readlink file` ]; then
atf_fail "readlink link != readlink file"
fi
}
atf_test_case files_to_dir
files_to_dir_head() {
atf_set "descr" "Checks the copy of multiple files into a directory"
}
files_to_dir_body() {
reset
# can't copy multiple files to a file
atf_check -s eq:1 -o empty -e ignore cp file file2 file3
atf_check -s eq:0 -o empty -e empty cp file file2 link dir
cp_compare files_to_dir file "dir/file"
}
atf_test_case dir_to_file
dir_to_file_head() {
atf_set "descr" "Checks the copy of a directory onto a file, which" \
"should not work"
}
dir_to_file_body() {
reset
# can't copy a dir onto a file
atf_check -s eq:1 -o empty -e ignore cp dir file
atf_check -s eq:1 -o empty -e ignore cp -R dir file
}
atf_test_case file_to_linkdir
file_to_linkdir_head() {
atf_set "descr" "Checks the copy of a file to a symbolic link that" \
"points to a directory"
}
file_to_linkdir_body() {
reset
atf_check -s eq:0 -o empty -e empty cp file dirlink
cp_compare file_to_linkdir file "dir/file"
# overwrite the link
atf_check -s eq:0 -o empty -e empty cp -P file dirlink
atf_check -s eq:1 -o empty -e empty readlink dirlink
cp_compare file_to_linkdir file dirlink
}
atf_test_case linkdir_to_file
linkdir_to_file_head() {
atf_set "descr" "Checks the copy of a symbolic link that points to" \
"a directory onto a file"
}
linkdir_to_file_body() {
reset
# cannot copy a dir onto a file
atf_check -s eq:1 -o empty -e ignore cp dirlink file
# overwrite the link
atf_check -s eq:0 -o empty -e empty cp -P dirlink file
if [ `readlink file` != `readlink dirlink` ]; then
atf_fail "readlink link != readlink file"
fi
}
dir_to_dne_no_R() {
atf_check -s eq:1 -o empty -e ignore cp dir dir2
}
dir_to_dne() {
atf_check -s eq:0 -o empty -e empty cp -R dir dir2
cp_compare dir_to_dne "dir/file" "dir2/file"
readlink dir2/link >/dev/null
if [ $? -gt 0 ]; then
atf_fail "-R didn't copy a link as a link"
fi
}
dir_to_dir_H() {
dir_to_dir_setup
atf_check -s eq:0 -o empty -e empty cp -R dir dir2
chmod 777 dir
# copy a dir into a dir, only command-line links are followed
atf_check -s eq:0 -o empty -e empty cp -R -H dirlink dir2
cp_compare dir_to_dir_H "dir/file" "dir2/dirlink/file"
readlink dir2/dirlink/link >/dev/null
if [ $? -gt 0 ]; then
atf_fail "didn't copy a link as a link"
fi
# Created directories have the same mode as the corresponding
# source directory, unmodified by the process's umask.
if [ `stat -f "%Lp" dir2/dirlink` != "777" ]; then
atf_fail "-R modified dir perms with umask"
fi
}
dir_to_dir_L() {
dir_to_dir_setup
atf_check -s eq:0 -o empty -e empty cp -R dir dir2
atf_check -s eq:0 -o empty -e empty cp -R -H dirlink dir2
# copy a dir into a dir, following all links
atf_check -s eq:0 -o empty -e empty cp -R -H -L dirlink dir2/dirlink
cp_compare dir_to_dir_L "dir/file" "dir2/dirlink/dirlink/file"
# fail if -R -L copied a link as a link
atf_check -s eq:1 -o ignore -e empty readlink dir2/dirlink/dirlink/link
}
dir_to_dir_subdir_exists() {
# recursively copy a dir into another dir, with some subdirs already
# existing
cleanup
mkdir -p dir/1 dir/2 dir/3 target/2
echo "file" > dir/2/file
atf_check -s eq:0 -o empty -e empty cp -R dir/* target
cp_compare dir_to_dir_subdir_exists "dir/2/file" "target/2/file"
}
dir_to_dir_setup() {
reset
umask 077
cp -P file file2 file3 link dir
}
atf_test_case dir_to_dir
dir_to_dir_head() {
atf_set "descr" "Checks the copy of a directory onto another directory"
}
dir_to_dir_body() {
dir_to_dir_setup
dir_to_dne_no_R
dir_to_dne
dir_to_dir_H
dir_to_dir_L
dir_to_dir_subdir_exists
}
atf_init_test_cases()
{
atf_add_test_case file_to_file
atf_add_test_case file_to_link
atf_add_test_case link_to_file
atf_add_test_case file_over_link
atf_add_test_case link_over_file
atf_add_test_case files_to_dir
atf_add_test_case file_to_linkdir
atf_add_test_case linkdir_to_file
atf_add_test_case dir_to_file
atf_add_test_case dir_to_dir
}

8
tests/bin/dd/Makefile Normal file
View File

@@ -0,0 +1,8 @@
# $NetBSD: Makefile,v 1.1 2012/03/17 16:33:11 jruoho Exp $
.include <bsd.own.mk>
TESTSDIR= ${TESTSBASE}/bin/dd
TESTS_SH= t_dd
.include <bsd.test.mk>

130
tests/bin/dd/t_dd.sh Normal file
View File

@@ -0,0 +1,130 @@
# $NetBSD: t_dd.sh,v 1.1 2012/03/17 16:33:11 jruoho Exp $
#
# Copyright (c) 2007 The NetBSD Foundation, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
test_dd_length() {
result=$1
cmd=$2
set -- x `eval $cmd | wc -c`
res=$2
if [ x"$res" != x"$result" ]; then
atf_fail "Expected $result bytes of output, got $res: $cmd"
fi
}
atf_test_case length
length_head() {
# XXX The PR should be stored in a tag.
atf_set "descr" "Test for result messages accidentally pumped into" \
"the output file if the standard IO descriptors are" \
"closed. The last of the three following tests is" \
"the one expected to fail. (NetBSD PR bin/8521)"
}
length_body() {
test_dd_length 512 \
"dd if=/dev/zero of=/dev/fd/5 count=1 5>&1 >/dev/null 2>/dev/null"
test_dd_length 512 \
"dd if=/dev/zero of=/dev/fd/5 count=1 5>&1 >&- 2>/dev/null"
test_dd_length 512 \
"dd if=/dev/zero of=/dev/fd/5 count=1 5>&1 >&- 2>&-"
}
test_dd_io() {
res="`echo -n "$2" | eval $1`"
if [ x"$res" != x"$3" ]; then
atf_fail "Expected \"$3\", got \"$res\": $1"
fi
}
allbits1="\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\060\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117\120\121\122\123\124\125\126\127\130\131\132\133\134\135\136\137\140\141\142\143\144\145\146\147\150\151\152\153\154\155\156\157\160\161\162\163\164\165\166\167\170\171\172\173\174\175\176\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377"
ebcdicbits1="\000\001\002\003\067\055\056\057\026\005\045\013\014\015\016\017\020\021\022\023\074\075\062\046\030\031\077\047\034\035\036\037\100\132\177\173\133\154\120\175\115\135\134\116\153\140\113\141\360\361\362\363\364\365\366\367\370\371\172\136\114\176\156\157\174\301\302\303\304\305\306\307\310\311\321\322\323\324\325\326\327\330\331\342\343\344\345\346\347\350\351\255\340\275\232\155\171\201\202\203\204\205\206\207\210\211\221\222\223\224\225\226\227\230\231\242\243\244\245\246\247\250\251\300\117\320\137\007\040\041\042\043\044\025\006\027\050\051\052\053\054\011\012\033\060\061\032\063\064\065\066\010\070\071\072\073\004\024\076\341\101\102\103\104\105\106\107\110\111\121\122\123\124\125\126\127\130\131\142\143\144\145\146\147\150\151\160\161\162\163\164\165\166\167\170\200\212\213\214\215\216\217\220\152\233\234\235\236\237\240\252\253\254\112\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\241\276\277\312\313\314\315\316\317\332\333\334\335\336\337\352\353\354\355\356\357\372\373\374\375\376\377"
allvisbits=`echo -n "$allbits1" | unvis | vis`
ebcdicvisbits=`echo -n "$ebcdicbits1" | unvis | vis`
atf_test_case io
io_head() {
atf_set "descr" "This checks the combination of bs= with" \
"conv=ebcdic. Prior to revision 1.24 of dd's" \
"args.c, the conv option would be ignored."
}
io_body() {
test_dd_io "unvis | dd 2>/dev/null | vis" \
"$allvisbits" "$allvisbits"
test_dd_io "unvis | dd ibs=1 2>/dev/null | vis" \
"$allvisbits" "$allvisbits"
test_dd_io "unvis | dd obs=1 2>/dev/null | vis" \
"$allvisbits" "$allvisbits"
test_dd_io "unvis | dd bs=1 2>/dev/null | vis" \
"$allvisbits" "$allvisbits"
test_dd_io "unvis | dd conv=ebcdic 2>/dev/null | vis" \
"$allvisbits" "$ebcdicvisbits"
test_dd_io "unvis | dd conv=ebcdic ibs=512 2>/dev/null | vis" \
"$allvisbits" "$ebcdicvisbits"
test_dd_io "unvis | dd conv=ebcdic obs=512 2>/dev/null | vis" \
"$allvisbits" "$ebcdicvisbits"
test_dd_io "unvis | dd conv=ebcdic bs=512 2>/dev/null | vis" \
"$allvisbits" "$ebcdicvisbits"
test_dd_io "unvis | dd conv=ebcdic 2>/dev/null | vis" \
"$allvisbits" "$ebcdicvisbits"
test_dd_io "unvis | dd conv=ebcdic ibs=1 2>/dev/null | vis" \
"$allvisbits" "$ebcdicvisbits"
test_dd_io "unvis | dd conv=ebcdic obs=1 2>/dev/null | vis" \
"$allvisbits" "$ebcdicvisbits"
test_dd_io "unvis | dd conv=ebcdic bs=1 2>/dev/null | vis" \
"$allvisbits" "$ebcdicvisbits"
}
atf_test_case seek
seek_head() {
atf_set "descr" "Tests output file seeking"
}
seek_body() {
echo TEST1234 > testfile
atf_check -s exit:0 -e ignore \
dd if=/dev/zero of=testfile seek=1 bs=8k count=1
atf_check -s exit:0 -e ignore -o match:'^TEST1234$' dd if=testfile
eval $(stat -s testfile)
atf_check_equal $st_size $((2*8192))
echo -n TEST1234 > tf2
atf_check -s exit:0 -e ignore -x \
'dd bs=4 if=/dev/zero count=1 | tr \\0 \\n | dd of=tf2 bs=4 seek=1'
atf_check -s exit:0 -e ignore -o match:'^TEST$' dd if=tf2
eval $(stat -s tf2)
atf_check_equal $st_size 8
}
atf_init_test_cases()
{
atf_add_test_case length
atf_add_test_case io
atf_add_test_case seek
}

27
tests/bin/df/Makefile Normal file
View File

@@ -0,0 +1,27 @@
# $NetBSD: Makefile,v 1.1 2012/03/17 16:33:11 jruoho Exp $
NOMAN= # defined
.include <bsd.own.mk>
TESTSDIR= ${TESTSBASE}/bin/df
TESTS_SH= t_df
BINDIR= ${TESTSDIR}
PROG= h_df
.PATH: ${NETBSDSRCDIR}/bin/df
SRCS= df.c getmntinfo.c
LDADD+= -lutil
DPADD+= ${LIBUTIL}
# Pass -DINTREE to make to test using humanize_number.c in source tree
# directly instead of the one in libc.
.if defined(INTREE)
.PATH: ${NETBSDSRCDIR}/lib/libc/gen
CPPFLAGS+= -I${NETBSDSRCDIR}/lib/libc/include
SRCS+= humanize_number.c
.endif
.include <bsd.test.mk>

218
tests/bin/df/getmntinfo.c Normal file
View File

@@ -0,0 +1,218 @@
/* $NetBSD: getmntinfo.c,v 1.1 2012/03/17 16:33:11 jruoho Exp $ */
/*
* Copyright (c) 2007 The NetBSD Foundation, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/param.h>
#include <sys/ucred.h>
#include <sys/mount.h>
#include <err.h>
#include <stdlib.h>
#include <string.h>
#define KB * 1024
#define MB * 1024 KB
#define GB * 1024 MB
static struct statvfs *getnewstatvfs(void);
static void other_variants(const struct statvfs *, const int *, int,
const int *, int);
static void setup_filer(void);
static void setup_ld0g(void);
static void setup_strpct(void);
static struct statvfs *allstatvfs;
static int sftotal, sfused;
struct statvfs *
getnewstatvfs(void)
{
if (sftotal == sfused) {
sftotal = sftotal ? sftotal * 2 : 1;
allstatvfs = realloc(allstatvfs,
sftotal * sizeof(struct statvfs));
if (allstatvfs == NULL)
err(EXIT_FAILURE, "realloc");
}
return (&allstatvfs[sfused++]);
}
void
other_variants(const struct statvfs *tmpl, const int *minfree, int minfreecnt,
const int *consumed, int consumedcnt)
{
int64_t total, used;
struct statvfs *sf;
int i, j;
for (i = 0; i < minfreecnt; i++)
for (j = 0; j < consumedcnt; j++) {
sf = getnewstatvfs();
*sf = *tmpl;
total = (int64_t)(u_long)sf->f_blocks * sf->f_bsize;
used = total * consumed[j] / 100;
sf->f_bfree = (total - used) / sf->f_bsize;
sf->f_bavail = (total * (100 - minfree[i]) / 100 -
used) / (int)sf->f_bsize;
sf->f_bresvd = sf->f_bfree - sf->f_bavail;
}
}
/*
* Parameter taken from:
* http://mail-index.NetBSD.org/tech-userlevel/2004/03/24/0001.html
*/
void
setup_filer(void)
{
static const struct statvfs tmpl = {
#define BSIZE 512
#define TOTAL 1147ULL GB
#define USED 132ULL MB
.f_bsize = BSIZE,
.f_frsize = BSIZE,
.f_blocks = TOTAL / BSIZE,
.f_bfree = (TOTAL - USED) / BSIZE,
.f_bavail = (TOTAL - USED) / BSIZE,
.f_bresvd = 0,
.f_mntfromname = "filer:/",
.f_mntonname = "/filer",
#undef USED
#undef TOTAL
#undef BSIZE
};
static const int minfree[] = { 0, 5, 10, 15, };
static const int consumed[] = { 0, 20, 60, 95, 100 };
*getnewstatvfs() = tmpl;
other_variants(&tmpl, minfree, sizeof(minfree) / sizeof(minfree[0]),
consumed, sizeof(consumed) / sizeof(consumed[0]));
}
/*
* Parameter taken from:
* http://mail-index.NetBSD.org/current-users/2004/03/01/0038.html
*/
void
setup_ld0g(void)
{
static const struct statvfs tmpl = {
#define BSIZE 4096 /* Guess */
#define TOTAL 1308726116ULL KB
#define USED 17901268ULL KB
#define AVAIL 1225388540ULL KB
.f_bsize = BSIZE,
.f_frsize = BSIZE,
.f_blocks = TOTAL / BSIZE,
.f_bfree = (TOTAL - USED) / BSIZE,
.f_bavail = AVAIL / BSIZE,
.f_bresvd = (TOTAL - USED) / BSIZE - AVAIL / BSIZE,
.f_mntfromname = "/dev/ld0g",
.f_mntonname = "/anon-root",
#undef AVAIL
#undef USED
#undef TOTAL
#undef BSIZE
};
static const int minfree[] = { 0, 5, 10, 15, };
static const int consumed[] = { 0, 20, 60, 95, 100 };
*getnewstatvfs() = tmpl;
other_variants(&tmpl, minfree, sizeof(minfree) / sizeof(minfree[0]),
consumed, sizeof(consumed) / sizeof(consumed[0]));
}
/*
* Test of strpct() with huge number.
*/
void
setup_strpct(void)
{
static const struct statvfs tmpl = {
#define BSIZE 4096 /* Guess */
#define TOTAL 0x4ffffffffULL KB
#define USED (TOTAL / 2)
#define AVAIL (TOTAL / 2)
.f_bsize = BSIZE,
.f_frsize = BSIZE,
.f_blocks = TOTAL / BSIZE,
.f_bfree = (TOTAL - USED) / BSIZE,
.f_bavail = AVAIL / BSIZE,
.f_bresvd = (TOTAL - USED) / BSIZE - AVAIL / BSIZE,
.f_mntfromname = "/dev/strpct",
.f_mntonname = "/strpct",
#undef AVAIL
#undef USED
#undef TOTAL
#undef BSIZE
};
*getnewstatvfs() = tmpl;
}
/*
* Parameter taken from:
* http://www.netbsd.org/cgi-bin/query-pr-single.pl?number=23600
*/
static void
setup_pr23600(void)
{
static const struct statvfs tmpl = {
#define BSIZE 512
#define TOTAL 20971376ULL
#define USED 5719864ULL
#define AVAIL 15251512ULL
.f_bsize = BSIZE,
.f_frsize = BSIZE,
.f_blocks = TOTAL,
.f_bfree = TOTAL - USED,
.f_bavail = AVAIL,
.f_bresvd = TOTAL - USED - AVAIL,
.f_mntfromname = "/dev/wd0e",
.f_mntonname = "/mount/windows/C",
#undef AVAIL
#undef USED
#undef TOTAL
#undef BSIZE
};
*getnewstatvfs() = tmpl;
}
int
getmntinfo(struct statvfs **mntbuf, int flags)
{
setup_filer();
setup_ld0g();
setup_strpct();
setup_pr23600();
*mntbuf = allstatvfs;
return (sfused);
}

148
tests/bin/df/t_df.sh Normal file
View File

@@ -0,0 +1,148 @@
# $NetBSD: t_df.sh,v 1.1 2012/03/17 16:33:11 jruoho Exp $
#
# Copyright (c) 2007, 2008 The NetBSD Foundation, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
atf_test_case normal
normal_head() {
atf_set "descr" "Checks that the output of df without flags is" \
"correct according to some already-known, sane" \
"output"
}
normal_body() {
cat >expout <<EOF
Filesystem 1K-blocks Used Avail %Cap Mounted on
filer:/ 1202716672 135168 1202581504 0% /filer
filer:/ 1202716672 0 1202716672 0% /filer
filer:/ 1202716672 240543334 962173337 20% /filer
filer:/ 1202716672 721630003 481086668 60% /filer
filer:/ 1202716672 1142580838 60135833 95% /filer
filer:/ 1202716672 1202716672 0 100% /filer
filer:/ 1202716672 0 1142580838 0% /filer
filer:/ 1202716672 240543334 902037504 21% /filer
filer:/ 1202716672 721630003 420950835 63% /filer
filer:/ 1202716672 1142580838 0 100% /filer
filer:/ 1202716672 1202716672 -60135833 105% /filer
filer:/ 1202716672 0 1082445004 0% /filer
filer:/ 1202716672 240543334 841901670 22% /filer
filer:/ 1202716672 721630003 360815001 66% /filer
filer:/ 1202716672 1142580838 -60135833 105% /filer
filer:/ 1202716672 1202716672 -120271667 111% /filer
filer:/ 1202716672 0 1022309171 0% /filer
filer:/ 1202716672 240543334 781765836 23% /filer
filer:/ 1202716672 721630003 300679168 70% /filer
filer:/ 1202716672 1142580838 -120271667 111% /filer
filer:/ 1202716672 1202716672 -180407500 117% /filer
/dev/ld0g 1308726116 17901268 1225388540 1% /anon-root
/dev/ld0g 1308726116 0 1308726116 0% /anon-root
/dev/ld0g 1308726116 261745224 1046980892 20% /anon-root
/dev/ld0g 1308726116 785235672 523490444 60% /anon-root
/dev/ld0g 1308726116 1243289812 65436304 95% /anon-root
/dev/ld0g 1308726116 1308726116 0 100% /anon-root
/dev/ld0g 1308726116 0 1243289808 0% /anon-root
/dev/ld0g 1308726116 261745224 981544584 21% /anon-root
/dev/ld0g 1308726116 785235672 458054140 63% /anon-root
/dev/ld0g 1308726116 1243289812 0 100% /anon-root
/dev/ld0g 1308726116 1308726116 -65436304 105% /anon-root
/dev/ld0g 1308726116 0 1177853504 0% /anon-root
/dev/ld0g 1308726116 261745224 916108280 22% /anon-root
/dev/ld0g 1308726116 785235672 392617832 66% /anon-root
/dev/ld0g 1308726116 1243289812 -65436304 105% /anon-root
/dev/ld0g 1308726116 1308726116 -130872608 111% /anon-root
/dev/ld0g 1308726116 0 1112417196 0% /anon-root
/dev/ld0g 1308726116 261745224 850671972 23% /anon-root
/dev/ld0g 1308726116 785235672 327181528 70% /anon-root
/dev/ld0g 1308726116 1243289812 -130872608 111% /anon-root
/dev/ld0g 1308726116 1308726116 -196308916 117% /anon-root
/dev/strpct 21474836476 10737418240 10737418236 50% /strpct
/dev/wd0e 10485688 2859932 7625756 27% /mount/windows/C
EOF
atf_check -s eq:0 -o file:expout -e empty \
-x "BLOCKSIZE=1k $(atf_get_srcdir)/h_df -n"
}
atf_test_case hflag
hflag_head() {
atf_set "descr" "Checks that the output of df is correct according" \
"to some already-known, sane output when using the" \
"human readable format"
}
hflag_body() {
cat >expout <<EOF
Filesystem Size Used Avail %Cap Mounted on
filer:/ 1.1T 132M 1.1T 0% /filer
filer:/ 1.1T 0B 1.1T 0% /filer
filer:/ 1.1T 229G 918G 20% /filer
filer:/ 1.1T 688G 459G 60% /filer
filer:/ 1.1T 1.1T 57G 95% /filer
filer:/ 1.1T 1.1T 0B 100% /filer
filer:/ 1.1T 0B 1.1T 0% /filer
filer:/ 1.1T 229G 860G 21% /filer
filer:/ 1.1T 688G 401G 63% /filer
filer:/ 1.1T 1.1T 0B 100% /filer
filer:/ 1.1T 1.1T -57G 105% /filer
filer:/ 1.1T 0B 1.0T 0% /filer
filer:/ 1.1T 229G 803G 22% /filer
filer:/ 1.1T 688G 344G 66% /filer
filer:/ 1.1T 1.1T -57G 105% /filer
filer:/ 1.1T 1.1T -115G 111% /filer
filer:/ 1.1T 0B 975G 0% /filer
filer:/ 1.1T 229G 746G 23% /filer
filer:/ 1.1T 688G 287G 70% /filer
filer:/ 1.1T 1.1T -115G 111% /filer
filer:/ 1.1T 1.1T -172G 117% /filer
/dev/ld0g 1.2T 17G 1.1T 1% /anon-root
/dev/ld0g 1.2T 0B 1.2T 0% /anon-root
/dev/ld0g 1.2T 250G 998G 20% /anon-root
/dev/ld0g 1.2T 749G 499G 60% /anon-root
/dev/ld0g 1.2T 1.2T 62G 95% /anon-root
/dev/ld0g 1.2T 1.2T 0B 100% /anon-root
/dev/ld0g 1.2T 0B 1.2T 0% /anon-root
/dev/ld0g 1.2T 250G 936G 21% /anon-root
/dev/ld0g 1.2T 749G 437G 63% /anon-root
/dev/ld0g 1.2T 1.2T 0B 100% /anon-root
/dev/ld0g 1.2T 1.2T -62G 105% /anon-root
/dev/ld0g 1.2T 0B 1.1T 0% /anon-root
/dev/ld0g 1.2T 250G 874G 22% /anon-root
/dev/ld0g 1.2T 749G 374G 66% /anon-root
/dev/ld0g 1.2T 1.2T -62G 105% /anon-root
/dev/ld0g 1.2T 1.2T -125G 111% /anon-root
/dev/ld0g 1.2T 0B 1.0T 0% /anon-root
/dev/ld0g 1.2T 250G 811G 23% /anon-root
/dev/ld0g 1.2T 749G 312G 70% /anon-root
/dev/ld0g 1.2T 1.2T -125G 111% /anon-root
/dev/ld0g 1.2T 1.2T -187G 117% /anon-root
/dev/strpct 20T 10T 10T 50% /strpct
/dev/wd0e 10G 2.7G 7.3G 27% /mount/windows/C
EOF
atf_check -s eq:0 -o file:expout -e empty \
-x "BLOCKSIZE=1k $(atf_get_srcdir)/h_df -hn"
}
atf_init_test_cases()
{
atf_add_test_case normal
atf_add_test_case hflag
}

8
tests/bin/expr/Makefile Normal file
View File

@@ -0,0 +1,8 @@
# $NetBSD: Makefile,v 1.1 2012/03/17 16:33:11 jruoho Exp $
.include <bsd.own.mk>
TESTSDIR= ${TESTSBASE}/bin/expr
TESTS_SH= t_expr
.include <bsd.test.mk>

228
tests/bin/expr/t_expr.sh Normal file
View File

@@ -0,0 +1,228 @@
# $NetBSD: t_expr.sh,v 1.3 2012/03/27 07:23:06 jruoho Exp $
#
# Copyright (c) 2007 The NetBSD Foundation, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
# The first arg will get eval'd so escape any meta characters
# The 2nd arg is an expected string/response from expr for that op.
test_expr() {
echo "Expression '${1}', expecting '${2}'"
res=`eval expr $1 2>&1`
if [ "$res" != "$2" ]; then
atf_fail "Expected $2, got $res from expression: " \
"`eval echo $1`"
fi
}
atf_test_case lang
lang_ops_head() {
atf_set "descr" "Test that expr(1) works with non-C LANG (PR bin/2486)"
}
lang_body() {
export LANG=nonexistent
atf_check -s exit:0 -o inline:"21\n" -e empty -x "expr 10 + 11"
export LANG=ru_RU.KOI8-R
atf_check -s exit:0 -o inline:"21\n" -e empty -x "expr 10 + 11"
}
atf_test_case overflow
overflow_head() {
atf_set "descr" "Test overflow cases"
}
overflow_body() {
test_expr '4611686018427387904 + 4611686018427387903' \
'9223372036854775807'
test_expr '4611686018427387904 + 4611686018427387904' \
"expr: integer overflow or underflow occurred for operation '4611686018427387904 + 4611686018427387904'"
test_expr '4611686018427387904 - -4611686018427387904' \
"expr: integer overflow or underflow occurred for operation '4611686018427387904 - -4611686018427387904'"
test_expr '-4611686018427387904 - 4611686018427387903' \
'-9223372036854775807'
test_expr '-4611686018427387904 - 4611686018427387905' \
"expr: integer overflow or underflow occurred for operation '-4611686018427387904 - 4611686018427387905'"
test_expr '-4611686018427387904 \* 1' '-4611686018427387904'
test_expr '-4611686018427387904 \* -1' '4611686018427387904'
test_expr '-4611686018427387904 \* 2' '-9223372036854775808'
test_expr '-4611686018427387904 \* 3' \
"expr: integer overflow or underflow occurred for operation '-4611686018427387904 * 3'"
test_expr '-4611686018427387904 \* -2' \
"expr: integer overflow or underflow occurred for operation '-4611686018427387904 * -2'"
test_expr '4611686018427387904 \* 1' '4611686018427387904'
test_expr '4611686018427387904 \* 2' \
"expr: integer overflow or underflow occurred for operation '4611686018427387904 * 2'"
test_expr '4611686018427387904 \* 3' \
"expr: integer overflow or underflow occurred for operation '4611686018427387904 * 3'"
}
atf_test_case gtkmm
gtkmm_head() {
atf_set "descr" "Test from gtk-- configure that cause problems on old expr"
}
gtkmm_body() {
test_expr '3 \> 3 \| 3 = 3 \& 4 \> 4 \| 3 = 3 \& 4 = 4 \& 5 \>= 5' '1'
test_expr '3 \> 3 \| 3 = 3 \& 4 \> 4 \| 3 = 3 \& 4 = 4 \& 5 \>= 6' '0'
test_expr '3 \> 3 \| 3 = 3 \& 4 \> 4 \| 3 = 3 \& 4 = 3 \& 5 \>= 5' '0'
test_expr '3 \> 3 \| 3 = 3 \& 4 \> 4 \| 3 = 2 \& 4 = 4 \& 5 \>= 5' '0'
test_expr '3 \> 2 \| 3 = 3 \& 4 \> 4 \| 3 = 3 \& 4 = 4 \& 5 \>= 6' '1'
test_expr '3 \> 3 \| 3 = 3 \& 4 \> 3 \| 3 = 3 \& 4 = 4 \& 5 \>= 5' '1'
}
atf_test_case colon_vs_math
colon_vs_math_head() {
atf_set "descr" "Basic precendence test with the : operator vs. math"
}
colon_vs_math_body() {
test_expr '2 : 4 / 2' '0'
test_expr '4 : 4 % 3' '1'
}
atf_test_case arithmetic_ops
arithmetic_ops_head() {
atf_set "descr" "Dangling arithemtic operator"
}
arithmetic_ops_body() {
test_expr '.java_wrapper : /' '0'
test_expr '4 : \*' '0'
test_expr '4 : +' '0'
test_expr '4 : -' '0'
test_expr '4 : /' '0'
test_expr '4 : %' '0'
}
atf_test_case basic_math
basic_math_head() {
atf_set "descr" "Basic math test"
}
basic_math_body() {
test_expr '2 + 4 \* 5' '22'
}
atf_test_case basic_functional
basic_functional_head() {
atf_set "descr" "Basic functional tests"
}
basic_functional_body() {
test_expr '2' '2'
test_expr '-4' '-4'
test_expr 'hello' 'hello'
}
atf_test_case compare_ops_precedence
compare_ops_precedence_head() {
atf_set "descr" "Compare operator precendence test"
}
compare_ops_precedence_body() {
test_expr '2 \> 1 \* 17' '0'
}
atf_test_case compare_ops
compare_ops_head() {
atf_set "descr" "Compare operator tests"
}
compare_ops_body() {
test_expr '2 \!= 5' '1'
test_expr '2 \!= 2' '0'
test_expr '2 \<= 3' '1'
test_expr '2 \<= 2' '1'
test_expr '2 \<= 1' '0'
test_expr '2 \< 3' '1'
test_expr '2 \< 2' '0'
test_expr '2 = 2' '1'
test_expr '2 = 4' '0'
test_expr '2 \>= 1' '1'
test_expr '2 \>= 2' '1'
test_expr '2 \>= 3' '0'
test_expr '2 \> 1' '1'
test_expr '2 \> 2' '0'
}
atf_test_case multiply
multiply_head() {
atf_set "descr" "Test the multiply operator (PR bin/12838)"
}
multiply_body() {
test_expr '1 \* -1' '-1'
test_expr '2 \> 1 \* 17' '0'
}
atf_test_case negative
negative_head() {
atf_set "descr" "Test the additive inverse"
}
negative_body() {
test_expr '-1 + 5' '4'
test_expr '- 1 + 5' 'expr: syntax error'
test_expr '5 + -1' '4'
test_expr '5 + - 1' 'expr: syntax error'
test_expr '1 - -5' '6'
}
atf_test_case math_precedence
math_precedence_head() {
atf_set "descr" "More complex math test for precedence"
}
math_precedence_body() {
test_expr '-3 + -1 \* 4 + 3 / -6' '-7'
}
atf_test_case precedence
precedence_head() {
atf_set "descr" "Test precedence"
}
precedence_body() {
# This is messy but the shell escapes cause that
test_expr 'X1/2/3 : X\\\(.\*[^/]\\\)//\*[^/][^/]\*/\*$ \| . : \\\(.\\\)' '1/2'
}
atf_test_case regex
regex_head() {
atf_set "descr" "Test proper () returning \1 from a regex"
}
regex_body() {
# This is messy but the shell escapes cause that
test_expr '1/2 : .\*/\\\(.\*\\\)' '2'
}
atf_init_test_cases()
{
atf_add_test_case lang
atf_add_test_case overflow
atf_add_test_case gtkmm
atf_add_test_case colon_vs_math
atf_add_test_case arithmetic_ops
atf_add_test_case basic_math
atf_add_test_case basic_functional
atf_add_test_case compare_ops_precedence
atf_add_test_case compare_ops
atf_add_test_case multiply
atf_add_test_case negative
atf_add_test_case math_precedence
atf_add_test_case precedence
atf_add_test_case regex
}

8
tests/bin/pax/Makefile Normal file
View File

@@ -0,0 +1,8 @@
# $NetBSD: Makefile,v 1.1 2012/03/17 16:33:11 jruoho Exp $
.include <bsd.own.mk>
TESTSDIR= ${TESTSBASE}/bin/pax
TESTS_SH= t_pax
.include <bsd.test.mk>

54
tests/bin/pax/t_pax.sh Normal file
View File

@@ -0,0 +1,54 @@
# $NetBSD: t_pax.sh,v 1.1 2012/03/17 16:33:11 jruoho Exp $
#
# Copyright (c) 2007, 2008 The NetBSD Foundation, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
atf_test_case append
append_head() {
atf_set "descr" "Ensure that appending a file to an archive" \
"produces the same results as if the file" \
"had been there during the archive's creation"
}
append_body() {
touch foo bar
# store both foo and bar into file1.tar
atf_check -s eq:0 -o empty -e empty \
pax -w -b 512 -x ustar -f file1.tar foo bar
# store foo into file2.tar, then append bar to file2.tar
atf_check -s eq:0 -o empty -e empty \
pax -w -b 512 -x ustar -f file2.tar foo
atf_check -s eq:0 -o empty -e empty \
pax -w -b 512 -x ustar -f file2.tar -a bar
# ensure that file1.tar and file2.tar are equal
atf_check -s eq:0 -o empty -e empty cmp file1.tar file2.tar
}
atf_init_test_cases()
{
atf_add_test_case append
}

12
tests/bin/ps/Makefile Normal file
View File

@@ -0,0 +1,12 @@
# $NetBSD: Makefile,v 1.1 2012/03/17 16:33:11 jruoho Exp $
.include <bsd.own.mk>
TESTSDIR= ${TESTSBASE}/bin/ps
TESTS_SH= t_ps
FILESDIR= ${TESTSDIR}
FILES= keywords
.include <bsd.test.mk>

122
tests/bin/ps/keywords Normal file
View File

@@ -0,0 +1,122 @@
# $NetBSD: keywords,v 1.1 2012/03/17 16:33:11 jruoho Exp $
#
# Table of keywords for use with ps "-o" option.
#
# The first column (keyword) is the name of a keyword.
#
# The second column (header) is the default column header associated
# with the keyword, except if the keyword is an alias, in which case the
# second column is the name of another keyword.
#
# The third column (flag) may be blank, "LJUST", or "ALIAS". "ALIAS"
# means that the keyword is an alias. "LJUST" means that the keyword
# should be displayed in a left-justified column. The default is that
# the keyword should be displayed in a right-justified column.
#
# keyword header flag
#
ktracep KTRACEP
nwchan WCHAN
p_ru P_RU
paddr PADDR
rlink RLINK
%cpu %CPU
%mem %MEM
acflag ACFLG
acflg acflag ALIAS
args command ALIAS
blocked sigmask ALIAS
caught sigcatch ALIAS
comm COMMAND LJUST
command COMMAND LJUST
cpu CPU
cputime time ALIAS
ctime CTIME
egid EGID
egroup EGROUP LJUST
etime ELAPSED
euid EUID
euser EUSER LJUST
f F
flags f ALIAS
gid GID
group GROUP LJUST
groupnames GROUPNAMES LJUST
groups GROUPS LJUST
holdcnt HOLDCNT
ignored sigignore ALIAS
inblk INBLK
inblock inblk ALIAS
jobc JOBC
ktrace KTRACE
laddr LADDR
lid LID
lim LIM
login LOGIN LJUST
logname login ALIAS
lstart STARTED LJUST
lstate STAT LJUST
majflt MAJFLT
minflt MINFLT
msgrcv MSGRCV
msgsnd MSGSND
ni nice ALIAS
nice NI
nivcsw NIVCSW
nlwp NLWP
nsignals nsigs ALIAS
nsigs NSIGS
nswap NSWAP
nvcsw NVCSW
oublk OUBLK
oublock oublk ALIAS
pagein PAGEIN
pcpu %cpu ALIAS
pending sig ALIAS
pgid PGID
pid PID
pmem %mem ALIAS
ppid PPID
pri PRI
re RE
rgid RGID
rgroup RGROUP LJUST
rlwp RLWP
rss RSS
rssize rsz ALIAS
rsz RSZ
ruid RUID
ruser RUSER LJUST
sess SESS
sid SID
sig PENDING
sigcatch CAUGHT
sigignore IGNORED
sigmask BLOCKED
sl SL
start STARTED
stat state ALIAS
state STAT LJUST
stime STIME
svgid SVGID
svgroup SVGROUP LJUST
svuid SVUID
svuser SVUSER LJUST
tdev TDEV
time TIME
tpgid TPGID
tsess TSESS
tsiz TSIZ
tt TTY LJUST
tty TTY LJUST
uaddr UADDR
ucomm UCOMM LJUST
uid UID
upr UPR
user USER LJUST
usrpri upr ALIAS
utime UTIME
vsize vsz ALIAS
vsz VSZ
wchan WCHAN LJUST
xstat XSTAT

404
tests/bin/ps/t_ps.sh Normal file
View File

@@ -0,0 +1,404 @@
# $NetBSD: t_ps.sh,v 1.1 2012/03/17 16:33:11 jruoho Exp $
#
# Copyright (c) 2007 The NetBSD Foundation, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
# the implementation of "ps" to test
: ${TEST_PS:="ps"}
# tab and newline characters
tab="$(printf '\t')"
# nl="$(printf '\n')" doesn't work
nl='
'
#
# Parse the "keywords" file into a load of shell variables
#
setup_keywords()
{
# Set variables representing the header text
# for all normal keywords (except aliases), and
# for regular expressions to match the text in left- or
# right-justified columns.
# For example, head_text_p_cpu="%CPU" head_regexp_p_cpu=" *%CPU".
while read keyword heading flag
do
case "$keyword" in
''|\#*) continue
;;
esac
[ x"$flag" = x"ALIAS" ] && continue
kvar="${keyword}"
case "${keyword}" in
%*) kvar="p_${keyword#%}"
;;
esac
eval head_text_${kvar}=\'"${heading}"\'
case "${flag}" in
'') # right justified
eval head_regexp_${kvar}=\'" *${heading}"\'
;;
LJUST) # left justified
eval head_regexp_${kvar}=\'"${heading} *"\'
;;
*) atf_fail "unknown flag in keywords"
;;
esac
done <"$(atf_get_srcdir)/keywords"
# Now do the aliases.
while read keyword heading flag
do
case "$keyword" in
''|\#*) continue
;;
esac
[ x"$flag" != x"ALIAS" ] && continue
kvar="${keyword}"
avar="${heading}"
case "${keyword}" in
%*) kvar="p_${keyword#%}"
;;
esac
case "${heading}" in
%*) avar="p_${heading#%}"
;;
esac
eval head_text_${kvar}=\"\$head_text_${avar}\"
eval head_regexp_${kvar}=\"\$head_regexp_${avar}\"
done <"$(atf_get_srcdir)/keywords"
# default sets of keywords
default_keywords='pid tty stat time command'
j_keywords='user pid ppid pgid sess jobc state tt time command'
l_keywords='uid pid ppid cpu pri nice vsz rss wchan state tt time command'
s_keywords='uid pid ppid cpu lid nlwp pri nice vsz rss wchan lstate tt time command'
u_keywords='user pid %cpu %mem vsz rss tt state start time command'
v_keywords='pid state time sl re pagein vsz rss lim tsiz %cpu %mem command'
}
# Convert a list of keywords like "pid comm" to a regexp
# like " *PID COMMAND *"
heading_keywords_to_regexp()
{
local keywords="$1"
local regexp
regexp="$(echo "$keywords" | \
sed -E -e 's/\%/p_/g' -e 's/(^| )/\1\$head_regexp_/g')"
eval regexp=\""${regexp}"\"
regexp="^${regexp}\$"
echo "$regexp"
}
#
# Check that a string matches a regexp; use the specified id
# in error or success messages.
#
check_regexp() {
local id="$1" string="$2" regexp="$3"
if ! expr "$string" : "$regexp" >/dev/null
then
atf_fail "${id}: expected [${regexp}], got [${string}]"
false
fi
}
#
# Run "ps $args -p $$"; check that only one line is printed,
# without a preceding header line.
#
check_no_heading_line()
{
local args="$1"
local output="$(eval "${TEST_PS} $args -p $$")"
case "$output" in
*"$nl"*)
local firstline="${output%%${nl}*}"
atf_fail "check_no_heading_line [$args] got [$firstline]"
;;
*)
;;
esac
}
#
# Run "ps $args"; check that the heading matches the expected regexp.
#
check_heading_regexp()
{
args="$1"
regexp="$2"
actual="$( eval "${TEST_PS} $args" | sed -e 1q )"
check_regexp "heading [$args]" "${actual}" "${regexp}"
}
#
# Run "ps $args"; check that the heading matches a regexp constructed
# from the specified keywords.
#
check_heading_keywords()
{
args="$1"
keywords="$2"
check_heading_regexp "$args" "$(heading_keywords_to_regexp "$keywords")"
}
#
# Try several variations on "ps $flag", "ps -$flag", etc.,
# and check that the heading always has the correct keywords.
#
check_heading_variations()
{
flag="$1"
keywords="$2"
for args in "$flag" "-$flag" "-$flag$flag -$flag"; do
check_heading_keywords "$args" "$keywords"
done
}
atf_test_case default_columns
default_columns_head()
{
atf_set "descr" "Checks that the default set of columns is correct" \
"and also check that the columns printed by the -j," \
"-l, -s, -u and -v flags alone are correct"
}
default_columns_body()
{
setup_keywords
check_heading_keywords '' "$default_keywords"
check_heading_variations 'j' "$j_keywords"
check_heading_variations 'l' "$l_keywords"
check_heading_variations 's' "$s_keywords"
check_heading_variations 'u' "$u_keywords"
check_heading_variations 'v' "$v_keywords"
}
atf_test_case minus_O
minus_O_head()
{
atf_set "descr" "Checks that 'ps -O foo' inserts columns just after" \
"the pid column"
}
minus_O_body()
{
setup_keywords
check_heading_keywords '-O %cpu,%mem' \
"$(echo "${default_keywords}" | sed -e 's/pid/pid %cpu %mem/')"
check_heading_keywords '-O %cpu -O %mem' \
"$(echo "${default_keywords}" | sed -e 's/pid/pid %cpu %mem/')"
check_heading_keywords '-O%cpu -O%mem' \
"$(echo "${default_keywords}" | sed -e 's/pid/pid %cpu %mem/')"
}
atf_test_case minus_o
minus_o_head()
{
atf_set "descr" "Checks simple cases of 'ps -o foo' to control which" \
"columns are printed; this does not test header" \
"overriding via 'ps -o foo=BAR'"
}
minus_o_body()
{
setup_keywords
# Keywords for "-o name" override the default display
check_heading_keywords '-o pid,%cpu,%mem' \
"pid %cpu %mem"
check_heading_keywords '-o pid -o %cpu,%mem' \
"pid %cpu %mem"
check_heading_keywords '-opid -o %cpu,%mem' \
"pid %cpu %mem"
# Space works like comma
check_heading_keywords '-opid -o "%cpu %mem"' \
"pid %cpu %mem"
# Check missing pid
check_heading_keywords '-o comm' \
"comm"
# Check pid present but not first
check_heading_keywords '-o comm,pid' \
"comm pid"
}
atf_test_case override_heading_simple
override_heading_simple_head()
{
atf_set "descr" "Tests simple uses of header overriding via" \
"'ps -o foo=BAR'. This does not test columns " \
"with null headings, or headings with embedded" \
"space, ',' or '='."
}
override_heading_simple_body()
{
setup_keywords
check_heading_regexp '-o pid=PPP -o comm' \
'^ *PPP '"${head_text_comm}"'$' # no trailing space
check_heading_regexp '-o pid=PPP -o comm=CCC' \
'^ *PPP CCC$'
check_heading_regexp '-o pid,comm=CCC' \
'^'"${head_regexp_pid}"' CCC$'
check_heading_regexp '-o pid -o comm=CCC' \
'^'"${head_regexp_pid}"' CCC$'
# Check missing pid
check_heading_regexp '-o comm=CCC' \
'^CCC$'
# Check pid present but not first
check_heading_regexp '-o comm=CCC -o pid=PPP' \
'^CCC *PPP$'
check_heading_regexp '-o comm,pid=PPP' \
'^'"${head_regexp_comm}"' *PPP$'
}
atf_test_case override_heading_embedded_specials
override_heading_embedded_specials_head()
{
atf_set "descr" "Tests header overriding with embedded space," \
"',' or '='. Everything after the first '='" \
"is part of the heading."
}
override_heading_embedded_specials_body()
{
setup_keywords
# Check embedded "," or "=" in override header.
check_heading_regexp '-o comm,pid==' \
'^'"${head_regexp_comm}"' *=$'
check_heading_regexp '-o comm,pid=,' \
'^'"${head_regexp_comm}"' *,$'
check_heading_regexp '-o pid=PPP,comm' \
'^ *PPP,comm$' # not like '-o pid=PPP -o comm'
check_heading_regexp '-o pid=PPP,comm=CCC' \
'^ *PPP,comm=CCC$' # not like '-o pid=PPP -o comm=CCC'
check_heading_regexp '-o comm,pid=PPP,QQQ' \
'^'"${head_regexp_comm}"' *PPP,QQQ$'
check_heading_regexp '-o comm,pid=ppid,tty=state' \
'^'"${head_regexp_comm}"' *ppid,tty=state$'
# Check embedded space or tab in override header.
check_heading_regexp '-o comm,pid="PPP QQQ"' \
'^'"${head_regexp_comm}"' *PPP QQQ$'
check_heading_regexp '-o comm,pid="PPP${tab}QQQ"' \
'^'"${head_regexp_comm}"' *PPP'"${tab}"'QQQ$'
}
atf_test_case override_heading_some_null
override_heading_some_null_head()
{
atf_set "descr" "Tests simple uses of null column headings" \
"overriding via 'ps -o foo=BAR -o baz='. This" \
"does not test the case where all columns have" \
"null headings."
}
override_heading_some_null_body()
{
setup_keywords
check_heading_regexp '-o pid=PPP -o comm=' \
'^ *PPP *$'
check_heading_regexp '-o pid= -o comm=CCC' \
'^ * CCC$'
check_heading_regexp '-o pid -o comm=' \
'^'"${head_regexp_pid}"' *$'
# Check missing pid
check_heading_regexp '-o ppid= -o comm=CCC' \
'^ * CCC$'
check_heading_regexp '-o ppid=PPP -o comm=' \
'^ *PPP *$'
# Check pid present but not first
check_heading_regexp '-o comm= -o pid=PPP' \
'^ * PPP$'
check_heading_regexp '-o comm,pid=' \
'^'"${head_regexp_comm}"' *$'
# A field with a null custom heading retains a minimum width
# derived from the default heading. This does not apply
# to a field with a very short (non-null) custom heading.
#
# We choose "holdcnt" as a column whose width is likely to be
# determined entirely by the header width, because the values
# are likely to be very small.
check_heading_regexp '-o holdcnt -o holdcnt -o holdcnt' \
'^HOLDCNT HOLDCNT HOLDCNT$'
check_heading_regexp '-o holdcnt -o holdcnt= -o holdcnt' \
'^HOLDCNT HOLDCNT$'
check_heading_regexp '-o holdcnt -o holdcnt=HH -o holdcnt' \
'^HOLDCNT HH HOLDCNT$'
}
atf_test_case override_heading_all_null
override_heading_all_null_head()
{
atf_set "descr" "Tests the use of 'ps -o foo= -o bar=' (with a" \
"null heading for every column). The heading" \
"should not be printed at all in this case."
}
override_heading_all_null_body()
{
setup_keywords
# A heading with a space is not a null heading,
# so should not be suppressed
check_heading_regexp '-o comm=" "' \
'^ *$'
# Null headings should be suppressed
check_no_heading_line '-o pid= -o comm='
check_no_heading_line '-o pid= -o comm='
# Check missing pid
check_no_heading_line '-o ppid='
check_no_heading_line '-o comm='
check_no_heading_line '-o command='
check_no_heading_line '-o ppid= -o comm='
check_no_heading_line '-o comm= -o ppid='
# Check pid present but not first
check_no_heading_line '-o comm= -o pid='
check_no_heading_line '-o ppid= -o pid= -o command='
}
atf_test_case duplicate_column
duplicate_column_head()
{
atf_set "descr" "Tests the use of -o options to display the" \
"same column more than once"
}
duplicate_column_body()
{
setup_keywords
# two custom headers
check_heading_regexp '-o pid=PPP -o pid=QQQ' \
'^ *PPP *QQQ$'
# one custom header, before and after default header
check_heading_regexp '-o pid=PPP -o pid' \
'^ *PPP '"${head_regexp_pid}"'$'
check_heading_regexp '-o pid -o pid=QQQ' \
'^'"${head_regexp_pid}"' *QQQ$'
# custom headers both before and after default header
check_heading_regexp '-o pid=PPP -o pid -o pid=QQQ' \
'^ *PPP '"${head_regexp_pid}"' *QQQ$'
}
atf_init_test_cases() {
atf_add_test_case default_columns
atf_add_test_case minus_O
atf_add_test_case minus_o
atf_add_test_case override_heading_simple
atf_add_test_case override_heading_embedded_specials
atf_add_test_case override_heading_some_null
atf_add_test_case override_heading_all_null
atf_add_test_case duplicate_column
}

18
tests/bin/sh/Makefile Normal file
View File

@@ -0,0 +1,18 @@
# $NetBSD: Makefile,v 1.2 2012/06/11 18:32:59 njoly Exp $
.include <bsd.own.mk>
TESTSDIR= ${TESTSBASE}/bin/sh
TESTS_SH= t_compexit
TESTS_SH+= t_exit
TESTS_SH+= t_expand
TESTS_SH+= t_evaltested
TESTS_SH+= t_fsplit
TESTS_SH+= t_here
TESTS_SH+= t_set_e
TESTS_SH+= t_ulimit
TESTS_SH+= t_varquote
TESTS_SH+= t_wait
.include <bsd.test.mk>

View File

@@ -0,0 +1,63 @@
# $NetBSD: t_compexit.sh,v 1.1 2012/03/17 16:33:11 jruoho Exp $
#
# Copyright (c) 2007 The NetBSD Foundation, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
# The standard
# http://www.opengroup.org/onlinepubs/007904975/utilities/set.html
# says:
#
# -e
#
# When this option is on, if a simple command fails for any of the
# reasons listed in Consequences of Shell Errors or returns an exit
# status value >0, and is not part of the compound list following a
# while, until, or if keyword, and is not a part of an AND or OR list,
# and is not a pipeline preceded by the ! reserved word, then the shell
# shall immediately exit.
crud() {
set -e
for x in a
do
BAR="foo"
false && echo true
echo mumble
done
}
atf_test_case set_e
set_e_head() {
atf_set "descr" "Tests that 'set -e' turns on error detection" \
"and that it behaves as defined by the standard"
}
set_e_body() {
foo=`crud`
atf_check_equal 'x$foo' 'xmumble'
}
atf_init_test_cases() {
atf_add_test_case set_e
}

View File

@@ -0,0 +1,60 @@
# $NetBSD: t_evaltested.sh,v 1.1 2012/03/17 16:33:11 jruoho Exp $
#
# Copyright (c) 2011 The NetBSD Foundation, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
atf_test_case evaltested
evaltested_head() {
atf_set "descr" "Tests that eval in a tested context does not exit"
}
evaltested_body() {
set -e
cat > helper.sh << EOF
set -e
if eval false
then
echo "'eval false' returned true"
exit 1
fi
echo "passed"
exit 0
EOF
output="$(/bin/sh helper.sh)"
[ $? = 0 ] && return
if [ -n "$output" ]
then
atf_fail "$output"
else
atf_fail "'eval false' exited from a tested context"
fi
}
atf_init_test_cases() {
atf_add_test_case evaltested
}

105
tests/bin/sh/t_exit.sh Normal file
View File

@@ -0,0 +1,105 @@
# $NetBSD: t_exit.sh,v 1.3 2012/04/13 06:12:32 jruoho Exp $
#
# Copyright (c) 2007 The NetBSD Foundation, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
crud() {
test yes = no
cat <<EOF
$?
EOF
}
atf_test_case background
background_head() {
atf_set "descr" "Tests that sh(1) sets '$?' properly when running " \
"a command in the background (PR bin/46327)"
}
background_body() {
atf_check -s exit:0 -o ignore -e ignore -x "true; true & echo $?"
atf_check -s exit:0 -o ignore -e ignore -x "false; true & echo $?"
}
atf_test_case function
function_head() {
atf_set "descr" "Tests that \$? is correctly updated inside" \
"a function"
}
function_body() {
foo=`crud`
atf_check_equal 'x$foo' 'x1'
}
atf_test_case readout
readout_head() {
atf_set "descr" "Tests that \$? is correctly updated in a" \
"compound expression"
}
readout_body() {
atf_check_equal '$( true && ! true | false; echo $? )' '0'
}
atf_test_case trap_subshell
trap_subshell_head() {
atf_set "descr" "Tests that the trap statement in a subshell" \
"works when the subshell exits"
}
trap_subshell_body() {
atf_check -s eq:0 -o inline:'exiting\n' -x \
'( trap "echo exiting" EXIT; /usr/bin/true )'
}
atf_test_case trap_zero__implicit_exit
trap_zero__implicit_exit_body() {
# PR bin/6764: sh works but ksh does not"
echo '( trap "echo exiting" 0 )' >helper.sh
atf_check -s eq:0 -o match:exiting -e empty /bin/sh helper.sh
atf_check -s eq:0 -o match:exiting -e empty /bin/ksh helper.sh
}
atf_test_case trap_zero__explicit_exit
trap_zero__explicit_exit_body() {
echo '( trap "echo exiting" 0; exit )' >helper.sh
atf_check -s eq:0 -o match:exiting -e empty /bin/sh helper.sh
atf_check -s eq:0 -o match:exiting -e empty /bin/ksh helper.sh
}
atf_test_case trap_zero__explicit_return
trap_zero__explicit_return_body() {
echo '( trap "echo exiting" 0; return )' >helper.sh
atf_check -s eq:0 -o match:exiting -e empty /bin/sh helper.sh
atf_check -s eq:0 -o match:exiting -e empty /bin/ksh helper.sh
}
atf_init_test_cases() {
atf_add_test_case background
atf_add_test_case function
atf_add_test_case readout
atf_add_test_case trap_subshell
atf_add_test_case trap_zero__implicit_exit
atf_add_test_case trap_zero__explicit_exit
atf_add_test_case trap_zero__explicit_return
}

128
tests/bin/sh/t_expand.sh Normal file
View File

@@ -0,0 +1,128 @@
# $NetBSD: t_expand.sh,v 1.1 2012/03/17 16:33:11 jruoho Exp $
#
# Copyright (c) 2007, 2009 The NetBSD Foundation, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
#
# This file tests the functions in expand.c.
#
delim_argv() {
str=
while [ $# -gt 0 ]; do
if [ -z "${str}" ]; then
str=">$1<"
else
str="${str} >$1<"
fi
shift
done
echo ${str}
}
atf_test_case dollar_at
dollar_at_head() {
atf_set "descr" "Somewhere between 2.0.2 and 3.0 the expansion" \
"of the \$@ variable had been broken. Check for" \
"this behavior."
}
dollar_at_body() {
# This one should work everywhere.
got=`echo "" "" | sed 's,$,EOL,'`
atf_check_equal ' EOL' '$got'
# This code triggered the bug.
set -- "" ""
got=`echo "$@" | sed 's,$,EOL,'`
atf_check_equal ' EOL' '$got'
set -- -
shift
n_arg() { echo $#; }
n_args=`n_arg "$@"`
atf_check_equal '0' '$n_args'
}
atf_test_case dollar_at_with_text
dollar_at_with_text_head() {
atf_set "descr" "Test \$@ expansion when it is surrounded by text" \
"within the quotes. PR bin/33956."
}
dollar_at_with_text_body() {
set --
atf_check_equal '' "$(delim_argv "$@")"
atf_check_equal '>foobar<' "$(delim_argv "foo$@bar")"
atf_check_equal '>foo bar<' "$(delim_argv "foo $@ bar")"
set -- a b c
atf_check_equal '>a< >b< >c<' "$(delim_argv "$@")"
atf_check_equal '>fooa< >b< >cbar<' "$(delim_argv "foo$@bar")"
atf_check_equal '>foo a< >b< >c bar<' "$(delim_argv "foo $@ bar")"
}
atf_test_case strip
strip_head() {
atf_set "descr" "Checks that the %% operator works and strips" \
"the contents of a variable from the given point" \
"to the end"
}
strip_body() {
line='#define bindir "/usr/bin" /* comment */'
stripped='#define bindir "/usr/bin" '
atf_expect_fail "PR bin/43469"
atf_check_equal '$stripped' '${line%%/\**}'
}
atf_test_case varpattern_backslashes
varpattern_backslashes_head() {
atf_set "descr" "Tests that protecting wildcards with backslashes" \
"works in variable patterns."
}
varpattern_backslashes_body() {
line='/foo/bar/*/baz'
stripped='/foo/bar/'
atf_check_equal $stripped ${line%%\**}
}
atf_test_case arithmetic
arithmetic_head() {
atf_set "descr" "POSIX requires shell arithmetic to use signed" \
"long or a wider type. We use intmax_t, so at" \
"least 64 bits should be available. Make sure" \
"this is true."
}
arithmetic_body() {
atf_check_equal '3' '$((1 + 2))'
atf_check_equal '2147483647' '$((0x7fffffff))'
atf_check_equal '9223372036854775807' '$(((1 << 63) - 1))'
}
atf_init_test_cases() {
atf_add_test_case dollar_at
atf_add_test_case dollar_at_with_text
atf_add_test_case strip
atf_add_test_case varpattern_backslashes
atf_add_test_case arithmetic
}

186
tests/bin/sh/t_fsplit.sh Normal file
View File

@@ -0,0 +1,186 @@
# $NetBSD: t_fsplit.sh,v 1.1 2012/03/17 16:33:11 jruoho Exp $
#
# Copyright (c) 2007 The NetBSD Foundation, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
# The standard
# http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html
# explains (section 2.6) that Field splitting should be performed on the
# result of variable expansions.
# In particular this means that in ${x-word}, 'word' must be expanded as if
# the "${x-" and "}" were absent from the input line.
#
# So: sh -c 'set ${x-a b c}; echo $#' should give 3.
#
nl='
'
check()
{
result="$(eval $1)"
# Remove newlines
oifs="$IFS"
IFS="$nl"
result="$(echo $result)"
IFS="$oifs"
if [ "$2" != "$result" ]
then
atf_fail "expected [$2], found [$result]"
fi
}
atf_test_case for
for_head() {
atf_set "descr" "Checks field splitting in for loops"
}
for_body() {
unset x
# Since I managed to break this, leave the test in
check 'for f in $x; do echo x${f}y; done' ''
}
atf_test_case default_val
default_val_head() {
atf_set "descr" "Checks field splitting in variable default values"
}
default_val_body() {
unset x
# Check that IFS is applied to text from ${x-...} unless it is inside
# any set of "..."
check 'set ${x-a b c}; echo $#' 3
check 'for i in ${x-a b c}; do echo "z${i}z"; done' 'zaz zbz zcz'
check 'for i in ${x-"a b" c}; do echo "z${i}z"; done' 'za bz zcz'
check 'for i in ${x-"a ${x-b c}" d}; do echo "z${i}z"; done' 'za b cz zdz'
check 'for i in ${x-"a ${x-"b c"}" d}; do echo "z${i}z"; done' 'za b cz zdz'
check 'for i in ${x-a ${x-"b c"} d}; do echo "z${i}z"; done' 'zaz zb cz zdz'
check 'for i in ${x-a ${x-b c} d}; do echo "z${i}z"; done' 'zaz zbz zcz zdz'
}
atf_test_case ifs_alpha
ifs_alpha_head() {
atf_set "descr" "Checks that field splitting works with alphabetic" \
"characters"
}
ifs_alpha_body() {
unset x
# repeat with an alphabetic in IFS
check 'IFS=q; set ${x-aqbqc}; echo $#' 3
check 'IFS=q; for i in ${x-aqbqc}; do echo "z${i}z"; done' 'zaz zbz zcz'
check 'IFS=q; for i in ${x-"aqb"qc}; do echo "z${i}z"; done' 'zaqbz zcz'
check 'IFS=q; for i in ${x-"aq${x-bqc}"qd}; do echo "z${i}z"; done' 'zaqbqcz zdz'
check 'IFS=q; for i in ${x-"aq${x-"bqc"}"qd}; do echo "z${i}z"; done' 'zaqbqcz zdz'
check 'IFS=q; for i in ${x-aq${x-"bqc"}qd}; do echo "z${i}z"; done' 'zaz zbqcz zdz'
}
atf_test_case quote
quote_head() {
atf_set "descr" "Checks that field splitting works with multi-word" \
"fields"
}
quote_body() {
unset x
# Some quote propagation checks
check 'set "${x-a b c}"; echo $#' 1
check 'set "${x-"a b" c}"; echo $1' 'a b c'
check 'for i in "${x-a b c}"; do echo "z${i}z"; done' 'za b cz'
}
atf_test_case dollar_at
dollar_at_head() {
atf_set "descr" "Checks that field splitting works when expanding" \
"\$@"
}
dollar_at_body() {
unset x
# Check we get "$@" right
check 'set ""; for i; do echo "z${i}z"; done' 'zz'
check 'set ""; for i in "$@"; do echo "z${i}z"; done' 'zz'
check 'set "" ""; for i; do echo "z${i}z"; done' 'zz zz'
check 'set "" ""; for i in "$@"; do echo "z${i}z"; done' 'zz zz'
check 'set "" ""; for i in $@; do echo "z${i}z"; done' ''
check 'set "a b" c; for i; do echo "z${i}z"; done' 'za bz zcz'
check 'set "a b" c; for i in "$@"; do echo "z${i}z"; done' 'za bz zcz'
check 'set "a b" c; for i in $@; do echo "z${i}z"; done' 'zaz zbz zcz'
check 'set " a b " c; for i in "$@"; do echo "z${i}z"; done' 'z a b z zcz'
check 'set --; for i in x"$@"x; do echo "z${i}z"; done' 'zxxz'
check 'set a; for i in x"$@"x; do echo "z${i}z"; done' 'zxaxz'
check 'set a b; for i in x"$@"x; do echo "z${i}z"; done' 'zxaz zbxz'
}
atf_test_case ifs
ifs_head() {
atf_set "descr" "Checks that IFS correctly configures field" \
"splitting behavior"
}
ifs_body() {
unset x
# Some IFS tests
check 't="-- "; IFS=" "; set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '0'
check 't=" x"; IFS=" x"; set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '1'
check 't=" x "; IFS=" x"; set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '1'
check 't=axb; IFS="x"; set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '2 a:b'
check 't="a x b"; IFS="x"; set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '2 a : b'
check 't="a xx b"; IFS="x"; set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '3 a :: b'
check 't="a xx b"; IFS="x "; set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '3 a::b'
# A recent 'clarification' means that a single trailing IFS non-whitespace
# doesn't generate an empty parameter
check 't="xax"; IFS="x"; set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '2 :a'
check 't="xax "; IFS="x "; set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '2 :a'
# Verify that IFS isn't being applied where it shouldn't be.
check 'IFS="x"; set axb; IFS=":"; r="$*"; IFS=; echo $# $r' '1 axb'
}
atf_test_case var_length
var_length_head() {
atf_set "descr" "Checks that field splitting works when expanding" \
"a variable's length"
}
var_length_body() {
unset x
# Check that we apply IFS to ${#var}
long=12345678123456781234567812345678
long=$long$long$long$long
check 'echo ${#long}; IFS=2; echo ${#long}; set 1 ${#long};echo $#' '128 1 8 3'
check 'IFS=2; set ${x-${#long}}; IFS=" "; echo $* $#' '1 8 2'
check 'IFS=2; set ${x-"${#long}"}; IFS=" "; echo $* $#' '128 1'
}
atf_init_test_cases() {
atf_add_test_case for
atf_add_test_case default_val
atf_add_test_case ifs_alpha
atf_add_test_case quote
atf_add_test_case dollar_at
atf_add_test_case ifs
atf_add_test_case var_length
}

73
tests/bin/sh/t_here.sh Normal file
View File

@@ -0,0 +1,73 @@
# $NetBSD: t_here.sh,v 1.1 2012/03/17 16:33:11 jruoho Exp $
#
# Copyright (c) 2007 The NetBSD Foundation, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
nl='
'
check()
{
SVIFS="$IFS"
result="$(eval $1)"
# Remove newlines
oifs="$IFS"
IFS="$nl"
result="$(echo $result)"
IFS="$oifs"
if [ "$2" != "$result" ]
then
atf_fail "expected [$2], found [$result]"
fi
IFS="$SVIFS"
}
atf_test_case all
all_head() {
atf_set "descr" "Basic tests for here documents"
}
all_body() {
y=x
IFS=
check 'x=`cat <<EOF'$nl'text'${nl}EOF$nl'`; echo $x' 'text'
check 'x=`cat <<\EOF'$nl'text'${nl}EOF$nl'`; echo $x' 'text'
check 'x=`cat <<EOF'$nl'te${y}t'${nl}EOF$nl'`; echo $x' 'text'
check 'x=`cat <<\EOF'$nl'te${y}t'${nl}EOF$nl'`; echo $x' 'te${y}t'
check 'x=`cat <<"EOF"'$nl'te${y}t'${nl}EOF$nl'`; echo $x' 'te${y}t'
check 'x=`cat <<'"'EOF'"$nl'te${y}t'${nl}EOF$nl'`; echo $x' 'te${y}t'
check 'x=`cat <<EOF'$nl'te'"'"'xt'${nl}EOF$nl'`; echo $x' 'te'"'"'xt'
check 'x=`cat <<\EOF'$nl'te'"'"'xt'${nl}EOF$nl'`; echo $x' 'te'"'"'xt'
check 'x=`cat <<"EOF"'$nl'te'"'"'xt'${nl}EOF$nl'`; echo $x' 'te'"'"'xt'
check 'x=`cat <<EOF'$nl'te'"'"'${y}t'${nl}EOF$nl'`; echo $x' 'te'"'"'xt'
check 'x=`cat <<EOF'$nl'te'"''"'${y}t'${nl}EOF$nl'`; echo $x' 'te'"''"'xt'
}
atf_init_test_cases() {
atf_add_test_case all
}

289
tests/bin/sh/t_set_e.sh Normal file
View File

@@ -0,0 +1,289 @@
# $NetBSD: t_set_e.sh,v 1.1 2012/03/17 16:33:11 jruoho Exp $
#
# Copyright (c) 2007 The NetBSD Foundation, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
# references:
# http://www.opengroup.org/onlinepubs/009695399/utilities/set.html
# http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html
# the implementation of "sh" to test
: ${TEST_SH:="sh"}
failwith()
{
case "$SH_FAILS" in
"") SH_FAILS=`echo "$1"`;;
*) SH_FAILS="$SH_FAILS"`echo; echo "$1"`;;
esac
}
check1()
{
#echo "$TEST_SH -c $1"
result=`$TEST_SH -c "$1" 2>/dev/null | tr '\n' ' ' | sed 's/ *$//'`
if [ "$result" != "$2" ]; then
MSG=`printf "%-56s %-8s %s" "$3" "$result" "$2"`
failwith "$MSG"
failcount=`expr $failcount + 1`
fi
count=`expr $count + 1`
}
# direct check: try the given expression.
dcheck()
{
check1 "$1" "$2" "$1"
}
# eval check: indirect through eval.
# as of this writing, this changes the behavior pretty drastically and
# is thus important to test. (PR bin/29861)
echeck()
{
check1 'eval '"'($1)'" "$2" "eval '($1)'"
}
atf_test_case all
all_head() {
atf_set "descr" "Tests that 'set -e' works correctly"
}
all_body() {
count=0
failcount=0
# make sure exiting from a subshell behaves as expected
dcheck '(set -e; exit 1; echo ERR$?); echo OK$?' 'OK1'
echeck '(set -e; exit 1; echo ERR$?); echo OK$?' 'OK1'
# first, check basic functioning.
# The ERR shouldn't print; the result of the () should be 1.
# Henceforth we'll assume that we don't need to check $?.
dcheck '(set -e; false; echo ERR$?); echo -n OK$?' 'OK1'
echeck '(set -e; false; echo ERR$?); echo -n OK$?' 'OK1'
# these cases should be equivalent to the preceding.
dcheck '(set -e; /nonexistent; echo ERR); echo OK' 'OK'
echeck '(set -e; /nonexistent; echo ERR); echo OK' 'OK'
dcheck '(set -e; nonexistent-program-on-path; echo ERR); echo OK' 'OK'
echeck '(set -e; nonexistent-program-on-path; echo ERR); echo OK' 'OK'
dcheck 'f() { false; }; (set -e; f; echo ERR); echo OK' 'OK'
echeck 'f() { false; }; (set -e; f; echo ERR); echo OK' 'OK'
dcheck 'f() { return 1; }; (set -e; f; echo ERR); echo OK' 'OK'
echeck 'f() { return 1; }; (set -e; f; echo ERR); echo OK' 'OK'
# but! with set -e, the false should cause an *immediate* exit.
# The return form should not, as such, but there's no way to
# distinguish it.
dcheck 'f() { false; echo ERR; }; (set -e; f); echo OK' 'OK'
echeck 'f() { false; echo ERR; }; (set -e; f); echo OK' 'OK'
# set is not scoped, so these should not exit at all.
dcheck 'f() { set +e; false; echo OK; }; (set -e; f); echo OK' 'OK OK'
echeck 'f() { set +e; false; echo OK; }; (set -e; f); echo OK' 'OK OK'
# according to the standard, only failing *simple* commands
# cause an exit under -e. () is not a simple command.
# Correct (per POSIX):
#dcheck '(set -e; (set +e; false; echo OK; false); echo OK)' 'OK OK'
#echeck '(set -e; (set +e; false; echo OK; false); echo OK)' 'OK OK'
# Wrong current behavior:
dcheck '(set -e; (set +e; false; echo OK; false); echo OK)' 'OK'
echeck '(set -e; (set +e; false; echo OK; false); echo OK)' 'OK'
# make sure an inner nested shell does exit though.
dcheck '(set -e; (false; echo ERR)); echo OK' 'OK'
# The left hand side of an || or && is explicitly tested and
# thus should not cause an exit. Furthermore, because a || or
# && expression is not a simple command, there should be no
# exit even if the overall result is false.
dcheck '(set -e; false || true; echo OK); echo OK' 'OK OK'
echeck '(set -e; false || true; echo OK); echo OK' 'OK OK'
dcheck '(set -e; false && true; echo OK); echo OK' 'OK OK'
echeck '(set -e; false && true; echo OK); echo OK' 'OK OK'
# However, the right hand side is not tested, so a failure
# there *should* cause an exit, regardless of whether it
# appears inside a non-simple command.
#
# Note that in at least one place the standard does not
# distinguish between the left and right hand sides of
# logical operators. It is possible that for strict
# compliance these need to not exit; however, if so that
# should probably be limited to when some strict-posix setting
# is in effect and tested accordingly.
#
dcheck '(set -e; false || false; echo ERR); echo OK' 'OK'
dcheck '(set -e; true && false; echo ERR); echo OK' 'OK'
echeck '(set -e; false || false; echo ERR); echo OK' 'OK'
echeck '(set -e; true && false; echo ERR); echo OK' 'OK'
# correct:
#dcheck '(set -e; false && false; echo ERR); echo OK' 'OK'
#echeck '(set -e; false && false; echo ERR); echo OK' 'OK'
# wrong current behavior:
dcheck '(set -e; false && false; echo ERR); echo OK' 'ERR OK'
echeck '(set -e; false && false; echo ERR); echo OK' 'ERR OK'
# A failure that is not reached because of short-circuit
# evaluation should not cause an exit, however.
dcheck '(set -e; true || false; echo OK); echo OK' 'OK OK'
echeck '(set -e; true || false; echo OK); echo OK' 'OK OK'
# For completeness, test the other two combinations.
dcheck '(set -e; true || true; echo OK); echo OK' 'OK OK'
dcheck '(set -e; true && true; echo OK); echo OK' 'OK OK'
echeck '(set -e; true || true; echo OK); echo OK' 'OK OK'
echeck '(set -e; true && true; echo OK); echo OK' 'OK OK'
# likewise, none of these should exit.
dcheck '(set -e; while false; do :; done; echo OK); echo OK' 'OK OK'
dcheck '(set -e; if false; then :; fi; echo OK); echo OK' 'OK OK'
# problematic :-)
#dcheck '(set -e; until false; do :; done; echo OK); echo OK' 'OK OK'
dcheck '(set -e; until [ "$t" = 1 ]; do t=1; done; echo OK); echo OK' \
'OK OK'
echeck '(set -e; while false; do :; done; echo OK); echo OK' 'OK OK'
echeck '(set -e; if false; then :; fi; echo OK); echo OK' 'OK OK'
echeck '(set -e; until [ "$t" = 1 ]; do t=1; done; echo OK); echo OK' \
'OK OK'
# the bang operator tests its argument and thus the argument
# should not cause an exit. it is also not a simple command (I
# believe) so it also shouldn't exit even if it yields a false
# result.
dcheck '(set -e; ! false; echo OK); echo OK' 'OK OK'
dcheck '(set -e; ! true; echo OK); echo OK' 'OK OK'
echeck '(set -e; ! false; echo OK); echo OK' 'OK OK'
echeck '(set -e; ! true; echo OK); echo OK' 'OK OK'
# combined case with () and &&; the inner expression is false
# but does not itself exit, and the () should not cause an
# exit even when failing.
# correct:
#dcheck '(set -e; (false && true); echo OK); echo OK' 'OK OK'
#echeck '(set -e; (false && true); echo OK); echo OK' 'OK OK'
# wrong current behavior:
dcheck '(set -e; (false && true); echo OK); echo OK' 'OK'
echeck '(set -e; (false && true); echo OK); echo OK' 'OK'
# pipelines. only the right-hand end is significant.
dcheck '(set -e; false | true; echo OK); echo OK' 'OK OK'
echeck '(set -e; false | true; echo OK); echo OK' 'OK OK'
dcheck '(set -e; true | false; echo ERR); echo OK' 'OK'
echeck '(set -e; true | false; echo ERR); echo OK' 'OK'
dcheck '(set -e; while true | false; do :; done; echo OK); echo OK' \
'OK OK'
dcheck '(set -e; if true | false; then :; fi; echo OK); echo OK' \
'OK OK'
# According to dsl@ in PR bin/32282, () is not defined as a
# subshell, only as a grouping operator [and a scope, I guess]
# so the nested false ought to cause the whole shell to exit,
# not just the subshell. dholland@ would like to see C&V,
# because that seems like a bad idea. (Among other things, it
# would break all the above test logic, which relies on being
# able to isolate set -e behavior inside ().) However, I'm
# going to put these tests here to make sure the issue gets
# dealt with sometime.
#
# XXX: the second set has been disabled in the name of making
# all tests "pass".
# 1. error if the whole shell exits (current behavior)
dcheck 'echo OK; (set -e; false); echo OK' 'OK OK'
echeck 'echo OK; (set -e; false); echo OK' 'OK OK'
# 2. error if the whole shell does not exit (dsl's suggested behavior)
#dcheck 'echo OK; (set -e; false); echo ERR' 'OK'
#echeck 'echo OK; (set -e; false); echo ERR' 'OK'
# The current behavior of the shell is that it exits out as
# far as -e is set and then stops. This is probably a
# consequence of it handling () wrong, but it's a somewhat
# curious compromise position between 1. and 2. above.
dcheck '(set -e; (false; echo ERR); echo ERR); echo OK' 'OK'
echeck '(set -e; (false; echo ERR); echo ERR); echo OK' 'OK'
# backquote expansion (PR bin/17514)
# correct
#dcheck '(set -e; echo ERR `false`; echo ERR); echo OK' 'OK'
#dcheck '(set -e; echo ERR $(false); echo ERR); echo OK' 'OK'
#dcheck '(set -e; echo ERR `exit 3`; echo ERR); echo OK' 'OK'
#dcheck '(set -e; echo ERR $(exit 3); echo ERR); echo OK' 'OK'
# wrong current behavior
dcheck '(set -e; echo ERR `false`; echo ERR); echo OK' 'ERR ERR OK'
dcheck '(set -e; echo ERR $(false); echo ERR); echo OK' 'ERR ERR OK'
dcheck '(set -e; echo ERR `exit 3`; echo ERR); echo OK' 'ERR ERR OK'
dcheck '(set -e; echo ERR $(exit 3); echo ERR); echo OK' 'ERR ERR OK'
dcheck '(set -e; x=`false`; echo ERR); echo OK' 'OK'
dcheck '(set -e; x=$(false); echo ERR); echo OK' 'OK'
dcheck '(set -e; x=`exit 3`; echo ERR); echo OK' 'OK'
dcheck '(set -e; x=$(exit 3); echo ERR); echo OK' 'OK'
# correct
#echeck '(set -e; echo ERR `false`; echo ERR); echo OK' 'OK'
#echeck '(set -e; echo ERR $(false); echo ERR); echo OK' 'OK'
#echeck '(set -e; echo ERR `exit 3`; echo ERR); echo OK' 'OK'
#echeck '(set -e; echo ERR $(exit 3); echo ERR); echo OK' 'OK'
# wrong current behavior
echeck '(set -e; echo ERR `false`; echo ERR); echo OK' 'ERR ERR OK'
echeck '(set -e; echo ERR $(false); echo ERR); echo OK' 'ERR ERR OK'
echeck '(set -e; echo ERR `exit 3`; echo ERR); echo OK' 'ERR ERR OK'
echeck '(set -e; echo ERR $(exit 3); echo ERR); echo OK' 'ERR ERR OK'
echeck '(set -e; x=`false`; echo ERR); echo OK' 'OK'
echeck '(set -e; x=$(false); echo ERR); echo OK' 'OK'
echeck '(set -e; x=`exit 3`; echo ERR); echo OK' 'OK'
echeck '(set -e; x=$(exit 3); echo ERR); echo OK' 'OK'
# shift (PR bin/37493)
# correct
#dcheck '(set -e; shift || true; echo OK); echo OK' 'OK OK'
#echeck '(set -e; shift || true; echo OK); echo OK' 'OK OK'
# wrong current behavior
dcheck '(set -e; shift || true; echo OK); echo OK' 'OK'
echeck '(set -e; shift || true; echo OK); echo OK' 'OK'
# Done.
if [ "x$SH_FAILS" != x ]; then
printf '%-56s %-8s %s\n' "Expression" "Result" "Should be"
echo "$SH_FAILS"
atf_fail "$failcount of $count failed cases"
else
atf_pass
fi
}
atf_init_test_cases() {
atf_add_test_case all
}

46
tests/bin/sh/t_ulimit.sh Normal file
View File

@@ -0,0 +1,46 @@
# $NetBSD: t_ulimit.sh,v 1.1 2012/06/11 18:32:59 njoly Exp $
#
# Copyright (c) 2012 The NetBSD Foundation, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
# ulimit builtin test.
atf_test_case limits
limits_head() {
atf_set "descr" "Checks for limits flags"
}
limits_body() {
atf_check -s eq:0 -o ignore -e empty \
/bin/sh -c "ulimit -a"
for l in $(ulimit -a | sed 's,^.*(,,;s, .*$,,');
do
atf_check -s eq:0 -o ignore -e empty \
/bin/sh -c "ulimit $l"
done
}
atf_init_test_cases() {
atf_add_test_case limits
}

View File

@@ -0,0 +1,81 @@
# $NetBSD: t_varquote.sh,v 1.2 2012/03/25 18:50:19 christos Exp $
#
# Copyright (c) 2007 The NetBSD Foundation, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
# Variable quoting test.
check() {
if [ "$1" != "$2" ]
then
atf_fail "expected [$2], found [$1]" 1>&2
fi
}
atf_test_case all
all_head() {
atf_set "descr" "Basic checks for variable quoting"
}
all_body() {
foo='${a:-foo}'
check "$foo" '${a:-foo}'
foo="${a:-foo}"
check "$foo" "foo"
foo=${a:-"'{}'"}
check "$foo" "'{}'"
foo=${a:-${b:-"'{}'"}}
check "$foo" "'{}'"
foo="${a:-"'{}'"}"
check "$foo" "'{}'"
foo="${a:-${b:-"${c:-${d:-"x}"}}y}"}}z}"
# " z*"
# ${a:- }
# ${b:- }
# " y*"
# ${c:- }
# ${d:- }
# "x*"
check "$foo" "x}y}z}"
}
atf_test_case nested_quotes_multiword
nested_quotes_multiword_head() {
atf_set "descr" "Tests that having nested quoting in a multi-word" \
"string works (PR bin/43597)"
}
nested_quotes_multiword_body() {
atf_check -s eq:0 -o match:"first-word second-word" -e empty \
/bin/sh -c 'echo "${foo:="first-word"} second-word"'
}
atf_init_test_cases() {
atf_add_test_case all
atf_add_test_case nested_quotes_multiword
}

59
tests/bin/sh/t_wait.sh Normal file
View File

@@ -0,0 +1,59 @@
# $NetBSD: t_wait.sh,v 1.1 2012/03/17 16:33:11 jruoho Exp $
#
# Copyright (c) 2008, 2009, 2010 The NetBSD Foundation, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
atf_test_case individual
individual_head() {
atf_set "descr" "Tests that waiting for individual jobs works"
}
individual_body() {
# atf-sh confuses wait for some reason; work it around by creating
# a helper script that executes /bin/sh directly.
cat >helper.sh <<EOF
sleep 3 &
sleep 1 &
wait %1
if [ \$? -ne 0 ]; then
echo "Waiting of first job failed"
exit 1
fi
wait %2
if [ \$? -ne 0 ]; then
echo "Waiting of second job failed"
exit 1
fi
exit 0
EOF
output=$(/bin/sh helper.sh)
[ $? -eq 0 ] || atf_fail "${output}"
}
atf_init_test_cases() {
atf_add_test_case individual
}

8
tests/bin/sleep/Makefile Normal file
View File

@@ -0,0 +1,8 @@
# $NetBSD: Makefile,v 1.1 2012/03/30 09:27:10 jruoho Exp $
.include <bsd.own.mk>
TESTSDIR= ${TESTSBASE}/bin/sleep
TESTS_SH= t_sleep
.include <bsd.test.mk>

View File

@@ -0,0 +1,72 @@
# $NetBSD: t_sleep.sh,v 1.1 2012/03/30 09:27:10 jruoho Exp $
#
# Copyright (c) 2012 The NetBSD Foundation, Inc.
# All rights reserved.
#
# This code is derived from software contributed to The NetBSD Foundation
# by Jukka Ruohonen.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
atf_test_case fraction
fraction_head() {
atf_set "descr" "Test that sleep(1) handles " \
"fractions of a second (PR bin/3914)"
}
fraction_body() {
atf_check -s exit:0 -o empty -e empty -x "sleep 0.1"
atf_check -s exit:0 -o empty -e empty -x "sleep 0.2"
atf_check -s exit:0 -o empty -e empty -x "sleep 0.3"
}
atf_test_case hex
hex_head() {
atf_set "descr" "Test that sleep(1) handles hexadecimal arguments"
}
hex_body() {
atf_check -s exit:0 -o empty -e empty -x "sleep 0x01"
}
atf_test_case nonnumeric
nonnumeric_head() {
atf_set "descr" "Test that sleep(1) errors out with " \
"non-numeric argument (PR bin/27140)"
}
nonnumeric_body() {
atf_check -s not-exit:0 -o empty -e not-empty -x "sleep xyz"
atf_check -s not-exit:0 -o empty -e not-empty -x "sleep x21"
atf_check -s not-exit:0 -o empty -e not-empty -x "sleep /3"
}
atf_init_test_cases() {
atf_add_test_case fraction
atf_add_test_case hex
atf_add_test_case nonnumeric
}

8
tests/bin/tar/Makefile Normal file
View File

@@ -0,0 +1,8 @@
# $NetBSD: Makefile,v 1.1 2012/03/17 16:33:11 jruoho Exp $
.include <bsd.own.mk>
TESTSDIR= ${TESTSBASE}/bin/tar
TESTS_SH= t_tar
.include <bsd.test.mk>

51
tests/bin/tar/t_tar.sh Normal file
View File

@@ -0,0 +1,51 @@
# $NetBSD: t_tar.sh,v 1.1 2012/03/17 16:33:11 jruoho Exp $
#
# Copyright (c) 2007, 2008 The NetBSD Foundation, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
atf_test_case append
append_head() {
atf_set "descr" "Ensure that appending a file to an archive" \
"produces the same results as if the file" \
"had been there during the archive's creation"
}
append_body() {
touch foo bar
# store both foo and bar into file1.tar
atf_check -s eq:0 -o empty -e empty tar -cf file1.tar foo bar
# store foo into file2.tar, then append bar to file2.tar
atf_check -s eq:0 -o empty -e empty tar -cf file2.tar foo
atf_check -s eq:0 -o empty -e empty tar -rf file2.tar bar
# ensure that file1.tar and file2.tar are equal
atf_check -s eq:0 -o empty -e empty cmp file1.tar file2.tar
}
atf_init_test_cases()
{
atf_add_test_case append
}

9
tests/crypto/Makefile Normal file
View File

@@ -0,0 +1,9 @@
# $NetBSD: Makefile,v 1.2 2010/07/13 21:13:21 jmmv Exp $
.include <bsd.own.mk>
TESTS_SUBDIRS= libcrypto
TESTSDIR= ${TESTSBASE}/crypto
.include <bsd.test.mk>

View File

@@ -0,0 +1 @@
.include "../Makefile.inc"

View File

@@ -0,0 +1,32 @@
# $NetBSD: Makefile,v 1.9 2012/07/14 04:06:17 christos Exp $
.include <bsd.own.mk>
.if ${MKCRYPTO} != "no"
SUBDIR+=bf bn cast conf des dh dsa ec ecdh ecdsa engine evp hmac lhash \
md2 md4 md5 rand rc2 rc4 ripemd rsa sha sha1 srp threads x509v3
SUBDIR+=idea mdc2
.if ${MKCRYPTO_RC5} != "no"
SUBDIR+=rc5
.endif
TESTSDIR= ${TESTSBASE}/crypto/libcrypto
TESTS_SH= t_certs
TESTS_SH+= t_ciphers
TESTS_SH+= t_hashes
TESTS_SH+= t_libcrypto
TESTS_SH+= t_pubkey
.include <bsd.test.mk>
.else
NOPROG=
.include <bsd.prog.mk>
.endif

View File

@@ -0,0 +1,29 @@
# $NetBSD: Makefile.inc,v 1.6 2011/06/11 18:03:17 christos Exp $
.include <bsd.own.mk>
.include "../Makefile.inc"
TESTSDIR= ${TESTSBASE}/crypto/libcrypto
ATFFILE= no
.if defined(HELPER_NAME)
HELPER_SRCS?= ${HELPER_NAME}.c
PROG= h_${HELPER_NAME}
SRCS= ${HELPER_SRCS}
MAN= # empty
BINDIR= ${TESTSDIR}
DPADD+= ${LIBCRYPTO} ${LIBCRYPT}
LDADD+= -lcrypto -lcrypt
CWARNFLAGS.clang+= -Wno-format
CPPFLAGS+= -DOPENSSL_FIPS
CPPFLAGS+= -I${OPENSSLSRC} -I${OPENSSLSRC}/crypto
CRYPTODIST= ${NETBSDSRCDIR}/crypto
.include "${NETBSDSRCDIR}/crypto/Makefile.openssl"
.PATH: ${OPENSSLSRC}/crypto/${HELPER_DIR}
.include <bsd.test.mk>
.include <bsd.prog.mk>
.endif

View File

@@ -0,0 +1,6 @@
# $NetBSD: Makefile,v 1.1 2009/02/13 20:58:14 jmmv Exp $
HELPER_NAME= bftest
HELPER_DIR= bf
.include <bsd.init.mk>

View File

@@ -0,0 +1,7 @@
# $NetBSD: Makefile,v 1.1 2009/02/13 20:58:14 jmmv Exp $
.include <bsd.own.mk>
SUBDIR=bn div exp
.include <bsd.subdir.mk>

View File

@@ -0,0 +1,3 @@
# $NetBSD: Makefile.inc,v 1.1 2009/02/13 20:58:14 jmmv Exp $
.include "../Makefile.inc"

View File

@@ -0,0 +1,6 @@
# $NetBSD: Makefile,v 1.1 2009/02/13 20:58:14 jmmv Exp $
HELPER_NAME= bntest
HELPER_DIR= bn
.include <bsd.init.mk>

View File

@@ -0,0 +1,6 @@
# $NetBSD: Makefile,v 1.2 2010/12/18 04:27:17 joerg Exp $
HELPER_NAME= divtest
HELPER_DIR= bn
.include <bsd.init.mk>

View File

@@ -0,0 +1,6 @@
# $NetBSD: Makefile,v 1.1 2009/02/13 20:58:14 jmmv Exp $
HELPER_NAME= exptest
HELPER_DIR= bn
.include <bsd.init.mk>

View File

@@ -0,0 +1,6 @@
# $NetBSD: Makefile,v 1.1 2009/02/13 20:58:14 jmmv Exp $
HELPER_NAME= casttest
HELPER_DIR= cast
.include <bsd.init.mk>

View File

@@ -0,0 +1,11 @@
# $NetBSD: Makefile,v 1.1 2009/02/13 20:58:14 jmmv Exp $
HELPER_NAME= conftest
HELPER_DIR= conf
HELPER_SRCS= test.c
FILESDIR= ${TESTSDIR}
FILES= d_conf_ssleay.cnf
FILES+= d_conf.out
.include <bsd.init.mk>

View File

@@ -0,0 +1,94 @@
num_items = 47
num_nodes = 24
num_alloc_nodes = 32
num_expands = 16
num_expand_reallocs = 1
num_contracts = 0
num_contract_reallocs = 0
num_hash_calls = 60
num_comp_calls = 5
num_insert = 47
num_replace = 0
num_delete = 0
num_no_delete = 0
num_retrieve = 5
num_retrieve_miss = 8
num_hash_comps = 132
node 0 -> 4
node 1 -> 1
node 2 -> 1
node 3 -> 4
node 4 -> 0
node 5 -> 2
node 6 -> 1
node 7 -> 1
node 8 -> 6
node 9 -> 2
node 10 -> 1
node 11 -> 1
node 12 -> 3
node 13 -> 1
node 14 -> 4
node 15 -> 3
node 16 -> 5
node 17 -> 0
node 18 -> 2
node 19 -> 0
node 20 -> 2
node 21 -> 2
node 22 -> 0
node 23 -> 1
20 nodes used out of 24
47 items
load 1.95 actual load 2.35
init2=10
cipher1=NULL
s_client:cipher1=DES_CBC_MD5:DES_CBC_SHA:DES_EDE_SHA:RC4_MD5cipher2 = DES_CBC_MD5 DES_CBC_SHA DES_EDE_SHA RC4_MD5
---------------------------- DUMP ------------------------
[req] Attribute_text_7=Email Address
[req] Attribute_text_2=State or Province Name (full name)
[default] tmp_cert_dir=/tmp/eay/.ca_certs
[req] Attribute_text_1=Country Name (2 letter code)
[[genrsa]]
[req] Attribute_default_5=TR
[req] Attribute_text_6=Common Name (eg, YOUR name)
[req] Attribute_default_1=AU
[[req]]
[[special]]
[[gendh]]
[req] Attribute_text_3=Locality Name (eg, city)
[req] Attribute_type_1=countryName
[default] init5==10' again
[req] Attribute_type_3=localityName
[s_client] cipher3=DES_CBC_MD5 DES_CBC_SHA DES_EDE_SHA RC4_MD5
[default] in\#it1=10
[req] Attribute_text_4=Organization Name (eg, company)
[req] Attribute_type_7=emailAddress
[gendh] def_generator=2
[default] HOME=/tmp/eay
[s_client] cipher4=DES_CBC_MD5 DES_CBC_SHA DES_EDE_SHA RC4_MD5
[default] init=5
[SSLeay] version=0.5.0
[req] Attribute_type_4=organizationName
[default] tmp2_cert_dir=thisis/tmp/eaystuff
[req] Attribute_type_5=organizationalUnitName
[[SSLEAY]]
[default] init4=10'
[[default]]
[default] LOGNAME=Eric Young (home=/tmp/eay)
[special] RANDFILE=/tmp/eay/.rand
[req] default_keyfile=privkey.pem
[req] Attribute_default_4=Mincom Pty Ltd
[req] Attribute_default_2=Queensland
[gendh] default_bits=512
[req] default_bits=512
[default] init2=10
[SSLEAY] version=0.5.0
[s_client] cipher1=DES_CBC_MD5:DES_CBC_SHA:DES_EDE_SHA:RC4_MD5cipher2 = DES_CBC_MD5 DES_CBC_SHA DES_EDE_SHA RC4_MD5
[req] Attribute_text_5=Organizational Unit Name (eg, section)
[req] Attribute_type_2=stateOrProvinceName
[genrsa] default_bits=512
[default] init3=10'
[[SSLeay]]
[[s_client]]
[req] Attribute_type_6=commonName

View File

@@ -0,0 +1,78 @@
#
# This is a test configuration file for use in SSLeay etc...
#
init = 5
in\#it1 =10
init2='10'
init3='10\''
init4="10'"
init5='='10\'' again'
SSLeay::version = 0.5.0
[genrsa]
default_bits = 512
SSLEAY::version = 0.5.0
[gendh]
default_bits = 512
def_generator = 2
[s_client]
cipher1 = DES_CBC_MD5:DES_CBC_SHA:DES_EDE_SHA:RC4_MD5\
cipher2 = 'DES_CBC_MD5 DES_CBC_SHA DES_EDE_SHA RC4_MD5'
cipher3 = "DES_CBC_MD5 DES_CBC_SHA DES_EDE_SHA RC4_MD5"
cipher4 = DES_CBC_MD5 DES_CBC_SHA DES_EDE_SHA RC4_MD5
[ default ]
#cert_dir = $ENV::HOME/.ca_certs
HOME = /tmp/eay
tmp_cert_dir = $HOME/.ca_certs
tmp2_cert_dir = thisis$(HOME)stuff
LOGNAME = Eric Young (home=$HOME)
[ special ]
#H=$HOME
#H=$default::HOME
#H=$ENV::HOME
#
# SSLeay example configuration file.
# This is mostly being used for generation of certificate requests.
#
RANDFILE = $HOME/.rand
[ req ]
default_bits = 512
default_keyfile = privkey.pem
Attribute_type_1 = countryName
Attribute_text_1 = Country Name (2 letter code)
Attribute_default_1 = AU
Attribute_type_2 = stateOrProvinceName
Attribute_text_2 = State or Province Name (full name)
Attribute_default_2 = Queensland
Attribute_type_3 = localityName
Attribute_text_3 = Locality Name (eg, city)
Attribute_type_4 = organizationName
Attribute_text_4 = Organization Name (eg, company)
Attribute_default_4 = Mincom Pty Ltd
Attribute_type_5 = organizationalUnitName
Attribute_text_5 = Organizational Unit Name (eg, section)
Attribute_default_5 = TR
Attribute_type_6 = commonName
Attribute_text_6 = Common Name (eg, YOUR name)
Attribute_type_7 = emailAddress
Attribute_text_7 = Email Address

View File

@@ -0,0 +1,6 @@
# $NetBSD: Makefile,v 1.1 2009/02/13 20:58:14 jmmv Exp $
HELPER_NAME= destest
HELPER_DIR= des
.include <bsd.init.mk>

View File

@@ -0,0 +1,6 @@
# $NetBSD: Makefile,v 1.1 2009/02/13 20:58:14 jmmv Exp $
HELPER_NAME= dhtest
HELPER_DIR= dh
.include <bsd.init.mk>

View File

@@ -0,0 +1,6 @@
# $NetBSD: Makefile,v 1.1 2009/02/13 20:58:15 jmmv Exp $
HELPER_NAME= dsatest
HELPER_DIR= dsa
.include <bsd.init.mk>

View File

@@ -0,0 +1,6 @@
# $NetBSD: Makefile,v 1.1 2009/02/13 20:58:15 jmmv Exp $
HELPER_NAME= ectest
HELPER_DIR= ec
.include <bsd.init.mk>

View File

@@ -0,0 +1,6 @@
# $NetBSD: Makefile,v 1.1 2009/02/13 20:58:15 jmmv Exp $
HELPER_NAME= ecdhtest
HELPER_DIR= ecdh
.include <bsd.init.mk>

View File

@@ -0,0 +1,6 @@
# $NetBSD: Makefile,v 1.1 2009/02/13 20:58:15 jmmv Exp $
HELPER_NAME= ecdsatest
HELPER_DIR= ecdsa
.include <bsd.init.mk>

View File

@@ -0,0 +1,6 @@
# $NetBSD: Makefile,v 1.1 2009/02/13 20:58:15 jmmv Exp $
HELPER_NAME= enginetest
HELPER_DIR= engine
.include <bsd.init.mk>

View File

@@ -0,0 +1,8 @@
# $NetBSD: Makefile,v 1.1 2011/06/09 05:25:17 spz Exp $
HELPER_NAME= evp_test
HELPER_DIR= evp
FILES= evptests.txt
.include <bsd.init.mk>

View File

@@ -0,0 +1,6 @@
# $NetBSD: Makefile,v 1.1 2009/02/13 20:58:15 jmmv Exp $
HELPER_NAME= hmactest
HELPER_DIR= hmac
.include <bsd.init.mk>

View File

@@ -0,0 +1,9 @@
# $NetBSD: Makefile,v 1.4 2012/07/14 04:06:17 christos Exp $
HELPER_NAME= ideatest
HELPER_DIR= idea
.include <bsd.init.mk>
LDADD= -lcrypto
LDADD+= -Wl,--no-fatal-warnings

View File

@@ -0,0 +1,10 @@
# $NetBSD: Makefile,v 1.1 2009/02/13 20:58:15 jmmv Exp $
HELPER_NAME= lhashtest
HELPER_DIR= lhash
HELPER_SRCS= lh_test.c
CPPFLAGS+= -DMalloc=malloc
DPADD+= ${LIBCRYPTO} ${LIBCRYPT}
.include <bsd.init.mk>

View File

@@ -0,0 +1,6 @@
# $NetBSD: Makefile,v 1.1 2009/02/13 20:58:15 jmmv Exp $
HELPER_NAME= md2test
HELPER_DIR= md2
.include <bsd.init.mk>

View File

@@ -0,0 +1,6 @@
# $NetBSD: Makefile,v 1.1 2009/02/13 20:58:15 jmmv Exp $
HELPER_NAME= md4test
HELPER_DIR= md4
.include <bsd.init.mk>

View File

@@ -0,0 +1,6 @@
# $NetBSD: Makefile,v 1.1 2009/02/13 20:58:15 jmmv Exp $
HELPER_NAME= md5test
HELPER_DIR= md5
.include <bsd.init.mk>

View File

@@ -0,0 +1,9 @@
# $NetBSD: Makefile,v 1.4 2012/07/14 04:06:17 christos Exp $
HELPER_NAME= mdc2test
HELPER_DIR= mdc2
.include <bsd.init.mk>
LDADD= -lcrypto
LDADD+= -Wl,--no-fatal-warnings

View File

@@ -0,0 +1,6 @@
# $NetBSD: Makefile,v 1.1 2009/02/13 20:58:15 jmmv Exp $
HELPER_NAME= randtest
HELPER_DIR= rand
.include <bsd.init.mk>

View File

@@ -0,0 +1,6 @@
# $NetBSD: Makefile,v 1.1 2009/02/13 20:58:15 jmmv Exp $
HELPER_NAME= rc2test
HELPER_DIR= rc2
.include <bsd.init.mk>

View File

@@ -0,0 +1,6 @@
# $NetBSD: Makefile,v 1.1 2009/02/13 20:58:15 jmmv Exp $
HELPER_NAME= rc4test
HELPER_DIR= rc4
.include <bsd.init.mk>

View File

@@ -0,0 +1,14 @@
# $NetBSD: Makefile,v 1.3 2011/07/05 10:03:10 spz Exp $
HELPER_NAME= rc5test
HELPER_DIR= rc5
.include <bsd.init.mk>
.if ${MKCRYPTO_RC5} != "no"
LDADD= -lcrypto_rc5 -lcrypto
.else
CPPFLAGS+= -DOPENSSL_NO_RC5
.endif
LDADD+= -Wl,--no-fatal-warnings

View File

@@ -0,0 +1,7 @@
# $NetBSD: Makefile,v 1.1 2009/02/13 20:58:15 jmmv Exp $
HELPER_NAME= ripemdtest
HELPER_DIR= ripemd
HELPER_SRCS= rmdtest.c
.include <bsd.init.mk>

View File

@@ -0,0 +1,7 @@
# $NetBSD: Makefile,v 1.1 2009/02/13 20:58:15 jmmv Exp $
HELPER_NAME= rsatest
HELPER_DIR= rsa
HELPER_SRCS= rsa_test.c
.include <bsd.init.mk>

View File

@@ -0,0 +1,6 @@
# $NetBSD: Makefile,v 1.1 2009/02/13 20:58:16 jmmv Exp $
HELPER_NAME= shatest
HELPER_DIR= sha
.include <bsd.init.mk>

View File

@@ -0,0 +1,6 @@
# $NetBSD: Makefile,v 1.1 2009/02/13 20:58:16 jmmv Exp $
HELPER_NAME= sha1test
HELPER_DIR= sha
.include <bsd.init.mk>

View File

@@ -0,0 +1,6 @@
# $NetBSD: Makefile,v 1.1 2011/06/09 05:25:20 spz Exp $
HELPER_NAME= srptest
HELPER_DIR= srp
.include <bsd.init.mk>

View File

@@ -0,0 +1,41 @@
# $NetBSD: t_certs.sh,v 1.1 2010/07/10 16:43:25 jmmv Exp $
#
# Copyright (c) 2008, 2009, 2010 The NetBSD Foundation, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
atf_test_case x509v3
x509v3_head()
{
atf_set "descr" "Checks x509v3 certificates"
}
x509v3_body()
{
atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_x509v3test"
}
atf_init_test_cases()
{
atf_add_test_case x509v3
}

View File

@@ -0,0 +1,122 @@
# $NetBSD: t_ciphers.sh,v 1.4 2012/07/14 16:04:06 spz Exp $
#
# Copyright (c) 2008, 2009, 2010 The NetBSD Foundation, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
atf_test_case bf
bf_head()
{
atf_set "descr" "Checks blowfish cipher"
}
bf_body()
{
atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_bftest"
}
atf_test_case cast
cast_head()
{
atf_set "descr" "Checks CAST cipher"
atf_set "timeout" "300"
}
cast_body()
{
atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_casttest"
}
atf_test_case des
des_head()
{
atf_set "descr" "Checks DES cipher (libdes)"
}
des_body()
{
atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_destest"
}
atf_test_case evp
evp_head()
{
atf_set "descr" "Checks EVP cipher"
}
evp_body()
{
atf_check -o ignore -e ignore $(atf_get_srcdir)/h_evp_test $(atf_get_srcdir)/evptests.txt
}
atf_test_case rc2
rc2_head()
{
atf_set "descr" "Checks RC2 cipher"
}
rc2_body()
{
atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_rc2test"
}
atf_test_case rc4
rc4_head()
{
atf_set "descr" "Checks RC4 cipher"
}
rc4_body()
{
atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_rc4test"
}
atf_test_case idea
idea_head()
{
atf_set "descr" "Checks IDEA cipher"
}
idea_body()
{
atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_ideatest"
}
atf_test_case rc5
rc5_head()
{
atf_set "descr" "Checks RC5 cipher"
}
rc5_body()
{
[ -x "$(atf_get_srcdir)/h_rc5test" ] \
|| atf_skip "RC5 support not available; system built" \
"with MKCRYPTO_RC5=no"
atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_rc5test"
}
atf_init_test_cases()
{
atf_add_test_case bf
atf_add_test_case cast
atf_add_test_case des
atf_add_test_case evp
atf_add_test_case rc2
atf_add_test_case rc4
atf_add_test_case idea
atf_add_test_case rc5
}

View File

@@ -0,0 +1,108 @@
# $NetBSD: t_hashes.sh,v 1.2 2012/07/14 16:04:06 spz Exp $
#
# Copyright (c) 2008, 2009, 2010 The NetBSD Foundation, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
atf_test_case hmac
hmac_head()
{
atf_set "descr" "Checks HMAC message authentication code"
}
hmac_body()
{
atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_hmactest"
}
atf_test_case md2
md2_head()
{
atf_set "descr" "Checks MD2 digest"
}
md2_body()
{
atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_md2test"
}
atf_test_case md4
md4_head()
{
atf_set "descr" "Checks MD4 digest"
}
md4_body()
{
atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_md4test"
}
atf_test_case md5
md5_head()
{
atf_set "descr" "Checks MD5 digest"
}
md5_body()
{
atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_md5test"
}
atf_test_case ripemd
ripemd_head()
{
atf_set "descr" "Checks RMD-160 digest"
}
ripemd_body()
{
atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_ripemdtest"
}
atf_test_case sha
sha_head()
{
atf_set "descr" "Checks SHA-1 digest"
}
sha_body()
{
atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_shatest"
}
atf_test_case mdc2
mdc2_head()
{
atf_set "descr" "Checks MDC2 digest"
}
mdc2_body()
{
atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_mdc2test"
}
atf_init_test_cases()
{
atf_add_test_case hmac
atf_add_test_case md2
atf_add_test_case md4
atf_add_test_case md5
atf_add_test_case ripemd
atf_add_test_case sha
atf_add_test_case mdc2
}

View File

@@ -0,0 +1,107 @@
# $NetBSD: t_libcrypto.sh,v 1.3 2010/11/08 19:06:12 pooka Exp $
#
# Copyright (c) 2008, 2009, 2010 The NetBSD Foundation, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
atf_test_case engine
engine_head()
{
atf_set "descr" "Checks ENGINE framework"
}
engine_body()
{
atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_enginetest"
}
atf_test_case rand
rand_head()
{
atf_set "descr" "Checks peudo-random number generator"
}
rand_body()
{
atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_randtest"
}
atf_test_case bn
bn_head()
{
atf_set "descr" "Checks BIGNUM library"
atf_set "timeout" "300"
}
bn_body()
{
atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_bntest"
atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_divtest"
atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_exptest"
}
atf_test_case conf
conf_head()
{
atf_set "descr" "Checks configuration modules"
}
conf_body()
{
cp $(atf_get_srcdir)/d_conf_ssleay.cnf ssleay.cnf
atf_check -o file:$(atf_get_srcdir)/d_conf.out \
$(atf_get_srcdir)/h_conftest
}
atf_test_case lhash
lhash_head()
{
atf_set "descr" "Checks lhash - dynamic hash tables"
}
lhash_body()
{
atf_check -o ignore -e ignore -x \
"echo hoge | $(atf_get_srcdir)/h_lhashtest"
}
atf_test_case threads
threads_head()
{
atf_set "descr" "Checks threading"
}
threads_body()
{
$(atf_get_srcdir)/h_threadstest \
-cert $(atf_get_srcdir)/d_server.pem \
-ccert $(atf_get_srcdir)/d_client.pem \
2>&1 | tee out
atf_check -s eq:1 -o empty -e empty grep :error: out
}
atf_init_test_cases()
{
atf_add_test_case engine
atf_add_test_case rand
atf_add_test_case bn
atf_add_test_case conf
atf_add_test_case lhash
atf_add_test_case threads
}

View File

@@ -0,0 +1,110 @@
# $NetBSD: t_pubkey.sh,v 1.3 2011/06/09 05:25:21 spz Exp $
#
# Copyright (c) 2008, 2009, 2010 The NetBSD Foundation, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
atf_test_case dsa
dsa_head()
{
atf_set "descr" "Checks DSA cipher"
}
dsa_body()
{
atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_dsatest"
}
atf_test_case dh
dh_head()
{
atf_set "descr" "Checks Diffie-Hellman key agreement protocol"
}
dh_body()
{
atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_dhtest"
}
atf_test_case rsa
rsa_head()
{
atf_set "descr" "Checks RSA"
atf_set "timeout" "300"
}
rsa_body()
{
atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_rsatest"
}
atf_test_case ec
ec_head()
{
atf_set "descr" "Checks EC cipher"
atf_set "timeout" "300"
}
ec_body()
{
atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_ectest"
}
atf_test_case ecdh
ecdh_head()
{
atf_set "descr" "Checks ECDH key agreement protocol"
}
ecdh_body()
{
atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_ecdhtest"
}
atf_test_case ecdsa
ecdsa_head()
{
atf_set "descr" "Checks ECDSA algorithm"
atf_set "timeout" "300"
}
ecdsa_body()
{
atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_ecdsatest"
}
atf_test_case srp
srp_head()
{
atf_set "descr" "Checks SRP key agreement protocol"
}
srp_body()
{
atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_srptest"
}
atf_init_test_cases()
{
atf_add_test_case dsa
atf_add_test_case dh
atf_add_test_case rsa
atf_add_test_case ec
atf_add_test_case ecdh
atf_add_test_case ecdsa
atf_add_test_case srp
}

View File

@@ -0,0 +1,21 @@
# $NetBSD: Makefile,v 1.2 2009/02/14 05:07:54 cube Exp $
HELPER_NAME= threadstest
HELPER_DIR= threads
HELPER_SRCS= mttest.c
CPPFLAGS+= -DPTHREADS
CFLAGS+= -pthread
DPADD+= ${LIBPTHREAD} ${LIBSSL}
LDADD+= -lpthread -lssl
FILESDIR= ${TESTSDIR}
FILES= server.pem
FILESNAME_server.pem= d_server.pem
FILES+= client.pem
FILESNAME_client.pem= d_client.pem
.include <bsd.init.mk>
.PATH: ${OPENSSLSRC}/apps

View File

@@ -0,0 +1,7 @@
# $NetBSD: Makefile,v 1.1 2009/02/13 20:58:16 jmmv Exp $
HELPER_NAME= x509v3test
HELPER_DIR= x509v3
HELPER_SRCS= tabtest.c
.include <bsd.init.mk>

14
tests/dev/Makefile Normal file
View File

@@ -0,0 +1,14 @@
# $NetBSD: Makefile,v 1.8 2012/08/08 13:57:05 christos Exp $
#
.include <bsd.own.mk>
TESTSDIR= ${TESTSBASE}/dev
TESTS_SUBDIRS+= cgd raidframe
.if (${MKRUMP} != "no")
TESTS_SUBDIRS+= audio md scsipi sysmon
.endif
.include <bsd.test.mk>

1
tests/dev/Makefile.inc Normal file
View File

@@ -0,0 +1 @@
.include "../Makefile.inc"

27
tests/dev/audio/Makefile Normal file
View File

@@ -0,0 +1,27 @@
# $NetBSD: Makefile,v 1.4 2012/12/02 18:39:53 pgoyette Exp $
#
.include <bsd.own.mk>
TESTSDIR= ${TESTSBASE}/dev/audio
FILESDIR= ${TESTSDIR}
TESTS_SH= t_pad
BINDIR= ${TESTSDIR}
MKMAN=no
PROGS= h_pad
LDADD+= -lrumpdev_pad -lrumpdev_audio -lrumpdev -lrumpvfs
LDADD+= -lrump
LDADD+= -lrumpuser
LDADD+= -lrump
LDADD+= -lpthread
FILES= t_pad_output.bz2.uue
WARNS= 4
NOMAN=
.include <bsd.test.mk>

76
tests/dev/audio/h_pad.c Normal file
View File

@@ -0,0 +1,76 @@
/* $NetBSD: h_pad.c,v 1.1 2010/08/04 13:15:15 pooka Exp $ */
/*
* Copyright (c) 2010 Antti Kantee. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#include <sys/types.h>
#include <rump/rump.h>
#include <rump/rump_syscalls.h>
#include <err.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "h_pad_musa.c"
/*
* Stuff some audio into /dev/audio, read it from /dev/pad. Use in
* conjunction with t_pad, which tests that we got sensible output
* by comparing against a previous audibly good result.
*/
#define BUFSIZE 1024
int
main(int argc, char *argv[])
{
char buf[BUFSIZE];
char zeros[BUFSIZE];
int padfd, audiofd;
ssize_t n;
rump_init();
audiofd = rump_sys_open("/dev/audio0", O_RDWR);
if (audiofd == -1)
err(1, "open audio");
padfd = rump_sys_open("/dev/pad0", O_RDONLY);
if (padfd == -1)
err(1, "open pad");
if ((n = rump_sys_write(audiofd, musa, sizeof(musa))) != sizeof(musa))
err(1, "write");
memset(zeros, 0, sizeof(zeros));
while ((n = rump_sys_read(padfd, buf, sizeof(buf))) > 0) {
if (memcmp(buf, zeros, sizeof(buf)) == 0)
break;
write(STDOUT_FILENO, buf, n);
}
}

View File

@@ -0,0 +1,344 @@
unsigned char musa[] = {
0x46, 0xdb, 0x76, 0x67, 0x61, 0xff, 0xfc, 0x67, 0xff, 0xe9, 0xdb, 0x79,
0x5d, 0x53, 0x5b, 0x79, 0xef, 0x65, 0x67, 0x5b, 0x67, 0x67, 0x72, 0x66,
0x4f, 0x5b, 0xe7, 0xf5, 0x5e, 0x53, 0x61, 0xe7, 0x5c, 0x53, 0x67, 0x67,
0x67, 0x5b, 0x54, 0x60, 0x4e, 0xec, 0xef, 0x5b, 0x5b, 0x6f, 0x69, 0xff,
0x71, 0x53, 0x77, 0x67, 0x67, 0x5b, 0x5b, 0x5b, 0x75, 0x6c, 0x67, 0x6d,
0x67, 0x7e, 0xff, 0x63, 0x66, 0x61, 0x67, 0x5b, 0x5b, 0x67, 0x67, 0x5f,
0x5b, 0x64, 0x5b, 0x5b, 0x55, 0x53, 0x5c, 0x5d, 0x67, 0x53, 0x63, 0x5e,
0xe7, 0xf5, 0x51, 0x5b, 0x5e, 0x5e, 0x67, 0x5b, 0x67, 0xff, 0x67, 0x67,
0xe9, 0x6e, 0x67, 0x5c, 0x60, 0x67, 0x7a, 0xff, 0xe7, 0xff, 0x58, 0x5b,
0x64, 0x6e, 0x67, 0x55, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x56, 0x5b, 0x53,
0x5b, 0x67, 0x54, 0x58, 0x67, 0x67, 0x6e, 0x67, 0x5c, 0x58, 0x67, 0x67,
0x5b, 0x65, 0x64, 0x70, 0x5b, 0x5b, 0x67, 0xfc, 0xf7, 0xf2, 0xff, 0xec,
0x73, 0x67, 0x67, 0xff, 0x67, 0x74, 0xff, 0x67, 0x5e, 0x5e, 0x67, 0x72,
0x77, 0x7c, 0x67, 0x5d, 0x5b, 0x67, 0x5b, 0x55, 0x67, 0x5c, 0x67, 0x60,
0x5b, 0x5b, 0x61, 0x54, 0x67, 0x5b, 0xe8, 0x75, 0xe2, 0x67, 0xff, 0x62,
0x5b, 0x5b, 0xff, 0xe8, 0xff, 0xe7, 0x6a, 0xee, 0x78, 0x67, 0xff, 0x67,
0x7a, 0xff, 0x6a, 0xff, 0xff, 0x67, 0xff, 0x71, 0xfd, 0x6c, 0x5e, 0xfe,
0xff, 0x6d, 0xe7, 0xff, 0xec, 0x68, 0x5b, 0xff, 0x5c, 0x6a, 0xeb, 0x69,
0x60, 0xff, 0x67, 0x67, 0x67, 0x7a, 0xdf, 0xec, 0x55, 0x5b, 0x5b, 0x5b,
0x71, 0x5c, 0x77, 0x72, 0x68, 0xe7, 0x6d, 0xff, 0xff, 0xff, 0xdb, 0xe7,
0xde, 0xdb, 0xff, 0xff, 0x69, 0xee, 0x78, 0x67, 0xef, 0xea, 0x5b, 0x5b,
0x67, 0x5d, 0x6f, 0xff, 0xff, 0x67, 0x67, 0x67, 0x61, 0x54, 0x5b, 0xff,
0x67, 0x67, 0x5b, 0x67, 0xf4, 0x67, 0x67, 0x67, 0x5b, 0x65, 0xf2, 0x67,
0xff, 0xe7, 0xe7, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xfc,
0xf7, 0xf2, 0x7d, 0x5b, 0x56, 0x67, 0x5e, 0xe2, 0x7f, 0x67, 0x75, 0x67,
0x6d, 0x63, 0x66, 0x67, 0x5b, 0x5b, 0x5b, 0x5b, 0x65, 0xf0, 0x6a, 0xe7,
0x5f, 0x67, 0xff, 0x6f, 0x7b, 0x67, 0x5b, 0xff, 0xff, 0x72, 0x67, 0xff,
0xff, 0xff, 0xff, 0x67, 0x7e, 0x6d, 0xff, 0xff, 0xff, 0x67, 0xff, 0xee,
0xe7, 0xff, 0xff, 0x6a, 0xe7, 0xe7, 0x7a, 0x67, 0xff, 0xff, 0xff, 0x67,
0x67, 0xff, 0xff, 0x67, 0x67, 0x67, 0x5c, 0x5b, 0x67, 0x7f, 0x67, 0xdb,
0xfe, 0xde, 0xec, 0x5c, 0x61, 0x5b, 0x67, 0x6e, 0x67, 0x67, 0xfe, 0xff,
0xe7, 0xff, 0xe7, 0xff, 0xff, 0xe6, 0xd9, 0xe7, 0xff, 0xff, 0x73, 0x68,
0x6c, 0x55, 0xe7, 0xe7, 0xec, 0x67, 0x5b, 0x71, 0xfd, 0xff, 0xff, 0xff,
0x71, 0x67, 0x5b, 0x53, 0x5e, 0x5e, 0x5b, 0x5d, 0x79, 0x70, 0x67, 0x67,
0x60, 0x5c, 0x67, 0xff, 0x7d, 0x75, 0xff, 0xff, 0xe7, 0xec, 0xff, 0xff,
0xe7, 0xfd, 0x67, 0xf7, 0xdc, 0xf1, 0x6b, 0xe9, 0xff, 0x79, 0x7a, 0x6f,
0xfa, 0xf9, 0xff, 0x5b, 0x53, 0x5b, 0x67, 0x77, 0x67, 0x66, 0x67, 0x5b,
0x67, 0x5b, 0x67, 0x67, 0x74, 0x75, 0x7e, 0xf3, 0x67, 0x5c, 0x67, 0x67,
0x5c, 0x67, 0x6a, 0xea, 0xff, 0xff, 0x67, 0xff, 0x7b, 0x78, 0xdf, 0xff,
0xdd, 0xee, 0xfd, 0xf6, 0x67, 0xe7, 0xff, 0x74, 0x67, 0x67, 0xe7, 0xfe,
0xff, 0xec, 0x5c, 0x61, 0xe7, 0x6a, 0x5b, 0xf8, 0xfb, 0xef, 0x79, 0x65,
0x5f, 0x5b, 0x67, 0x60, 0x67, 0x55, 0xf2, 0xff, 0xe7, 0x61, 0x5b, 0x67,
0x67, 0x5b, 0x5e, 0x5e, 0xe8, 0xf3, 0x67, 0xe8, 0xe7, 0xdd, 0xff, 0xe7,
0xdb, 0xf7, 0x70, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xe7, 0x67, 0xff, 0x60,
0x5c, 0x5d, 0x6e, 0xff, 0xec, 0xff, 0x67, 0x67, 0x67, 0x5b, 0x5b, 0x67,
0x5c, 0xff, 0xff, 0x67, 0x6e, 0x67, 0x67, 0x60, 0x67, 0x67, 0x67, 0x67,
0x67, 0x70, 0xff, 0xff, 0x67, 0xff, 0xff, 0xff, 0xfd, 0xf6, 0xff, 0xff,
0xf5, 0xff, 0xff, 0xe2, 0x6c, 0x67, 0x67, 0xff, 0x67, 0xff, 0x63, 0x5b,
0x67, 0x5b, 0x7b, 0x67, 0x67, 0x5d, 0x49, 0x5b, 0x67, 0xe7, 0xff, 0xdf,
0xe5, 0x4d, 0x3b, 0x55, 0xbe, 0xbf, 0x66, 0x41, 0x5b, 0xc3, 0xd3, 0x47,
0x43, 0x79, 0xcf, 0x67, 0x3e, 0x51, 0xc4, 0xbc, 0x6d, 0x3e, 0x50, 0xdf,
0xe7, 0xf9, 0xd4, 0xca, 0x46, 0x37, 0xee, 0xaf, 0xba, 0x40, 0x34, 0x4b,
0xc9, 0xc7, 0x56, 0x39, 0x46, 0xc5, 0xbc, 0x4f, 0x33, 0x4f, 0xbc, 0xc8,
0x4b, 0x39, 0x7e, 0xb6, 0xbc, 0x4b, 0x39, 0x45, 0xcc, 0xc1, 0xec, 0x41,
0x4a, 0xc5, 0xce, 0x48, 0x4c, 0xc9, 0xc4, 0x59, 0x41, 0x53, 0xd9, 0xdb,
0x56, 0x56, 0xdd, 0xcd, 0xdf, 0x4e, 0x5c, 0xda, 0xc6, 0xf0, 0x5b, 0x5b,
0x53, 0x4f, 0x67, 0x71, 0x53, 0x49, 0x4f, 0xfa, 0xd9, 0xff, 0x5b, 0x4d,
0x5b, 0x45, 0x5e, 0xcb, 0xcd, 0x63, 0x49, 0x49, 0xdf, 0xc9, 0xd3, 0x45,
0x4b, 0xdf, 0xbf, 0xcc, 0x3e, 0x39, 0xc6, 0xb4, 0xc9, 0x44, 0x3c, 0x69,
0xbe, 0xcd, 0x45, 0x37, 0x46, 0xc4, 0xbd, 0x62, 0x3c, 0x4d, 0xbe, 0xce,
0x3d, 0x32, 0x47, 0xc7, 0xc2, 0x69, 0x3f, 0x42, 0xce, 0xbd, 0xcb, 0x4b,
0x38, 0x47, 0xcc, 0xc1, 0xd7, 0xdb, 0xef, 0x42, 0x3f, 0x5f, 0xd8, 0xce,
0xe7, 0xdb, 0xff, 0x51, 0xff, 0xff, 0x73, 0xe7, 0xe7, 0x7a, 0x6b, 0xd4,
0x66, 0x5d, 0x7a, 0x6f, 0x55, 0xed, 0xd3, 0xdc, 0x6b, 0x50, 0x5b, 0x53,
0x6e, 0x68, 0x4c, 0x50, 0x54, 0xd0, 0xc5, 0xe7, 0x48, 0x49, 0xdc, 0xdd,
0xff, 0x5c, 0x3a, 0x4e, 0xce, 0xc1, 0xda, 0x4a, 0x5c, 0x67, 0x67, 0x67,
0x52, 0x5a, 0xf0, 0xd3, 0xd3, 0xd7, 0xcd, 0xdb, 0xed, 0x5b, 0x57, 0xcf,
0xd4, 0x51, 0x47, 0x4d, 0x48, 0x5d, 0xe6, 0xff, 0x59, 0x79, 0xcf, 0xf4,
0x46, 0x4c, 0xd0, 0xc1, 0xcf, 0x4c, 0x3c, 0x41, 0xe0, 0xbd, 0xd5, 0x3e,
0x3e, 0x4e, 0xc5, 0xd4, 0x61, 0x53, 0x56, 0x74, 0xcd, 0xc7, 0xe6, 0x4e,
0x6b, 0xd9, 0xce, 0xe0, 0x52, 0x4a, 0x54, 0xd2, 0xd2, 0xe8, 0x4d, 0x46,
0x4d, 0x69, 0xeb, 0xee, 0x5d, 0xff, 0xff, 0x7d, 0x67, 0x55, 0x4a, 0x67,
0xff, 0xff, 0xdb, 0xf5, 0x68, 0x53, 0x71, 0xdc, 0xe7, 0xeb, 0x54, 0x4d,
0x6b, 0xdc, 0xdb, 0xed, 0x4b, 0x4f, 0xfb, 0xce, 0xdb, 0x53, 0x4a, 0x4b,
0xe4, 0xc3, 0xc5, 0x65, 0x40, 0x4c, 0x67, 0xdb, 0xe7, 0xfe, 0x5b, 0xe7,
0x5c, 0x61, 0x6f, 0xfc, 0x60, 0xff, 0x67, 0x5b, 0x4b, 0x65, 0xe7, 0x65,
0x5a, 0x6f, 0x5a, 0x52, 0x7a, 0xcd, 0xd1, 0x55, 0x5c, 0xdb, 0x4c, 0x54,
0xd1, 0xd6, 0x54, 0x4c, 0x72, 0xdb, 0x4f, 0xef, 0xdb, 0x65, 0x4e, 0xed,
0xc9, 0xd0, 0x4f, 0x6f, 0xff, 0x56, 0x5b, 0xe7, 0x5f, 0x65, 0xe6, 0xf7,
0x4c, 0x46, 0x4c, 0xdd, 0xdc, 0x5e, 0x51, 0x45, 0x56, 0xdf, 0xc6, 0xfa,
0x4c, 0x49, 0x55, 0xd9, 0xe6, 0x5f, 0x53, 0x4d, 0x4f, 0xe7, 0xe7, 0x70,
0x5b, 0x78, 0x71, 0x69, 0xdb, 0xcd, 0xe9, 0x5b, 0x4d, 0x68, 0xe7, 0xd9,
0xd3, 0x75, 0x51, 0x53, 0x6b, 0xd3, 0xe6, 0x67, 0x59, 0x53, 0x49, 0x4e,
0x65, 0x67, 0x6a, 0x5e, 0x4b, 0x53, 0x49, 0xf0, 0xe7, 0xdb, 0x63, 0x4e,
0x77, 0xff, 0xfc, 0xcd, 0xe3, 0x53, 0x49, 0x4f, 0x5b, 0x4b, 0x61, 0xd4,
0xd0, 0xeb, 0xe7, 0xe0, 0xeb, 0xff, 0xe7, 0x61, 0x49, 0xef, 0xd3, 0x6d,
0x53, 0xfb, 0xe7, 0xff, 0xfc, 0xce, 0x79, 0x41, 0x43, 0x48, 0x42, 0x4f,
0xcf, 0xc1, 0xcc, 0xcc, 0xc9, 0x64, 0x40, 0x45, 0x61, 0x78, 0xeb, 0xd7,
0xdd, 0x4f, 0x3d, 0x46, 0x4d, 0x4b, 0x6c, 0xdb, 0xc8, 0xca, 0xd1, 0xe4,
0x52, 0x45, 0x51, 0x68, 0xd8, 0xd3, 0xcd, 0xec, 0x59, 0x4e, 0x53, 0x56,
0x7d, 0x6e, 0x55, 0x7c, 0x67, 0xf8, 0xd4, 0xd3, 0xde, 0x55, 0x53, 0x5a,
0x42, 0x56, 0xcd, 0xd1, 0xd3, 0xcd, 0xc9, 0x57, 0x3c, 0x35, 0x35, 0x3b,
0xe2, 0xbc, 0xb7, 0xbd, 0xcb, 0x6a, 0x47, 0x41, 0x52, 0x71, 0x5a, 0x77,
0xcd, 0xce, 0xe7, 0xdb, 0x59, 0x46, 0x3c, 0x3f, 0x58, 0xe3, 0xc1, 0xc0,
0xc1, 0xe9, 0x58, 0x45, 0x4e, 0x67, 0xe2, 0xe7, 0xd3, 0xd3, 0x69, 0x47,
0x44, 0x45, 0x4a, 0x67, 0xdd, 0x7c, 0x6e, 0xd5, 0xdf, 0xff, 0xdd, 0xdf,
0x4d, 0x64, 0xd8, 0xd3, 0xca, 0xbc, 0xbd, 0x5c, 0x35, 0x2d, 0x2c, 0x34,
0xe8, 0xb7, 0xab, 0xae, 0xb1, 0xc6, 0x43, 0x39, 0x38, 0x34, 0x4a, 0x67,
0x5b, 0x67, 0xd2, 0xcd, 0xd3, 0xce, 0x52, 0x3e, 0x39, 0x47, 0x65, 0xc9,
0xb4, 0xb3, 0xbf, 0x73, 0x4b, 0x3a, 0x43, 0x66, 0xce, 0xcc, 0xc8, 0xcd,
0xea, 0x48, 0x3f, 0x3c, 0x3f, 0x49, 0x72, 0xc9, 0xc1, 0xcb, 0xca, 0x67,
0x38, 0x3d, 0xe6, 0xb5, 0xab, 0xa8, 0xb1, 0x4c, 0x28, 0x1f, 0x23, 0x32,
0xc4, 0xaa, 0xa2, 0xa5, 0xb6, 0x53, 0x2f, 0x29, 0x2b, 0x2f, 0x4b, 0xe7,
0xc9, 0xc9, 0xdb, 0x4d, 0x50, 0xff, 0xd2, 0xcd, 0xe5, 0x48, 0x37, 0x3c,
0x55, 0xc9, 0xb4, 0xad, 0xb3, 0xc9, 0x4a, 0x39, 0x3d, 0x49, 0xde, 0xcc,
0xc1, 0xd9, 0x4b, 0x3c, 0x38, 0x3f, 0x52, 0xff, 0xda, 0xca, 0xc5, 0xcf,
0x4b, 0x3c, 0x37, 0x54, 0xc1, 0xa8, 0xa7, 0xad, 0x50, 0x23, 0x1e, 0x1f,
0x31, 0xc2, 0xa2, 0x9f, 0xa4, 0xbb, 0x36, 0x25, 0x27, 0x34, 0xea, 0xbb,
0xb6, 0xbc, 0x4c, 0x3b, 0x37, 0x43, 0xe1, 0xc2, 0xda, 0x55, 0x49, 0x49,
0x5e, 0xc1, 0xb8, 0xba, 0xbd, 0xdb, 0x62, 0x4a, 0x66, 0xe3, 0xfd, 0x5b,
0x49, 0x45, 0x49, 0x45, 0x51, 0x53, 0x5b, 0x53, 0x67, 0xe7, 0x6d, 0x5f,
0x67, 0x5b, 0xd4, 0xc5, 0x5e, 0x35, 0x3f, 0x6e, 0xbe, 0xaa, 0xa4, 0xb4,
0x3d, 0x28, 0x1d, 0x23, 0x44, 0xaf, 0xa6, 0xa3, 0xb2, 0x51, 0x2a, 0x29,
0x3a, 0x69, 0xaf, 0xb0, 0xc3, 0x47, 0x2d, 0x28, 0x31, 0x4d, 0xc2, 0xb8,
0xbc, 0x52, 0x3a, 0x3b, 0xde, 0xb0, 0xa6, 0xa9, 0xc1, 0x40, 0x2b, 0x28,
0x2f, 0x66, 0xb7, 0xb6, 0xb6, 0xd6, 0x3d, 0x38, 0x30, 0x3d, 0x57, 0xe7,
0xc2, 0xcf, 0xdd, 0xf5, 0x46, 0x4d, 0x78, 0xcd, 0xcb, 0x3c, 0x39, 0x49,
0xbf, 0xa7, 0x9f, 0xa0, 0xbd, 0x39, 0x1e, 0x17, 0x1e, 0x3a, 0xbd, 0xa2,
0xa4, 0xac, 0x60, 0x2c, 0x29, 0x32, 0xdc, 0xb2, 0xbc, 0xc7, 0x38, 0x2a,
0x28, 0x2e, 0x53, 0xb2, 0xad, 0xaf, 0xc5, 0x42, 0x3f, 0x79, 0xba, 0xaa,
0xa7, 0xbf, 0x3e, 0x29, 0x26, 0x2d, 0x52, 0xb5, 0xad, 0xaf, 0xbf, 0x3c,
0x2f, 0x2d, 0x37, 0x4d, 0xbd, 0xbe, 0xc3, 0xd3, 0x66, 0x49, 0x48, 0x45,
0x7d, 0xc3, 0x5d, 0x37, 0x3f, 0x78, 0xba, 0xa3, 0x9d, 0xa9, 0x66, 0x24,
0x19, 0x1c, 0x2b, 0xd9, 0xab, 0x9f, 0xa6, 0xc5, 0x43, 0x33, 0x33, 0xf3,
0xbc, 0xbf, 0x4e, 0x37, 0x28, 0x27, 0x33, 0x65, 0xb5, 0xaa, 0xad, 0xbf,
0x5f, 0x42, 0x41, 0xdb, 0xb5, 0xac, 0xac, 0xcc, 0x35, 0x25, 0x20, 0x29,
0x4e, 0xb1, 0xab, 0xab, 0xbb, 0x42, 0x2a, 0x28, 0x2d, 0x4a, 0xc7, 0xb4,
0xb4, 0xc8, 0x46, 0x3b, 0x37, 0x3f, 0xbe, 0xb1, 0x4d, 0x48, 0x49, 0x41,
0xb6, 0x9c, 0x9d, 0xab, 0x5d, 0x1c, 0x14, 0x1c, 0x2d, 0xca, 0xa3, 0x9d,
0xa9, 0xb7, 0x5a, 0x38, 0x36, 0x5b, 0x44, 0x3e, 0x39, 0x2e, 0x2d, 0x38,
0x42, 0xc9, 0xb3, 0xad, 0xaf, 0xbc, 0xdc, 0x5a, 0x4a, 0x4d, 0x60, 0xc7,
0xb5, 0xb7, 0xca, 0x3f, 0x2e, 0x28, 0x30, 0x4a, 0xb5, 0xa8, 0xaa, 0xb6,
0x47, 0x2e, 0x27, 0x2d, 0x51, 0xbd, 0xad, 0xb2, 0xed, 0x3a, 0x39, 0x38,
0x3c, 0xc9, 0xb0, 0x4e, 0x36, 0x3f, 0xee, 0xad, 0x9b, 0x9e, 0xb2, 0x32,
0x17, 0x12, 0x1b, 0x2d, 0xc4, 0x9d, 0x98, 0x9e, 0xae, 0x5f, 0x2d, 0x2b,
0x2c, 0x32, 0x3d, 0x3f, 0x38, 0x3d, 0x4c, 0x5f, 0xc2, 0xaf, 0xae, 0xac,
0xb9, 0xd9, 0x41, 0x3c, 0x3c, 0x3d, 0x5c, 0xc0, 0xae, 0xaf, 0xbc, 0x3b,
0x28, 0x24, 0x2a, 0x4b, 0xb5, 0xa8, 0xab, 0xbe, 0x40, 0x2a, 0x29, 0x33,
0x54, 0xbb, 0xb4, 0xc9, 0x63, 0x4a, 0x3d, 0x3d, 0x4a, 0xb9, 0xbb, 0x48,
0x37, 0x5d, 0xbd, 0xa5, 0x9a, 0xa1, 0xc6, 0x23, 0x13, 0x11, 0x20, 0x39,
0xaa, 0x99, 0x97, 0xa2, 0xb9, 0x45, 0x2c, 0x28, 0x2a, 0x2e, 0x34, 0x38,
0x35, 0x43, 0x6b, 0xc5, 0xba, 0xad, 0xad, 0xb5, 0xcc, 0x41, 0x32, 0x34,
0x41, 0xe3, 0xd3, 0xc6, 0xbc, 0xbb, 0xbe, 0xe2, 0x38, 0x2a, 0x2b, 0x32,
0x5c, 0xb8, 0xad, 0xae, 0xbb, 0x59, 0x36, 0x2c, 0x31, 0x57, 0xc2, 0xb6,
0xbb, 0xd1, 0x45, 0x3b, 0x36, 0x53, 0xaa, 0xaf, 0x33, 0x3b, 0x4a, 0x4c,
0xa8, 0x9c, 0xad, 0x48, 0x1e, 0x13, 0x19, 0x2e, 0xc5, 0x9d, 0x94, 0x9c,
0xb0, 0x70, 0x2d, 0x24, 0x28, 0x2d, 0x36, 0x46, 0x4b, 0x4e, 0xd3, 0xc0,
0xb6, 0xaf, 0xae, 0xbc, 0xe4, 0x3f, 0x30, 0x34, 0x5d, 0xc8, 0xbb, 0xba,
0xc4, 0xe4, 0xf0, 0xc9, 0x79, 0x38, 0x30, 0x2e, 0x36, 0x56, 0xb9, 0xaf,
0xb1, 0xc3, 0x4d, 0x36, 0x38, 0x3a, 0x3c, 0x6b, 0xd9, 0xca, 0xd0, 0xd3,
0xf9, 0x5b, 0x5f, 0xc3, 0xba, 0x46, 0x34, 0x3d, 0x51, 0xb5, 0xa3, 0xab,
0xd0, 0x32, 0x1f, 0x21, 0x2f, 0xf4, 0xad, 0xa5, 0xa8, 0xb9, 0xfe, 0x3d,
0x38, 0x3d, 0x45, 0x48, 0x48, 0x49, 0x4d, 0x6b, 0xcb, 0xbe, 0xbe, 0xbe,
0xcd, 0x5a, 0x4a, 0x45, 0x4e, 0x71, 0xce, 0xc1, 0xc4, 0xdf, 0x7d, 0x67,
0xf3, 0xe7, 0x6c, 0x4c, 0x41, 0x40, 0x4c, 0xe9, 0xc3, 0xc1, 0xc5, 0xd0,
0x58, 0x46, 0x43, 0x42, 0x49, 0x4f, 0xfa, 0xd5, 0xc9, 0xc5, 0xd0, 0x71,
0x49, 0x4f, 0xd9, 0xd7, 0x33, 0x31, 0x46, 0xcd, 0xa9, 0xa0, 0xae, 0x3c,
0x1e, 0x19, 0x1e, 0x35, 0xb5, 0x9f, 0x9e, 0xa9, 0xca, 0x47, 0x36, 0x30,
0x34, 0x3b, 0x34, 0x32, 0x3b, 0x4e, 0xd1, 0xb9, 0xb0, 0xb7, 0xc9, 0x66,
0x44, 0x3b, 0x41, 0x4b, 0xd1, 0xbb, 0xbc, 0xcd, 0x5c, 0x53, 0xef, 0xe6,
0x57, 0x35, 0x2c, 0x2f, 0x44, 0x49, 0xbc, 0xb7, 0xc4, 0xe7, 0x77, 0x3b,
0x2f, 0x3f, 0x42, 0x49, 0x3e, 0x59, 0xb1, 0xb7, 0x62, 0xed, 0xc2, 0xd2,
0x36, 0x36, 0xc3, 0xaf, 0x2d, 0x21, 0x3a, 0xa6, 0x9c, 0xa4, 0xc0, 0x2b,
0x21, 0x1a, 0x18, 0x37, 0xa3, 0xa0, 0xa9, 0xa7, 0xb1, 0x4b, 0x26, 0x2b,
0x37, 0x4f, 0x43, 0x2c, 0x2f, 0xc8, 0xb9, 0xb5, 0xcf, 0xe6, 0x6e, 0x59,
0x3f, 0x2f, 0x52, 0xba, 0xd8, 0xc3, 0xb8, 0xc3, 0xc4, 0xb5, 0x6d, 0x2f,
0x27, 0x2b, 0x33, 0xed, 0xbb, 0xad, 0xb3, 0x70, 0x35, 0x40, 0x4d, 0x42,
0x3e, 0x48, 0xea, 0xc8, 0xdb, 0xc6, 0xbe, 0xce, 0x6d, 0x3c, 0x34, 0x3f,
0xc9, 0xd5, 0xdd, 0xf0, 0xde, 0x4d, 0x6e, 0x6a, 0xca, 0xb4, 0xbf, 0x48,
0x2d, 0x29, 0x31, 0x3f, 0x53, 0xbf, 0xab, 0xb0, 0xc2, 0xf0, 0x5b, 0x52,
0x3e, 0x39, 0x36, 0x3e, 0x5b, 0xcf, 0xbc, 0xb9, 0xbd, 0x63, 0x4d, 0x4f,
0x5b, 0x67, 0x4c, 0x4d, 0x5f, 0xc8, 0xba, 0xb6, 0xbe, 0xe7, 0x37, 0x2c,
0x32, 0x3e, 0xd5, 0xbf, 0xbc, 0xc2, 0xda, 0x4f, 0x3c, 0x39, 0x36, 0x37,
0x4f, 0xbe, 0xb8, 0xb8, 0xc5, 0xd6, 0x55, 0x53, 0x4d, 0x59, 0xff, 0xe7,
0xd6, 0xde, 0xdb, 0xc8, 0xdb, 0x68, 0x67, 0x56, 0x54, 0x50, 0xe3, 0xfc,
0x52, 0x46, 0x45, 0x54, 0xd7, 0xc9, 0xcd, 0xec, 0x5d, 0x50, 0x4e, 0x5b,
0x5b, 0xe7, 0x60, 0x57, 0x5c, 0xde, 0xc8, 0xce, 0xff, 0x67, 0x67, 0x5e,
0x4f, 0x45, 0x4d, 0xef, 0xc6, 0xc4, 0xcf, 0xff, 0x57, 0x52, 0x49, 0x5f,
0xd1, 0xc9, 0xd7, 0xd2, 0xc9, 0xd2, 0x63, 0x3f, 0x3c, 0x42, 0x4f, 0x67,
0xdb, 0xe2, 0xe2, 0xff, 0x5b, 0x67, 0x7e, 0xe7, 0xec, 0x5b, 0x67, 0xd9,
0xd3, 0xe7, 0x79, 0x4e, 0x5b, 0x55, 0x79, 0x60, 0x54, 0x78, 0xdb, 0xff,
0x57, 0x5a, 0xdc, 0x6c, 0xff, 0x7e, 0x62, 0xff, 0x5b, 0x5e, 0xde, 0xdc,
0xe7, 0x67, 0xe9, 0xe7, 0xdd, 0xe7, 0xe0, 0xe7, 0xce, 0xf0, 0x5a, 0x5a,
0x6f, 0x6a, 0xe7, 0x67, 0xe5, 0xf0, 0x4e, 0x49, 0x45, 0x5d, 0xdc, 0xe7,
0xd3, 0xe7, 0xe7, 0xf4, 0x5c, 0x4f, 0x59, 0x53, 0xff, 0xff, 0xff, 0x57,
0x57, 0xe9, 0x6f, 0xe4, 0xd3, 0xef, 0xde, 0x67, 0xe7, 0xff, 0xdd, 0xd8,
0xe7, 0xe7, 0x58, 0x5c, 0x67, 0x5b, 0x5b, 0x4f, 0x5b, 0x67, 0xf6, 0xd6,
0xdb, 0x67, 0x77, 0x67, 0x57, 0x55, 0x5b, 0x70, 0x67, 0x67, 0x5b, 0x5e,
0xff, 0x5f, 0xe7, 0xff, 0x5b, 0xff, 0xeb, 0xe7, 0xff, 0xff, 0xdb, 0xe7,
0xe7, 0xff, 0xff, 0x5e, 0x67, 0xff, 0x6d, 0x6c, 0xe7, 0x72, 0xff, 0x69,
0x60, 0x67, 0x67, 0xdb, 0xed, 0x7a, 0x6f, 0x5b, 0x78, 0x67, 0xff, 0x67,
0xff, 0x7d, 0x67, 0x67, 0x5b, 0x5b, 0x6d, 0x5b, 0x74, 0x5e, 0xdc, 0x67,
0xdb, 0xce, 0x79, 0x5f, 0xe7, 0x67, 0x6f, 0x55, 0x60, 0xf9, 0xe5, 0xdf,
0xff, 0xdd, 0xfd, 0x69, 0xff, 0x5b, 0x67, 0x67, 0x78, 0xdc, 0x76, 0x73,
0x68, 0xf5, 0x62, 0x5b, 0x73, 0xff, 0xe8, 0xe7, 0xe3, 0xfc, 0x71, 0xe7,
0x6b, 0x58, 0x53, 0x65, 0x6f, 0x7a, 0x67, 0xff, 0x7b, 0x67, 0x5b, 0x5b,
0x53, 0x6e, 0x66, 0x76, 0xed, 0xfe, 0xd6, 0x67, 0x7f, 0xf4, 0xe7, 0xfe,
0xff, 0xff, 0xff, 0x72, 0xeb, 0x67, 0x71, 0xff, 0x67, 0x6f, 0x6a, 0xdb,
0x70, 0xe7, 0x6b, 0x6e, 0x7c, 0x67, 0x5b, 0x53, 0x4d, 0x4d, 0x5c, 0x67,
0xf4, 0xe7, 0xe2, 0xe7, 0xfe, 0x5e, 0x67, 0x67, 0xe7, 0xeb, 0xff, 0x5f,
0x67, 0x67, 0xef, 0x67, 0x5b, 0xff, 0xff, 0xe7, 0xdb, 0xe7, 0xe7, 0x71,
0x67, 0xeb, 0xff, 0x7d, 0x62, 0xed, 0xe7, 0xed, 0x75, 0xff, 0xe7, 0x63,
0x66, 0x5f, 0x5b, 0x66, 0xe7, 0xff, 0xff, 0x67, 0x6a, 0xe7, 0x5f, 0x5d,
0x67, 0x5b, 0xff, 0x6b, 0x5f, 0xe7, 0xff, 0xe7, 0xe8, 0x56, 0x6d, 0x67,
0x59, 0xff, 0x53, 0x66, 0xd0, 0x67, 0x67, 0xf6, 0x68, 0xff, 0xff, 0x67,
0xdf, 0xea, 0xdd, 0xdc, 0x5d, 0xde, 0x5c, 0x50, 0xdb, 0x71, 0xe7, 0xff,
0x72, 0xff, 0x6c, 0x67, 0x67, 0x5b, 0x5b, 0xff, 0xff, 0x5b, 0xe8, 0xff,
0x5b, 0x53, 0x5b, 0x67, 0x67, 0x74, 0xdb, 0xfb, 0x70, 0xed, 0x7a, 0xe7,
0xec, 0x5b, 0x67, 0x64, 0x52, 0xe1, 0xe8, 0xe7, 0x73, 0x68, 0xde, 0x74,
0x68, 0xdb, 0xdb, 0x68, 0x5b, 0xff, 0xff, 0x6e, 0x67, 0x5c, 0x60, 0x53,
0x5a, 0x70, 0x61, 0x52, 0x5b, 0xff, 0x5b, 0xe7, 0xfb, 0xf8, 0x6e, 0x7c,
0x5d, 0x78, 0x7d, 0x5b, 0xff, 0x7e, 0x5b, 0x5b, 0x67, 0x6d, 0xff, 0x5c,
0x72, 0xf7, 0xe7, 0xe7, 0x67, 0xff, 0x5f, 0x6a, 0xff, 0x67, 0xe7, 0xf9,
0x67, 0xff, 0x67, 0x60, 0x5c, 0xff, 0x67, 0x66, 0x63, 0xff, 0xe7, 0xe7,
0x6d, 0xe7, 0x5e, 0xf5, 0xfe, 0x67, 0x56, 0x67, 0xe7, 0xff, 0x67, 0x67,
0x78, 0x4b, 0x5c, 0xd6, 0x5d, 0xdf, 0xe7, 0xff, 0xff, 0x5b, 0x77, 0xff,
0xff, 0xff, 0x53, 0x7e, 0x5b, 0x6d, 0xe7, 0x56, 0x73, 0xfd, 0xe7, 0xf6,
0xfd, 0xff, 0x6f, 0x5b, 0xfb, 0xee, 0x7b, 0xff, 0x79, 0x5b, 0x53, 0x55,
0x53, 0x58, 0x49, 0x5a, 0x6e, 0xdc, 0xff, 0xff, 0xe8, 0x67, 0x67, 0xdb,
0x67, 0x56, 0x54, 0x5b, 0x51, 0x4d, 0x58, 0x5b, 0xea, 0xf1, 0x5d, 0xff,
0xe7, 0xda, 0xe5, 0xd7, 0xde, 0xea, 0xef, 0x67, 0xff, 0x60, 0x5b, 0x67,
0x53, 0x67, 0x50, 0xeb, 0x5b, 0x67, 0x5b, 0x67, 0xed, 0x4a, 0x65, 0xff,
0x5b, 0xd5, 0x57, 0xdd, 0xff, 0x5c, 0xbe, 0x3c, 0xd3, 0x47, 0x5c, 0x68,
0x63, 0x4d, 0xd3, 0x4d, 0xf6, 0x5b, 0x5f, 0xbe, 0x50, 0xdb, 0xe2, 0x74,
0xe7, 0xd8, 0x4f, 0xce, 0x5f, 0x44, 0x41, 0x5f, 0x4e, 0x3d, 0x5d, 0xeb,
0x5c, 0xd3, 0xdd, 0xff, 0xd7, 0xbd, 0x53, 0xca, 0x5e, 0x43, 0xd1, 0xf4,
0x38, 0x67, 0x5b, 0x47, 0x56, 0x5b, 0x67, 0x59, 0x46, 0x57, 0xc5, 0xc5,
0xbc, 0xe4, 0x3f, 0x4b, 0x37, 0xec, 0xc8, 0xcd, 0x49, 0xd7, 0x48, 0x40,
0xe8, 0xd9, 0xbd, 0xca, 0x55, 0xcc, 0xdd, 0x52, 0x3a, 0x4c, 0xe6, 0xc1,
0x74, 0x4d, 0xe7, 0x61, 0x4e, 0x3d, 0xcb, 0xfa, 0x5b, 0x5b, 0xeb, 0x7c,
0x5d, 0xff, 0x5f, 0xfa, 0x45, 0x3c, 0x5e, 0x67, 0xd0, 0xe9, 0xdd, 0x78,
0x3f, 0xed, 0xc7, 0x5b, 0x53, 0x75, 0xff, 0xcf, 0xce, 0x67, 0x6d, 0xf6,
0x68, 0xf9, 0xe7, 0xfc, 0xfb, 0xe1, 0x4b, 0x45, 0x4e, 0x53, 0xdf, 0xea,
0xdf, 0x69, 0xe5, 0xe4, 0x72, 0x67, 0x56, 0x3c, 0x4a, 0xe7, 0x59, 0x53,
0x49, 0x67, 0x46, 0x4d, 0xd7, 0xc6, 0xc1, 0xeb, 0xe7, 0x60, 0xdd, 0xff,
0xe7, 0x67, 0xea, 0xe7, 0x4d, 0xd5, 0xcd, 0x49, 0x46, 0x49, 0xcd, 0xca,
0xda, 0xdb, 0x72, 0x4c, 0x68, 0xde, 0xec, 0x5b, 0xd9, 0x4d, 0x5b, 0x3c,
0x5a, 0xfc, 0x48, 0xdd, 0x4a, 0xfc, 0x57, 0x4d, 0x5f, 0x7a, 0x67, 0xdc,
0xc2, 0xd0, 0xcd, 0xe9, 0xd7, 0x4d, 0x45, 0x43, 0xd8, 0xe7, 0x5b, 0x40,
0x5b, 0xd9, 0xf5, 0xce, 0xe3, 0xd8, 0xdd, 0xca, 0x6b, 0xff, 0xcf, 0xee,
0x5b, 0x4b, 0x5d, 0x67, 0x4c, 0xf6, 0x5f, 0xe0, 0xff, 0x77, 0xd7, 0xe7,
0xe7, 0x53, 0x5c, 0x5e, 0x59, 0xe7, 0x5b, 0x61, 0x68, 0x3b, 0x4a, 0x5c,
0x58, 0x40, 0xef, 0xc9, 0xf4, 0x53, 0xe6, 0xce, 0xf5, 0x5b, 0xe5, 0xce,
0xd0, 0xc6, 0x53, 0x52, 0xe7, 0xf7, 0x4a, 0x5c, 0xff, 0x61, 0x68, 0xf5,
0x4b, 0x7e, 0xff, 0xcb, 0xda, 0x58, 0xff, 0x5c, 0x6a, 0x4d, 0x5a, 0x4f,
0x5e, 0x5d, 0x5f, 0x5e, 0xe7, 0x53, 0xd6, 0x4d, 0xe0, 0xe6, 0xeb, 0x61,
0xeb, 0x4f, 0x65, 0x5c, 0x5e, 0x4d, 0x53, 0x5e, 0x5b, 0x67, 0xff, 0x59,
0xeb, 0xea, 0x55, 0xeb, 0xc5, 0xbf, 0x6e, 0x68, 0xce, 0xd5, 0x60, 0x57,
0xdb, 0x6b, 0x46, 0x59, 0xda, 0x4d, 0x3f, 0x6a, 0xdc, 0x48, 0x54, 0xe7,
0xcc, 0x68, 0x4a, 0x52, 0xd7, 0xc2, 0xe4, 0x5b, 0x53, 0x57, 0x43, 0x77,
0xdf, 0xed, 0x4f, 0x53, 0xfa, 0x6a, 0x7c, 0xd5, 0x55, 0x6e, 0x69, 0xdd,
0xcb, 0xff, 0xd6, 0xff, 0x4d, 0x43, 0xed, 0xc2, 0xcd, 0x4d, 0x4d, 0x79,
0xd1, 0xda, 0x5f, 0x53, 0x4a, 0x53, 0xda, 0xe2, 0x4f, 0x5d, 0x67, 0x5b,
0x54, 0xdd, 0x60, 0x55, 0xe7, 0xf2, 0xd4, 0x5e, 0xe7, 0x53, 0x62, 0x4f,
0x5b, 0xd3, 0x57, 0x4d, 0x73, 0xec, 0x5b, 0x5b, 0x5f, 0xfb, 0x53, 0xf9,
0xfa, 0x5f, 0xcd, 0xda, 0x68, 0x6e, 0xcd, 0x67, 0xf9, 0xd9, 0xee, 0x5b,
0x59, 0x4c, 0x4a, 0x75, 0x4c, 0xff, 0x59, 0x54, 0x45, 0xed, 0xec, 0x54,
0x77, 0xc9, 0x6c, 0xd3, 0x5e, 0x72, 0x66, 0x4c, 0xd5, 0x4e, 0x55, 0x53,
0xff, 0x52, 0x49, 0x7a, 0xe8, 0x67, 0xd8, 0xe7, 0xd1, 0x67, 0x7f, 0xed,
0xe2, 0xfe, 0x67, 0x5e, 0xdc, 0x53, 0x59, 0x5b, 0x67, 0xff, 0x5d, 0x58,
0x53, 0x5a, 0xef, 0x67, 0x79, 0xee, 0x6b, 0xd3, 0xf1, 0xd5, 0xeb, 0x5d,
0x54, 0x56, 0x63, 0xdb, 0xe2, 0x59, 0xdc, 0x76, 0x53, 0x53, 0x53, 0x5d,
0x54, 0x57, 0x5f, 0xe7, 0xf0, 0xcf, 0xd0, 0x57, 0xd7, 0xde, 0x5b, 0x77,
0x60, 0xd7, 0x5b, 0x59, 0xd7, 0x53, 0x76, 0x6d, 0x5c, 0xec, 0x4d, 0x7f,
0x5e, 0xff, 0x5c, 0xe3, 0xf1, 0x5b, 0x5f, 0xf7, 0x5d, 0x60, 0x64, 0x7b,
0x6f, 0x55, 0xea, 0x53, 0x5b, 0x5b, 0x71, 0x5b, 0x5d, 0x67, 0x66, 0x63,
0xe7, 0xe8, 0xff, 0xd9, 0xd3, 0xf4, 0xe7, 0x68, 0xed, 0xd6, 0x5c, 0x6a,
0x77, 0x7c, 0x65, 0x53, 0x65, 0x4d, 0x4f, 0x67, 0x5b, 0x65, 0x53, 0x70,
0x5d, 0xdd, 0x5b, 0xff, 0xeb, 0xda, 0xfc, 0xe9, 0x4c, 0xff, 0x67, 0x6d,
0x53, 0x67, 0x5b, 0x5b, 0x5b, 0x5f, 0x4d, 0xdb, 0x5b, 0xff, 0xe6, 0xea,
0xea, 0xef, 0xe5, 0xe7, 0xe7, 0xda, 0xe0, 0xff, 0x67, 0xe7, 0x4e, 0x68,
0x50, 0x59, 0x5c, 0xec, 0xff, 0xe7, 0x5b, 0xf5, 0xfe, 0x73, 0xf6, 0xe7,
0xff, 0x63, 0xeb, 0x6e, 0x67, 0x5d, 0x68, 0x65, 0x5b, 0x57, 0xff, 0xff,
0xe0, 0xff, 0x5d, 0x5f, 0x68, 0xff, 0xff, 0x68, 0xde, 0x5e, 0x67, 0x74,
0xff, 0x68, 0x73, 0xf6, 0xfd, 0xe7, 0xff, 0xfc, 0xdf, 0xff, 0xe7, 0x67,
0x67, 0xea, 0xdf, 0x7a, 0x5b, 0x67, 0xff, 0x5b, 0x60, 0x5b, 0x53, 0x56,
0xfe, 0xf5, 0x74, 0x67, 0x62, 0xff, 0x67, 0x6d, 0x5b, 0x7d, 0x72, 0xe7,
0x5c, 0xe7, 0x5b, 0x65, 0xf0, 0xff, 0x6a, 0xef, 0xfa, 0xe4, 0x67, 0x69,
0xff, 0x5b, 0xdb, 0xe3, 0xdf, 0x67, 0x76, 0xe7, 0x7e, 0x5b, 0xff, 0x67,
0x67, 0xe7, 0x5c, 0x61, 0x53, 0xea, 0x5b, 0x64, 0x65, 0x7c, 0x5d, 0x67,
0x6f, 0x67, 0x5d, 0x5b, 0xfb, 0xff, 0xd7, 0xff, 0xdd, 0x6a, 0x67, 0x6c,
0x56, 0xe8, 0xec, 0xe2, 0x5b, 0x67, 0x6c, 0xfe, 0x5e, 0x60, 0xe6, 0x53,
0x67, 0x7c, 0x5f, 0xf8, 0xfb, 0x67, 0xe7, 0xff, 0xe7, 0xe7, 0xdb, 0xdf,
0x67, 0x55, 0x61, 0x5c, 0x6c, 0x53, 0x69, 0xe7, 0x5b, 0x67, 0x62, 0x56,
0x67, 0x61, 0x67, 0xe8, 0xdb, 0x77, 0xdd, 0xdb, 0xeb, 0x67, 0x5b, 0xff,
0x5d, 0x6f, 0x67, 0x67, 0xe7, 0xff, 0x67, 0xe0, 0xe9, 0xeb, 0xe4, 0x67,
0xff, 0x67, 0x67, 0x75, 0x5b, 0x7f, 0xf4, 0xff, 0xff, 0x72, 0x77, 0x5b,
0x67, 0x5b, 0x67, 0xe7, 0x5b, 0x7a, 0x6f, 0x5d, 0xea, 0x61, 0x4d, 0x60,
0xe7, 0x79, 0x59, 0xff, 0x7d, 0x56, 0x5e, 0x67, 0x59, 0x5b, 0xe7, 0xde,
0x75, 0x7e, 0xf7, 0x6f, 0x66, 0x67, 0xf0, 0xfc, 0xe7, 0x67, 0xff, 0x7e,
0x6a, 0x6a, 0x67, 0x67, 0xff, 0xee, 0x67, 0x77, 0xee, 0x67, 0x67, 0x61,
0x67, 0x67, 0x67, 0x67, 0x51, 0xe7, 0x5c, 0x5b, 0xff, 0x5c, 0x72, 0x67,
0x67, 0xff, 0x5d, 0xff, 0x53, 0x6a, 0x5e, 0x57, 0x5d, 0xea, 0xe7, 0xfb,
0xe7, 0xe7, 0xfc, 0xe7, 0xdb, 0xff, 0xff, 0xf3, 0xe7, 0x67, 0xff, 0xff,
0xe7, 0x76, 0x66, 0x5b, 0xff, 0x69, 0xff, 0x64, 0x4e, 0x60, 0xea, 0x5b,
0x67, 0x67, 0x67, 0x5b, 0x67, 0x5b, 0x57, 0x67, 0x77, 0xee, 0xe7, 0xe7,
0xed, 0xff, 0xff, 0x62, 0x5b, 0x67, 0x6c, 0xff, 0x5b, 0x6c, 0xdc, 0x5a,
0x5d, 0x67, 0x71, 0x79, 0x67, 0xd3, 0xe7, 0xff, 0xe7, 0xfb, 0xff, 0xe0,
0x66, 0x67, 0xe7, 0x67, 0x76, 0xe7, 0x67, 0x67, 0x5e, 0xff, 0x6d, 0x5e,
0x68, 0x61, 0x6c, 0xff, 0x53, 0x5d, 0xe9, 0x5f, 0x55, 0xe9, 0x5b, 0x67,
0x67, 0x5f, 0xfa, 0x57, 0x66, 0xe7, 0x6b, 0x67, 0xff, 0xff, 0xe7, 0xff,
0xd8, 0xed, 0xff, 0x74, 0xec, 0x68, 0x67, 0xe7, 0x68, 0xee, 0xff, 0x7c,
0xf1, 0x64, 0x5a, 0x67, 0x53, 0x65, 0x67, 0x5b, 0x79, 0x70, 0x67, 0x5d,
0x4f, 0x54, 0xff, 0xf2, 0x7d, 0x76, 0xe7, 0xe8, 0x75, 0xde, 0xff, 0x5b,
0x75, 0x5b, 0xed, 0x76, 0x66, 0x6e, 0x67, 0x7b, 0x5f, 0x67, 0x67, 0x5b,
0x5d, 0xdd, 0xef, 0xf7, 0xda, 0x60, 0xe6, 0xe3, 0x61, 0xfd, 0xf6, 0xff,
0x67, 0x62, 0x59, 0x53, 0x74, 0x6d, 0x5b, 0xff, 0x5b, 0x67, 0x72, 0x6f,
0x5b, 0xff, 0x6b, 0xe7, 0xe7, 0x67, 0x67, 0xef, 0xdd, 0x6a, 0x60, 0x67,
0xe7, 0xe7, 0x65, 0x63, 0xf3, 0xe9, 0x62, 0x74, 0x67, 0xff, 0xf5, 0xe7,
0xff, 0xff, 0x68, 0x53, 0x6b, 0x69, 0xff, 0xe7, 0xe7, 0xf0, 0x79, 0x55,
0x53, 0x5d, 0xff, 0x67, 0xdb, 0xf8, 0x6e, 0x7a, 0x53, 0xff, 0x5b, 0x51,
0x5e, 0x67, 0x5e, 0x5e, 0x67, 0x67, 0x5b, 0x5b, 0x5b, 0x5b, 0x67, 0xe7,
0x78, 0x7b, 0xf0, 0xea, 0x67, 0xff, 0x67, 0x79, 0xff, 0xe7, 0xf8, 0x6e,
0xe9, 0xff, 0x61, 0xff, 0x58, 0x67, 0x5b, 0x75, 0x67, 0xff, 0x5b, 0x67,
0x67, 0x6d, 0x5b, 0x5b, 0x5f, 0x5d, 0x67, 0x5b, 0x53, 0x5b, 0x67, 0x79,
0xff, 0xf0, 0xe9, 0x67, 0x60, 0x5b, 0x67, 0x6e, 0x67, 0xff, 0xe7, 0xe8,
0x6c, 0xf4, 0x67, 0x67, 0xf5, 0xdc, 0x6d, 0xff, 0xff, 0x6e, 0x67, 0xff,
0x65, 0xf8, 0xf7, 0x5c, 0xea, 0xff, 0xd7, 0xff, 0xff, 0x70, 0x5b, 0x5d,
0xff, 0x66, 0x53, 0x6e, 0x66, 0x76, 0xff, 0x67, 0x67, 0x53, 0x5b, 0x73,
0x76, 0x67, 0xe7, 0xdd, 0x67, 0xff, 0x5b, 0x65, 0x67, 0x67, 0xff, 0x6f,
0x7a, 0x79, 0x67, 0x69, 0xe7, 0xee, 0xe7, 0xe7, 0xe7, 0xff, 0x4d, 0xe7,
0xe8, 0xff, 0x67, 0x7f, 0xff, 0x67, 0x67, 0x6d, 0x58, 0xe7, 0x67, 0x6b,
0xff, 0x5b, 0x67, 0x5d, 0x5b, 0x52, 0x59, 0xfe, 0x53, 0x78, 0xff, 0x53,
0x63, 0x72, 0x5b, 0x51, 0x5b, 0x5c, 0xec, 0xf4, 0xe7, 0xd9, 0xd6, 0xfe,
0xed, 0x63, 0x5b, 0xff, 0x67, 0x7c, 0xff, 0x67, 0xe9, 0x6f, 0x67, 0x67,
0xff, 0xdb, 0xe4, 0x67, 0x5c, 0x67, 0x5f, 0x5b, 0x5b, 0x5b, 0x5b, 0x75,
0x67, 0x67, 0x67, 0xe7, 0x67, 0x5b, 0x67, 0x67, 0x5f, 0x67, 0xe9, 0xff,
0x5b, 0x65, 0xe7, 0xea, 0x7a, 0xff, 0x7a, 0x67, 0x5f, 0x67, 0x6b, 0x5b,
0x67, 0x67, 0x61, 0x67, 0x67, 0xff, 0xe8, 0x5b, 0xff, 0xe7, 0xe7, 0xe7,
0xe7, 0xe7, 0x67, 0x5c, 0x5b, 0x5b, 0x67, 0xff, 0x67, 0xea, 0x6f, 0x67,
0x67, 0x67, 0x4e, 0x53, 0xe9, 0x79, 0x59, 0xdd, 0xd4, 0xe3, 0xdd, 0xe8,
0x5b, 0x62, 0x7f, 0xd1, 0x6d, 0x53, 0xed, 0x6e, 0x66, 0x67, 0x67, 0x67,
0x67, 0xff, 0x69, 0x67, 0xea, 0x5d, 0x6f, 0xdb, 0x5f, 0x5b, 0xe7, 0xf7,
0xd0, 0xe8, 0xec, 0x73, 0x5b, 0x67, 0xf4, 0x67, 0x74, 0x67, 0x5b, 0x5b,
0x5b, 0x66, 0x53, 0x55, 0x5b, 0x71, 0x5b, 0x5c, 0x70, 0xed, 0x4e, 0x4d,
0x6a, 0xe7, 0x6f, 0xfb, 0xd5, 0xdf, 0x67, 0x77, 0x72, 0xfd, 0xe7, 0xed,
0x68, 0xff, 0x74, 0x67, 0x61, 0xff, 0x68, 0x6e, 0x53, 0x5b, 0x67, 0x5a,
0x5a, 0xff, 0xdd, 0x5e, 0x57, 0xea, 0xff, 0x4d, 0x6b, 0xf8, 0x53, 0x67,
0x67, 0xf2, 0x7b, 0x53, 0x58, 0x5b, 0x56, 0x67, 0xe7, 0xf4, 0x6c, 0xff,
0xe7, 0xff, 0x68, 0xee, 0x77, 0x7c, 0xf1, 0x67, 0xe7, 0x5f, 0x6a, 0xff,
0xff, 0xff, 0xff, 0x60, 0xfc, 0xe7, 0x72, 0x54, 0x76, 0x67, 0x67, 0x67,
0xd9, 0xdb, 0x4f, 0x67, 0x5b, 0x5b, 0x56, 0x67, 0xe7, 0x4e, 0xea, 0x7b,
};

47
tests/dev/audio/t_pad.sh Normal file
View File

@@ -0,0 +1,47 @@
# $NetBSD: t_pad.sh,v 1.3 2010/11/07 17:51:17 jmmv Exp $
#
# Copyright (c) 2010 The NetBSD Foundation, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
atf_test_case pad_output
pad_output_head()
{
atf_set "descr" "Check pad driver output against known-good output"
}
pad_output_body()
{
atf_check -s exit:0 uudecode $(atf_get_srcdir)/t_pad_output.bz2.uue
atf_check -s exit:0 bunzip2 t_pad_output.bz2
atf_check -s exit:0 -o file:t_pad_output $(atf_get_srcdir)/h_pad
}
atf_init_test_cases()
{
atf_add_test_case pad_output
}

View File

@@ -0,0 +1,998 @@
begin 644 t_pad_output.bz2
M0EIH.3%!629368,\S/H`A(]_____________________________________
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
&A(09YF?0
`
end

12
tests/dev/cgd/Makefile Normal file
View File

@@ -0,0 +1,12 @@
# $NetBSD: Makefile,v 1.2 2010/12/14 17:48:31 pooka Exp $
#
.include <bsd.own.mk>
TESTSDIR= ${TESTSBASE}/dev/cgd
FILES= paramsfile
FILESDIR= ${TESTSDIR}
TESTS_SH= t_cgd
.include <bsd.test.mk>

8
tests/dev/cgd/paramsfile Normal file
View File

@@ -0,0 +1,8 @@
algorithm aes-cbc;
iv-method encblkno1;
keylength 128;
verify_method none;
keygen pkcs5_pbkdf2/sha1 {
iterations 42;
salt AAAAgKajcCnHR7sR1k1RKQ9Q0uY=;
};

159
tests/dev/cgd/t_cgd.sh Normal file
View File

@@ -0,0 +1,159 @@
# $NetBSD: t_cgd.sh,v 1.11 2013/02/19 21:08:24 joerg Exp $
#
# Copyright (c) 2010 The NetBSD Foundation, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
rawpart=`sysctl -n kern.rawpartition | tr '01234' 'abcde'`
rawcgd=/dev/rcgd0${rawpart}
cgdserver=\
"rump_server -lrumpvfs -lrumpkern_crypto -lrumpdev -lrumpdev_disk -lrumpdev_cgd"
atf_test_case basic cleanup
basic_head()
{
atf_set "descr" "Tests that encrypt/decrypt works"
atf_set "require.progs" "rump_server"
}
basic_body()
{
d=$(atf_get_srcdir)
atf_check -s exit:0 \
${cgdserver} -d key=/dev/dk,hostpath=dk.img,size=1m unix://csock
export RUMP_SERVER=unix://csock
atf_check -s exit:0 -x "echo 12345 | \
rump.cgdconfig -p cgd0 /dev/dk ${d}/paramsfile"
atf_check -s exit:0 -e ignore -x \
"dd if=${d}/t_cgd count=2 | rump.dd of=${rawcgd}"
atf_check -s exit:0 -e ignore dd if=${d}/t_cgd of=testfile count=2
atf_check -s exit:0 -e ignore -o file:testfile \
rump.dd if=${rawcgd} count=2
}
basic_cleanup()
{
env RUMP_SERVER=unix://csock rump.halt || true
}
atf_test_case wrongpass cleanup
wrongpass_head()
{
atf_set "descr" "Tests that wrong password does not give original " \
"plaintext"
atf_set "require.progs" "rump_server"
}
wrongpass_body()
{
d=$(atf_get_srcdir)
atf_check -s exit:0 \
${cgdserver} -d key=/dev/dk,hostpath=dk.img,size=1m unix://csock
export RUMP_SERVER=unix://csock
atf_check -s exit:0 -x "echo 12345 | \
rump.cgdconfig -p cgd0 /dev/dk ${d}/paramsfile"
atf_check -s exit:0 -e ignore -x \
"dd if=${d}/t_cgd | rump.dd of=${rawcgd} count=2"
# unconfig and reconfig cgd
atf_check -s exit:0 rump.cgdconfig -u cgd0
atf_check -s exit:0 -x "echo 54321 | \
rump.cgdconfig -p cgd0 /dev/dk ${d}/paramsfile"
atf_check -s exit:0 -e ignore dd if=${d}/t_cgd of=testfile count=2
atf_check -s exit:0 -e ignore -o not-file:testfile \
rump.dd if=${rawcgd} count=2
}
wrongpass_cleanup()
{
env RUMP_SERVER=unix://csock rump.halt || true
}
atf_test_case unaligned_write cleanup
unaligned_write_head()
{
atf_set "descr" "Attempt unaligned writes to a raw cgd device"
atf_set "require.progs" "rump_server"
}
unaligned_write_body()
{
d=$(atf_get_srcdir)
atf_check -s exit:0 \
${cgdserver} -d key=/dev/dk,hostpath=dk.img,size=1m unix://csock
export RUMP_SERVER=unix://csock
atf_check -s exit:0 -x "echo 12345 | \
rump.cgdconfig -p cgd0 /dev/dk ${d}/paramsfile"
# Check that cgd rejects writes of totally bogus lengths.
atf_check -s not-exit:0 -e ignore -x \
"echo die hard | rump.dd of=${rawcgd} bs=123 conv=sync"
# Check that cgd rejects non-sector-length writes even if they
# are integral multiples of the block size.
atf_check -s not-exit:0 -e ignore -x \
"echo die hard | rump.dd of=${rawcgd} bs=64 conv=sync"
atf_check -s not-exit:0 -e ignore -x \
"echo die hard | rump.dd of=${rawcgd} bs=256 conv=sync"
# Check that cgd rejects misaligned buffers, produced by
# packetizing the input on bogus boundaries and using the
# bizarre behaviour of `bs=N' in dd.
atf_check -s not-exit:0 -e ignore -x \
"(echo -n x && sleep 1 && head -c 511 </dev/zero) \
| rump.dd of=${rawcgd} bs=512"
# Check that cgd rejects sector-length writes if they are not
# on sector boundaries. Doesn't work because dd can't be
# persuaded to seek a non-integral multiple of the output
# buffer size and I can't be arsed to find the another way to
# do that.
#atf_check -s not-exit:0 -e ignore -x \
# "echo die hard | rump.dd of=${rawcgd} seek=1 bs=512 conv=sync"
}
unaligned_write_cleanup()
{
env RUMP_SERVER=unix://csock rump.halt || true
}
atf_init_test_cases()
{
atf_add_test_case basic
atf_add_test_case wrongpass
atf_add_test_case unaligned_write
}

28
tests/dev/dm/Makefile Normal file
View File

@@ -0,0 +1,28 @@
# $NetBSD: Makefile,v 1.2 2012/12/02 18:39:53 pgoyette Exp $
#
.include <bsd.own.mk>
TESTSDIR= ${TESTSBASE}/dev/dm
FILESDIR= ${TESTSDIR}
TESTS_SH= t_dm
BINDIR= ${TESTSDIR}
MKMAN=no
PROGS= h_dm
LDADD+= -lprop -lutil
LDADD+= -lrumpdev_disk -lrumpdev_dm
LDADD+= -lrumpdev -lrumpvfs
LDADD+= -lrump
LDADD+= -lrumpuser -lpthread
FILES= t_dm_disk_1.bz2.uue t_dm_disk_2.bz2.uue t_dm_disk_3.bz2.uue
WARNS= 4
NOMAN=
.include <bsd.test.mk>

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>cmd_data</key>
<array/>
<key>command</key>
<string>targets</string>
<key>event_nr</key>
<integer>0x0</integer>
<key>flags</key>
<integer>0x4</integer>
<key>version</key>
<array>
<integer>0x4</integer>
<integer>0x1</integer>
<integer>0x0</integer>
</array>
</dict>
</plist>

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>cmd_data</key>
<array/>
<key>command</key>
<string>version</string>
<key>event_nr</key>
<integer>0x0</integer>
<key>flags</key>
<integer>0x4</integer>
<key>version</key>
<array>
<integer>0x4</integer>
<integer>0x0</integer>
<integer>0x0</integer>
</array>
</dict>
</plist>

146
tests/dev/dm/h_dm.c Normal file
View File

@@ -0,0 +1,146 @@
/* $NetBSD: h_dm.c,v 1.1 2010/10/06 11:24:55 haad Exp $ */
/*
* Copyright (c) 2010 Antti Kantee. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#include <sys/types.h>
#include <rump/rump.h>
#include <rump/rump_syscalls.h>
#include <sys/param.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/disklabel.h>
#include <ctype.h>
#include <err.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <util.h>
#include <dev/dm/netbsd-dm.h>
int dm_test_targets(void);
int dm_test_versions(void);
/*
* Test simple dm versions command on device-mapper device.
*/
int
dm_test_versions(void) {
int fd;
int error;
prop_dictionary_t dict_in, dict_out;
struct plistref prefp;
char *xml;
error = 0;
error = rump_init();
if (error != 0)
err(1, "Rump init failed");
fd = rump_sys_open("/dev/mapper/control", O_RDWR, 0);
if (fd == -1)
err(1, "Open dm device failed");
dict_in = prop_dictionary_internalize_from_file("dm_version_cmd.plist");
dict_out = prop_dictionary_create();
prop_dictionary_externalize_to_pref(dict_in, &prefp);
error = rump_sys_ioctl(fd, NETBSD_DM_IOCTL, &prefp);
if (error < 0)
err(1, "Dm control ioctl failed");
dict_out = prop_dictionary_internalize(prefp.pref_plist);
xml = prop_dictionary_externalize(dict_out);
rump_sys_close(fd);
return error;
}
/*
* Test simple dm targets command on device-mapper device.
*/
int
dm_test_targets(void) {
int fd;
int error;
prop_dictionary_t dict_in, dict_out;
struct plistref prefp;
char *xml;
error = 0;
error = rump_init();
if (error != 0)
err(1, "Rump init failed");
fd = rump_sys_open("/dev/mapper/control", O_RDWR, 0);
if (fd == -1)
err(1, "Open dm device failed");
dict_in = prop_dictionary_internalize_from_file("dm_targets_cmd.plist");
dict_out = prop_dictionary_create();
prop_dictionary_externalize_to_pref(dict_in, &prefp);
error = rump_sys_ioctl(fd, NETBSD_DM_IOCTL, &prefp);
if (error < 0)
err(1, "Dm control ioctl failed");
dict_out = prop_dictionary_internalize(prefp.pref_plist);
xml = prop_dictionary_externalize(dict_out);
rump_sys_close(fd);
return error;
}
int
main(int argc, char **argv) {
int error;
error = 0;
error = dm_test_versions();
if (error != 0)
err(1, "dm_test_versions failed");
error = dm_test_targets();
if (error != 0)
err(1, "dm_test_targets failed");
return error;
}

47
tests/dev/dm/t_dm.sh Normal file
View File

@@ -0,0 +1,47 @@
# $NetBSD: t_dm.sh,v 1.2 2010/11/07 17:51:17 jmmv Exp $
#
# Copyright (c) 2010 The NetBSD Foundation, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
atf_test_case dm_test
dm_test_head()
{
atf_set "descr" "Check dm driver routines and create lineary, stripe mapped disks"
}
dm_test_body()
{
# XXX Actually we need disks than 1 for stripe check let it leave for later now.
#atf_check -s exit:0 uudecode $(atf_get_srcdir)/t_dm_disk_1.bz2.uue
#atf_check -s exit:0 bunzip2 t_dm_disk_1.bz2
#atf_check -s exit:0 -o file:t_dm_disk_1 $(atf_get_srcdir)/h_dm
atf_check -s exit:0 $(atf_get_srcdir)/h_dm
}
atf_init_test_cases()
{
atf_add_test_case dm_test
}

24
tests/dev/md/Makefile Normal file
View File

@@ -0,0 +1,24 @@
# $NetBSD: Makefile,v 1.3 2012/12/02 18:39:53 pgoyette Exp $
#
.include <bsd.own.mk>
TESTSDIR= ${TESTSBASE}/dev/md
FILESDIR= ${TESTSDIR}
TESTS_SH= t_md
BINDIR= ${TESTSDIR}
MKMAN=no
PROGS= h_mdserv
LDADD+= -lrumpdev_md -lrumpdev_disk -lrumpdev -lrumpvfs
LDADD+= -lrump
LDADD+= -lrumpuser
LDADD+= -lpthread
WARNS= 4
NOMAN=
.include <bsd.test.mk>

109
tests/dev/md/h_mdserv.c Normal file
View File

@@ -0,0 +1,109 @@
/* $NetBSD: h_mdserv.c,v 1.4 2011/02/10 13:29:02 pooka Exp $ */
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <dev/md.h>
#include <err.h>
#include <errno.h>
#include <fcntl.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <rump/rump.h>
#include <rump/rump_syscalls.h>
#define MDSIZE (1024*1024)
#define REQUIRE(a, msg) if ((a) != 0) err(1, msg);
static void *
prober(void *arg)
{
int fd, error;
char buf[4];
ssize_t n;
fd = rump_sys_open(arg, O_RDONLY);
for (;;) {
n = rump_sys_read(fd, buf, sizeof(buf));
switch (n) {
case 4:
error = 0;
goto out;
case -1:
if (errno == ENXIO) {
usleep(1000);
continue;
}
/* FALLTHROUGH */
default:
error = EPIPE;
goto out;
}
}
out:
error = rump_daemonize_done(error);
REQUIRE(error, "rump_daemonize_done");
if (error)
exit(1);
return NULL;
}
int
main(int argc, char *argv[])
{
pthread_t pt;
struct md_conf md;
int fd, error;
if (argc != 2)
exit(1);
md.md_addr = calloc(1, MDSIZE);
md.md_size = MDSIZE;
md.md_type = MD_UMEM_SERVER;
error = rump_daemonize_begin();
REQUIRE(error, "rump_daemonize_begin");
error = rump_init();
REQUIRE(error, "rump_init");
error = rump_init_server("unix://commsock");
REQUIRE(error, "init server");
if ((fd = rump_sys_open(argv[1], O_RDWR)) == -1)
err(1, "open");
/*
* Now, configuring the md driver also causes our process
* to start acting as the worker for the md. Splitting it
* into two steps in the driver is not easy, since md is
* supposed to be unconfigured when the process dies
* (process may exit between calling ioctl1 and ioctl2).
* So, start a probe thread which attempts to read the md
* and declares the md as configured when the read is
* succesful.
*/
error = pthread_create(&pt, NULL, prober, argv[1]);
REQUIRE(error, "pthread_create");
pthread_detach(pt);
if (rump_sys_ioctl(fd, MD_SETCONF, &md) == -1) {
rump_daemonize_done(errno);
exit(1);
}
return 0;
}

65
tests/dev/md/t_md.sh Normal file
View File

@@ -0,0 +1,65 @@
# $NetBSD: t_md.sh,v 1.7 2011/05/14 17:42:28 jmmv Exp $
#
# Copyright (c) 2010 The NetBSD Foundation, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
rawpart=`sysctl -n kern.rawpartition | tr '01234' 'abcde'`
rawmd=/dev/rmd0${rawpart}
atf_test_case basic cleanup
basic_head()
{
atf_set "descr" "Check that md can be created, read and written"
}
basic_body()
{
# Scope out raw part. This is actually the *host* raw partition,
# but just let it slide for now, since they *should* be the same.
rawpart=`sysctl -n kern.rawpartition | tr '01234' 'abcde'`
atf_check -s exit:0 $(atf_get_srcdir)/h_mdserv ${rawmd}
export RUMP_SERVER=unix://commsock
atf_check -s exit:0 -e ignore -x \
"dd if=/bin/ls count=10 | rump.dd of=${rawmd} seek=100"
atf_check -s exit:0 -e ignore -x \
"rump.dd if=${rawmd} skip=100 count=10 | dd of=testfile"
atf_check -s exit:0 -e ignore -o file:testfile dd if=/bin/ls count=10
}
basic_cleanup()
{
env RUMP_SERVER=unix://commsock rump.halt
}
atf_init_test_cases()
{
atf_add_test_case basic
}

Some files were not shown because too many files have changed in this diff Show More