1168754Sbushman/*-
2168754Sbushman * Copyright (c) 2006 Michael Bushkov <bushman@freebsd.org>
3251867Seadler * All rights reserved.
4168754Sbushman *
5168754Sbushman * Redistribution and use in source and binary forms, with or without
6168754Sbushman * modification, are permitted provided that the following conditions
7168754Sbushman * are met:
8168754Sbushman * 1. Redistributions of source code must retain the above copyright
9168754Sbushman *    notice, this list of conditions and the following disclaimer.
10168754Sbushman * 2. Redistributions in binary form must reproduce the above copyright
11168754Sbushman *    notice, this list of conditions and the following disclaimer in the
12168754Sbushman *    documentation and/or other materials provided with the distribution.
13168754Sbushman *
14168754Sbushman * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15168754Sbushman * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16168754Sbushman * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17168754Sbushman * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18168754Sbushman * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19168754Sbushman * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20168754Sbushman * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21168754Sbushman * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22168754Sbushman * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23168754Sbushman * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24168754Sbushman * SUCH DAMAGE.
25168754Sbushman *
26168754Sbushman */
27168754Sbushman
28168754Sbushman#include <sys/cdefs.h>
29168754Sbushman__FBSDID("$FreeBSD: stable/10/lib/libc/tests/nss/getpw_test.c 319298 2017-05-31 08:30:37Z ngie $");
30168754Sbushman
31168754Sbushman#include <errno.h>
32168754Sbushman#include <pwd.h>
33168754Sbushman#include <stdio.h>
34168754Sbushman#include <stdlib.h>
35168754Sbushman#include <string.h>
36168754Sbushman#include <unistd.h>
37292323Sngie
38292323Sngie#include <atf-c.h>
39292323Sngie
40168754Sbushman#include "testutil.h"
41168754Sbushman
42168754Sbushmanenum test_methods {
43168754Sbushman	TEST_GETPWENT,
44168754Sbushman	TEST_GETPWNAM,
45168754Sbushman	TEST_GETPWUID,
46168754Sbushman	TEST_GETPWENT_2PASS,
47168754Sbushman	TEST_BUILD_SNAPSHOT
48168754Sbushman};
49168754Sbushman
50168754SbushmanDECLARE_TEST_DATA(passwd)
51168754SbushmanDECLARE_TEST_FILE_SNAPSHOT(passwd)
52168754SbushmanDECLARE_1PASS_TEST(passwd)
53168754SbushmanDECLARE_2PASS_TEST(passwd)
54168754Sbushman
55168754Sbushmanstatic void clone_passwd(struct passwd *, struct passwd const *);
56168754Sbushmanstatic int compare_passwd(struct passwd *, struct passwd *, void *);
57168754Sbushmanstatic void free_passwd(struct passwd *);
58168754Sbushman
59168754Sbushmanstatic void sdump_passwd(struct passwd *, char *, size_t);
60319298Sngie#ifdef DEBUG
61168754Sbushmanstatic void dump_passwd(struct passwd *);
62319298Sngie#endif
63168754Sbushman
64168754Sbushmanstatic int passwd_read_snapshot_func(struct passwd *, char *);
65168754Sbushman
66168754Sbushmanstatic int passwd_check_ambiguity(struct passwd_test_data *, struct passwd *);
67168754Sbushmanstatic int passwd_fill_test_data(struct passwd_test_data *);
68168754Sbushmanstatic int passwd_test_correctness(struct passwd *, void *);
69168754Sbushmanstatic int passwd_test_getpwnam(struct passwd *, void *);
70168754Sbushmanstatic int passwd_test_getpwuid(struct passwd *, void *);
71168754Sbushmanstatic int passwd_test_getpwent(struct passwd *, void *);
72291363Sngie
73168754SbushmanIMPLEMENT_TEST_DATA(passwd)
74168754SbushmanIMPLEMENT_TEST_FILE_SNAPSHOT(passwd)
75168754SbushmanIMPLEMENT_1PASS_TEST(passwd)
76168754SbushmanIMPLEMENT_2PASS_TEST(passwd)
77168754Sbushman
78291363Sngiestatic void
79168754Sbushmanclone_passwd(struct passwd *dest, struct passwd const *src)
80168754Sbushman{
81292323Sngie	ATF_REQUIRE(dest != NULL);
82292323Sngie	ATF_REQUIRE(src != NULL);
83291363Sngie
84168754Sbushman	memcpy(dest, src, sizeof(struct passwd));
85168754Sbushman	if (src->pw_name != NULL)
86168754Sbushman		dest->pw_name = strdup(src->pw_name);
87168754Sbushman	if (src->pw_passwd != NULL)
88168754Sbushman		dest->pw_passwd = strdup(src->pw_passwd);
89168754Sbushman	if (src->pw_class != NULL)
90168754Sbushman		dest->pw_class = strdup(src->pw_class);
91168754Sbushman	if (src->pw_gecos != NULL)
92168754Sbushman		dest->pw_gecos = strdup(src->pw_gecos);
93168754Sbushman	if (src->pw_dir != NULL)
94168754Sbushman		dest->pw_dir = strdup(src->pw_dir);
95168754Sbushman	if (src->pw_shell != NULL)
96168754Sbushman		dest->pw_shell = strdup(dest->pw_shell);
97168754Sbushman}
98168754Sbushman
99291363Sngiestatic int
100319298Sngiecompare_passwd(struct passwd *pwd1, struct passwd *pwd2, void *mdata __unused)
101168754Sbushman{
102292323Sngie	ATF_REQUIRE(pwd1 != NULL);
103292323Sngie	ATF_REQUIRE(pwd2 != NULL);
104291363Sngie
105168754Sbushman	if (pwd1 == pwd2)
106168754Sbushman		return (0);
107291363Sngie
108292323Sngie	if (pwd1->pw_uid != pwd2->pw_uid ||
109292323Sngie	    pwd1->pw_gid != pwd2->pw_gid ||
110292323Sngie	    pwd1->pw_change != pwd2->pw_change ||
111292323Sngie	    pwd1->pw_expire != pwd2->pw_expire ||
112292323Sngie	    pwd1->pw_fields != pwd2->pw_fields ||
113292323Sngie	    strcmp(pwd1->pw_name, pwd2->pw_name) != 0 ||
114292323Sngie	    strcmp(pwd1->pw_passwd, pwd2->pw_passwd) != 0 ||
115292323Sngie	    strcmp(pwd1->pw_class, pwd2->pw_class) != 0 ||
116292323Sngie	    strcmp(pwd1->pw_gecos, pwd2->pw_gecos) != 0 ||
117292323Sngie	    strcmp(pwd1->pw_dir, pwd2->pw_dir) != 0 ||
118292323Sngie	    strcmp(pwd1->pw_shell, pwd2->pw_shell) != 0)
119168754Sbushman		return (-1);
120168754Sbushman	else
121168754Sbushman		return (0);
122168754Sbushman}
123168754Sbushman
124291363Sngiestatic void
125168754Sbushmanfree_passwd(struct passwd *pwd)
126168754Sbushman{
127168754Sbushman	free(pwd->pw_name);
128168754Sbushman	free(pwd->pw_passwd);
129168754Sbushman	free(pwd->pw_class);
130168754Sbushman	free(pwd->pw_gecos);
131168754Sbushman	free(pwd->pw_dir);
132168754Sbushman	free(pwd->pw_shell);
133168754Sbushman}
134168754Sbushman
135291363Sngiestatic void
136168754Sbushmansdump_passwd(struct passwd *pwd, char *buffer, size_t buflen)
137168754Sbushman{
138292323Sngie	snprintf(buffer, buflen, "%s:%s:%d:%d:%jd:%s:%s:%s:%s:%jd:%d",
139292323Sngie	    pwd->pw_name, pwd->pw_passwd, pwd->pw_uid, pwd->pw_gid,
140292323Sngie	    (uintmax_t)pwd->pw_change, pwd->pw_class, pwd->pw_gecos,
141292323Sngie	    pwd->pw_dir, pwd->pw_shell, (uintmax_t)pwd->pw_expire,
142292323Sngie	    pwd->pw_fields);
143168754Sbushman}
144168754Sbushman
145319298Sngie#ifdef DEBUG
146168754Sbushmanstatic void
147168754Sbushmandump_passwd(struct passwd *pwd)
148168754Sbushman{
149168754Sbushman	if (pwd != NULL) {
150168754Sbushman		char buffer[2048];
151168754Sbushman		sdump_passwd(pwd, buffer, sizeof(buffer));
152168754Sbushman		printf("%s\n", buffer);
153168754Sbushman	} else
154168754Sbushman		printf("(null)\n");
155168754Sbushman}
156319298Sngie#endif
157168754Sbushman
158291363Sngiestatic int
159168754Sbushmanpasswd_read_snapshot_func(struct passwd *pwd, char *line)
160168754Sbushman{
161168754Sbushman	char *s, *ps, *ts;
162168754Sbushman	int i;
163168754Sbushman
164292323Sngie#ifdef DEBUG
165292323Sngie	printf("1 line read from snapshot:\n%s\n", line);
166292323Sngie#endif
167291363Sngie
168168754Sbushman	i = 0;
169168754Sbushman	ps = line;
170168754Sbushman	memset(pwd, 0, sizeof(struct passwd));
171292323Sngie	while ((s = strsep(&ps, ":")) != NULL) {
172168754Sbushman		switch (i) {
173292323Sngie		case 0:
174292323Sngie			pwd->pw_name = strdup(s);
175292323Sngie			ATF_REQUIRE(pwd->pw_name != NULL);
176168754Sbushman			break;
177292323Sngie		case 1:
178292323Sngie			pwd->pw_passwd = strdup(s);
179292323Sngie			ATF_REQUIRE(pwd->pw_passwd != NULL);
180168754Sbushman			break;
181292323Sngie		case 2:
182292323Sngie			pwd->pw_uid = (uid_t)strtol(s, &ts, 10);
183292323Sngie			if (*ts != '\0')
184292323Sngie				goto fin;
185168754Sbushman			break;
186292323Sngie		case 3:
187292323Sngie			pwd->pw_gid = (gid_t)strtol(s, &ts, 10);
188292323Sngie			if (*ts != '\0')
189292323Sngie				goto fin;
190168754Sbushman			break;
191292323Sngie		case 4:
192292323Sngie			pwd->pw_change = (time_t)strtol(s, &ts, 10);
193292323Sngie			if (*ts != '\0')
194292323Sngie				goto fin;
195168754Sbushman			break;
196292323Sngie		case 5:
197292323Sngie			pwd->pw_class = strdup(s);
198292323Sngie			ATF_REQUIRE(pwd->pw_class != NULL);
199168754Sbushman			break;
200292323Sngie		case 6:
201292323Sngie			pwd->pw_gecos = strdup(s);
202292323Sngie			ATF_REQUIRE(pwd->pw_gecos != NULL);
203168754Sbushman			break;
204292323Sngie		case 7:
205292323Sngie			pwd->pw_dir = strdup(s);
206292323Sngie			ATF_REQUIRE(pwd->pw_dir != NULL);
207168754Sbushman			break;
208292323Sngie		case 8:
209292323Sngie			pwd->pw_shell = strdup(s);
210292323Sngie			ATF_REQUIRE(pwd->pw_shell != NULL);
211168754Sbushman			break;
212292323Sngie		case 9:
213292323Sngie			pwd->pw_expire = (time_t)strtol(s, &ts, 10);
214292323Sngie			if (*ts != '\0')
215292323Sngie				goto fin;
216168754Sbushman			break;
217292323Sngie		case 10:
218292323Sngie			pwd->pw_fields = (int)strtol(s, &ts, 10);
219292323Sngie			if (*ts != '\0')
220292323Sngie				goto fin;
221168754Sbushman			break;
222292323Sngie		default:
223291363Sngie			break;
224292323Sngie		}
225168754Sbushman		++i;
226168754Sbushman	}
227168754Sbushman
228168754Sbushmanfin:
229168754Sbushman	if (i != 11) {
230168754Sbushman		free_passwd(pwd);
231168754Sbushman		memset(pwd, 0, sizeof(struct passwd));
232168754Sbushman		return (-1);
233168754Sbushman	}
234291363Sngie
235168754Sbushman	return (0);
236168754Sbushman}
237168754Sbushman
238168754Sbushmanstatic int
239168754Sbushmanpasswd_fill_test_data(struct passwd_test_data *td)
240168754Sbushman{
241168754Sbushman	struct passwd *pwd;
242291363Sngie
243168754Sbushman	setpassent(1);
244168754Sbushman	while ((pwd = getpwent()) != NULL) {
245168754Sbushman		if (passwd_test_correctness(pwd, NULL) == 0)
246168754Sbushman			TEST_DATA_APPEND(passwd, td, pwd);
247168754Sbushman		else
248168754Sbushman			return (-1);
249168754Sbushman	}
250168754Sbushman	endpwent();
251291363Sngie
252168754Sbushman	return (0);
253168754Sbushman}
254168754Sbushman
255168754Sbushmanstatic int
256319298Sngiepasswd_test_correctness(struct passwd *pwd, void *mdata __unused)
257168754Sbushman{
258291363Sngie
259292323Sngie#ifdef DEBUG
260292323Sngie	printf("testing correctness with the following data:\n");
261292323Sngie	dump_passwd(pwd);
262292323Sngie#endif
263292323Sngie
264168754Sbushman	if (pwd == NULL)
265291363Sngie		return (-1);
266168754Sbushman
267168754Sbushman	if (pwd->pw_name == NULL)
268168754Sbushman		goto errfin;
269168754Sbushman
270168754Sbushman	if (pwd->pw_passwd == NULL)
271168754Sbushman		goto errfin;
272168754Sbushman
273168754Sbushman	if (pwd->pw_class == NULL)
274168754Sbushman		goto errfin;
275168754Sbushman
276168754Sbushman	if (pwd->pw_gecos == NULL)
277168754Sbushman		goto errfin;
278168754Sbushman
279168754Sbushman	if (pwd->pw_dir == NULL)
280168754Sbushman		goto errfin;
281168754Sbushman
282168754Sbushman	if (pwd->pw_shell == NULL)
283168754Sbushman		goto errfin;
284291363Sngie
285292323Sngie#ifdef DEBUG
286292323Sngie	printf("correct\n");
287292323Sngie#endif
288291363Sngie
289291363Sngie	return (0);
290168754Sbushmanerrfin:
291292323Sngie#ifdef DEBUG
292292323Sngie	printf("incorrect\n");
293292323Sngie#endif
294291363Sngie
295168754Sbushman	return (-1);
296168754Sbushman}
297168754Sbushman
298168754Sbushman/* passwd_check_ambiguity() is needed here because when doing the getpwent()
299291363Sngie * calls sequence, records from different nsswitch sources can be different,
300168754Sbushman * though having the same pw_name/pw_uid */
301168754Sbushmanstatic int
302168754Sbushmanpasswd_check_ambiguity(struct passwd_test_data *td, struct passwd *pwd)
303168754Sbushman{
304291363Sngie
305168754Sbushman	return (TEST_DATA_FIND(passwd, td, pwd, compare_passwd,
306168754Sbushman		NULL) != NULL ? 0 : -1);
307168754Sbushman}
308168754Sbushman
309168754Sbushmanstatic int
310168754Sbushmanpasswd_test_getpwnam(struct passwd *pwd_model, void *mdata)
311168754Sbushman{
312168754Sbushman	struct passwd *pwd;
313291363Sngie
314292323Sngie#ifdef DEBUG
315292323Sngie	printf("testing getpwnam() with the following data:\n");
316292323Sngie	dump_passwd(pwd_model);
317292323Sngie#endif
318168754Sbushman
319168754Sbushman	pwd = getpwnam(pwd_model->pw_name);
320168754Sbushman	if (passwd_test_correctness(pwd, NULL) != 0)
321168754Sbushman		goto errfin;
322291363Sngie
323168754Sbushman	if ((compare_passwd(pwd, pwd_model, NULL) != 0) &&
324291363Sngie	    (passwd_check_ambiguity((struct passwd_test_data *)mdata, pwd)
325168754Sbushman	    !=0))
326168754Sbushman	    goto errfin;
327291363Sngie
328292323Sngie#ifdef DEBUG
329292323Sngie	printf("ok\n");
330292323Sngie#endif
331168754Sbushman	return (0);
332291363Sngie
333168754Sbushmanerrfin:
334292323Sngie#ifdef DEBUG
335292323Sngie	printf("not ok\n");
336292323Sngie#endif
337168754Sbushman	return (-1);
338168754Sbushman}
339168754Sbushman
340168754Sbushmanstatic int
341168754Sbushmanpasswd_test_getpwuid(struct passwd *pwd_model, void *mdata)
342168754Sbushman{
343168754Sbushman	struct passwd *pwd;
344291363Sngie
345292323Sngie#ifdef DEBUG
346292323Sngie	printf("testing getpwuid() with the following data...\n");
347292323Sngie	dump_passwd(pwd_model);
348292323Sngie#endif
349291363Sngie
350168754Sbushman	pwd = getpwuid(pwd_model->pw_uid);
351291363Sngie	if ((passwd_test_correctness(pwd, NULL) != 0) ||
352168754Sbushman	    ((compare_passwd(pwd, pwd_model, NULL) != 0) &&
353168754Sbushman	    (passwd_check_ambiguity((struct passwd_test_data *)mdata, pwd)
354168754Sbushman	    != 0))) {
355292323Sngie#ifdef DEBUG
356168754Sbushman		printf("not ok\n");
357292323Sngie#endif
358292323Sngie		return (-1);
359168754Sbushman	} else {
360292323Sngie#ifdef DEBUG
361168754Sbushman		printf("ok\n");
362292323Sngie#endif
363292323Sngie		return (0);
364168754Sbushman	}
365168754Sbushman}
366168754Sbushman
367291363Sngiestatic int
368319298Sngiepasswd_test_getpwent(struct passwd *pwd, void *mdata __unused)
369168754Sbushman{
370168754Sbushman	/* Only correctness can be checked when doing 1-pass test for
371168754Sbushman	 * getpwent(). */
372168754Sbushman	return (passwd_test_correctness(pwd, NULL));
373168754Sbushman}
374168754Sbushman
375292323Sngiestatic int
376292323Sngierun_tests(const char *snapshot_file, enum test_methods method)
377168754Sbushman{
378168754Sbushman	struct passwd_test_data td, td_snap, td_2pass;
379168754Sbushman	int rv;
380291363Sngie
381168754Sbushman	TEST_DATA_INIT(passwd, &td, clone_passwd, free_passwd);
382168754Sbushman	TEST_DATA_INIT(passwd, &td_snap, clone_passwd, free_passwd);
383168754Sbushman	if (snapshot_file != NULL) {
384291363Sngie		if (access(snapshot_file, W_OK | R_OK) != 0) {
385168754Sbushman			if (errno == ENOENT)
386168754Sbushman				method = TEST_BUILD_SNAPSHOT;
387168754Sbushman			else {
388292323Sngie				printf("can't access the file %s\n",
389292323Sngie				    snapshot_file);
390168754Sbushman				rv = -1;
391168754Sbushman				goto fin;
392168754Sbushman			}
393168754Sbushman		} else {
394168754Sbushman			if (method == TEST_BUILD_SNAPSHOT) {
395168754Sbushman				rv = 0;
396168754Sbushman				goto fin;
397168754Sbushman			}
398291363Sngie
399168754Sbushman			TEST_SNAPSHOT_FILE_READ(passwd, snapshot_file,
400168754Sbushman				&td_snap, passwd_read_snapshot_func);
401168754Sbushman		}
402168754Sbushman	}
403291363Sngie
404168754Sbushman	rv = passwd_fill_test_data(&td);
405168754Sbushman	if (rv == -1)
406168754Sbushman		return (-1);
407291363Sngie
408168754Sbushman	switch (method) {
409168754Sbushman	case TEST_GETPWNAM:
410168754Sbushman		if (snapshot_file == NULL)
411168754Sbushman			rv = DO_1PASS_TEST(passwd, &td,
412168754Sbushman				passwd_test_getpwnam, (void *)&td);
413168754Sbushman		else
414291363Sngie			rv = DO_1PASS_TEST(passwd, &td_snap,
415168754Sbushman				passwd_test_getpwnam, (void *)&td_snap);
416168754Sbushman		break;
417168754Sbushman	case TEST_GETPWUID:
418168754Sbushman		if (snapshot_file == NULL)
419168754Sbushman			rv = DO_1PASS_TEST(passwd, &td,
420168754Sbushman				passwd_test_getpwuid, (void *)&td);
421168754Sbushman		else
422291363Sngie			rv = DO_1PASS_TEST(passwd, &td_snap,
423168754Sbushman				passwd_test_getpwuid, (void *)&td_snap);
424168754Sbushman		break;
425168754Sbushman	case TEST_GETPWENT:
426168754Sbushman		if (snapshot_file == NULL)
427168754Sbushman			rv = DO_1PASS_TEST(passwd, &td, passwd_test_getpwent,
428168754Sbushman				(void *)&td);
429168754Sbushman		else
430168754Sbushman			rv = DO_2PASS_TEST(passwd, &td, &td_snap,
431168754Sbushman				compare_passwd, NULL);
432168754Sbushman		break;
433168754Sbushman	case TEST_GETPWENT_2PASS:
434292323Sngie		TEST_DATA_INIT(passwd, &td_2pass, clone_passwd, free_passwd);
435292323Sngie		rv = passwd_fill_test_data(&td_2pass);
436292323Sngie		if (rv != -1)
437292323Sngie			rv = DO_2PASS_TEST(passwd, &td, &td_2pass,
438292323Sngie			    compare_passwd, NULL);
439292323Sngie		TEST_DATA_DESTROY(passwd, &td_2pass);
440168754Sbushman		break;
441168754Sbushman	case TEST_BUILD_SNAPSHOT:
442168754Sbushman		if (snapshot_file != NULL)
443292323Sngie			rv = TEST_SNAPSHOT_FILE_WRITE(passwd, snapshot_file,
444292323Sngie			    &td, sdump_passwd);
445168754Sbushman		break;
446168754Sbushman	default:
447168754Sbushman		rv = 0;
448168754Sbushman		break;
449292323Sngie	}
450168754Sbushman
451168754Sbushmanfin:
452168754Sbushman	TEST_DATA_DESTROY(passwd, &td_snap);
453168754Sbushman	TEST_DATA_DESTROY(passwd, &td);
454292323Sngie
455168754Sbushman	return (rv);
456168754Sbushman}
457292323Sngie
458292323Sngie#define	SNAPSHOT_FILE	"snapshot_pwd"
459292323Sngie
460292323SngieATF_TC_WITHOUT_HEAD(build_snapshot);
461292323SngieATF_TC_BODY(build_snapshot, tc)
462292323Sngie{
463292323Sngie
464292323Sngie	ATF_REQUIRE(run_tests(SNAPSHOT_FILE, TEST_BUILD_SNAPSHOT) == 0);
465292323Sngie}
466292323Sngie
467292323SngieATF_TC_WITHOUT_HEAD(getpwent);
468292323SngieATF_TC_BODY(getpwent, tc)
469292323Sngie{
470292323Sngie
471292323Sngie	ATF_REQUIRE(run_tests(SNAPSHOT_FILE, TEST_GETPWENT) == 0);
472292323Sngie}
473292323Sngie
474292323SngieATF_TC_WITHOUT_HEAD(getpwent_with_snapshot);
475292323SngieATF_TC_BODY(getpwent_with_snapshot, tc)
476292323Sngie{
477292323Sngie
478292323Sngie	ATF_REQUIRE(run_tests(SNAPSHOT_FILE, TEST_BUILD_SNAPSHOT) == 0);
479292323Sngie	ATF_REQUIRE(run_tests(SNAPSHOT_FILE, TEST_GETPWENT) == 0);
480292323Sngie}
481292323Sngie
482292323SngieATF_TC_WITHOUT_HEAD(getpwent_with_two_pass);
483292323SngieATF_TC_BODY(getpwent_with_two_pass, tc)
484292323Sngie{
485292323Sngie
486292323Sngie	ATF_REQUIRE(run_tests(SNAPSHOT_FILE, TEST_GETPWENT_2PASS) == 0);
487292323Sngie}
488292323Sngie
489292323SngieATF_TC_WITHOUT_HEAD(getpwnam);
490292323SngieATF_TC_BODY(getpwnam, tc)
491292323Sngie{
492292323Sngie
493292323Sngie	ATF_REQUIRE(run_tests(SNAPSHOT_FILE, TEST_GETPWNAM) == 0);
494292323Sngie}
495292323Sngie
496292323SngieATF_TC_WITHOUT_HEAD(getpwnam_with_snapshot);
497292323SngieATF_TC_BODY(getpwnam_with_snapshot, tc)
498292323Sngie{
499292323Sngie
500292323Sngie	ATF_REQUIRE(run_tests(SNAPSHOT_FILE, TEST_BUILD_SNAPSHOT) == 0);
501292323Sngie	ATF_REQUIRE(run_tests(SNAPSHOT_FILE, TEST_GETPWNAM) == 0);
502292323Sngie}
503292323Sngie
504292323SngieATF_TC_WITHOUT_HEAD(getpwuid);
505292323SngieATF_TC_BODY(getpwuid, tc)
506292323Sngie{
507292323Sngie
508292323Sngie	ATF_REQUIRE(run_tests(SNAPSHOT_FILE, TEST_GETPWUID) == 0);
509292323Sngie}
510292323Sngie
511292323SngieATF_TC_WITHOUT_HEAD(getpwuid_with_snapshot);
512292323SngieATF_TC_BODY(getpwuid_with_snapshot, tc)
513292323Sngie{
514292323Sngie
515292323Sngie	ATF_REQUIRE(run_tests(SNAPSHOT_FILE, TEST_BUILD_SNAPSHOT) == 0);
516292323Sngie	ATF_REQUIRE(run_tests(SNAPSHOT_FILE, TEST_GETPWUID) == 0);
517292323Sngie}
518292323Sngie
519292323SngieATF_TP_ADD_TCS(tp)
520292323Sngie{
521292323Sngie
522292323Sngie	ATF_TP_ADD_TC(tp, build_snapshot);
523292323Sngie	ATF_TP_ADD_TC(tp, getpwent);
524292323Sngie	ATF_TP_ADD_TC(tp, getpwent_with_snapshot);
525292323Sngie	ATF_TP_ADD_TC(tp, getpwent_with_two_pass);
526292323Sngie	ATF_TP_ADD_TC(tp, getpwnam);
527292323Sngie	ATF_TP_ADD_TC(tp, getpwnam_with_snapshot);
528292323Sngie	ATF_TP_ADD_TC(tp, getpwuid);
529292323Sngie	ATF_TP_ADD_TC(tp, getpwuid_with_snapshot);
530292323Sngie
531292323Sngie	return (atf_no_error());
532292323Sngie}
533