From: Bruno Haible Date: Sun, 29 Apr 2007 02:07:56 +0000 (+0000) Subject: Make the tests sharper: also test the interaction with fflush(). X-Git-Tag: cvs-readonly~468 X-Git-Url: http://erislabs.net/gitweb/?a=commitdiff_plain;h=503e2514a1404a19a00117845216993a3c2ccf5f;p=gnulib.git Make the tests sharper: also test the interaction with fflush(). --- diff --git a/ChangeLog b/ChangeLog index 398786616..3c75b003e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,15 @@ 2007-04-28 Bruno Haible + * tests/test-fwriting.c (main): Also test the interaction between + fflush and fwriting. + * modules/fwriting-tests (Depends-on): Add fflush. + + * tests/test-freading.c (main): Also test the interaction between + fflush and freading. + * modules/freading-tests (Depends-on): Add fflush. + +2007-04-28 Bruno Haible + * lib/stdio_.h (fseek, ftell): Provide link warnings suggesting to use fseeko and ftello. Suggested by Eric Blake. diff --git a/modules/freading-tests b/modules/freading-tests index fea9a69e7..78cb96a79 100644 --- a/modules/freading-tests +++ b/modules/freading-tests @@ -2,6 +2,7 @@ Files: tests/test-freading.c Depends-on: +fflush configure.ac: diff --git a/modules/fwriting-tests b/modules/fwriting-tests index f4258d494..5594223f0 100644 --- a/modules/fwriting-tests +++ b/modules/fwriting-tests @@ -2,6 +2,7 @@ Files: tests/test-fwriting.c Depends-on: +fflush configure.ac: diff --git a/tests/test-freading.c b/tests/test-freading.c index 02414e5d0..e51d7ab18 100644 --- a/tests/test-freading.c +++ b/tests/test-freading.c @@ -57,6 +57,11 @@ main () if (fgetc (fp) != 'b') goto skip; ASSERT (freading (fp)); + fflush (fp); + ASSERT (freading (fp)); + if (fgetc (fp) != 'a') + goto skip; + ASSERT (freading (fp)); if (fseek (fp, 0, SEEK_END)) goto skip; ASSERT (freading (fp)); @@ -77,12 +82,52 @@ main () ASSERT (freading (fp)); if (fseek (fp, 2, SEEK_CUR)) goto skip; - /* freading (fp)) is undefined here, but fwriting is false. */ + /* freading (fp) is undefined here, but fwriting (fp) is false. */ if (fgetc (fp) != 'b') goto skip; ASSERT (freading (fp)); + /* This fseek call is necessary when switching from reading to writing. + See the description of fopen(), ISO C 99 7.19.5.3.(6). */ + if (fseek (fp, 0, SEEK_CUR) != 0) + goto skip; + /* freading (fp) is undefined here, but fwriting (fp) is false. */ + if (fputc ('z', fp) != 'z') + goto skip; + ASSERT (!freading (fp)); + if (fseek (fp, 0, SEEK_END)) + goto skip; + ASSERT (!freading (fp)); + if (fclose (fp)) + goto skip; + + /* Open it in read-write mode. POSIX requires a reposition (fseek, + fsetpos, rewind) or EOF when transitioning from read to write; + freading is only deterministic after input or output, but this + test case should be portable even on open, after reposition, and + at EOF. */ + fp = fopen (TESTFILE, "r+"); + if (fp == NULL) + goto skip; + ASSERT (!freading (fp)); + if (fgetc (fp) != 'f') + goto skip; + ASSERT (freading (fp)); + if (fseek (fp, 2, SEEK_CUR)) + goto skip; + /* freading (fp) is undefined here, but fwriting (fp) is false. */ + if (fgetc (fp) != 'b') + goto skip; + ASSERT (freading (fp)); + fflush (fp); + /* freading (fp) is undefined here, but fwriting (fp) is false. */ + if (fgetc (fp) != 'a') + goto skip; + ASSERT (freading (fp)); + /* This fseek call is necessary when switching from reading to writing. + See the description of fopen(), ISO C 99 7.19.5.3.(6). */ if (fseek (fp, 0, SEEK_CUR) != 0) goto skip; + /* freading (fp) is undefined here, but fwriting (fp) is false. */ if (fputc ('z', fp) != 'z') goto skip; ASSERT (!freading (fp)); diff --git a/tests/test-fwriting.c b/tests/test-fwriting.c index 24279f313..00b6870b4 100644 --- a/tests/test-fwriting.c +++ b/tests/test-fwriting.c @@ -57,6 +57,11 @@ main () if (fgetc (fp) != 'b') goto skip; ASSERT (!fwriting (fp)); + fflush (fp); + ASSERT (!fwriting (fp)); + if (fgetc (fp) != 'a') + goto skip; + ASSERT (!fwriting (fp)); if (fseek (fp, 0, SEEK_END)) goto skip; ASSERT (!fwriting (fp)); @@ -81,14 +86,54 @@ main () if (fgetc (fp) != 'b') goto skip; ASSERT (!fwriting (fp)); + /* This fseek call is necessary when switching from reading to writing. + See the description of fopen(), ISO C 99 7.19.5.3.(6). */ + if (fseek (fp, 0, SEEK_CUR) != 0) + goto skip; + ASSERT (!fwriting (fp)); + if (fputc ('z', fp) != 'z') + goto skip; + ASSERT (fwriting (fp)); + if (fseek (fp, 0, SEEK_END)) + goto skip; + /* fwriting (fp) is undefined here, but freading (fp) is false. */ + if (fclose (fp)) + goto skip; + + /* Open it in read-write mode. POSIX requires a reposition (fseek, + fsetpos, rewind) or fflush when transitioning from write to read, + fwriting is only deterministic after input or output, but this + test case should be portable even on open, after reposition, and + after fflush. */ + fp = fopen (TESTFILE, "r+"); + if (fp == NULL) + goto skip; + ASSERT (!fwriting (fp)); + if (fgetc (fp) != 'f') + goto skip; + ASSERT (!fwriting (fp)); + if (fseek (fp, 2, SEEK_CUR)) + goto skip; + ASSERT (!fwriting (fp)); + if (fgetc (fp) != 'b') + goto skip; + ASSERT (!fwriting (fp)); + fflush (fp); + ASSERT (!fwriting (fp)); + if (fgetc (fp) != 'a') + goto skip; + ASSERT (!fwriting (fp)); + /* This fseek call is necessary when switching from reading to writing. + See the description of fopen(), ISO C 99 7.19.5.3.(6). */ if (fseek (fp, 0, SEEK_CUR) != 0) goto skip; + ASSERT (!fwriting (fp)); if (fputc ('z', fp) != 'z') goto skip; ASSERT (fwriting (fp)); if (fseek (fp, 0, SEEK_END)) goto skip; - /* fwriting (fp) is undefined here, but freading is false. */ + /* fwriting (fp) is undefined here, but freading (fp) is false. */ if (fclose (fp)) goto skip;