]> CyberLeo.Net >> Repos - FreeBSD/releng/8.1.git/blob - tools/regression/tmpfs/h_funcs.subr
Copy stable/8 to releng/8.1 in preparation for 8.1-RC1.
[FreeBSD/releng/8.1.git] / tools / regression / tmpfs / h_funcs.subr
1 #!/bin/sh
2 #
3 # $NetBSD: h_funcs.subr,v 1.5 2006/11/09 16:20:06 jmmv Exp $
4 #
5 # Copyright (c) 2005, 2006 The NetBSD Foundation, Inc.
6 # All rights reserved.
7 #
8 # This code is derived from software contributed to The NetBSD Foundation
9 # by Julio M. Merino Vidal, developed as part of Google's Summer of Code
10 # 2005 program.
11 #
12 # Redistribution and use in source and binary forms, with or without
13 # modification, are permitted provided that the following conditions
14 # are met:
15 # 1. Redistributions of source code must retain the above copyright
16 #    notice, this list of conditions and the following disclaimer.
17 # 2. Redistributions in binary form must reproduce the above copyright
18 #    notice, this list of conditions and the following disclaimer in the
19 #    documentation and/or other materials provided with the distribution.
20 # 3. All advertising materials mentioning features or use of this software
21 #    must display the following acknowledgement:
22 #        This product includes software developed by the NetBSD
23 #        Foundation, Inc. and its contributors.
24 # 4. Neither the name of The NetBSD Foundation nor the names of its
25 #    contributors may be used to endorse or promote products derived
26 #    from this software without specific prior written permission.
27 #
28 # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
29 # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
30 # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
31 # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
32 # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
33 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
34 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
35 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
36 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
37 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
38 # POSSIBILITY OF SUCH DAMAGE.
39 #
40 # $FreeBSD$
41 #
42
43 #
44 # Helper functions for tests written in shell script.
45 #
46
47 Prog_Name=${0##*/}
48 Src_Dir=$(pwd)
49 Unprived_User=
50 Verbose=2
51 Work_Dir=$(pwd)/tmp
52
53 # -------------------------------------------------------------------------
54
55 # die
56 #
57 #       Called by tests when a command fails unexpectedly.  Terminates
58 #       execution and tries to clean up the mount point.
59 #
60 die() {
61         if [ -d ${Work_Dir} ]; then
62                 cd ${Src_Dir}
63                 umount ${Work_Dir}
64                 rmdir ${Work_Dir}
65         fi
66         [ ${Verbose} -eq 2 ] && err "Test ended unexpectedly"
67         [ ${Verbose} -eq 1 ] && echo " failed."
68         exit 1
69 }
70
71 # -------------------------------------------------------------------------
72
73 # err message
74 #
75 #       Shows the given error message and terminates the program.
76 #
77 err() {
78         echo "${Prog_Name}: $*" 1>&2
79         exit 1
80 }
81
82 # -------------------------------------------------------------------------
83
84 # test_mount [args]
85 #
86 #       Mounts tmpfs over ${Work_Dir} and changes the current directory
87 #       to the mount point.  Optional arguments may be passed to the
88 #       mount command.
89 #
90 test_mount() {
91         mkdir ${Work_Dir} || die
92         if [ $# -gt 0 ]; then
93                 mount -t tmpfs "$@" tmpfs ${Work_Dir} || die
94         else
95                 mount -t tmpfs tmpfs ${Work_Dir} || die
96         fi
97         cd ${Work_Dir}
98 }
99
100 # -------------------------------------------------------------------------
101
102 # test_name message
103 #
104 #       Prints a message about what a test is going to do.
105 #
106 test_name() {
107         [ ${Verbose} -gt 1 ] && echo "    $*..."
108 }
109
110 # -------------------------------------------------------------------------
111
112 # test_unmount
113 #
114 #       Unmounts the file system mounted by test_mount.
115 #
116 test_unmount() {
117         cd -
118         umount ${Work_Dir} || die
119         rmdir ${Work_Dir} || die
120 }
121
122 # -------------------------------------------------------------------------
123
124 # kqueue_monitor expected_nevents file1 [.. fileN]
125 #
126 #       Monitors the commands given through stdin (one per line) using
127 #       kqueue and stores the events raised in a log that can be later
128 #       verified with kqueue_check.
129 #
130 kqueue_monitor() {
131         nev=${1}; shift
132         test_name "Running kqueue-monitored commands and expecting" \
133             "${nev} events"
134         ${Src_Dir}/h_tools kqueue ${*} >kqueue.log || return 1
135         got=$(wc -l kqueue.log | awk '{ print $1 }')
136         test ${got} -eq ${nev}
137 }
138
139 # -------------------------------------------------------------------------
140
141 # kqueue_check file event
142 #
143 #       Checks if kqueue raised the given event when monitoring the
144 #       given file.
145 #
146 kqueue_check() {
147         grep "^${1} - ${2}$" kqueue.log >/dev/null
148 }
149
150 # -------------------------------------------------------------------------
151
152 main() {
153         local args
154
155         [ $(id -un) = root ] || err "Must be run as root"
156
157         args=$(getopt u:v:w: $*)
158         if [ $? -ne 0 ]; then
159                 echo "Usage: ${Prog_Name} [-u unprived_user] [-v level] " \
160                     "[-w root_dir]" 1>&2
161                 return 1
162         fi
163         set -- ${args}
164         while [ $# -gt 0 ]; do
165                 case "$1" in
166                         -u)
167                                 Unprived_User="$2"; shift
168                                 ;;
169                         -v)
170                                 Verbose="$2"; shift
171                                 ;;
172                         -w)
173                                 Work_Dir="$2"; shift
174                                 ;;
175                         --)
176                                 shift; break
177                                 ;;
178                 esac
179                 shift
180         done
181
182         [ ${Verbose} -eq 1 ] && echo -n "${Prog_Name}:"
183         [ ${Verbose} -eq 2 ] && echo "${Prog_Name}: Running tests"
184         test_run
185         [ ${Verbose} -eq 1 ] && echo " ok."
186         [ ${Verbose} -eq 2 ] && echo "${Prog_Name}: All tests were successful"
187
188         return 0
189 }
190
191 main "$@"