diff options
author | Bruno Haible <bruno@clisp.org> | 2012-06-22 12:02:54 +0200 |
---|---|---|
committer | Bruno Haible <bruno@clisp.org> | 2012-06-22 12:02:54 +0200 |
commit | e8dd490b46444e82673618f34b4ef1b3bf0bf382 (patch) | |
tree | 186cab2908a057510f40f1422a0810e5e3982cc8 | |
parent | b283b5d518e10f7880d890a6f38b931478d13ed9 (diff) | |
download | gnulib-e8dd490b46444e82673618f34b4ef1b3bf0bf382.tar.gz |
fbufmode test: Don't test unportable behaviour.
* tests/test-fbufmode.c (test_mode): New function, extracted from main.
(main): Invoke it three times.
Reported by Szabolcs Nagy <nsz@port70.net>
and Rich Felker <dalias@aerifal.cx>.
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | tests/test-fbufmode.c | 77 |
2 files changed, 64 insertions, 21 deletions
@@ -1,3 +1,11 @@ +2012-06-22 Bruno Haible <bruno@clisp.org> + + fbufmode test: Don't test unportable behaviour. + * tests/test-fbufmode.c (test_mode): New function, extracted from main. + (main): Invoke it three times. + Reported by Szabolcs Nagy <nsz@port70.net> + and Rich Felker <dalias@aerifal.cx>. + 2012-06-21 Bruno Haible <bruno@clisp.org> gnulib-tool: Refactor inctests variable. diff --git a/tests/test-fbufmode.c b/tests/test-fbufmode.c index 2b762e7913..76169c718a 100644 --- a/tests/test-fbufmode.c +++ b/tests/test-fbufmode.c @@ -26,45 +26,80 @@ #define TESTFILE "t-fbufmode.tmp" -int -main () +/* ISO C99 disallows more than one setvbuf call on a given stream, + and HP-UX 11 and musl libc indeed don't support such use of setvbuf. + Therefore allocate a new stream for each possible mode value. */ +static int +test_mode (int mode) { FILE *fp; char buf[5]; - /* Create a file with some contents. */ - fp = fopen (TESTFILE, "w"); - if (fp == NULL) - goto skip; - if (fwrite ("foobarsh", 1, 8, fp) < 8) - goto skip; - if (fclose (fp)) - goto skip; - /* Open it for reading. */ fp = fopen (TESTFILE, "r"); - if (setvbuf (fp, NULL, _IONBF, 0)) - goto skip; - ASSERT (fbufmode (fp) == _IONBF); - - /* This setvbuf call can fail, e.g. on HP-UX 11. */ - if (setvbuf (fp, buf, _IOLBF, 5) == 0) + switch (mode) { + case _IONBF: + ASSERT (setvbuf (fp, NULL, _IONBF, 0) == 0); + ASSERT (fbufmode (fp) == _IONBF); + break; + + case _IOLBF: + ASSERT (setvbuf (fp, buf, _IOLBF, 5) == 0); /* mingw's setvbuf implements _IOLBF the same way as _IOFBF. */ ASSERT (fbufmode (fp) == _IOLBF || fbufmode (fp) == _IOFBF); - } + break; - /* This setvbuf call can fail, e.g. on HP-UX 11. */ - if (setvbuf (fp, buf, _IOFBF, 5) == 0) - { + case _IOFBF: + ASSERT (setvbuf (fp, buf, _IOFBF, 5) == 0); ASSERT (fbufmode (fp) == _IOFBF); + break; + + default: + break; } fclose (fp); return 0; +} + +int +main () +{ + int ret; + + /* Create a file with some contents. */ + { + FILE *fp; + + fp = fopen (TESTFILE, "w"); + if (fp == NULL) + goto skip; + if (fwrite ("foobarsh", 1, 8, fp) < 8) + goto skip; + if (fclose (fp)) + goto skip; + } + + ret = test_mode (_IONBF); + if (ret != 0) + goto fail; + + ret = test_mode (_IOLBF); + if (ret != 0) + goto fail; + + ret = test_mode (_IOFBF); + if (ret != 0) + goto fail; + + return 0; + + fail: + return ret; skip: fprintf (stderr, "Skipping test: file operations failed.\n"); |