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