Home | History | Annotate | Download | only in stream
      1 /*
      2  *
      3  *   Copyright (c) International Business Machines  Corp., 2002
      4  *
      5  *   This program is free software;  you can redistribute it and/or modify
      6  *   it under the terms of the GNU General Public License as published by
      7  *   the Free Software Foundation; either version 2 of the License, or
      8  *   (at your option) any later version.
      9  *
     10  *   This program is distributed in the hope that it will be useful,
     11  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
     12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
     13  *   the GNU General Public License for more details.
     14  *
     15  *   You should have received a copy of the GNU General Public License
     16  *   along with this program;  if not, write to the Free Software
     17  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
     18  */
     19 
     20 /* ported from SPIE, section2/filesuite/stream.c, by Airong Zhang */
     21 
     22 /*======================================================================
     23 	=================== TESTPLAN SEGMENT ===================
     24 >KEYS:  < ferror() feof() clearerr() fileno()
     25 >WHAT:  < 1) check that ferror returns zero
     26 	< 2) check fileno returns valid file descriptor
     27 	< 3) check that feof returns zero (nonzero) appropriately
     28 	< 4) check that clearerr resets EOF indicator.
     29 >HOW:   < 1) open a stream and immediately execute ferror
     30 	< 2) use the file des returned from fileno to read a file
     31 	<    written with stream - compare actual vs expected.
     32 	< 3) open stream and ensure feof returns zero, read to end of
     33 	<    file and ensure feof returns non-zero.
     34 	< 4) after 3) above use clearerr and then use feof to ensure
     35 	<    clearerr worked
     36 >BUGS:  <
     37 ======================================================================*/
     38 
     39 #include <unistd.h>
     40 #include <stdio.h>
     41 #include <errno.h>
     42 #include "test.h"
     43 
     44 char *TCID = "stream05";
     45 int TST_TOTAL = 1;
     46 int local_flag;
     47 
     48 #define PASSED 1
     49 #define FAILED 0
     50 
     51 char progname[] = "stream05()";
     52 char tempfile[40] = "";
     53 
     54 /*--------------------------------------------------------------------*/
     55 int main(int ac, char *av[])
     56 {
     57 	FILE *stream;
     58 	char buf[10];
     59 	int nr, fd;
     60 
     61 	int lc;
     62 
     63 	/*
     64 	 * parse standard options
     65 	 */
     66 	tst_parse_opts(ac, av, NULL, NULL);
     67 	tst_tmpdir();
     68 	local_flag = PASSED;
     69 
     70 	for (lc = 0; TEST_LOOPING(lc); lc++) {
     71 		local_flag = PASSED;
     72 
     73 		sprintf(tempfile, "stream05.%d", getpid());
     74 	/*--------------------------------------------------------------------*/
     75 		//block0:
     76 		if ((stream = fopen(tempfile, "a+")) == NULL) {
     77 			tst_brkm(TFAIL, NULL, "fopen(%s) a+ failed: %s",
     78 				 tempfile,
     79 				 strerror(errno));
     80 		}
     81 		fprintf(stream, "a");
     82 		fclose(stream);
     83 
     84 		if ((stream = fopen(tempfile, "r+")) == NULL) {
     85 			tst_brkm(TFAIL, NULL, "fopen(%s) r+ failed: %s",
     86 				 tempfile,
     87 				 strerror(errno));
     88 		}
     89 
     90 		/* check that ferror returns zero */
     91 		if (ferror(stream) != 0) {
     92 			tst_resm(TFAIL, "ferror did not return zero: %s",
     93 				 strerror(errno));
     94 			local_flag = FAILED;
     95 		}
     96 
     97 		if (local_flag == PASSED) {
     98 			tst_resm(TPASS, "Test passed in block0.");
     99 		} else {
    100 			tst_resm(TFAIL, "Test failed in block0.");
    101 		}
    102 
    103 		local_flag = PASSED;
    104 
    105 	/*--------------------------------------------------------------------*/
    106 		//block1:
    107 
    108 		/* check that fileno returns valid file descriptor */
    109 		fd = fileno(stream);
    110 		if ((nr = read(fd, buf, 1)) < 0) {
    111 			tst_brkm(TFAIL, NULL, "read failed: %s",
    112 				 strerror(errno));
    113 		}
    114 		if (nr != 1) {
    115 			tst_resm(TFAIL, "read did not read right number");
    116 			local_flag = FAILED;
    117 		}
    118 		if (buf[0] != 'a') {
    119 			tst_resm(TFAIL, "read returned bad values");
    120 			local_flag = FAILED;
    121 		}
    122 		if (local_flag == PASSED) {
    123 			tst_resm(TPASS, "Test passed in block1.");
    124 		} else {
    125 			tst_resm(TFAIL, "Test failed in block1.");
    126 		}
    127 
    128 		local_flag = PASSED;
    129 	/*--------------------------------------------------------------------*/
    130 		//block2:
    131 
    132 		/* read to EOF and ensure feof returns non-zero */
    133 		fclose(stream);
    134 
    135 		if ((stream = fopen(tempfile, "r+")) == NULL) {
    136 			tst_brkm(TFAIL, NULL, "fopen(%s) r+ failed: %s",
    137 				 tempfile,
    138 				 strerror(errno));
    139 		}
    140 		if (feof(stream) != 0) {
    141 			tst_resm(TFAIL,
    142 				 "feof returned non-zero when it should not: %s",
    143 				 strerror(errno));
    144 			local_flag = FAILED;
    145 		}
    146 		fread(buf, 1, 2, stream);	/* read to EOF */
    147 		if (feof(stream) == 0) {
    148 			tst_resm(TFAIL,
    149 				 "feof returned zero when it should not: %s",
    150 				 strerror(errno));
    151 			local_flag = FAILED;
    152 		}
    153 
    154 		if (local_flag == PASSED) {
    155 			tst_resm(TPASS, "Test passed in block2.");
    156 		} else {
    157 			tst_resm(TFAIL, "Test failed in block2.");
    158 		}
    159 
    160 		local_flag = PASSED;
    161 	/*--------------------------------------------------------------------*/
    162 		//block3:
    163 		/* ensure clearerr works */
    164 		clearerr(stream);
    165 		if (feof(stream) != 0) {
    166 			tst_resm(TFAIL, "clearerr failed: %s", strerror(errno));
    167 			local_flag = FAILED;
    168 		}
    169 		if (local_flag == PASSED) {
    170 			tst_resm(TPASS, "Test passed in block3.");
    171 		} else {
    172 			tst_resm(TFAIL, "Test failed in block3.");
    173 		}
    174 
    175 		local_flag = PASSED;
    176 	/*--------------------------------------------------------------------*/
    177 		//block4:
    178 
    179 		/* test fopen "b" flags -- should be allowed but ignored */
    180 		(void)fclose(stream);
    181 
    182 		if ((stream = fopen(tempfile, "rb")) == NULL) {
    183 			tst_brkm(TFAIL, NULL, "fopen(%s) rb failed: %s",
    184 				 tempfile,
    185 				 strerror(errno));
    186 		}
    187 		(void)fclose(stream);
    188 
    189 		if ((stream = fopen(tempfile, "wb")) == NULL) {
    190 			tst_brkm(TFAIL, NULL, "fopen(%s) wb failed: %s",
    191 				 tempfile,
    192 				 strerror(errno));
    193 		}
    194 		(void)fclose(stream);
    195 
    196 		if ((stream = fopen(tempfile, "ab")) == NULL) {
    197 			tst_brkm(TFAIL, NULL, "fopen(%s) ab failed: %s",
    198 				 tempfile,
    199 				 strerror(errno));
    200 		}
    201 		(void)fclose(stream);
    202 
    203 		if ((stream = fopen(tempfile, "rb+")) == NULL) {
    204 			tst_brkm(TFAIL, NULL, "fopen(%s) rb+ failed: %s",
    205 				 tempfile,
    206 				 strerror(errno));
    207 		}
    208 		(void)fclose(stream);
    209 
    210 		if ((stream = fopen(tempfile, "wb+")) == NULL) {
    211 			tst_brkm(TFAIL, NULL, "fopen(%s) wb+ failed: %s",
    212 				 tempfile,
    213 				 strerror(errno));
    214 		}
    215 		(void)fclose(stream);
    216 
    217 		if ((stream = fopen(tempfile, "ab+")) == NULL) {
    218 			tst_brkm(TFAIL, NULL, "fopen(%s) ab+ failed: %s",
    219 				 tempfile,
    220 				 strerror(errno));
    221 		}
    222 		(void)fclose(stream);
    223 
    224 		tst_resm(TPASS, "Test passed in block4.");
    225 	/*--------------------------------------------------------------------*/
    226 		unlink(tempfile);
    227 	}			/* end for */
    228 	tst_rmdir();
    229 	tst_exit();
    230 }
    231