btrfs: test balance and send running in parallel
[xfstests-dev.git] / new
1 #! /bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3 # Copyright (c) 2000-2005 Silicon Graphics, Inc.  All Rights Reserved.
4 #
5 # Make a new test
6 #
7
8 # generic initialization
9 iam=new
10 . ./common/test_names
11
12 tmpfile="/tmp/$$."
13 trap "rm -f $tmpfile; exit" 0 1 2 3 15
14
15 _cleanup()
16 {
17     :
18 }
19
20 SRC_GROUPS=`find tests -not -path tests -type d -printf "%f "`
21 usage()
22 {
23     echo "Usage $0 test_dir|test_dir_and_name"
24     echo "Available dirs are: $SRC_GROUPS"
25     exit
26 }
27
28 [ $# -eq 0 ] && usage
29
30 if echo "$1" | grep -q '/'; then
31         if [ -e "tests/$1" ]; then
32                 echo "$1: test already exists."
33                 exit 1
34         fi
35         tdir="tests/$(echo "$1" | cut -d '/' -f 1)"
36         id="$(echo "$1" | cut -d '/' -f 2)"
37 else
38         tdir=tests/$1
39         id="$(basename "$(./tools/nextid "$1")")"
40 fi
41
42 i=0
43 line=0
44 eof=1
45 [ -d "$tdir/" ] || usage
46
47 export AWK_PROG="$(type -P awk)"
48 [ "$AWK_PROG" = "" ] && { echo "awk not found"; exit; }
49
50 echo "Next test id is $id"
51 shift
52
53 read -p "Append a name to the ID? Test name will be $id-\$name. y,[n]: " -r
54 if [[ $REPLY = [Yy] ]]; then
55         # get the new name from user
56         name=""
57         while [ "$name" = "" ]; do
58                 read -p "Enter the name: "
59                 if [ "$REPLY" = "" ]; then
60                         echo "For canceling, use ctrl+c."
61                 elif echo "$id-$REPLY" | grep -q "^$VALID_TEST_NAME$"; then
62                         if [ -e "$tdir/$id-$REPLY" ]; then
63                                 echo "File '$id-$REPLY' already exists, use another one."
64                                 echo
65                         else
66                                 name="$REPLY"
67                         fi
68                 else
69                         echo "A name can contain only alphanumeric symbols and dash!"
70                         echo
71                 fi
72         done
73
74         id="$id-$name"
75 fi
76
77 echo "Creating test file '$id'"
78
79 if [ -f $tdir/$id ]
80 then
81     echo "Error: test $id already exists!"
82     _cleanup
83     exit 1
84 fi
85
86 # Extract group names from the documentation.
87 group_names() {
88         awk '/^[[:lower:][:digit:]_]/ {
89                 if ($1 != "" && $1 != "Group" && $2 != "Name:" && $1 != "all")
90                         printf("%s\n", $1);
91         }' doc/group-names.txt
92 }
93
94 # Make sure that the new test's groups fit the correct format and are listed
95 # in the group documentation file.
96 check_groups() {
97         for g in "$@"; do
98                 local inval="$(echo "${g}" | tr -d '[:lower:][:space:][:digit:]_')"
99                 if [ -n "${inval}" ]; then
100                         echo "Invalid characters in group(s): ${inval}"
101                         echo "Only lower cases, digits and underscore are allowed in groups, separated by space"
102                         return 1
103                 elif [ "${g}" = "other" ]; then
104                         echo "Do not add more tests to group \"other\""
105                         return 1
106                 elif ! group_names | grep -q -w "${g}"; then
107                         echo "Warning: group \"${g}\" not defined in documentation"
108                         return 1
109                 fi
110         done
111
112         return 0
113 }
114
115 if [ $# -eq 0 ]; then
116         # interactive mode
117         prompt="Add to group(s) [auto] (separate by space, ? for list): "
118         while true; do
119                 read -p "${prompt}" -a new_groups || exit 1
120                 case "${#new_groups[@]}" in
121                 0)
122                         new_groups=("auto")
123                         ;;
124                 1)
125                         if [ "${new_groups[0]}" = "?" ]; then
126                                 echo $(group_names | grep -v -w 'other')
127                                 continue
128                         fi
129                         ;;
130                 esac
131                 check_groups "${new_groups[@]}" && break
132         done
133 else
134         # expert mode, groups are on the command line
135         new_groups=("$@")
136         check_groups "${new_groups[@]}" || exit 1
137 fi
138
139 echo -n "Creating skeletal script for you to edit ..."
140
141 year=`date +%Y`
142
143 cat <<End-of-File >$tdir/$id
144 #! /bin/bash
145 # SPDX-License-Identifier: GPL-2.0
146 # Copyright (c) $year YOUR NAME HERE.  All Rights Reserved.
147 #
148 # FS QA Test $id
149 #
150 # what am I here for?
151 #
152 . ./common/preamble
153 _begin_fstest ${new_groups[@]}
154
155 # Override the default cleanup function.
156 # _cleanup()
157 # {
158 #       cd /
159 #       rm -r -f \$tmp.*
160 # }
161
162 # Import common functions.
163 # . ./common/filter
164
165 # real QA test starts here
166
167 # Modify as appropriate.
168 _supported_fs generic
169 _require_test
170
171 # if error
172 exit
173
174 # optional stuff if your test has verbose output to help resolve problems
175 #echo
176 #echo "If failure, check \$seqres.full (this) and \$seqres.full.ok (reference)"
177
178 # success, all done
179 status=0
180 exit
181 End-of-File
182
183 sleep 2         # latency to read messages to this point
184 echo ""
185
186 chmod 755 $tdir/$id
187 ${EDITOR-vi} $tdir/$id
188
189 # Create default .out file
190 cat <<End-of-File >$tdir/$id.out
191 QA output created by $id
192 Silence is golden
193 End-of-File
194
195 echo " done."
196 exit 0