xref: /netbsd-src/tests/lib/libc/stdio/t_fputc.c (revision 6629be1b13d2c23836fe2b29c83e399c8053598a)
1*6629be1bSjruoho /*	$NetBSD: t_fputc.c,v 1.1 2011/09/11 09:02:46 jruoho Exp $ */
2*6629be1bSjruoho 
3*6629be1bSjruoho /*-
4*6629be1bSjruoho  * Copyright (c) 2011 The NetBSD Foundation, Inc.
5*6629be1bSjruoho  * All rights reserved.
6*6629be1bSjruoho  *
7*6629be1bSjruoho  * This code is derived from software contributed to The NetBSD Foundation
8*6629be1bSjruoho  * by Jukka Ruohonen.
9*6629be1bSjruoho  *
10*6629be1bSjruoho  * Redistribution and use in source and binary forms, with or without
11*6629be1bSjruoho  * modification, are permitted provided that the following conditions
12*6629be1bSjruoho  * are met:
13*6629be1bSjruoho  * 1. Redistributions of source code must retain the above copyright
14*6629be1bSjruoho  *    notice, this list of conditions and the following disclaimer.
15*6629be1bSjruoho  * 2. Redistributions in binary form must reproduce the above copyright
16*6629be1bSjruoho  *    notice, this list of conditions and the following disclaimer in the
17*6629be1bSjruoho  *    documentation and/or other materials provided with the distribution.
18*6629be1bSjruoho  *
19*6629be1bSjruoho  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20*6629be1bSjruoho  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21*6629be1bSjruoho  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22*6629be1bSjruoho  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23*6629be1bSjruoho  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24*6629be1bSjruoho  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25*6629be1bSjruoho  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26*6629be1bSjruoho  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27*6629be1bSjruoho  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28*6629be1bSjruoho  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29*6629be1bSjruoho  * POSSIBILITY OF SUCH DAMAGE.
30*6629be1bSjruoho  */
31*6629be1bSjruoho #include <sys/cdefs.h>
32*6629be1bSjruoho __RCSID("$NetBSD: t_fputc.c,v 1.1 2011/09/11 09:02:46 jruoho Exp $");
33*6629be1bSjruoho 
34*6629be1bSjruoho #include <atf-c.h>
35*6629be1bSjruoho #include <errno.h>
36*6629be1bSjruoho #include <stdio.h>
37*6629be1bSjruoho #include <string.h>
38*6629be1bSjruoho #include <unistd.h>
39*6629be1bSjruoho 
40*6629be1bSjruoho static const char	*path = "fputc";
41*6629be1bSjruoho static void		 puterr(int (*)(int, FILE *));
42*6629be1bSjruoho static void		 putstr(int (*)(int, FILE *));
43*6629be1bSjruoho 
44*6629be1bSjruoho static void
puterr(int (* func)(int,FILE *))45*6629be1bSjruoho puterr(int (*func)(int, FILE *))
46*6629be1bSjruoho {
47*6629be1bSjruoho 	FILE *f;
48*6629be1bSjruoho 
49*6629be1bSjruoho 	f = fopen(path, "w+");
50*6629be1bSjruoho 
51*6629be1bSjruoho 	ATF_REQUIRE(f != NULL);
52*6629be1bSjruoho 	ATF_REQUIRE(fclose(f) == 0);
53*6629be1bSjruoho 	ATF_REQUIRE(unlink(path) == 0);
54*6629be1bSjruoho 	ATF_REQUIRE(func('x', f) == EOF);
55*6629be1bSjruoho }
56*6629be1bSjruoho 
57*6629be1bSjruoho static void
putstr(int (* func)(int,FILE *))58*6629be1bSjruoho putstr(int (*func)(int, FILE *))
59*6629be1bSjruoho {
60*6629be1bSjruoho 	const char *str = "1234567890x";
61*6629be1bSjruoho 	unsigned short i = 0;
62*6629be1bSjruoho 	char buf[10];
63*6629be1bSjruoho 	FILE *f;
64*6629be1bSjruoho 
65*6629be1bSjruoho 	(void)memset(buf, 'x', sizeof(buf));
66*6629be1bSjruoho 
67*6629be1bSjruoho 	f = fopen(path, "w+");
68*6629be1bSjruoho 	ATF_REQUIRE(f != NULL);
69*6629be1bSjruoho 
70*6629be1bSjruoho 	while (str[i] != 'x') {
71*6629be1bSjruoho 		ATF_REQUIRE(func(str[i], f) == str[i]);
72*6629be1bSjruoho 		i++;
73*6629be1bSjruoho 	}
74*6629be1bSjruoho 
75*6629be1bSjruoho 	ATF_REQUIRE(fclose(f) == 0);
76*6629be1bSjruoho 
77*6629be1bSjruoho 	f = fopen(path, "r");
78*6629be1bSjruoho 	ATF_REQUIRE(f != NULL);
79*6629be1bSjruoho 
80*6629be1bSjruoho 	ATF_REQUIRE(fread(buf, 1, 10, f) == 10);
81*6629be1bSjruoho 	ATF_REQUIRE(strncmp(buf, str, 10) == 0);
82*6629be1bSjruoho 
83*6629be1bSjruoho 	ATF_REQUIRE(fclose(f) == 0);
84*6629be1bSjruoho 	ATF_REQUIRE(unlink(path) == 0);
85*6629be1bSjruoho }
86*6629be1bSjruoho 
87*6629be1bSjruoho ATF_TC_WITH_CLEANUP(fputc_basic);
ATF_TC_HEAD(fputc_basic,tc)88*6629be1bSjruoho ATF_TC_HEAD(fputc_basic, tc)
89*6629be1bSjruoho {
90*6629be1bSjruoho 	atf_tc_set_md_var(tc, "descr", "A basic test of fputc(3)");
91*6629be1bSjruoho }
92*6629be1bSjruoho 
ATF_TC_BODY(fputc_basic,tc)93*6629be1bSjruoho ATF_TC_BODY(fputc_basic, tc)
94*6629be1bSjruoho {
95*6629be1bSjruoho 	putstr(fputc);
96*6629be1bSjruoho }
97*6629be1bSjruoho 
ATF_TC_CLEANUP(fputc_basic,tc)98*6629be1bSjruoho ATF_TC_CLEANUP(fputc_basic, tc)
99*6629be1bSjruoho {
100*6629be1bSjruoho 	(void)unlink(path);
101*6629be1bSjruoho }
102*6629be1bSjruoho 
103*6629be1bSjruoho ATF_TC_WITH_CLEANUP(fputc_err);
ATF_TC_HEAD(fputc_err,tc)104*6629be1bSjruoho ATF_TC_HEAD(fputc_err, tc)
105*6629be1bSjruoho {
106*6629be1bSjruoho 	atf_tc_set_md_var(tc, "descr", "Test errors from fputc(3)");
107*6629be1bSjruoho }
108*6629be1bSjruoho 
ATF_TC_BODY(fputc_err,tc)109*6629be1bSjruoho ATF_TC_BODY(fputc_err, tc)
110*6629be1bSjruoho {
111*6629be1bSjruoho 	puterr(fputc);
112*6629be1bSjruoho }
113*6629be1bSjruoho 
ATF_TC_CLEANUP(fputc_err,tc)114*6629be1bSjruoho ATF_TC_CLEANUP(fputc_err, tc)
115*6629be1bSjruoho {
116*6629be1bSjruoho 	(void)unlink(path);
117*6629be1bSjruoho }
118*6629be1bSjruoho 
119*6629be1bSjruoho ATF_TC_WITH_CLEANUP(putc_basic);
ATF_TC_HEAD(putc_basic,tc)120*6629be1bSjruoho ATF_TC_HEAD(putc_basic, tc)
121*6629be1bSjruoho {
122*6629be1bSjruoho 	atf_tc_set_md_var(tc, "descr", "A basic test of putc(3)");
123*6629be1bSjruoho }
124*6629be1bSjruoho 
ATF_TC_BODY(putc_basic,tc)125*6629be1bSjruoho ATF_TC_BODY(putc_basic, tc)
126*6629be1bSjruoho {
127*6629be1bSjruoho 	putstr(putc);
128*6629be1bSjruoho }
129*6629be1bSjruoho 
ATF_TC_CLEANUP(putc_basic,tc)130*6629be1bSjruoho ATF_TC_CLEANUP(putc_basic, tc)
131*6629be1bSjruoho {
132*6629be1bSjruoho 	(void)unlink(path);
133*6629be1bSjruoho }
134*6629be1bSjruoho 
135*6629be1bSjruoho ATF_TC_WITH_CLEANUP(putc_err);
ATF_TC_HEAD(putc_err,tc)136*6629be1bSjruoho ATF_TC_HEAD(putc_err, tc)
137*6629be1bSjruoho {
138*6629be1bSjruoho 	atf_tc_set_md_var(tc, "descr", "Test errors from putc(3)");
139*6629be1bSjruoho }
140*6629be1bSjruoho 
ATF_TC_BODY(putc_err,tc)141*6629be1bSjruoho ATF_TC_BODY(putc_err, tc)
142*6629be1bSjruoho {
143*6629be1bSjruoho 	puterr(putc);
144*6629be1bSjruoho }
145*6629be1bSjruoho 
ATF_TC_CLEANUP(putc_err,tc)146*6629be1bSjruoho ATF_TC_CLEANUP(putc_err, tc)
147*6629be1bSjruoho {
148*6629be1bSjruoho 	(void)unlink(path);
149*6629be1bSjruoho }
150*6629be1bSjruoho 
151*6629be1bSjruoho ATF_TC_WITH_CLEANUP(putc_unlocked_basic);
ATF_TC_HEAD(putc_unlocked_basic,tc)152*6629be1bSjruoho ATF_TC_HEAD(putc_unlocked_basic, tc)
153*6629be1bSjruoho {
154*6629be1bSjruoho 	atf_tc_set_md_var(tc, "descr", "A basic test of putc_unlocked(3)");
155*6629be1bSjruoho }
156*6629be1bSjruoho 
ATF_TC_BODY(putc_unlocked_basic,tc)157*6629be1bSjruoho ATF_TC_BODY(putc_unlocked_basic, tc)
158*6629be1bSjruoho {
159*6629be1bSjruoho 	putstr(putc_unlocked);
160*6629be1bSjruoho }
161*6629be1bSjruoho 
ATF_TC_CLEANUP(putc_unlocked_basic,tc)162*6629be1bSjruoho ATF_TC_CLEANUP(putc_unlocked_basic, tc)
163*6629be1bSjruoho {
164*6629be1bSjruoho 	(void)unlink(path);
165*6629be1bSjruoho }
166*6629be1bSjruoho 
167*6629be1bSjruoho ATF_TC_WITH_CLEANUP(putc_unlocked_err);
ATF_TC_HEAD(putc_unlocked_err,tc)168*6629be1bSjruoho ATF_TC_HEAD(putc_unlocked_err, tc)
169*6629be1bSjruoho {
170*6629be1bSjruoho 	atf_tc_set_md_var(tc, "descr", "Test errors from putc_unlocked(3)");
171*6629be1bSjruoho }
172*6629be1bSjruoho 
ATF_TC_BODY(putc_unlocked_err,tc)173*6629be1bSjruoho ATF_TC_BODY(putc_unlocked_err, tc)
174*6629be1bSjruoho {
175*6629be1bSjruoho 	puterr(putc_unlocked);
176*6629be1bSjruoho }
177*6629be1bSjruoho 
ATF_TC_CLEANUP(putc_unlocked_err,tc)178*6629be1bSjruoho ATF_TC_CLEANUP(putc_unlocked_err, tc)
179*6629be1bSjruoho {
180*6629be1bSjruoho 	(void)unlink(path);
181*6629be1bSjruoho }
182*6629be1bSjruoho 
ATF_TP_ADD_TCS(tp)183*6629be1bSjruoho ATF_TP_ADD_TCS(tp)
184*6629be1bSjruoho {
185*6629be1bSjruoho 
186*6629be1bSjruoho 	ATF_TP_ADD_TC(tp, fputc_basic);
187*6629be1bSjruoho 	ATF_TP_ADD_TC(tp, fputc_err);
188*6629be1bSjruoho 	ATF_TP_ADD_TC(tp, putc_basic);
189*6629be1bSjruoho 	ATF_TP_ADD_TC(tp, putc_err);
190*6629be1bSjruoho 	ATF_TP_ADD_TC(tp, putc_unlocked_basic);
191*6629be1bSjruoho 	ATF_TP_ADD_TC(tp, putc_unlocked_err);
192*6629be1bSjruoho 
193*6629be1bSjruoho 	return atf_no_error();
194*6629be1bSjruoho }
195