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

43
tests/fs/tmpfs/Makefile Normal file
View File

@@ -0,0 +1,43 @@
# $NetBSD: Makefile,v 1.6 2010/06/07 03:43:51 riz Exp $
TESTSDIR= ${TESTSBASE}/fs/tmpfs
WARNS= 4
TESTS_SH= t_create
TESTS_SH+= t_devices
TESTS_SH+= t_dots
TESTS_SH+= t_exec
TESTS_SH+= t_link
TESTS_SH+= t_mkdir
TESTS_SH+= t_mknod
TESTS_SH+= t_mount
TESTS_SH+= t_pipes
TESTS_SH+= t_read_write
TESTS_SH+= t_readdir
TESTS_SH+= t_remove
TESTS_SH+= t_rename
TESTS_SH+= t_rmdir
TESTS_SH+= t_setattr
TESTS_SH+= t_sizes
TESTS_SH+= t_sockets
TESTS_SH+= t_statvfs
TESTS_SH+= t_symlink
TESTS_SH+= t_times
TESTS_SH+= t_trail_slash
TESTS_SH+= t_truncate
TESTS_SH+= t_vnd
TESTS_SH+= t_vnode_leak
TESTS_C+= t_renamerace
LDADD.t_renamerace+= -lrumpfs_tmpfs -lrumpvfs -lrump -lrumpuser -lpthread
FILES= h_funcs.subr
FILESDIR= ${TESTSDIR}
PROGS= h_tools
SRCS.h_tools= h_tools.c
MAN.h_tools= # empty
BINDIR.h_tools= ${TESTSDIR}
.include <bsd.test.mk>

17
tests/fs/tmpfs/README Normal file
View File

@@ -0,0 +1,17 @@
The tests in this directory where written at the same time tmpfs was
developed. This is why, if you follow the order of tests in the Atffile,
you will notice that they start checking the most basic things and end
checking the less common ones. Furthermore, tests try not to use features
tested by further tests in the lists.
However, the above is not the most appropriate testing procedure when you
have a working file system because some separation in test programs does
not make sense afterwards.
Many of the tests here are applicable to any file system. They should be
refactored to be reusable on any mounted file system, which could also
remove the need to do the mount/unmount steps in each and every test case.
Possibly take a look at the file system tests in FreeBSD. They seem to be
much more complete, even though they are written in Perl and therefore not
directly usable.

View File

@@ -0,0 +1,96 @@
#!/bin/sh
#
# $NetBSD: h_funcs.subr,v 1.5 2013/03/17 01:16:45 jmmv Exp $
#
# Copyright (c) 2005, 2006, 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.
#
Mount_Point=
#
# test_mount [args]
#
# Mounts tmpfs over ${Mount_Point} and changes the current directory
# to the mount point. Optional arguments may be passed to the
# mount command.
#
test_mount() {
require_fs tmpfs
Mount_Point=$(pwd)/mntpt
atf_check -s eq:0 -o empty -e empty mkdir "${Mount_Point}"
echo "mount -t tmpfs ${*} tmpfs ${Mount_Point}"
mount -t tmpfs "${@}" tmpfs "${Mount_Point}" 2>mounterr
if [ "${?}" -ne 0 ]; then
cat mounterr 1>&2
if grep 'Operation not supported' mounterr > /dev/null; then
atf_skip "tmpfs not supported"
fi
atf_fail "Failed to mount a tmpfs file system"
fi
cd "${Mount_Point}"
}
#
# test_unmount
#
# Unmounts the file system mounted by test_mount.
#
test_unmount() {
cd - >/dev/null
atf_check -s eq:0 -o empty -e empty umount ${Mount_Point}
atf_check -s eq:0 -o empty -e empty rmdir ${Mount_Point}
Mount_Point=
}
#
# kqueue_monitor expected_nevents file1 [.. fileN]
#
# Monitors the commands given through stdin (one per line) using
# kqueue and stores the events raised in a log that can be later
# verified with kqueue_check.
#
kqueue_monitor() {
nev=${1}; shift
echo "Running kqueue-monitored commands and expecting" \
"${nev} events"
$(atf_get_srcdir)/h_tools kqueue ${*} >kqueue.log || \
atf_fail "Could not launch kqueue monitor"
got=$(wc -l kqueue.log | awk '{ print $1 }')
test ${got} -eq ${nev} || \
atf_fail "Got ${got} events but expected ${nev}"
}
#
# kqueue_check file event
#
# Checks if kqueue raised the given event when monitoring the
# given file.
#
kqueue_check() {
echo "Checking if ${1} received ${2}"
grep "^${1} - ${2}$" kqueue.log >/dev/null || \
atf_fail "${1} did not receive ${2}"
}

299
tests/fs/tmpfs/h_tools.c Normal file
View File

