xref: /freebsd/usr.sbin/pw/tests/pw_useradd_test.sh (revision 24e4dcf4ba5e9dedcf89efd358ea3e1fe5867020)
1# Import helper functions
2. $(atf_get_srcdir)/helper_functions.shin
3
4# Test add user
5atf_test_case user_add
6user_add_body() {
7	populate_etc_skel
8
9	atf_check -s exit:0 ${PW} useradd test
10	atf_check -s exit:0 -o match:"^test:.*" \
11		grep "^test:.*" $HOME/master.passwd
12}
13
14# Test add user with option -N
15atf_test_case user_add_noupdate
16user_add_noupdate_body() {
17	populate_etc_skel
18
19	atf_check -s exit:0 -o match:"^test:.*" ${PW} useradd test -N
20	atf_check -s exit:1 -o empty grep "^test:.*" $HOME/master.passwd
21}
22
23# Test add user with comments
24atf_test_case user_add_comments
25user_add_comments_body() {
26	populate_etc_skel
27
28	atf_check -s exit:0 ${PW} useradd test -c 'Test User,work!,123,user@example.com'
29	atf_check -s exit:0 -o match:'^test:.*:Test User,work!,123,user@example.com:' \
30		grep '^test:.*:Test User,work!,123,user@example.com:' $HOME/master.passwd
31}
32
33# Test add user with comments and option -N
34atf_test_case user_add_comments_noupdate
35user_add_comments_noupdate_body() {
36	populate_etc_skel
37
38	atf_check -s exit:0 -o match:"^test:.*:Test User,work,123,456:" \
39		${PW} useradd test -c "Test User,work,123,456" -N
40	atf_check -s exit:1 -o empty grep "^test:.*" $HOME/master.passwd
41}
42
43# Test add user with invalid comments
44atf_test_case user_add_comments_invalid
45user_add_comments_invalid_body() {
46	populate_etc_skel
47
48	atf_check -s exit:65 -e match:"invalid character" \
49		${PW} useradd test -c "Test User,work,123:456,456"
50	atf_check -s exit:1 -o empty \
51		grep "^test:.*:Test User,work,123:456,456:" $HOME/master.passwd
52}
53
54# Test add user with invalid comments and option -N
55atf_test_case user_add_comments_invalid_noupdate
56user_add_comments_invalid_noupdate_body() {
57	populate_etc_skel
58
59	atf_check -s exit:65 -e match:"invalid character" \
60		${PW} useradd test -c "Test User,work,123:456,456" -N
61	atf_check -s exit:1 -o empty grep "^test:.*" $HOME/master.passwd
62}
63
64# Test add user with alternate homedir
65atf_test_case user_add_homedir
66user_add_homedir_body() {
67	populate_etc_skel
68
69	atf_check -s exit:0 ${PW} useradd test -d /foo/bar
70	atf_check -s exit:0 -o match:"^test:\*:.*::0:0:User &:/foo/bar:.*" \
71		${PW} usershow test
72}
73
74# Test add user with account expiration as an epoch date
75atf_test_case user_add_account_expiration_epoch
76user_add_account_expiration_epoch_body() {
77	populate_etc_skel
78
79	DATE=`date -j -v+1d "+%s"`
80	atf_check -s exit:0 ${PW} useradd test -e ${DATE}
81	atf_check -s exit:0 -o match:"^test:\*:.*::0:${DATE}:.*" \
82		${PW} usershow test
83}
84
85# Test add user with account expiration as a DD-MM-YYYY date
86atf_test_case user_add_account_expiration_date_numeric
87user_add_account_expiration_date_numeric_body() {
88	populate_etc_skel
89
90	DATE=`date -j -v+1d "+%d-%m-%Y"`
91	EPOCH=`date -j -f "%d-%m-%Y %H:%M:%S" "${DATE} 00:00:00" "+%s"`
92	atf_check -s exit:0 ${PW} useradd test -e ${DATE}
93	atf_check -s exit:0 -o match:"^test:\*:.*::0:${EPOCH}:User &:.*" \
94		${PW} usershow test
95}
96
97# Test add user with account expiration as a DD-MM-YYYY date
98atf_test_case user_add_account_expiration_date_month
99user_add_account_expiration_date_month_body() {
100	populate_etc_skel
101
102	DATE=`date -j -v+1d "+%d-%b-%Y"`
103	EPOCH=`date -j -f "%d-%b-%Y %H:%M:%S" "${DATE} 00:00:00" "+%s"`
104	atf_check -s exit:0 ${PW} useradd test -e ${DATE}
105	atf_check -s exit:0 -o match:"^test:\*:.*::0:${EPOCH}:User &:.*" \
106		${PW} usershow test
107}
108
109# Test add user with account expiration as a relative date
110atf_test_case user_add_account_expiration_date_relative
111user_add_account_expiration_date_relative_body() {
112	populate_etc_skel
113
114	EPOCH=`date -j -v+13m "+%s"`
115	BUF=`expr $EPOCH + 5`
116	atf_check -s exit:0 ${PW} useradd test -e +13o
117	TIME=`${PW} usershow test | awk -F ':' '{print $7}'`
118	[ ! -z $TIME -a $TIME -ge $EPOCH -a $TIME -lt $BUF ] || \
119		atf_fail "Expiration time($TIME) was not within $EPOCH - $BUF seconds."
120}
121
122# Test add user with password expiration as an epoch date
123atf_test_case user_add_password_expiration_epoch
124user_add_password_expiration_epoch_body() {
125	populate_etc_skel
126
127	DATE=`date -j -v+1d "+%s"`
128	atf_check -s exit:0 ${PW} useradd test -p ${DATE}
129	atf_check -s exit:0 -o match:"^test:\*:.*::${DATE}:0:.*" \
130		${PW} usershow test
131}
132
133# Test add user with password expiration as a DD-MM-YYYY date
134atf_test_case user_add_password_expiration_date_numeric
135user_add_password_expiration_date_numeric_body() {
136	populate_etc_skel
137
138	DATE=`date -j -v+1d "+%d-%m-%Y"`
139	EPOCH=`date -j -f "%d-%m-%Y %H:%M:%S" "${DATE} 00:00:00" "+%s"`
140	atf_check -s exit:0 ${PW} useradd test -p ${DATE}
141	atf_check -s exit:0 -o match:"^test:\*:.*::${EPOCH}:0:User &:.*" \
142		${PW} usershow test
143}
144
145# Test add user with password expiration as a DD-MMM-YYYY date
146atf_test_case user_add_password_expiration_date_month
147user_add_password_expiration_date_month_body() {
148	populate_etc_skel
149
150	DATE=`date -j -v+1d "+%d-%b-%Y"`
151	EPOCH=`date -j -f "%d-%b-%Y %H:%M:%S" "${DATE} 00:00:00" "+%s"`
152	atf_check -s exit:0 ${PW} useradd test -p ${DATE}
153	atf_check -s exit:0 -o match:"^test:\*:.*::${EPOCH}:0:User &:.*" \
154		${PW} usershow test
155}
156
157# Test add user with password expiration as a relative date
158atf_test_case user_add_password_expiration_date_relative
159user_add_password_expiration_date_relative_body() {
160	populate_etc_skel
161
162	EPOCH=`date -j -v+13m "+%s"`
163	BUF=`expr $EPOCH + 5`
164	atf_check -s exit:0 ${PW} useradd test -p +13o
165	TIME=`${PW} usershow test | awk -F ':' '{print $6}'`
166	[ ! -z $TIME -a $TIME -ge $EPOCH -a $TIME -lt $BUF ] || \
167		atf_fail "Expiration time($TIME) was not within $EPOCH - $BUF seconds."
168}
169
170atf_test_case user_add_name_too_long
171user_add_name_too_long_body() {
172	populate_etc_skel
173	atf_check -e match:"too long" -s exit:64 \
174		${PW} useradd name_very_vert_very_very_very_long
175}
176
177atf_test_case user_add_name_with_spaces
178user_add_name_with_spaces_body() {
179	populate_etc_skel
180	atf_check -s exit:65 -e match:"invalid character" \
181		  ${PW} useradd 'test user'
182	atf_check -s exit:1 -o empty grep "^test user:.*" $HOME/master.passwd
183	# Try again with -n which uses a slightly different code path.
184	atf_check -s exit:65 -e match:"invalid character" \
185		  ${PW} useradd -n 'test user'
186	atf_check -s exit:1 -o empty grep "^test user:.*" $HOME/master.passwd
187}
188
189atf_test_case user_add_name_with_spaces_and_gid_specified
190user_add_name_with_spaces_and_gid_specified_body() {
191	populate_etc_skel
192	gid=12345
193	user_name="test user"
194	# pw useradd should fail because of the space in the user
195	# name, not because the group doesn't exist.
196	atf_check -s exit:65 -e match:"invalid character" \
197		  ${PW} useradd "${user_name}" -g ${gid}
198	atf_check -s exit:1 -o empty grep "^${user_name}:.*" $HOME/master.passwd
199	# Try again with -n which uses a slightly different code path.
200	atf_check -s exit:65 -e match:"invalid character" \
201		  ${PW} useradd -n "${user_name}" -g ${gid}
202	atf_check -s exit:1 -o empty grep "^${user_name}:.*" $HOME/master.passwd
203	# Make sure the user isn't added even if the group exists
204	atf_check -s exit:0 ${PW} groupadd blafasel -g ${gid}
205	atf_check -s exit:65 -e match:"invalid character" \
206		  ${PW} useradd "${user_name}" -g ${gid}
207	atf_check -s exit:1 -o empty grep "^${user_name}:.*" $HOME/master.passwd
208	# Try again with the -n option.
209	atf_check -s exit:65 -e match:"invalid character" \
210		  ${PW} useradd -n "${user_name}" -g ${gid}
211	atf_check -s exit:1 -o empty grep "^${user_name}:.*" $HOME/master.passwd
212}
213
214atf_test_case user_add_expiration
215user_add_expiration_body() {
216	populate_etc_skel
217
218	atf_check -s exit:0 \
219		${PW} useradd foo -e 20-03-2037
220	atf_check -o inline:"foo:*:1001:1001::0:2121120000:User &:/home/foo:/bin/sh\n" \
221		-s exit:0 grep "^foo" ${HOME}/master.passwd
222	atf_check -s exit:0 ${PW} userdel foo
223	atf_check -s exit:0 \
224		${PW} useradd foo -e 20-03-37
225	atf_check -o inline:"foo:*:1001:1001::0:2121120000:User &:/home/foo:/bin/sh\n" \
226		-s exit:0 grep "^foo" ${HOME}/master.passwd
227	atf_check -s exit:0 ${PW} userdel foo
228	atf_check -s exit:0 \
229		${PW} useradd foo -e 20-Mar-2037
230	atf_check -o inline:"foo:*:1001:1001::0:2121120000:User &:/home/foo:/bin/sh\n" \
231		-s exit:0 grep "^foo" ${HOME}/master.passwd
232	atf_check -s exit:0 ${PW} userdel foo
233	atf_check -e inline:"pw: Invalid date\n" -s exit:1 \
234		${PW} useradd foo -e 20-Foo-2037
235	atf_check -e inline:"pw: Invalid date\n" -s exit:1 \
236		${PW} useradd foo -e 20-13-2037
237	atf_check -s exit:0 ${PW} useradd foo -e "12:00 20-03-2037"
238	atf_check -s exit:0 ${PW} userdel foo
239	atf_check -e inline:"pw: Invalid date\n" -s exit:1 \
240		${PW} useradd foo -e "12 20-03-2037"
241	atf_check -s exit:0 ${PW} useradd foo -e "20-03-2037	12:00"
242	atf_check -s exit:0 ${PW} userdel foo
243}
244
245atf_test_case user_add_invalid_user_entry
246user_add_invalid_user_entry_body() {
247	touch ${HOME}/master.passwd
248	touch ${HOME}/group
249
250	pwd_mkdb -p -d ${HOME} ${HOME}/master.passwd || \
251		atf_fail "generate passwd from master.passwd"
252	atf_check -s exit:0 ${PW} useradd foo
253	echo "foo1:*:1002" >> ${HOME}/master.passwd
254	atf_check -s exit:1 -e match:"Invalid user entry" ${PW} useradd foo2
255}
256
257atf_test_case user_add_invalid_group_entry
258user_add_invalid_group_entry_body() {
259	touch ${HOME}/master.passwd
260	touch ${HOME}/group
261
262	pwd_mkdb -p -d ${HOME} ${HOME}/master.passwd || \
263		atf_fail "generate passwd from master.passwd"
264	atf_check -s exit:0 ${PW} useradd foo
265	echo 'foo1:*:1002' >> group
266	atf_check -s exit:1 -e match:"Invalid group entry" ${PW} useradd foo2
267}
268
269atf_test_case user_add_password_from_h
270user_add_password_from_h_body() {
271	populate_etc_skel
272
273	atf_check -s exit:0 ${PW} useradd foo -h 0 <<-EOF
274	$(echo mypassword)
275	EOF
276	passhash=`awk -F ':' '/^foo:/ {print $2}' $HOME/master.passwd`
277	atf_check -s exit:0 -o inline:$passhash \
278		$(atf_get_srcdir)/crypt $passhash "mypassword"
279}
280
281atf_test_case user_add_R
282user_add_R_body() {
283	populate_root_etc_skel
284
285	atf_check -s exit:0 ${RPW} useradd foo
286	atf_check -s exit:0 ${RPW} useradd bar -m
287	test -d ${HOME}/home || atf_fail "Home parent directory not created"
288	test -d ${HOME}/home/bar || atf_fail "Directory not created"
289	atf_check -s exit:0 ${RPW} userdel bar
290	test -d ${HOME}/home/bar || atf_fail "Directory removed"
291	atf_check -s exit:0 ${RPW} useradd bar
292	atf_check -s exit:0 ${RPW} userdel bar -r
293	[ ! -d ${HOME}/home/bar ] || atf_fail "Directory not removed"
294}
295
296atf_test_case user_add_R_no_symlink
297user_add_R_no_symlink_body() {
298	populate_root_etc_skel
299
300	mkdir ${HOME}/usr
301	atf_check -s exit:0 ${RPW} useradd foo -m
302	[ ! -d ${HOME}/usr/home ] || atf_fail "/usr/home created"
303	test -d ${HOME}/home || atf_fail "/home directory not created"
304}
305
306atf_test_case user_add_R_intermed
307user_add_R_intermed_body() {
308	populate_root_etc_skel
309
310	atf_check -s exit:0 ${RPW} useradd foo -m -d /a/b/c/foo
311	test -d ${HOME}/a/b/c || atf_fail "intermediate directories not created"
312	test -d ${HOME}/a/b/c/foo || atf_fail "user directory not created"
313}
314
315atf_test_case user_add_dir
316user_add_dir_body() {
317	populate_root_etc_skel
318
319	atf_check -s exit:0 ${RPW} useradd foo -M 0705 -m
320	atf_check grep -q '^foo:' $HOME/etc/master.passwd
321	atf_check test -d ${HOME}/home/foo
322	atf_check -o save:ugid \
323	      awk -F: '$1 == "foo" { print $3, $4 }' \
324	      $HOME/etc/master.passwd
325	atf_check -o file:ugid \
326	    stat -f '%u %g' ${HOME}/home/foo
327	atf_check -o inline:"40705\n" \
328	    stat -f '%p' ${HOME}/home/foo
329}
330
331atf_test_case user_add_existing_dir
332user_add_existing_dir_body() {
333	populate_root_etc_skel
334
335	mkdir -p -m 0777 ${HOME}/home/foo
336	atf_check -o inline:"40777\n" \
337	    stat -f '%p' ${HOME}/home/foo
338
339	atf_check -s exit:0 ${RPW} useradd foo -M 0705 -m
340	atf_check grep -q '^foo:' $HOME/etc/master.passwd
341	atf_check test -d ${HOME}/home/foo
342	atf_check -o inline:"40705\n" \
343	    stat -f '%p' ${HOME}/home/foo
344}
345
346atf_test_case user_add_skel
347user_add_skel_body() {
348	populate_root_etc_skel
349
350	mkdir ${HOME}/skel
351	echo "a" > ${HOME}/skel/.a
352	echo "b" > ${HOME}/skel/b
353	mkdir ${HOME}/skel/c
354	mkdir ${HOME}/skel/c/d
355	mkdir ${HOME}/skel/dot.plop
356	echo "c" > ${HOME}/skel/c/d/dot.c
357	mkdir ${HOME}/home
358	ln -sf /nonexistent ${HOME}/skel/c/foo
359	atf_check -s exit:0 ${RPW} -M METALOG useradd foo -k /skel -m
360	test -d ${HOME}/home/foo || atf_fail "Directory not created"
361	test -f ${HOME}/home/foo/.a || atf_fail "File not created"
362	atf_check -o file:${HOME}/skel/.a -s exit:0 cat ${HOME}/home/foo/.a
363	atf_check -o file:${HOME}/skel/b -s exit:0 cat ${HOME}/home/foo/b
364	test -d ${HOME}/home/foo/c || atf_fail "Directory in skel not copied"
365	test -d ${HOME}/home/foo/.plop || atf_fail "Dotted directory in skel not created"
366	atf_check -o inline:"/nonexistent\n" -s ignore readlink -f ${HOME}/home/foo/c/foo
367	atf_check -o file:${HOME}/skel/c/d/dot.c -s exit:0 cat ${HOME}/home/foo/c/d/.c
368
369	cat <<__EOF__ >METALOG.expected
370./home/foo type=dir mode=0755 uid=1001 gid=1001
371./home/foo/.a type=file mode=0644 uid=1001 gid=1001
372./home/foo/.plop type=dir mode=0755 uid=1001 gid=1001
373./home/foo/b type=file mode=0644 uid=1001 gid=1001
374./home/foo/c type=dir mode=0755 uid=1001 gid=1001
375./home/foo/c/d type=dir mode=0755 uid=1001 gid=1001
376./home/foo/c/d/.c type=file mode=0644 uid=1001 gid=1001
377./home/foo/c/foo type=link mode=0755 uid=1001 gid=1001 link=/nonexistent
378__EOF__
379	atf_check -o save:METALOG.out sort METALOG
380	atf_check diff METALOG.out METALOG.expected
381}
382
383atf_test_case user_add_uid0
384user_add_uid0_body() {
385	populate_etc_skel
386	atf_check -e inline:"pw: WARNING: new account \`foo' has a uid of 0 (superuser access!)\n" \
387		-s exit:0 ${PW} useradd foo -u 0 -g 0 -d /root -s /bin/sh -c "Bourne-again Superuser" -o
388	atf_check \
389		-o inline:"foo:*:0:0::0:0:Bourne-again Superuser:/root:/bin/sh\n" \
390		-s exit:0 ${PW} usershow foo
391}
392
393atf_test_case user_add_uid_too_large
394user_add_uid_too_large_body() {
395	populate_etc_skel
396	atf_check -s exit:64 -e inline:"pw: Bad id '9999999999999': too large\n" \
397		${PW} useradd -n test1 -u 9999999999999
398}
399
400atf_test_case user_add_bad_shell
401user_add_bad_shell_body() {
402	populate_etc_skel
403
404	atf_check -s exit:0 ${PW} useradd foo -s sh
405	atf_check -s exit:78 -e ignore ${PW} useradd bar -s badshell
406}
407
408atf_test_case user_add_already_exists
409user_add_already_exists_body() {
410	populate_etc_skel
411
412	atf_check -s exit:0 ${PW} useradd foo
413	atf_check -s exit:65 \
414		-e inline:"pw: login name \`foo' already exists\n" \
415		${PW} useradd foo
416}
417
418atf_test_case user_add_w_error
419user_add_w_error_body() {
420	populate_etc_skel
421
422	atf_check -s exit:1 -e match:"pw: Invalid value for default password" \
423		${PW} useradd foo -w invalid_value
424}
425
426atf_test_case user_add_w_no
427user_add_w_no_body() {
428	populate_etc_skel
429
430	atf_check -s exit:0 ${PW} useradd foo -w no
431	atf_check -s exit:0 -o match:"^foo:\*" grep "^foo:" $HOME/master.passwd
432}
433
434atf_test_case user_add_w_none
435user_add_w_none_body() {
436	populate_etc_skel
437
438	atf_check -s exit:0 ${PW} useradd foo -w none
439	atf_check -s exit:0 -o match:"^foo::" grep "^foo:" $HOME/master.passwd
440}
441
442atf_test_case user_add_w_random
443user_add_w_random_body() {
444	populate_etc_skel
445
446	password=`${PW} useradd foo -w random | cat`
447	passhash=`awk -F ':' '/^foo:/ {print $2}' $HOME/master.passwd`
448	atf_check -s exit:0 -o inline:$passhash \
449		$(atf_get_srcdir)/crypt $passhash "$password"
450}
451
452atf_test_case user_add_w_yes
453user_add_w_yes_body() {
454	populate_etc_skel
455	password=`${PW} useradd foo -w random | cat`
456	passhash=`awk -F ':' '/^foo:/ {print $2}' $HOME/master.passwd`
457	atf_check -s exit:0 -o inline:$passhash \
458		$(atf_get_srcdir)/crypt $passhash "$password"
459}
460
461atf_test_case user_add_with_pw_conf
462user_add_with_pw_conf_body()
463{
464	populate_etc_skel
465	atf_check -s exit:0 \
466		${PW} useradd -D -C ${HOME}/pw.conf \
467		-u 2000,32767 -i 2000,32767
468	atf_check -s exit:0 \
469		-o inline:"minuid = 2000\nmaxuid = 32767\nmingid = 2000\nmaxgid = 32767\n" \
470		grep "^m.*id =" ${HOME}/pw.conf
471	atf_check -s exit:0 \
472		${PW} useradd foo -C ${HOME}/pw.conf
473}
474
475atf_test_case user_add_defaultgroup
476user_add_defaultgroup_body()
477{
478	populate_etc_skel
479	echo 'defaultgroup = "plop"' > ${HOME}/pw.conf
480	atf_check -s exit:0 \
481		${PW} groupadd plop -g 442
482	atf_check -s exit:0 \
483		${PW} useradd foo -C ${HOME}/pw.conf
484	atf_check -s exit:0 \
485		-o inline:"foo:*:1001:442::0:0:User &:/home/foo:/bin/sh\n" \
486		${PW} usershow foo
487}
488
489atf_test_case user_add_conf_defaultpasswd
490user_add_conf_defaultpasswd_body()
491{
492	populate_etc_skel
493
494	atf_check -s exit:0 ${PW} useradd -D -w no
495	atf_check -o inline:"defaultpasswd = \"no\"\n" \
496	    grep defaultpasswd ${HOME}/pw.conf
497	atf_check -s exit:0 ${PW} useradd -D -w none
498	atf_check -o inline:"defaultpasswd = \"none\"\n" \
499	    grep defaultpasswd ${HOME}/pw.conf
500	atf_check -s exit:0 ${PW} useradd -D -w random
501	atf_check -o inline:"defaultpasswd = \"random\"\n" \
502	    grep defaultpasswd ${HOME}/pw.conf
503	atf_check -s exit:0 ${PW} useradd -D -w yes
504	atf_check -o inline:"defaultpasswd = \"yes\"\n" \
505	    grep defaultpasswd ${HOME}/pw.conf
506}
507
508atf_test_case user_add_existing_login_group
509user_add_existing_login_group_body()
510{
511	populate_etc_skel
512
513	atf_check -s exit:0 ${PW} groupadd testuser
514	atf_check -s exit:0 ${PW} useradd user1 -G testuser
515	atf_check -s exit:0 ${PW} useradd testuser
516	atf_check -o match:"1" \
517	    sh -c "grep testuser ${HOME}/group | wc -l"
518}
519
520atf_test_case user_add_already_in_group
521user_add_already_in_group_body()
522{
523	populate_etc_skel
524
525	echo "testgroup:*:4242:testuser" >> ${HOME}/group
526	atf_check -s exit:0 ${PW} useradd testuser -G testgroup
527	atf_check -o not-match:"testuser,testuser" \
528		grep testuser ${HOME}/group
529}
530
531atf_init_test_cases() {
532	atf_add_test_case user_add
533	atf_add_test_case user_add_noupdate
534	atf_add_test_case user_add_comments
535	atf_add_test_case user_add_comments_noupdate
536	atf_add_test_case user_add_comments_invalid
537	atf_add_test_case user_add_comments_invalid_noupdate
538	atf_add_test_case user_add_homedir
539	atf_add_test_case user_add_account_expiration_epoch
540	atf_add_test_case user_add_account_expiration_date_numeric
541	atf_add_test_case user_add_account_expiration_date_month
542	atf_add_test_case user_add_account_expiration_date_relative
543	atf_add_test_case user_add_password_expiration_epoch
544	atf_add_test_case user_add_password_expiration_date_numeric
545	atf_add_test_case user_add_password_expiration_date_month
546	atf_add_test_case user_add_password_expiration_date_relative
547	atf_add_test_case user_add_name_too_long
548	atf_add_test_case user_add_name_with_spaces
549	atf_add_test_case user_add_name_with_spaces_and_gid_specified
550	atf_add_test_case user_add_expiration
551	atf_add_test_case user_add_invalid_user_entry
552	atf_add_test_case user_add_invalid_group_entry
553	atf_add_test_case user_add_password_from_h
554	atf_add_test_case user_add_R
555	atf_add_test_case user_add_R_no_symlink
556	atf_add_test_case user_add_R_intermed
557	atf_add_test_case user_add_dir
558	atf_add_test_case user_add_existing_dir
559	atf_add_test_case user_add_skel
560	atf_add_test_case user_add_uid0
561	atf_add_test_case user_add_uid_too_large
562	atf_add_test_case user_add_bad_shell
563	atf_add_test_case user_add_already_exists
564	atf_add_test_case user_add_w_error
565	atf_add_test_case user_add_w_no
566	atf_add_test_case user_add_w_none
567	atf_add_test_case user_add_w_random
568	atf_add_test_case user_add_w_yes
569	atf_add_test_case user_add_with_pw_conf
570	atf_add_test_case user_add_defaultgroup
571
572	atf_add_test_case user_add_conf_defaultpasswd
573	atf_add_test_case user_add_existing_login_group
574	atf_add_test_case user_add_already_in_group
575}
576