t_fputc.c revision 272345
134229Speter/*	$NetBSD: t_fputc.c,v 1.1 2011/09/11 09:02:46 jruoho Exp $ */
295349Sobrien
334229Speter/*-
434229Speter * Copyright (c) 2011 The NetBSD Foundation, Inc.
551408Sobrien * All rights reserved.
634229Speter *
752112Sobrien * This code is derived from software contributed to The NetBSD Foundation
818334Speter * by Jukka Ruohonen.
918334Speter *
1018334Speter * Redistribution and use in source and binary forms, with or without
1118334Speter * modification, are permitted provided that the following conditions
1218334Speter * are met:
1318334Speter * 1. Redistributions of source code must retain the above copyright
1418334Speter *    notice, this list of conditions and the following disclaimer.
1518334Speter * 2. Redistributions in binary form must reproduce the above copyright
1618334Speter *    notice, this list of conditions and the following disclaimer in the
1718334Speter *    documentation and/or other materials provided with the distribution.
1818334Speter *
1918334Speter * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
2018334Speter * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
2118334Speter * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2218334Speter * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
2318334Speter * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2418334Speter * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2518334Speter * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2651408Sobrien * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2718334Speter * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2895810Sobrien * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2995810Sobrien * POSSIBILITY OF SUCH DAMAGE.
3051408Sobrien */
3158478Sobrien#include <sys/cdefs.h>
3295810Sobrien__RCSID("$NetBSD: t_fputc.c,v 1.1 2011/09/11 09:02:46 jruoho Exp $");
3358478Sobrien
3458478Sobrien#include <atf-c.h>
3551408Sobrien#include <errno.h>
3658478Sobrien#include <stdio.h>
3758478Sobrien#include <string.h>
3858478Sobrien#include <unistd.h>
3995349Sobrien
4058478Sobrienstatic const char	*path = "fputc";
4158478Sobrienstatic void		 puterr(int (*)(int, FILE *));
4258478Sobrienstatic void		 putstr(int (*)(int, FILE *));
4358478Sobrien
4458478Sobrienstatic void
4558478Sobrienputerr(int (*func)(int, FILE *))
4658478Sobrien{
4758478Sobrien	FILE *f;
4858478Sobrien
4958478Sobrien	f = fopen(path, "w+");
5058478Sobrien
5158478Sobrien	ATF_REQUIRE(f != NULL);
5258478Sobrien	ATF_REQUIRE(fclose(f) == 0);
5358478Sobrien	ATF_REQUIRE(unlink(path) == 0);
5458478Sobrien	ATF_REQUIRE(func('x', f) == EOF);
5558478Sobrien}
5658478Sobrien
5758478Sobrienstatic void
5858478Sobrienputstr(int (*func)(int, FILE *))
5958478Sobrien{
6058478Sobrien	const char *str = "1234567890x";
6158478Sobrien	unsigned short i = 0;
6295349Sobrien	char buf[10];
6358478Sobrien	FILE *f;
6458478Sobrien
6558478Sobrien	(void)memset(buf, 'x', sizeof(buf));
6658478Sobrien
6758478Sobrien	f = fopen(path, "w+");
6858478Sobrien	ATF_REQUIRE(f != NULL);
6995349Sobrien
7095349Sobrien	while (str[i] != 'x') {
7158478Sobrien		ATF_REQUIRE(func(str[i], f) == str[i]);
7295349Sobrien		i++;
7395349Sobrien	}
7495349Sobrien
7595349Sobrien	ATF_REQUIRE(fclose(f) == 0);
7658478Sobrien
7758478Sobrien	f = fopen(path, "r");
7858478Sobrien	ATF_REQUIRE(f != NULL);
7958478Sobrien
8058478Sobrien	ATF_REQUIRE(fread(buf, 1, 10, f) == 10);
8158478Sobrien	ATF_REQUIRE(strncmp(buf, str, 10) == 0);
8258478Sobrien
8358478Sobrien	ATF_REQUIRE(fclose(f) == 0);
8458478Sobrien	ATF_REQUIRE(unlink(path) == 0);
8558478Sobrien}
8658478Sobrien
8758478SobrienATF_TC_WITH_CLEANUP(fputc_basic);
8858478SobrienATF_TC_HEAD(fputc_basic, tc)
8995349Sobrien{
9095349Sobrien	atf_tc_set_md_var(tc, "descr", "A basic test of fputc(3)");
9195349Sobrien}
9258478Sobrien
9358478SobrienATF_TC_BODY(fputc_basic, tc)
9495349Sobrien{
9558478Sobrien	putstr(fputc);
9658478Sobrien}
9758478Sobrien
9858478SobrienATF_TC_CLEANUP(fputc_basic, tc)
9958478Sobrien{
10058478Sobrien	(void)unlink(path);
10158478Sobrien}
10258478Sobrien
10358478SobrienATF_TC_WITH_CLEANUP(fputc_err);
10458478SobrienATF_TC_HEAD(fputc_err, tc)
10558478Sobrien{
10658478Sobrien	atf_tc_set_md_var(tc, "descr", "Test errors from fputc(3)");
10795349Sobrien}
10858478Sobrien
10958478SobrienATF_TC_BODY(fputc_err, tc)
11058478Sobrien{
11195349Sobrien	puterr(fputc);
11258478Sobrien}
11395349Sobrien
11495349SobrienATF_TC_CLEANUP(fputc_err, tc)
11558478Sobrien{
11658478Sobrien	(void)unlink(path);
11795349Sobrien}
11895349Sobrien
11995349SobrienATF_TC_WITH_CLEANUP(putc_basic);
12058478SobrienATF_TC_HEAD(putc_basic, tc)
12158478Sobrien{
12258478Sobrien	atf_tc_set_md_var(tc, "descr", "A basic test of putc(3)");
12334229Speter}
12434229Speter
12534229SpeterATF_TC_BODY(putc_basic, tc)
12618349Speter{
12734229Speter	putstr(putc);
12834229Speter}
12934229Speter
13034229SpeterATF_TC_CLEANUP(putc_basic, tc)
13118349Speter{
13234229Speter	(void)unlink(path);
13352112Sobrien}
13468601Sobrien
13568601SobrienATF_TC_WITH_CLEANUP(putc_err);
13668601SobrienATF_TC_HEAD(putc_err, tc)
13768601Sobrien{
13868601Sobrien	atf_tc_set_md_var(tc, "descr", "Test errors from putc(3)");
13968601Sobrien}
14018349Speter
14158478SobrienATF_TC_BODY(putc_err, tc)
14295810Sobrien{
14395810Sobrien	puterr(putc);
14458478Sobrien}
14558478Sobrien
14695349SobrienATF_TC_CLEANUP(putc_err, tc)
14795349Sobrien{
14895349Sobrien	(void)unlink(path);
14995349Sobrien}
15018349Speter
15195349SobrienATF_TC_WITH_CLEANUP(putc_unlocked_basic);
15295349SobrienATF_TC_HEAD(putc_unlocked_basic, tc)
15395349Sobrien{
15458478Sobrien	atf_tc_set_md_var(tc, "descr", "A basic test of putc_unlocked(3)");
15558478Sobrien}
15658478Sobrien
15718349SpeterATF_TC_BODY(putc_unlocked_basic, tc)
15895349Sobrien{
15995349Sobrien	putstr(putc_unlocked);
16095349Sobrien}
16195349Sobrien
16295349SobrienATF_TC_CLEANUP(putc_unlocked_basic, tc)
16318349Speter{
16458478Sobrien	(void)unlink(path);
16558478Sobrien}
16658478Sobrien
16758478SobrienATF_TC_WITH_CLEANUP(putc_unlocked_err);
16858478SobrienATF_TC_HEAD(putc_unlocked_err, tc)
16958478Sobrien{
17058478Sobrien	atf_tc_set_md_var(tc, "descr", "Test errors from putc_unlocked(3)");
17158478Sobrien}
17258478Sobrien
17358478SobrienATF_TC_BODY(putc_unlocked_err, tc)
17458478Sobrien{
17558478Sobrien	puterr(putc_unlocked);
17695810Sobrien}
17758478Sobrien
17858478SobrienATF_TC_CLEANUP(putc_unlocked_err, tc)
17958478Sobrien{
18058478Sobrien	(void)unlink(path);
18158478Sobrien}
18258478Sobrien
18358478SobrienATF_TP_ADD_TCS(tp)
18458478Sobrien{
18558478Sobrien
18658478Sobrien	ATF_TP_ADD_TC(tp, fputc_basic);
18758478Sobrien	ATF_TP_ADD_TC(tp, fputc_err);
18858478Sobrien	ATF_TP_ADD_TC(tp, putc_basic);
18958478Sobrien	ATF_TP_ADD_TC(tp, putc_err);
19058478Sobrien	ATF_TP_ADD_TC(tp, putc_unlocked_basic);
19158478Sobrien	ATF_TP_ADD_TC(tp, putc_unlocked_err);
19258478Sobrien
19395810Sobrien	return atf_no_error();
19458478Sobrien}
19558478Sobrien