@@ -0,0 +1,299 @@
/* $NetBSD: h_tools.c,v 1.4 2011/06/11 18:03:17 christos Exp $ */
/*
* Copyright (c) 2005, 2006 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.
*/
/*
* Helper tools for several tests. These are kept in a single file due
* to the limitations of bsd.prog.mk to build a single program in a
* given directory.
*/
#include <sys/param.h>
#include <sys/types.h>
#include <sys/event.h>
#include <sys/mount.h>
#include <sys/statvfs.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/un.h>
#include <assert.h>
#include <err.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
/* --------------------------------------------------------------------- */
static int getfh_main(int, char **);
static int kqueue_main(int, char **);
static int rename_main(int, char **);
static int sockets_main(int, char **);
static int statvfs_main(int, char **);
/* --------------------------------------------------------------------- */
int
getfh_main(int argc, char **argv)
{
int error;
void *fh;
size_t fh_size;
if (argc < 2)
return EXIT_FAILURE;
fh_size = 0;
fh = NULL;
for (;;) {
if (fh_size) {
fh = malloc(fh_size);
if (fh == NULL) {
fprintf(stderr, "out of memory");
return EXIT_FAILURE;
}
}
/*
* The kernel provides the necessary size in fh_size -
* but it may change if someone moves things around,
* so retry untill we have enough memory.
*/
error = getfh(argv[1], fh, &fh_size);
if (error == 0) {
break;
} else {
if (fh != NULL)
free(fh);
if (errno != E2BIG) {
warn("getfh");
return EXIT_FAILURE;
}
}
}
error = write(STDOUT_FILENO, fh, fh_size);
if (error == -1) {
warn("write");
return EXIT_FAILURE;
}
free(fh);
return 0;
}
/* --------------------------------------------------------------------- */
int
kqueue_main(int argc, char **argv)
{
char *line;
int i, kq;
size_t len;
struct kevent *changes, event;
if (argc < 2)
return EXIT_FAILURE;
argc--;
argv++;
changes = malloc(sizeof(struct kevent) * argc);
if (changes == NULL)
errx(EXIT_FAILURE, "not enough memory");
for (i = 0; i < argc; i++) {
int fd;
fd = open(argv[i], O_RDONLY);
if (fd == -1)
err(EXIT_FAILURE, "cannot open %s", argv[i]);
EV_SET(&changes[i], fd, EVFILT_VNODE,
EV_ADD | EV_ENABLE | EV_ONESHOT,
NOTE_ATTRIB | NOTE_DELETE | NOTE_EXTEND | NOTE_LINK |
NOTE_RENAME | NOTE_REVOKE | NOTE_WRITE,
0, 0);
}
kq = kqueue();
if (kq == -1)
err(EXIT_FAILURE, "kqueue");
while ((line = fgetln(stdin, &len)) != NULL) {
int ec, nev;
struct timespec to;
to.tv_sec = 0;
to.tv_nsec = 100000;
(void)kevent(kq, changes, argc, &event, 1, &to);
assert(len > 0);
assert(line[len - 1] == '\n');
line[len - 1] = '\0';
ec = system(line);
if (ec != EXIT_SUCCESS)
errx(ec, "%s returned %d", line, ec);
do {
nev = kevent(kq, changes, argc, &event, 1, &to);
if (nev == -1)
err(EXIT_FAILURE, "kevent");
else if (nev > 0) {
for (i = 0; i < argc; i++)
if (event.ident == changes[i].ident)
break;
if (event.fflags & NOTE_ATTRIB)
printf("%s - NOTE_ATTRIB\n", argv[i]);
if (event.fflags & NOTE_DELETE)
printf("%s - NOTE_DELETE\n", argv[i]);
if (event.fflags & NOTE_EXTEND)
printf("%s - NOTE_EXTEND\n", argv[i]);
if (event.fflags & NOTE_LINK)
printf("%s - NOTE_LINK\n", argv[i]);
if (event.fflags & NOTE_RENAME)
printf("%s - NOTE_RENAME\n", argv[i]);
if (event.fflags & NOTE_REVOKE)
printf("%s - NOTE_REVOKE\n", argv[i]);
if (event.fflags & NOTE_WRITE)
printf("%s - NOTE_WRITE\n", argv[i]);
}
} while (nev > 0);
}
for (i = 0; i < argc; i++)
close(changes[i].ident);
free(changes);
return EXIT_SUCCESS;
}
/* --------------------------------------------------------------------- */
int
rename_main(int argc, char **argv)
{
if (argc < 3)
return EXIT_FAILURE;
if (rename(argv[1], argv[2]) == -1) {
warn("rename");
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
/* --------------------------------------------------------------------- */
int
sockets_main(int argc, char **argv)
{
int error, fd;
struct sockaddr_un addr;
if (argc < 2)
return EXIT_FAILURE;
fd = socket(PF_LOCAL, SOCK_STREAM, 0);
if (fd == -1) {
warn("socket");
return EXIT_FAILURE;
}
(void)strlcpy(addr.sun_path, argv[1], sizeof(addr.sun_path));
addr.sun_family = PF_UNIX;
error = bind(fd, (struct sockaddr *)&addr, sizeof(addr));
if (error == -1) {
warn("connect");
return EXIT_FAILURE;
}
close(fd);
return EXIT_SUCCESS;
}
/* --------------------------------------------------------------------- */
int
statvfs_main(int argc, char **argv)
{
int error;
struct statvfs buf;
if (argc < 2)
return EXIT_FAILURE;
error = statvfs(argv[1], &buf);
if (error != 0) {
warn("statvfs");
return EXIT_FAILURE;
}
(void)printf("f_bsize=%lu\n", buf.f_bsize);
(void)printf("f_blocks=%" PRId64 "\n", buf.f_blocks);
(void)printf("f_bfree=%" PRId64 "\n", buf.f_bfree);
(void)printf("f_files=%" PRId64 "\n", buf.f_files);
return EXIT_SUCCESS;
}
/* --------------------------------------------------------------------- */
int
main(int argc, char **argv)
{
int error;
if (argc < 2)
return EXIT_FAILURE;
argc -= 1;
argv += 1;
if (strcmp(argv[0], "getfh") == 0)
error = getfh_main(argc, argv);
else if (strcmp(argv[0], "kqueue") == 0)
error = kqueue_main(argc, argv);
else if (strcmp(argv[0], "rename") == 0)
error = rename_main(argc, argv);
else if (strcmp(argv[0], "sockets") == 0)
error = sockets_main(argc, argv);
else if (strcmp(argv[0], "statvfs") == 0)
error = statvfs_main(argc, argv);
else
error = EXIT_FAILURE;
return error;
}

122
tests/fs/tmpfs/t_create.sh Normal file
View File

@@ -0,0 +1,122 @@
# $NetBSD: t_create.sh,v 1.8 2011/03/05 07:41:11 pooka Exp $
#
# Copyright (c) 2005, 2006, 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.
#
#
# Verifies that the create operation works.
#
atf_test_case create
create_head() {
atf_set "descr" "Verifies that files can be created"
atf_set "require.user" "root"
}
create_body() {
test_mount
atf_check -s eq:1 -o empty -e empty test -f a
atf_check -s eq:0 -o empty -e empty touch a
atf_check -s eq:0 -o empty -e empty test -f a
test_unmount
}
atf_test_case attrs
attrs_head() {
atf_set "descr" "Verifies that a new file gets the correct" \
"attributes"
atf_set "require.config" "unprivileged-user"
atf_set "require.user" "root"
}
attrs_body() {
user=$(atf_config_get unprivileged-user)
# Allow the unprivileged user to access the work directory.
chown ${user} .
test_mount
umask 022
atf_check -s eq:1 -o empty -e empty test -f a
atf_check -s eq:0 -o empty -e empty touch a
atf_check -s eq:0 -o empty -e empty test -f a
eval $(stat -s . | sed -e 's|st_|dst_|g')
eval $(stat -s a)
test ${st_flags} -eq 0 || atf_fail "Incorrect flags"
test ${st_size} -eq 0 || atf_fail "Incorrect size"
test ${st_uid} -eq $(id -u) || atf_fail "Incorrect uid"
test ${st_gid} -eq ${dst_gid} || atf_fail "Incorrect gid"
test ${st_mode} = 0100644 || atf_fail "Incorrect mode"
atf_check -s eq:0 -o empty -e empty mkdir b c
atf_check -s eq:0 -o empty -e empty chown ${user}:0 b
eval $(stat -s b)
[ ${st_uid} -eq $(id -u ${user}) ] || atf_fail "Incorrect owner"
[ ${st_gid} -eq 0 ] || atf_fail "Incorrect group"
atf_check -s eq:0 -o empty -e empty chown ${user}:100 c
eval $(stat -s c)
[ ${st_uid} -eq $(id -u ${user}) ] || atf_fail "Incorrect owner"
[ ${st_gid} -eq 100 ] || atf_fail "Incorrect group"
atf_check -s eq:0 -o empty -e empty su -m ${user} -c 'touch b/a'
eval $(stat -s b/a)
[ ${st_uid} -eq $(id -u ${user}) ] || atf_fail "Incorrect owner"
[ ${st_gid} -eq 0 ] || atf_fail "Incorrect group"
atf_check -s eq:0 -o empty -e empty su -m ${user} -c 'touch c/a'
eval $(stat -s c/a)
[ ${st_uid} -eq $(id -u ${user}) ] || atf_fail "Incorrect owner"
[ ${st_gid} -eq 100 ] || atf_fail "Incorrect group"
test_unmount
}
atf_test_case kqueue
kqueue_head() {
atf_set "descr" "Verifies that creating a file raises the correct" \
"kqueue events"
atf_set "require.user" "root"
}
kqueue_body() {
test_mount
atf_check -s eq:0 -o empty -e empty mkdir dir
echo 'touch dir/a' | kqueue_monitor 1 dir
kqueue_check dir NOTE_WRITE
test_unmount
}
atf_init_test_cases() {
. $(atf_get_srcdir)/../h_funcs.subr
. $(atf_get_srcdir)/h_funcs.subr
atf_add_test_case create
atf_add_test_case attrs
atf_add_test_case kqueue
}

View File

@@ -0,0 +1,60 @@
# $NetBSD: t_devices.sh,v 1.5 2010/11/07 17:51:18 jmmv Exp $
#
# Copyright (c) 2005, 2006, 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 basic
basic_head() {
atf_set "descr" "Tests that special devices work"
atf_set "require.user" "root"
}
basic_body() {
test_mount
umask 022
atf_check -s eq:0 -o ignore -e ignore /dev/MAKEDEV std
atf_check -s eq:0 -o empty -e empty test -e zero
atf_check -s eq:0 -o empty -e empty test -e null
echo "Reading from the 'zero' character device"
atf_check -s eq:0 -o ignore -e ignore dd if=zero of=a bs=10k count=1
[ $(md5 a | cut -d ' ' -f 4) = 1276481102f218c981e0324180bafd9f ] || \
atf_fail "Data read is invalid"
echo "Writing to the 'null' device"
echo foo >null
eval $(stat -s null)
[ ${st_size} -eq 0 ] || atf_fail "Invalid size for device"
test_unmount
}
atf_init_test_cases() {
. $(atf_get_srcdir)/../h_funcs.subr
. $(atf_get_srcdir)/h_funcs.subr
atf_add_test_case basic
}

67
tests/fs/tmpfs/t_dots.sh Normal file
View File

@@ -0,0 +1,67 @@
# $NetBSD: t_dots.sh,v 1.5 2010/11/07 17:51:18 jmmv Exp $
#
# Copyright (c) 2005, 2006, 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 topdir
topdir_head() {
atf_set "descr" "Verifies that looking up '.' and '..' in" \
"top-level directories works"
atf_set "require.user" "root"
}
topdir_body() {
test_mount
atf_check -s eq:0 -o empty -e empty mkdir a
atf_check -s eq:0 -o empty -e empty test -d ./a
atf_check -s eq:0 -o empty -e empty test -d a/../a
test_unmount
}
atf_test_case nesteddir
nesteddir_head() {
atf_set "descr" "Verifies that looking up '.' and '..' in" \
"top-level directories works"
atf_set "require.user" "root"
}
nesteddir_body() {
test_mount
atf_check -s eq:0 -o empty -e empty mkdir a
atf_check -s eq:0 -o empty -e empty mkdir a/b
atf_check -s eq:0 -o empty -e empty test -d a/b/../b
atf_check -s eq:0 -o empty -e empty test -d a/b/../../a
test_unmount
}
atf_init_test_cases() {
. $(atf_get_srcdir)/../h_funcs.subr
. $(atf_get_srcdir)/h_funcs.subr
atf_add_test_case topdir
atf_add_test_case nesteddir
}

52
tests/fs/tmpfs/t_exec.sh Normal file
View File

@@ -0,0 +1,52 @@
# $NetBSD: t_exec.sh,v 1.5 2010/11/07 17:51:18 jmmv Exp $
#
# Copyright (c) 2005, 2006, 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 basic
basic_head() {
atf_set "descr" "Verifies that binary files can be executed from" \
"within the file system (i.e., whether getpages" \
"works)"
atf_set "require.user" "root"
}
basic_body() {
test_mount
atf_check -s eq:0 -o empty -e empty cp /bin/cp .
echo "Verifying copied file"
[ $(md5 cp | cut -d ' ' -f 4) = $(md5 /bin/cp | cut -d ' ' -f 4) ] || \
atf_file "New binary file does not match original"
atf_check -s eq:0 -o empty -e empty ./cp cp foo
test_unmount
}
atf_init_test_cases() {
. $(atf_get_srcdir)/../h_funcs.subr
. $(atf_get_srcdir)/h_funcs.subr
atf_add_test_case basic
}

129
tests/fs/tmpfs/t_link.sh Normal file
View File

@@ -0,0 +1,129 @@
# $NetBSD: t_link.sh,v 1.5 2010/11/07 17:51:18 jmmv Exp $
#
# Copyright (c) 2005, 2006, 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.
#
#
# Verifies that the link operation works.
#
atf_test_case basic
basic_head() {
atf_set "descr" "Verifies that the link operation works on files" \
"at the top directory"
atf_set "require.user" "root"
}
basic_body() {
test_mount
atf_check -s eq:0 -o empty -e empty touch a
atf_check -s eq:0 -o empty -e empty touch z
eval $(stat -s a | sed -e 's|st_|sta_|g')
eval $(stat -s z | sed -e 's|st_|stz_|g')
test ${sta_ino} != ${stz_ino} || \
atf_fail "Node numbers are not different"
test ${sta_nlink} -eq 1 || atf_fail "Number of links is incorrect"
atf_check -s eq:0 -o empty -e empty ln a b
echo "Checking if link count is correct after links are created"
eval $(stat -s a | sed -e 's|st_|sta_|g')
eval $(stat -s b | sed -e 's|st_|stb_|g')
test ${sta_ino} = ${stb_ino} || atf_fail "Node number changed"
test ${sta_nlink} -eq 2 || atf_fail "Link count is incorrect"
test ${stb_nlink} -eq 2 || atf_fail "Link count is incorrect"
echo "Checking if link count is correct after links are deleted"
atf_check -s eq:0 -o empty -e empty rm a
eval $(stat -s b | sed -e 's|st_|stb_|g')
test ${stb_nlink} -eq 1 || atf_fail "Link count is incorrect"
atf_check -s eq:0 -o empty -e empty rm b
test_unmount
}
atf_test_case subdirs
subdirs_head() {
atf_set "descr" "Verifies that the link operation works if used" \
"in subdirectories"
atf_set "require.user" "root"
}
subdirs_body() {
test_mount
atf_check -s eq:0 -o empty -e empty touch a
atf_check -s eq:0 -o empty -e empty mkdir c
atf_check -s eq:0 -o empty -e empty ln a c/b
echo "Checking if link count is correct after links are created"
eval $(stat -s a | sed -e 's|st_|sta_|g')
eval $(stat -s c/b | sed -e 's|st_|stb_|g')
test ${sta_ino} = ${stb_ino} || atf_fail "Node number changed"
test ${sta_nlink} -eq 2 || atf_fail "Link count is incorrect"
test ${stb_nlink} -eq 2 || atf_fail "Link count is incorrect"
echo "Checking if link count is correct after links are deleted"
atf_check -s eq:0 -o empty -e empty rm a
eval $(stat -s c/b | sed -e 's|st_|stb_|g')
test ${stb_nlink} -eq 1 || atf_fail "Link count is incorrect"
atf_check -s eq:0 -o empty -e empty rm c/b
atf_check -s eq:0 -o empty -e empty rmdir c
test_unmount
}
atf_test_case kqueue
kqueue_head() {
atf_set "descr" "Verifies that creating a link raises the correct" \
"kqueue events"
atf_set "require.user" "root"
}
kqueue_body() {
test_mount
atf_check -s eq:0 -o empty -e empty mkdir dir
atf_check -s eq:0 -o empty -e empty touch dir/a
echo 'ln dir/a dir/b' | kqueue_monitor 2 dir dir/a
kqueue_check dir/a NOTE_LINK
kqueue_check dir NOTE_WRITE
echo 'rm dir/a' | kqueue_monitor 2 dir dir/b
# XXX According to the (short) kqueue(2) documentation, the following
# should raise a NOTE_LINK but FFS raises a NOTE_DELETE...
kqueue_check dir/b NOTE_LINK
kqueue_check dir NOTE_WRITE
atf_check -s eq:0 -o empty -e empty rm dir/b
atf_check -s eq:0 -o empty -e empty rmdir dir
test_unmount
}
atf_init_test_cases() {
. $(atf_get_srcdir)/../h_funcs.subr
. $(atf_get_srcdir)/h_funcs.subr
atf_add_test_case basic
atf_add_test_case subdirs
atf_add_test_case kqueue
}

159
tests/fs/tmpfs/t_mkdir.sh Normal file
View File

@@ -0,0 +1,159 @@
# $NetBSD: t_mkdir.sh,v 1.8 2011/03/05 07:41:11 pooka Exp $
#
# Copyright (c) 2005, 2006, 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.
#
#
# Verifies that mkdir works by creating some nested directories. It also
# checks, in part, the lookup operation.
#
atf_test_case single
single_head() {
atf_set "descr" "Creates a single directory and checks the" \
"mount point's hard link count"
atf_set "require.user" "root"
}
single_body() {
test_mount
atf_check -s eq:1 -o empty -e empty test -d a
atf_check -s eq:0 -o empty -e empty mkdir a
atf_check -s eq:0 -o empty -e empty test -d a
test -d a
eval $(stat -s ${Mount_Point})
[ ${st_nlink} = 3 ] || atf_fail "Link count is not 3"
test_unmount
}
atf_test_case many
many_head() {
atf_set "descr" "Creates multiple directories and checks the" \
"mount point's hard link count"
atf_set "require.user" "root"
}
many_body() {
test_mount
for d in $(jot 100); do
atf_check -s eq:1 -o empty -e empty test -d ${d}
atf_check -s eq:0 -o empty -e empty mkdir ${d}
atf_check -s eq:0 -o empty -e empty test -d ${d}
done
eval $(stat -s ${Mount_Point})
[ ${st_nlink} = 102 ] || atf_fail "Link count is not 102"
test_unmount
}
atf_test_case nested
nested_head() {
atf_set "descr" "Checks if nested directories can be created"
atf_set "require.user" "root"
}
nested_body() {
test_mount
atf_check -s eq:1 -o empty -e empty test -d a/b/c/d/e
atf_check -s eq:0 -o empty -e empty mkdir -p a/b/c/d/e
atf_check -s eq:0 -o empty -e empty test -d a/b/c/d/e
test_unmount
}
atf_test_case attrs
attrs_head() {
atf_set "descr" "Checks that new directories get the proper" \
"attributes (owner and group)"
atf_set "require.config" "unprivileged-user"
atf_set "require.user" "root"
}
attrs_body() {
user=$(atf_config_get unprivileged-user)
# Allow the unprivileged user to access the work directory.
chown ${user} .
test_mount
atf_check -s eq:0 -o empty -e empty mkdir b c
atf_check -s eq:0 -o empty -e empty chown ${user}:0 b
eval $(stat -s b)
[ ${st_uid} -eq $(id -u ${user}) ] || atf_fail "Incorrect owner"
[ ${st_gid} -eq 0 ] || atf_fail "Incorrect group"
atf_check -s eq:0 -o empty -e empty chown ${user}:100 c
eval $(stat -s c)
[ ${st_uid} -eq $(id -u ${user}) ] || atf_fail "Incorrect owner"
[ ${st_gid} -eq 100 ] || atf_fail "Incorrect group"
atf_check -s eq:0 -o empty -e empty su -m ${user} -c 'mkdir b/a'
eval $(stat -s b/a)
[ ${st_uid} -eq $(id -u ${user}) ] || atf_fail "Incorrect owner"
[ ${st_gid} -eq 0 ] || atf_fail "Incorrect group"
atf_check -s eq:0 -o empty -e empty su -m ${user} -c 'mkdir c/a'
eval $(stat -s c/a)
[ ${st_uid} -eq $(id -u ${user}) ] || atf_fail "Incorrect owner"
[ ${st_gid} -eq 100 ] || atf_fail "Incorrect group"
test_unmount
}
atf_test_case kqueue
kqueue_head() {
atf_set "descr" "Creates a directory and checks the kqueue events" \
"raised"
atf_set "require.user" "root"
}
kqueue_body() {
test_mount
atf_check -s eq:0 -o empty -e empty mkdir dir
echo 'mkdir dir/a' | kqueue_monitor 2 dir
# Creating a directory raises NOTE_LINK on the parent directory
kqueue_check dir NOTE_LINK
# Creating a directory raises NOTE_WRITE on the parent directory
kqueue_check dir NOTE_WRITE
atf_check -s eq:0 -o empty -e empty rmdir dir/a
atf_check -s eq:0 -o empty -e empty rmdir dir
test_unmount
}
atf_init_test_cases() {
. $(atf_get_srcdir)/../h_funcs.subr
. $(atf_get_srcdir)/h_funcs.subr
atf_add_test_case single
atf_add_test_case many
atf_add_test_case nested
atf_add_test_case attrs
atf_add_test_case kqueue
}

143
tests/fs/tmpfs/t_mknod.sh Normal file
View File

@@ -0,0 +1,143 @@
# $NetBSD: t_mknod.sh,v 1.5 2010/11/07 17:51:18 jmmv Exp $
#
# Copyright (c) 2005, 2006, 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.
#
#
# Verifies that the mknod operation works.
#
atf_test_case block
block_head() {
atf_set "descr" "Tests that block devices can be created"
atf_set "require.user" "root"
}
block_body() {
test_mount
umask 022
atf_check -s eq:0 -o empty -e empty mknod fd0a b 2 0
eval $(stat -s fd0a)
[ ${st_mode} = 060644 ] || atf_fail "Invalid mode"
[ ${st_rdev} -eq 512 ] || atf_fail "Invalid device"
test_unmount
}
atf_test_case block_kqueue
block_kqueue_head() {
atf_set "descr" "Tests that creating a block device raises the" \
"appropriate kqueue events"
atf_set "require.user" "root"
}
block_kqueue_body() {
test_mount
umask 022
atf_check -s eq:0 -o empty -e empty mkdir dir
echo 'mknod dir/fd0a b 2 0' | kqueue_monitor 1 dir
kqueue_check dir NOTE_WRITE
test_unmount
}
atf_test_case char
char_head() {
atf_set "descr" "Tests that character devices can be created"
atf_set "require.user" "root"
}
char_body() {
test_mount
umask 022
atf_check -s eq:0 -o empty -e empty mknod null c 2 2
eval $(stat -s null)
[ ${st_mode} = 020644 ] || atf_fail "Invalid mode"
[ ${st_rdev} -eq 514 ] || atf_fail "Invalid device"
test_unmount
}
atf_test_case char_kqueue
char_kqueue_head() {
atf_set "descr" "Tests that creating a character device raises the" \
"appropriate kqueue events"
atf_set "require.user" "root"
}
char_kqueue_body() {
test_mount
umask 022
atf_check -s eq:0 -o empty -e empty mkdir dir
echo 'mknod dir/null c 2 2' | kqueue_monitor 1 dir
kqueue_check dir NOTE_WRITE
test_unmount
}
atf_test_case pipe
pipe_head() {
atf_set "descr" "Tests that named pipes can be created"
atf_set "require.user" "root"
}
pipe_body() {
test_mount
umask 022
atf_check -s eq:0 -o empty -e empty mknod pipe p
eval $(stat -s pipe)
[ ${st_mode} = 010644 ] || atf_fail "Invalid mode"
test_unmount
}
atf_test_case pipe_kqueue
pipe_kqueue_head() {
atf_set "descr" "Tests that creating a named pipe raises the" \
"appropriate kqueue events"
atf_set "require.user" "root"
}
pipe_kqueue_body() {
test_mount
umask 022
atf_check -s eq:0 -o empty -e empty mkdir dir
echo 'mknod dir/pipe p' | kqueue_monitor 1 dir
kqueue_check dir NOTE_WRITE
test_unmount
}
atf_init_test_cases() {
. $(atf_get_srcdir)/../h_funcs.subr
. $(atf_get_srcdir)/h_funcs.subr
atf_add_test_case block
atf_add_test_case block_kqueue
atf_add_test_case char
atf_add_test_case char_kqueue
atf_add_test_case pipe
atf_add_test_case pipe_kqueue
}

140
tests/fs/tmpfs/t_mount.sh Normal file
View File

@@ -0,0 +1,140 @@
# $NetBSD: t_mount.sh,v 1.6 2010/11/07 17:51:18 jmmv Exp $
#
# Copyright (c) 2005, 2006, 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.
#
#
# Verifies that an execution of mount and umount works correctly without
# causing errors and that the root node gets correct attributes.
# Also verifies command line parsing from mount_tmpfs.
#
atf_test_case plain
plain_head() {
atf_set "descr" "Tests a mount and unmount without any options"
atf_set "require.user" "root"
}
plain_body() {
test_mount
test_unmount
}
atf_test_case links
links_head() {
atf_set "descr" "Tests that the mount point has two hard links"
atf_set "require.user" "root"
}
links_body() {
test_mount
eval $(stat -s ${Mount_Point})
[ ${st_nlink} = 2 ] || \
atf_fail "Root directory does not have two hard links"
test_unmount
}
atf_test_case options
options_head() {
atf_set "descr" "Tests the read-only mount option"
atf_set "require.user" "root"
}
options_body() {
test_mount -o ro
mount | grep ${Mount_Point} | grep -q read-only || \
atf_fail "read-only option (ro) does not work"
test_unmount
}
atf_test_case attrs
attrs_head() {
atf_set "descr" "Tests that root directory attributes are set" \
"correctly"
atf_set "require.user" "root"
}
attrs_body() {
test_mount -o -u1000 -o -g100 -o -m755
eval $(stat -s ${Mount_Point})
[ ${st_uid} = 1000 ] || atf_fail "uid is incorrect"
[ ${st_gid} = 100 ] || atf_fail "gid is incorrect"
[ ${st_mode} = 040755 ] || atf_fail "mode is incorrect"
test_unmount
}
atf_test_case negative
negative_head() {
atf_set "descr" "Tests that negative values passed to to -s are" \
"handled correctly"
atf_set "require.user" "root"
}
negative_body() {
mkdir tmp
test_mount -o -s-10
test_unmount
}
atf_test_case large
large_head() {
atf_set "descr" "Tests that extremely long values passed to -s" \
"are handled correctly"
atf_set "require.user" "root"
}
large_body() {
test_mount -o -s9223372036854775807
test_unmount
mkdir tmp
atf_check -s eq:1 -o empty -e ignore \
mount -t tmpfs -o -s9223372036854775808 tmpfs tmp
atf_check -s eq:1 -o empty -e ignore \
mount -t tmpfs -o -s9223372036854775808g tmpfs tmp
rmdir tmp
}
atf_test_case mntpt
mntpt_head() {
atf_set "descr" "Tests that the error messages printed when the" \
"mount point is invalid do not show the source" \
"unused parameter"
}
mntpt_body() {
mount_tmpfs unused $(pwd)/mnt >out 2>&1
atf_check -s eq:1 -o empty -e empty grep unused out
atf_check -s eq:0 -o ignore -e empty grep "$(pwd)/mnt" out
mount_tmpfs unused mnt >out 2>&1
atf_check -s eq:1 -o empty -e empty grep unused out
atf_check -s eq:0 -o ignore -e empty grep mnt out
}
atf_init_test_cases() {
. $(atf_get_srcdir)/../h_funcs.subr
. $(atf_get_srcdir)/h_funcs.subr
atf_add_test_case plain
atf_add_test_case options
atf_add_test_case attrs
atf_add_test_case negative
atf_add_test_case large
atf_add_test_case mntpt
}

52
tests/fs/tmpfs/t_pipes.sh Normal file
View File

@@ -0,0 +1,52 @@
# $NetBSD: t_pipes.sh,v 1.5 2010/11/07 17:51:18 jmmv Exp $
#
# Copyright (c) 2005, 2006, 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 basic
basic_head() {
atf_set "descr" "Verifies that pipes work"
atf_set "require.user" "root"
}
basic_body() {
test_mount
umask 022
atf_check -s eq:0 -o empty -e empty mknod pipe p
echo "Writing to pipe and waiting for response"
echo -n foo >pipe &
[ "$(cat pipe)" = foo ] || atf_fail "Received data is incorrect"
test_unmount
}
atf_init_test_cases() {
. $(atf_get_srcdir)/../h_funcs.subr
. $(atf_get_srcdir)/h_funcs.subr
atf_add_test_case basic
}

View File

@@ -0,0 +1,87 @@
# $NetBSD: t_read_write.sh,v 1.5 2010/11/07 17:51:18 jmmv Exp $
#
# Copyright (c) 2005, 2006, 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.
#
#
# Verifies that the read and write operations work.
#
atf_test_case basic
basic_head() {
atf_set "descr" "Checks that file removal works"
atf_set "require.user" "root"
}
basic_body() {
test_mount
echo "Testing write to a small file"
echo foo >a || atf_fail "Failed to write to file"
[ $(md5 a | cut -d ' ' -f 4) = d3b07384d113edec49eaa6238ad5ff00 ] || \
atf_fail "Invalid file contents"
echo "Testing appending to a small file"
echo bar >>a || atf_fail "Failed to append data to file"
[ $(md5 a | cut -d ' ' -f 4) = f47c75614087a8dd938ba4acff252494 ] || \
atf_fail "Invalid file contents"
echo "Testing write to a big file (bigger than a page)"
jot 10000 >b || atf_fail "Failed to create a big file"
[ $(md5 b | cut -d ' ' -f 4) = 72d4ff27a28afbc066d5804999d5a504 ] || \
atf_fail "Invalid file contents"
test_unmount
}
atf_test_case kqueue
kqueue_head() {
atf_set "descr" "Checks that writing to a file raises the" \
"appropriate kqueue events"
atf_set "require.user" "root"
}
kqueue_body() {
test_mount
atf_check -s eq:0 -o ignore -e ignore \
dd if=/dev/zero of=c bs=1k count=10
echo 'dd if=/dev/zero of=c seek=2 bs=1k count=1 conv=notrunc' \
'>/dev/null 2>&1' | kqueue_monitor 1 c
kqueue_check c NOTE_WRITE
echo foo >d
echo 'echo bar >>d' | kqueue_monitor 2 d
kqueue_check d NOTE_EXTEND
kqueue_check d NOTE_WRITE
test_unmount
}
atf_init_test_cases() {
. $(atf_get_srcdir)/../h_funcs.subr
. $(atf_get_srcdir)/h_funcs.subr
atf_add_test_case basic
atf_add_test_case kqueue
}

116
tests/fs/tmpfs/t_readdir.sh Normal file
View File

@@ -0,0 +1,116 @@
# $NetBSD: t_readdir.sh,v 1.5 2010/11/07 17:51:18 jmmv Exp $
#
# Copyright (c) 2005, 2006, 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.
#
#
# Verifies that the readdir operation works.
#
atf_test_case dots
dots_head() {
atf_set "descr" "Verifies that readdir returns the '.' and '..'" \
"entries"
atf_set "require.user" "root"
}
dots_body() {
test_mount
atf_check -s eq:0 -o save:stdout -e empty /bin/ls -a
atf_check -s eq:0 -o ignore -e empty grep '^\.$' stdout
atf_check -s eq:0 -o ignore -e empty grep '^\..$' stdout
test_unmount
}
atf_test_case types
types_head() {
atf_set "descr" "Verifies that readdir works for all different" \
"file types"
atf_set "require.user" "root"
}
types_body() {
test_mount
atf_check -s eq:0 -o empty -e empty mkdir dir
atf_check -s eq:0 -o empty -e empty touch reg
atf_check -s eq:0 -o empty -e empty ln -s reg lnk
atf_check -s eq:0 -o empty -e empty mknod blk b 0 0
atf_check -s eq:0 -o empty -e empty mknod chr c 0 0
atf_check -s eq:0 -o empty -e empty mknod fifo p
atf_check -s eq:0 -o empty -e empty \
$(atf_get_srcdir)/h_tools sockets sock
atf_check -s eq:0 -o ignore -e empty ls
atf_check -s eq:0 -o empty -e empty rm -rf *
test_unmount
}
atf_test_case caching
caching_head() {
atf_set "descr" "Catch a bug caused by incorrect invalidation of" \
"readdir caching variables"
atf_set "require.user" "root"
}
caching_body() {
test_mount
atf_check -s eq:0 -o empty -e empty touch $(jot 10)
atf_check -s eq:0 -o empty -e empty rm *
atf_check -s eq:0 -o empty -e empty touch $(jot 20)
atf_check -s eq:0 -o empty -e empty -x "ls >/dev/null"
test_unmount
}
atf_test_case many
many_head() {
atf_set "descr" "Verifies that readdir works with many files"
atf_set "require.user" "root"
}
many_body() {
test_mount
atf_check -s eq:0 -o empty -e empty mkdir a
echo "Creating 500 files"
for f in $(jot 500); do
touch a/$f
done
atf_check -s eq:0 -o empty -e empty rm a/*
atf_check -s eq:0 -o empty -e empty rmdir a
test_unmount
}
atf_init_test_cases() {
. $(atf_get_srcdir)/../h_funcs.subr
. $(atf_get_srcdir)/h_funcs.subr
atf_add_test_case dots
atf_add_test_case types
atf_add_test_case caching
atf_add_test_case many
}

110
tests/fs/tmpfs/t_remove.sh Normal file
View File

@@ -0,0 +1,110 @@
# $NetBSD: t_remove.sh,v 1.5 2010/11/07 17:51:18 jmmv Exp $
#
# Copyright (c) 2005, 2006, 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.
#
#
# Verifies that the remove operation works.
#
atf_test_case single
single_head() {
atf_set "descr" "Checks that file removal works"
atf_set "require.user" "root"
}
single_body() {
test_mount
atf_check -s eq:1 -o empty -e empty test -f a
atf_check -s eq:0 -o empty -e empty touch a
atf_check -s eq:0 -o empty -e empty test -f a
atf_check -s eq:0 -o empty -e empty rm a
atf_check -s eq:1 -o empty -e empty test -f a
test_unmount
}
atf_test_case uchg
uchg_head() {
atf_set "descr" "Checks that files with the uchg flag set cannot" \
"be removed"
atf_set "require.user" "root"
}
uchg_body() {
test_mount
atf_check -s eq:0 -o empty -e empty touch a
atf_check -s eq:0 -o empty -e empty chflags uchg a
atf_check -s eq:1 -o empty -e ignore rm -f a
atf_check -s eq:0 -o empty -e empty chflags nouchg a
atf_check -s eq:0 -o empty -e empty rm a
atf_check -s eq:1 -o empty -e empty test -f a
test_unmount
}
atf_test_case dot
dot_head() {
atf_set "descr" "Checks that '.' cannot be removed"
atf_set "require.user" "root"
}
dot_body() {
test_mount
atf_check -s eq:0 -o empty -e empty mkdir a
atf_check -s eq:1 -o empty -e ignore unlink a/.
atf_check -s eq:0 -o empty -e empty rmdir a
test_unmount
}
atf_test_case kqueue
kqueue_head() {
atf_set "descr" "Removes a file and checks the kqueue events" \
"raised"
atf_set "require.user" "root"
}
kqueue_body() {
test_mount
atf_check -s eq:0 -o empty -e empty mkdir dir
atf_check -s eq:0 -o empty -e empty touch dir/a
echo 'rm dir/a' | kqueue_monitor 2 dir dir/a
kqueue_check dir/a NOTE_DELETE
kqueue_check dir NOTE_WRITE
atf_check -s eq:0 -o empty -e empty rmdir dir
test_unmount
}
atf_init_test_cases() {
. $(atf_get_srcdir)/../h_funcs.subr
. $(atf_get_srcdir)/h_funcs.subr
atf_add_test_case single
atf_add_test_case uchg
atf_add_test_case dot
atf_add_test_case kqueue
}

278
tests/fs/tmpfs/t_rename.sh Normal file
View File

@@ -0,0 +1,278 @@
# $NetBSD: t_rename.sh,v 1.5 2010/11/07 17:51:18 jmmv Exp $
#
# Copyright (c) 2005, 2006, 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.
#
#
# Verifies that the rename operation works (either by renaming entries or
# by moving them).
#
atf_test_case dots
dots_head() {
atf_set "descr" "Tests that '.' and '..' cannot be renamed"
atf_set "require.user" "root"
}
dots_body() {
test_mount
atf_check -s eq:0 -o empty -e empty mkdir a
atf_check -s eq:1 -o empty -e ignore mv a/. c
atf_check -s eq:1 -o empty -e ignore mv a/.. c
atf_check -s eq:0 -o empty -e empty rmdir a
test_unmount
}
atf_test_case crossdev
crossdev_head() {
atf_set "descr" "Tests that cross-device renames do not work"
atf_set "require.user" "root"
}
crossdev_body() {
test_mount
atf_check -s eq:0 -o empty -e empty mkdir a
atf_check -s eq:1 -o empty -e save:stderr \
$(atf_get_srcdir)/h_tools rename a /var/tmp/a
atf_check -s eq:0 -o ignore -e empty grep "Cross-device link" stderr
atf_check -s eq:0 -o empty -e empty test -d a
atf_check -s eq:0 -o empty -e empty rmdir a
test_unmount
}
atf_test_case basic
basic_head() {
atf_set "descr" "Tests that basic renames work"
atf_set "require.user" "root"
}
basic_body() {
test_mount
atf_check -s eq:0 -o empty -e empty mkdir a
atf_check -s eq:0 -o empty -e empty mv a c
atf_check -s eq:1 -o empty -e empty test -d a
atf_check -s eq:0 -o empty -e empty test -d c
atf_check -s eq:0 -o empty -e empty rmdir c
test_unmount
}
atf_test_case dotdot
dotdot_head() {
atf_set "descr" "Tests that the '..' entry is properly updated" \
"during moves"
atf_set "require.user" "root"
}
dotdot_body() {
test_mount
echo "Checking if the '..' entry is updated after moves"
atf_check -s eq:0 -o empty -e empty mkdir a
atf_check -s eq:0 -o empty -e empty mkdir b
atf_check -s eq:0 -o empty -e empty mv b a
atf_check -s eq:0 -o empty -e empty test -d a/b/../b
atf_check -s eq:0 -o empty -e empty test -d a/b/../../a
eval $(stat -s a/b)
[ ${st_nlink} = 2 ] || atf_fail "Incorrect number of links"
eval $(stat -s a)
[ ${st_nlink} = 3 ] || atf_fail "Incorrect number of links"
atf_check -s eq:0 -o empty -e empty rmdir a/b
atf_check -s eq:0 -o empty -e empty rmdir a
echo "Checking if the '..' entry is correct after renames"
atf_check -s eq:0 -o empty -e empty mkdir a
atf_check -s eq:0 -o empty -e empty mkdir b
atf_check -s eq:0 -o empty -e empty mv b a
atf_check -s eq:0 -o empty -e empty mv a c
atf_check -s eq:0 -o empty -e empty test -d c/b/../b
atf_check -s eq:0 -o empty -e empty test -d c/b/../../c
atf_check -s eq:0 -o empty -e empty rmdir c/b
atf_check -s eq:0 -o empty -e empty rmdir c
echo "Checking if the '..' entry is correct after multiple moves"
atf_check -s eq:0 -o empty -e empty mkdir a
atf_check -s eq:0 -o empty -e empty mkdir b
atf_check -s eq:0 -o empty -e empty mv b a
atf_check -s eq:0 -o empty -e empty mv a c
atf_check -s eq:0 -o empty -e empty mv c/b d
atf_check -s eq:0 -o empty -e empty test -d d/../c
atf_check -s eq:0 -o empty -e empty rmdir d
atf_check -s eq:0 -o empty -e empty rmdir c
test_unmount
}
atf_test_case dir_to_emptydir
dir_to_emptydir_head() {
atf_set "descr" "Tests that renaming a directory to override an" \
"empty directory works"
atf_set "require.user" "root"
}
dir_to_emptydir_body() {
test_mount
atf_check -s eq:0 -o empty -e empty mkdir a
atf_check -s eq:0 -o empty -e empty touch a/c
atf_check -s eq:0 -o empty -e empty mkdir b
atf_check -s eq:0 -o empty -e empty \
$(atf_get_srcdir)/h_tools rename a b
atf_check -s eq:1 -o empty -e empty test -e a
atf_check -s eq:0 -o empty -e empty test -d b
atf_check -s eq:0 -o empty -e empty test -f b/c
rm b/c
rmdir b
test_unmount
}
atf_test_case dir_to_fulldir
dir_to_fulldir_head() {
atf_set "descr" "Tests that renaming a directory to override a" \
"non-empty directory fails"
atf_set "require.user" "root"
}
dir_to_fulldir_body() {
test_mount
atf_check -s eq:0 -o empty -e empty mkdir a
atf_check -s eq:0 -o empty -e empty touch a/c
atf_check -s eq:0 -o empty -e empty mkdir b
atf_check -s eq:0 -o empty -e empty touch b/d
atf_check -s eq:1 -o empty -e save:stderr \
$(atf_get_srcdir)/h_tools rename a b
atf_check -s eq:0 -o ignore -e empty grep "Directory not empty" stderr
atf_check -s eq:0 -o empty -e empty test -d a
atf_check -s eq:0 -o empty -e empty test -f a/c
atf_check -s eq:0 -o empty -e empty test -d b
atf_check -s eq:0 -o empty -e empty test -f b/d
rm a/c
rm b/d
rmdir a
rmdir b
test_unmount
}
atf_test_case dir_to_file
dir_to_file_head() {
atf_set "descr" "Tests that renaming a directory to override a" \
"file fails"
atf_set "require.user" "root"
}
dir_to_file_body() {
test_mount
atf_check -s eq:0 -o empty -e empty mkdir a
atf_check -s eq:0 -o empty -e empty touch b
atf_check -s eq:1 -o empty -e save:stderr \
$(atf_get_srcdir)/h_tools rename a b
atf_check -s eq:0 -o ignore -e empty grep "Not a directory" stderr
atf_check -s eq:0 -o empty -e empty test -d a
atf_check -s eq:0 -o empty -e empty test -f b
rmdir a
rm b
test_unmount
}
atf_test_case file_to_dir
file_to_dir_head() {
atf_set "descr" "Tests that renaming a file to override a" \
"directory fails"
atf_set "require.user" "root"
}
file_to_dir_body() {
test_mount
atf_check -s eq:0 -o empty -e empty touch a
atf_check -s eq:0 -o empty -e empty mkdir b
atf_check -s eq:1 -o empty -e save:stderr \
$(atf_get_srcdir)/h_tools rename a b
atf_check -s eq:0 -o ignore -e empty grep "Is a directory" stderr
atf_check -s eq:0 -o empty -e empty test -f a
atf_check -s eq:0 -o empty -e empty test -d b
rm a
rmdir b
test_unmount
}
atf_test_case kqueue
kqueue_head() {
atf_set "descr" "Tests that moving and renaming files raise the" \
"correct kqueue events"
atf_set "require.user" "root"
}
kqueue_body() {
test_mount
atf_check -s eq:0 -o empty -e empty mkdir dir
atf_check -s eq:0 -o empty -e empty touch dir/a
echo 'mv dir/a dir/b' | kqueue_monitor 2 dir dir/a
kqueue_check dir/a NOTE_RENAME
kqueue_check dir NOTE_WRITE
atf_check -s eq:0 -o empty -e empty rm dir/b
atf_check -s eq:0 -o empty -e empty rmdir dir
atf_check -s eq:0 -o empty -e empty mkdir dir
atf_check -s eq:0 -o empty -e empty touch dir/a
atf_check -s eq:0 -o empty -e empty touch dir/b
echo 'mv dir/a dir/b' | kqueue_monitor 3 dir dir/a dir/b
kqueue_check dir/a NOTE_RENAME
kqueue_check dir NOTE_WRITE
kqueue_check dir/b NOTE_DELETE
atf_check -s eq:0 -o empty -e empty rm dir/b
atf_check -s eq:0 -o empty -e empty rmdir dir
atf_check -s eq:0 -o empty -e empty mkdir dir1
atf_check -s eq:0 -o empty -e empty mkdir dir2
atf_check -s eq:0 -o empty -e empty touch dir1/a
echo 'mv dir1/a dir2/a' | kqueue_monitor 3 dir1 dir1/a dir2
kqueue_check dir1/a NOTE_RENAME
kqueue_check dir1 NOTE_WRITE
kqueue_check dir2 NOTE_WRITE
atf_check -s eq:0 -o empty -e empty rm dir2/a
atf_check -s eq:0 -o empty -e empty rmdir dir1
atf_check -s eq:0 -o empty -e empty rmdir dir2
test_unmount
}
atf_init_test_cases() {
. $(atf_get_srcdir)/../h_funcs.subr
. $(atf_get_srcdir)/h_funcs.subr
atf_add_test_case dots
atf_add_test_case crossdev
atf_add_test_case basic
atf_add_test_case dotdot
atf_add_test_case dir_to_emptydir
atf_add_test_case dir_to_fulldir
atf_add_test_case dir_to_file
atf_add_test_case file_to_dir
atf_add_test_case kqueue
}

View File

@@ -0,0 +1,115 @@
/* $NetBSD: t_renamerace.c,v 1.13 2011/08/18 21:44:55 riastradh Exp $ */
/*
* Modified for rump and atf from a program supplied
* by Nicolas Joly in kern/40948
*/
#include <sys/types.h>
#include <sys/mount.h>
#include <sys/utsname.h>
#include <atf-c.h>
#include <errno.h>
#include <fcntl.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <rump/rump.h>
#include <rump/rump_syscalls.h>
#include <fs/tmpfs/tmpfs_args.h>
#include "../../h_macros.h"
ATF_TC(renamerace2);
ATF_TC_HEAD(renamerace2, tc)
{
atf_tc_set_md_var(tc, "descr", "rename(2) lock order inversion");
atf_tc_set_md_var(tc, "timeout", "6");
}
static volatile int quittingtime = 0;
static pid_t wrkpid;
static void *
r2w1(void *arg)
{
int fd;
rump_pub_lwproc_newlwp(wrkpid);
fd = rump_sys_open("/file", O_CREAT | O_RDWR, 0777);
if (fd == -1)
atf_tc_fail_errno("creat");
rump_sys_close(fd);
while (!quittingtime) {
if (rump_sys_rename("/file", "/dir/file") == -1)
atf_tc_fail_errno("rename 1");
if (rump_sys_rename("/dir/file", "/file") == -1)
atf_tc_fail_errno("rename 2");
}
return NULL;
}
static void *
r2w2(void *arg)
{
int fd;
rump_pub_lwproc_newlwp(wrkpid);
while (!quittingtime) {
fd = rump_sys_open("/dir/file1", O_RDWR);
if (fd != -1)
rump_sys_close(fd);
}
return NULL;
}
ATF_TC_BODY(renamerace2, tc)
{
struct tmpfs_args args;
pthread_t pt[2];
/*
* Force SMP regardless of how many host CPUs there are.
* Deadlock is highly unlikely to trigger otherwise.
*/
setenv("RUMP_NCPU", "2", 1);
rump_init();
memset(&args, 0, sizeof(args));
args.ta_version = TMPFS_ARGS_VERSION;
args.ta_root_mode = 0777;
if (rump_sys_mount(MOUNT_TMPFS, "/", 0, &args, sizeof(args)) == -1)
atf_tc_fail_errno("could not mount tmpfs");
if (rump_sys_mkdir("/dir", 0777) == -1)
atf_tc_fail_errno("cannot create directory");
RZ(rump_pub_lwproc_rfork(RUMP_RFCFDG));
RL(wrkpid = rump_sys_getpid());
pthread_create(&pt[0], NULL, r2w1, NULL);
pthread_create(&pt[1], NULL, r2w2, NULL);
/* usually triggers in <<1s for me */
sleep(4);
quittingtime = 1;
pthread_join(pt[0], NULL);
pthread_join(pt[1], NULL);
}
ATF_TP_ADD_TCS(tp)
{
ATF_TP_ADD_TC(tp, renamerace2);
return atf_no_error();
}

204
tests/fs/tmpfs/t_rmdir.sh Normal file
View File

@@ -0,0 +1,204 @@
# $NetBSD: t_rmdir.sh,v 1.5 2010/11/07 17:51:18 jmmv Exp $
#
# Copyright (c) 2005, 2006, 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.
#
#
# Verifies that rmdir works by creating and removing directories. Also
# checks multiple error conditions.
#
atf_test_case mntpt
mntpt_head() {
atf_set "descr" "Checks that the mount point cannot be removed"
atf_set "require.user" "root"
}
mntpt_body() {
test_mount
atf_check -s eq:1 -o empty -e ignore rmdir ${Mount_Point}
test_unmount
}
atf_test_case non_existent
non_existent_head() {
atf_set "descr" "Checks that non-existent directories cannot" \
"be removed"
atf_set "require.user" "root"
}
non_existent_body() {
test_mount
atf_check -s eq:1 -o empty -e ignore rmdir non-existent
test_unmount
}
atf_test_case single
single_head() {
atf_set "descr" "Checks that removing a single directory works"
atf_set "require.user" "root"
}
single_body() {
test_mount
atf_check -s eq:0 -o empty -e empty mkdir a
eval $(stat -s ${Mount_Point})
[ ${st_nlink} = 3 ] || \
atf_fail "Incorrect number of links after creation"
atf_check -s eq:0 -o empty -e empty rmdir a
eval $(stat -s ${Mount_Point})
[ ${st_nlink} = 2 ] || \
atf_fail "Incorrect number of links after removal"
test_unmount
}
atf_test_case nested
nested_head() {
atf_set "descr" "Checks that removing nested directories works"
atf_set "require.user" "root"
}
nested_body() {
test_mount
atf_check -s eq:0 -o empty -e empty mkdir -p a/b/c
atf_check -s eq:0 -o empty -e empty rmdir a/b/c
atf_check -s eq:0 -o empty -e empty rmdir a/b
atf_check -s eq:0 -o empty -e empty rmdir a
test_unmount
}
atf_test_case dots
dots_head() {
atf_set "descr" "Checks that '.' and '..' cannot be removed"
atf_set "require.user" "root"
}
dots_body() {
test_mount
atf_check -s eq:0 -o empty -e empty mkdir a
atf_check -s eq:1 -o empty -e ignore rmdir a/.
atf_check -s eq:1 -o empty -e ignore rmdir a/..
atf_check -s eq:0 -o empty -e empty rmdir a
test_unmount
}
atf_test_case non_empty
non_empty_head() {
atf_set "descr" "Checks that non-empty directories cannot be removed"
atf_set "require.user" "root"
}
non_empty_body() {
test_mount
atf_check -s eq:0 -o empty -e empty mkdir a
atf_check -s eq:0 -o empty -e empty mkdir a/b
atf_check -s eq:0 -o empty -e empty mkdir a/c
atf_check -s eq:1 -o empty -e ignore rmdir a
atf_check -s eq:0 -o empty -e empty rmdir a/b
atf_check -s eq:0 -o empty -e empty rmdir a/c
atf_check -s eq:0 -o empty -e empty rmdir a
test_unmount
}
atf_test_case links
links_head() {
atf_set "descr" "Checks the root directory's links after removals"
atf_set "require.user" "root"
}
links_body() {
test_mount
atf_check -s eq:0 -o empty -e empty mkdir a
atf_check -s eq:0 -o empty -e empty mkdir a/b
atf_check -s eq:0 -o empty -e empty mkdir c
atf_check -s eq:0 -o empty -e empty rmdir c
atf_check -s eq:0 -o empty -e empty rmdir a/b
atf_check -s eq:0 -o empty -e empty rmdir a
eval $(stat -s ${Mount_Point})
[ ${st_nlink} = 2 ] || atf_fail "Incorrect number of links"
test_unmount
}
atf_test_case curdir
curdir_head() {
atf_set "descr" "Checks that the current directory cannot be removed"
atf_set "require.user" "root"
}
curdir_body() {
test_mount
atf_check -s eq:0 -o empty -e empty mkdir a
# Catch a bug that would panic the system when accessing the
# current directory after being deleted: vop_open cannot assume
# that open files are still linked to a directory.
atf_check -s eq:1 -o empty -e ignore -x '( cd a && rmdir ../a && ls )'
atf_check -s eq:1 -o empty -e empty test -e a
test_unmount
}
atf_test_case kqueue
kqueue_head() {
atf_set "descr" "Checks that removing a directory raises the" \
"correct kqueue events"
atf_set "require.user" "root"
}
kqueue_body() {
test_mount
atf_check -s eq:0 -o empty -e empty mkdir dir
atf_check -s eq:0 -o empty -e empty mkdir dir/a
echo 'rmdir dir/a' | kqueue_monitor 3 dir dir/a
kqueue_check dir/a NOTE_DELETE
kqueue_check dir NOTE_LINK
kqueue_check dir NOTE_WRITE
atf_check -s eq:0 -o empty -e empty rmdir dir
test_unmount
}
atf_init_test_cases() {
. $(atf_get_srcdir)/../h_funcs.subr
. $(atf_get_srcdir)/h_funcs.subr
atf_add_test_case mntpt
atf_add_test_case non_existent
atf_add_test_case single
atf_add_test_case nested
atf_add_test_case dots
atf_add_test_case non_empty
atf_add_test_case links
atf_add_test_case curdir
atf_add_test_case kqueue
}

216
tests/fs/tmpfs/t_setattr.sh Normal file
View File

@@ -0,0 +1,216 @@
# $NetBSD: t_setattr.sh,v 1.5 2010/11/07 17:51:18 jmmv Exp $
#
# Copyright (c) 2005, 2006, 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.
#
#
# Verifies that the setattr vnode operation works, using several commands
# that require this function.
#
atf_test_case chown
chown_head() {
atf_set "descr" "Tests that the file owner can be changed"
atf_set "require.user" "root"
}
chown_body() {
test_mount
atf_check -s eq:0 -o empty -e empty mkdir own
eval $(stat -s own | sed -e 's|st_|ost_|g')
atf_check -s eq:0 -o empty -e empty chown 1234 own
eval $(stat -s own)
[ ${st_uid} -eq 1234 ] || atf_fail "uid was not set"
[ ${st_gid} -eq ${ost_gid} ] || atf_fail "gid was modified"
test_unmount
}
atf_test_case chown_kqueue
chown_kqueue_head() {
atf_set "descr" "Tests that changing the file owner raises" \
"NOTE_ATTRIB on it"
atf_set "require.user" "root"
}
chown_kqueue_body() {
test_mount
atf_check -s eq:0 -o empty -e empty mkdir ownq
echo 'chown 1234 ownq' | kqueue_monitor 1 ownq
kqueue_check ownq NOTE_ATTRIB
test_unmount
}
atf_test_case chgrp
chgrp_head() {
atf_set "descr" "Tests that the file group can be changed"
atf_set "require.user" "root"
}
chgrp_body() {
test_mount
atf_check -s eq:0 -o empty -e empty mkdir grp
eval $(stat -s grp | sed -e 's|st_|ost_|g')
atf_check -s eq:0 -o empty -e empty chgrp 5678 grp
eval $(stat -s grp)
[ ${st_uid} -eq ${ost_uid} ] || atf_fail "uid was modified"
[ ${st_gid} -eq 5678 ] || atf_fail "gid was not set"
test_unmount
}
atf_test_case chgrp_kqueue
chgrp_kqueue_head() {
atf_set "descr" "Tests that changing the file group raises" \
"NOTE_ATTRIB on it"
atf_set "require.user" "root"
}
chgrp_kqueue_body() {
test_mount
atf_check -s eq:0 -o empty -e empty mkdir grpq
echo 'chgrp 1234 grpq' | kqueue_monitor 1 grpq
kqueue_check grpq NOTE_ATTRIB
test_unmount
}
atf_test_case chowngrp
chowngrp_head() {
atf_set "descr" "Tests that the file owner and group can be" \
"changed at once"
atf_set "require.user" "root"
}
chowngrp_body() {
test_mount
atf_check -s eq:0 -o empty -e empty mkdir owngrp
atf_check -s eq:0 -o empty -e empty chown 1234:5678 owngrp
eval $(stat -s owngrp)
[ ${st_uid} -eq 1234 ] || atf_fail "uid was not modified"
[ ${st_gid} -eq 5678 ] || atf_fail "gid was not modified"
test_unmount
}
atf_test_case chowngrp_kqueue
chowngrp_kqueue_head() {
atf_set "descr" "Tests that changing the file owner and group" \
"raises NOTE_ATTRIB on it"
atf_set "require.user" "root"
}
chowngrp_kqueue_body() {
test_mount
atf_check -s eq:0 -o empty -e empty mkdir owngrpp
echo 'chown 1234:5678 owngrpp' | kqueue_monitor 1 owngrpp
kqueue_check owngrpp NOTE_ATTRIB
test_unmount
}
atf_test_case chmod
chmod_head() {
atf_set "descr" "Tests that the file mode can be changed"
atf_set "require.user" "root"
}
chmod_body() {
test_mount
atf_check -s eq:0 -o empty -e empty mkdir mode
atf_check -s eq:0 -o empty -e empty chmod 0000 mode
eval $(stat -s mode)
[ ${st_mode} -eq 40000 ] || af_fail "mode was not set"
test_unmount
}
atf_test_case chmod_kqueue
chmod_kqueue_head() {
atf_set "descr" "Tests that changing the file mode raises" \
"NOTE_ATTRIB on it"
atf_set "require.user" "root"
}
chmod_kqueue_body() {
test_mount
atf_check -s eq:0 -o empty -e empty mkdir modeq
echo 'chmod 0000 modeq' | kqueue_monitor 1 modeq
kqueue_check modeq NOTE_ATTRIB
test_unmount
}
atf_test_case chtimes
chtimes_head() {
atf_set "descr" "Tests that file times can be changed"
atf_set "require.user" "root"
}
chtimes_body() {
test_mount
atf_check -s eq:0 -o empty -e empty mkdir times
atf_check -s eq:0 -o empty -e empty \
-x 'TZ=GMT touch -t 200501010101 times'
eval $(stat -s times)
[ ${st_atime} = ${st_mtime} ] || \
atf_fail "atime does not match mtime"
[ ${st_atime} = 1104541260 ] || atf_fail "atime does not match"
test_unmount
}
atf_test_case chtimes_kqueue
chtimes_kqueue_head() {
atf_set "descr" "Tests that changing the file times raises" \
"NOTE_ATTRIB on it"
atf_set "require.user" "root"
}
chtimes_kqueue_body() {
test_mount
atf_check -s eq:0 -o empty -e empty mkdir timesq
echo 'touch timesq' | kqueue_monitor 1 timesq
kqueue_check timesq NOTE_ATTRIB
test_unmount
}
atf_init_test_cases() {
. $(atf_get_srcdir)/../h_funcs.subr
. $(atf_get_srcdir)/h_funcs.subr
atf_add_test_case chown
atf_add_test_case chown_kqueue
atf_add_test_case chgrp
atf_add_test_case chgrp_kqueue
atf_add_test_case chowngrp
atf_add_test_case chowngrp_kqueue
atf_add_test_case chmod
atf_add_test_case chmod_kqueue
atf_add_test_case chtimes
atf_add_test_case chtimes_kqueue
}

131
tests/fs/tmpfs/t_sizes.sh Normal file
View File

@@ -0,0 +1,131 @@
# $NetBSD: t_sizes.sh,v 1.5 2010/11/07 17:51:18 jmmv Exp $
#
# Copyright (c) 2005, 2006, 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.
#
#
# Verifies that the file system controls memory usage correctly.
#
atf_test_case small
small_head() {
atf_set "descr" "Checks the status after creating a small file"
atf_set "require.user" "root"
}
small_body() {
test_mount -o -s10M
echo a >a || atf_fail "Could not create file"
eval $($(atf_get_srcdir)/h_tools statvfs .)
f_bused=$((${f_blocks} - ${f_bfree}))
[ ${f_bused} -gt 1 ] || atf_fail "Incorrect bused count"
atf_check -s eq:0 -o empty -e empty rm a
test_unmount
}
atf_test_case big
big_head() {
atf_set "descr" "Checks the status after creating a big file"
atf_set "require.user" "root"
}
big_body() {
test_mount -o -s10M
pagesize=$(sysctl hw.pagesize | cut -d ' ' -f 3)
eval $($(atf_get_srcdir)/h_tools statvfs . | sed -e 's|^f_|cf_|')
cf_bused=$((${cf_blocks} - ${cf_bfree}))
atf_check -s eq:0 -o ignore -e ignore \
dd if=/dev/zero of=a bs=1m count=5
eval $($(atf_get_srcdir)/h_tools statvfs .)
f_bused=$((${f_blocks} - ${f_bfree}))
[ ${f_bused} -ne ${cf_bused} ] || atf_fail "bused did not change"
[ ${f_bused} -gt $((5 * 1024 * 1024 / ${pagesize})) ] || \
atf_fail "bused too big"
of_bused=${f_bused}
atf_check -s eq:0 -o empty -e empty rm a
eval $($(atf_get_srcdir)/h_tools statvfs .)
f_bused=$((${f_blocks} - ${f_bfree}))
[ ${f_bused} -lt ${of_bused} ] || \
atf_fail "bused was not correctly restored"
test_unmount
}
atf_test_case overflow
overflow_head() {
atf_set "descr" "Checks the status after creating a big file that" \
"overflows the file system limits"
atf_set "require.user" "root"
}
overflow_body() {
test_mount -o -s10M
atf_check -s eq:0 -o empty -e empty touch a
atf_check -s eq:0 -o empty -e empty rm a
eval $($(atf_get_srcdir)/h_tools statvfs .)
of_bused=$((${f_blocks} - ${f_bfree}))
atf_check -s eq:1 -o ignore -e ignore \
dd if=/dev/zero of=a bs=1m count=15
atf_check -s eq:0 -o empty -e empty rm a
eval $($(atf_get_srcdir)/h_tools statvfs .)
f_bused=$((${f_blocks} - ${f_bfree}))
[ ${f_bused} -ge ${of_bused} -a ${f_bused} -le $((${of_bused} + 1)) ] \
|| atf_fail "Incorrect bused"
test_unmount
}
atf_test_case overwrite
overwrite_head() {
atf_set "descr" "Checks that writing to the middle of a file" \
"does not change its size"
atf_set "require.user" "root"
}
overwrite_body() {
test_mount -o -s10M
atf_check -s eq:0 -o ignore -e ignore \
dd if=/dev/zero of=a bs=1024 count=10
sync
atf_check -s eq:0 -o ignore -e ignore \
dd if=/dev/zero of=a bs=1024 conv=notrunc seek=1 count=1
sync
eval $(stat -s a)
[ ${st_size} -eq 10240 ] || atf_fail "Incorrect file size"
test_unmount
}
atf_init_test_cases() {
. $(atf_get_srcdir)/../h_funcs.subr
. $(atf_get_srcdir)/h_funcs.subr
atf_add_test_case small
atf_add_test_case big
atf_add_test_case overflow
atf_add_test_case overwrite
}

View File

@@ -0,0 +1,52 @@
# $NetBSD: t_sockets.sh,v 1.5 2010/11/07 17:51:18 jmmv Exp $
#
# Copyright (c) 2005, 2006, 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 basic
basic_head() {
atf_set "descr" "Verifies that sockets can be created using" \
"socket/bind"
atf_set "require.user" "root"
}
basic_body() {
test_mount
atf_check -s eq:0 -o empty -e empty $(atf_get_srcdir)/h_tools sockets a
atf_check -s eq:0 -o empty -e empty rm a
atf_check -s eq:0 -o empty -e empty mkdir dir
echo "$(atf_get_srcdir)/h_tools sockets dir/a" | kqueue_monitor 1 dir
kqueue_check dir NOTE_WRITE
test_unmount
}
atf_init_test_cases() {
. $(atf_get_srcdir)/../h_funcs.subr
. $(atf_get_srcdir)/h_funcs.subr
atf_add_test_case basic
}

View File

@@ -0,0 +1,59 @@
# $NetBSD: t_statvfs.sh,v 1.4 2010/11/07 17:51:18 jmmv Exp $
#
# Copyright (c) 2005, 2006, 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.
#
#
# Verifies that the statvfs system call works properly (returning the
# correct values) over a tmpfs mount point.
#
atf_test_case values
values_head() {
atf_set "descr" "Tests that statvfs(2) returns correct values"
atf_set "require.user" "root"
}
values_body() {
test_mount -o -s10M
pagesize=$(sysctl hw.pagesize | cut -d ' ' -f 3)
eval $($(atf_get_srcdir)/h_tools statvfs .)
[ ${pagesize} -eq ${f_bsize} ] || \
atf_fail "Invalid bsize"
[ $((${f_bsize} * ${f_blocks})) -ge $((10 * 1024 * 1024)) ] || \
atf_file "bsize * blocks too small"
[ $((${f_bsize} * ${f_blocks})) -le \
$((10 * 1024 * 1024 + ${pagesize})) ] || \
atf_fail "bsize * blocks too big"
test_unmount
}
atf_init_test_cases() {
. $(atf_get_srcdir)/../h_funcs.subr
. $(atf_get_srcdir)/h_funcs.subr
atf_add_test_case values
}

114
tests/fs/tmpfs/t_symlink.sh Normal file
View File

@@ -0,0 +1,114 @@
# $NetBSD: t_symlink.sh,v 1.5 2010/11/07 17:51:18 jmmv Exp $
#
# Copyright (c) 2005, 2006, 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.
#
#
# Verifies that the symlink and readlink operations work.
#
atf_test_case file
file_head() {
atf_set "descr" "Tests that symlinks to files work"
atf_set "require.user" "root"
}
file_body() {
test_mount
atf_check -s eq:0 -o empty -e empty touch a
atf_check -s eq:0 -o empty -e empty ln -s a b
[ $(md5 b | cut -d ' ' -f 4) = d41d8cd98f00b204e9800998ecf8427e ] || \
atf_fail "Symlink points to an incorrect file"
atf_check -s eq:0 -o empty -e empty -x 'echo foo >a'
[ $(md5 b | cut -d ' ' -f 4) = d3b07384d113edec49eaa6238ad5ff00 ] || \
atf_fail "Symlink points to an incorrect file"
test_unmount
}
atf_test_case exec
exec_head() {
atf_set "descr" "Tests symlinking to a known system binary and" \
"executing it through the symlink"
atf_set "require.user" "root"
}
exec_body() {
test_mount
atf_check -s eq:0 -o empty -e empty touch b
atf_check -s eq:0 -o empty -e empty ln -s /bin/cp cp
atf_check -s eq:0 -o empty -e empty ./cp b c
atf_check -s eq:0 -o empty -e empty test -f c
test_unmount
}
atf_test_case dir
dir_head() {
atf_set "descr" "Tests that symlinks to directories work"
atf_set "require.user" "root"
}
dir_body() {
test_mount
atf_check -s eq:0 -o empty -e empty mkdir d
atf_check -s eq:1 -o empty -e empty test -f d/foo
atf_check -s eq:1 -o empty -e empty test -f e/foo
atf_check -s eq:0 -o empty -e empty ln -s d e
atf_check -s eq:0 -o empty -e empty touch d/foo
atf_check -s eq:0 -o empty -e empty test -f d/foo
atf_check -s eq:0 -o empty -e empty test -f e/foo
test_unmount
}
atf_test_case kqueue
kqueue_head() {
atf_set "descr" "Tests that creating a symlink raises the" \
"appropriate kqueue events"
atf_set "require.user" "root"
}
kqueue_body() {
test_mount
atf_check -s eq:0 -o empty -e empty mkdir dir
echo 'ln -s non-existent dir/a' | kqueue_monitor 1 dir
kqueue_check dir NOTE_WRITE
atf_check -s eq:0 -o empty -e empty rm dir/a
atf_check -s eq:0 -o empty -e empty rmdir dir
test_unmount
}
atf_init_test_cases() {
. $(atf_get_srcdir)/../h_funcs.subr
. $(atf_get_srcdir)/h_funcs.subr
atf_add_test_case file
atf_add_test_case exec
atf_add_test_case dir
atf_add_test_case kqueue
}

141
tests/fs/tmpfs/t_times.sh Normal file
View File

@@ -0,0 +1,141 @@
# $NetBSD: t_times.sh,v 1.5 2010/11/07 17:51:18 jmmv Exp $
#
# Copyright (c) 2005, 2006, 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.
#
#
# Verifies that node times are properly handled.
#
atf_test_case empty
empty_head() {
atf_set "descr" "Tests that creating an empty file and later" \
"manipulating it updates times correctly"
atf_set "require.user" "root"
}
empty_body() {
test_mount
atf_check -s eq:0 -o empty -e empty touch a
eval $(stat -s a | sed -e 's|st_|ost_|g') || atf_fail "stat failed"
[ ${ost_birthtime} -eq ${ost_atime} ] || atf_fail "Incorrect atime"
[ ${ost_birthtime} -eq ${ost_ctime} ] || atf_fail "Incorrect ctime"
[ ${ost_birthtime} -eq ${ost_mtime} ] || atf_fail "Incorrect mtime"
sleep 1
atf_check -s eq:0 -o ignore -e empty cat a
eval $(stat -s a) || atf_fail "stat failed"
[ ${st_atime} -gt ${ost_atime} ] || atf_fail "Incorrect atime"
[ ${st_ctime} -eq ${ost_ctime} ] || atf_fail "Incorrect ctime"
[ ${st_mtime} -eq ${ost_mtime} ] || atf_fail "Incorrect mtime"
sleep 1
echo foo >a || atf_fail "Write failed"
eval $(stat -s a) || atf_fail "stat failed"
[ ${st_atime} -gt ${ost_atime} ] || atf_fail "Incorrect atime"
[ ${st_ctime} -gt ${ost_ctime} ] || atf_fail "Incorrect ctime"
[ ${st_mtime} -gt ${ost_mtime} ] || atf_fail "Incorrect mtime"
test_unmount
}
atf_test_case non_empty
non_empty_head() {
atf_set "descr" "Tests that creating a non-empty file and later" \
"manipulating it updates times correctly"
atf_set "require.user" "root"
}
non_empty_body() {
test_mount
echo foo >b || atf_fail "Non-empty creation failed"
eval $(stat -s b | sed -e 's|st_|ost_|g') || atf_fail "stat failed"
sleep 1
atf_check -s eq:0 -o ignore -e empty cat b
eval $(stat -s b) || atf_fail "stat failed"
[ ${st_atime} -gt ${ost_atime} ] || atf_fail "Incorrect atime"
[ ${st_ctime} -eq ${ost_ctime} ] || atf_fail "Incorrect ctime"
[ ${st_mtime} -eq ${ost_mtime} ] || atf_fail "Incorrect mtime"
test_unmount
}
atf_test_case link
link_head() {
atf_set "descr" "Tests that linking to an existing file updates" \
"times correctly"
atf_set "require.user" "root"
}
link_body() {
test_mount
echo foo >c || atf_fail "Non-empty creation failed"
eval $(stat -s c | sed -e 's|st_|ost_|g') || atf_fail "stat failed"
sleep 1
atf_check -s eq:0 -o empty -e empty ln c d
eval $(stat -s c) || atf_fail "stat failed"
[ ${st_atime} -eq ${ost_atime} ] || atf_fail "Incorrect atime"
[ ${st_ctime} -gt ${ost_ctime} ] || atf_fail "Incorrect ctime"
[ ${st_mtime} -eq ${ost_mtime} ] || atf_fail "Incorrect mtime"
test_unmount
}
atf_test_case rename
rename_head() {
atf_set "descr" "Tests that renaming an existing file updates" \
"times correctly"
atf_set "require.user" "root"
}
rename_body() {
test_mount
atf_check -s eq:0 -o empty -e empty mkdir e
echo foo >e/a || atf_fail "Creation failed"
eval $(stat -s e | sed -e 's|st_|dost_|g') || atf_fail "stat failed"
eval $(stat -s e/a | sed -e 's|st_|ost_|g') || atf_fail "stat failed"
sleep 1
atf_check -s eq:0 -o empty -e empty mv e/a e/b
eval $(stat -s e | sed -e 's|st_|dst_|g') || atf_fail "stat failed"
eval $(stat -s e/b) || atf_fail "stat failed"
[ ${st_atime} -eq ${ost_atime} ] || atf_fail "Incorrect atime"
[ ${st_ctime} -gt ${ost_ctime} ] || atf_fail "Incorrect ctime"
[ ${st_mtime} -eq ${ost_mtime} ] || atf_fail "Incorrect mtime"
[ ${dst_mtime} -gt ${dost_mtime} ] || atf_fail "Incorrect mtime"
test_unmount
}
atf_init_test_cases() {
. $(atf_get_srcdir)/../h_funcs.subr
. $(atf_get_srcdir)/h_funcs.subr
atf_add_test_case empty
atf_add_test_case non_empty
atf_add_test_case link
atf_add_test_case rename
}

View File

@@ -0,0 +1,52 @@
# $NetBSD: t_trail_slash.sh,v 1.5 2010/11/07 17:51:18 jmmv Exp $
#
# Copyright (c) 2005, 2006, 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 main
main_head() {
atf_set "descr" "Verifies that trailing slashes are not stored" \
"in directory names and that they do not cause" \
"crashes"
atf_set "require.user" "root"
}
main_body() {
test_mount
atf_check -s eq:0 -o empty -e empty mkdir a/
atf_check -s eq:0 -o empty -e empty touch a/b
atf_check -s eq:0 -o empty -e empty test -f a/b
atf_check -s eq:0 -o empty -e empty rm a/b
atf_check -s eq:0 -o empty -e empty rmdir a/
test_unmount
}
atf_init_test_cases() {
. $(atf_get_srcdir)/../h_funcs.subr
. $(atf_get_srcdir)/h_funcs.subr
atf_add_test_case main
}

View File

@@ -0,0 +1,56 @@
# $NetBSD: t_truncate.sh,v 1.4 2010/11/07 17:51:18 jmmv Exp $
#
# Copyright (c) 2005, 2006, 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.
#
atf_test_case basic
basic_head() {
atf_set "descr" "Verifies that the truncate operation works"
atf_set "require.user" "root"
}
basic_body() {
test_mount
echo "Creating big file"
jot 10000 >a || atf_fail "Failed to create big file"
echo "Trunctaing the file to a smaller size"
echo foo >a || atf_fail "Failed to truncate file to a smaller size"
[ $(md5 a | cut -d ' ' -f 4) = d3b07384d113edec49eaa6238ad5ff00 ] || \
echo "Truncated file is incorrect"
echo "Truncating to zero bytes"
>a || atf_fail "Failed to truncate to 0"
echo "Truncating to zero bytes, second try"
>a || atf_fail "Failed to re-truncate to 0"
test_unmount
}
atf_init_test_cases() {
. $(atf_get_srcdir)/../h_funcs.subr
. $(atf_get_srcdir)/h_funcs.subr
atf_add_test_case basic
}

78
tests/fs/tmpfs/t_vnd.sh Normal file
View File

@@ -0,0 +1,78 @@
# $NetBSD: t_vnd.sh,v 1.8 2011/04/21 22:26:46 haad Exp $
#
# Copyright (c) 2006, 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.
#
#
# Verifies that vnd works with files stored in tmpfs.
#
atf_test_case basic cleanup
basic_head() {
atf_set "descr" "Verifies that vnd works with files stored in tmpfs"
atf_set "require.user" "root"
}
basic_body() {
test_mount
atf_check -s eq:0 -o ignore -e ignore \
dd if=/dev/zero of=disk.img bs=1m count=10
atf_check -s eq:0 -o empty -e empty vnconfig /dev/vnd3 disk.img
atf_check -s eq:0 -o ignore -e ignore newfs /dev/rvnd3a
atf_check -s eq:0 -o empty -e empty mkdir mnt
atf_check -s eq:0 -o empty -e empty mount /dev/vnd3a mnt
echo "Creating test files"
for f in $(jot -w %u 100 | uniq); do
jot 1000 >mnt/${f} || atf_fail "Failed to create file ${f}"
done
echo "Verifying created files"
for f in $(jot -w %u 100 | uniq); do
[ $(md5 mnt/${f} | cut -d ' ' -f 4) = \
53d025127ae99ab79e8502aae2d9bea6 ] || \
atf_fail "Invalid checksum for file ${f}"
done
atf_check -s eq:0 -o empty -e empty umount mnt
atf_check -s eq:0 -o empty -e empty vnconfig -u /dev/vnd3
test_unmount
touch done
}
basic_cleanup() {
if [ ! -f done ]; then
umount mnt 2>/dev/null 1>&2
vnconfig -u /dev/vnd3 2>/dev/null 1>&2
fi
}
atf_init_test_cases() {
. $(atf_get_srcdir)/../h_funcs.subr
. $(atf_get_srcdir)/h_funcs.subr
atf_add_test_case basic
}

View File

@@ -0,0 +1,60 @@
# $NetBSD: t_vnode_leak.sh,v 1.6 2010/11/07 17:51:18 jmmv Exp $
#
# Copyright (c) 2005, 2006, 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 main cleanup
main_head() {
atf_set "descr" "Verifies that vnodes are not leaked and that" \
"their reclaim operation works as expected: i.e.," \
"when all free vnodes are exhausted, unused ones" \
"have to be recycled, which is what the reclaim" \
"operation does."
atf_set "require.user" "root"
}
main_body() {
echo "Lowering kern.maxvnodes to 2000"
sysctl kern.maxvnodes | awk '{ print $3; }' >oldvnodes
atf_check -s eq:0 -o ignore -e empty sysctl -w kern.maxvnodes=2000
test_mount -o -s$(((4000 + 2) * 4096))
echo "Creating 4000 directories"
for f in $(jot 4000); do
mkdir ${f}
done
test_unmount
}
main_cleanup() {
oldvnodes=$(cat oldvnodes)
echo "Restoring kern.maxvnodes to ${oldvnodes}"
sysctl -w kern.maxvnodes=${oldvnodes}
}
atf_init_test_cases() {
. $(atf_get_srcdir)/../h_funcs.subr
. $(atf_get_srcdir)/h_funcs.subr
atf_add_test_case main
}