Grazvydas Ignotas : msvcrt/tests: Add a test for fwrite flushing behavior.
Alexandre Julliard
julliard at winehq.org
Tue Jun 17 14:40:51 CDT 2014
Module: wine
Branch: master
Commit: 147be95a68727eed1f021319ea05903c5451e3e6
URL: http://source.winehq.org/git/wine.git/?a=commit;h=147be95a68727eed1f021319ea05903c5451e3e6
Author: Grazvydas Ignotas <notasas at gmail.com>
Date: Sat Jun 14 02:23:55 2014 +0300
msvcrt/tests: Add a test for fwrite flushing behavior.
---
dlls/msvcrt/tests/file.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 60 insertions(+)
diff --git a/dlls/msvcrt/tests/file.c b/dlls/msvcrt/tests/file.c
index f6a1624..00e1f90 100644
--- a/dlls/msvcrt/tests/file.c
+++ b/dlls/msvcrt/tests/file.c
@@ -2219,6 +2219,65 @@ static void test__open_osfhandle(void)
CloseHandle(tmp);
}
+static void test_write_flush_size(FILE *file, size_t bufsize)
+{
+ char *inbuffer;
+ char *outbuffer;
+ size_t size;
+ int fd;
+
+ fd = fileno(file);
+ inbuffer = calloc(bufsize + 1, 1);
+ outbuffer = calloc(bufsize + 1, 1);
+ _snprintf(outbuffer, bufsize + 1, "0,1,2,3,4,5,6,7,8,9");
+
+ for (size = bufsize + 1; size >= bufsize - 1; size--) {
+ rewind(file);
+ fwrite(outbuffer, 1, size, file);
+ /* lseek() below intentionally redirects the write in fflush() to detect
+ * if fwrite() has already flushed the whole buffer or not.
+ */
+ lseek(fd, 1, SEEK_SET);
+ fflush(file);
+ fseek(file, 0, SEEK_SET);
+ ok(fread(inbuffer, 1, bufsize, file) == bufsize, "read failed\n");
+ if (size == bufsize)
+ todo_wine ok(memcmp(outbuffer, inbuffer, bufsize) == 0, "missing flush by %d byte write\n", size);
+ else
+ ok(memcmp(outbuffer, inbuffer, bufsize) != 0, "unexpected flush by %d byte write\n", size);
+ }
+ rewind(file);
+ fwrite(outbuffer, 1, bufsize / 2, file);
+ fwrite(outbuffer + bufsize / 2, 1, bufsize / 2, file);
+ lseek(fd, 1, SEEK_SET);
+ fflush(file);
+ fseek(file, 0, SEEK_SET);
+ ok(fread(inbuffer, 1, bufsize, file) == bufsize, "read failed\n");
+ ok(memcmp(outbuffer, inbuffer, bufsize) != 0, "unexpected flush by %d/2 byte double write\n", bufsize);
+ free(inbuffer);
+ free(outbuffer);
+}
+
+static void test_write_flush(void)
+{
+ char iobuf[1024];
+ char *tempf;
+ FILE *file;
+
+ tempf = _tempnam(".","wne");
+ file = fopen(tempf, "wb+");
+ ok(file != NULL, "unable to create test file\n");
+ iobuf[0] = 0;
+ fwrite(iobuf, 1, 1, file); /* needed for wine to init _bufsiz */
+ todo_wine ok(file->_bufsiz == 4096, "incorrect default buffer size: %d", file->_bufsiz);
+ test_write_flush_size(file, file->_bufsiz);
+ setvbuf(file, iobuf, _IOFBF, sizeof(iobuf));
+ test_write_flush_size(file, sizeof(iobuf));
+ fclose(file);
+ unlink(tempf);
+ free(tempf);
+}
+
START_TEST(file)
{
int arg_c;
@@ -2284,6 +2343,7 @@ START_TEST(file)
test_stdin();
test_mktemp();
test__open_osfhandle();
+ test_write_flush();
/* Wait for the (_P_NOWAIT) spawned processes to finish to make sure the report
* file contains lines in the correct order
More information about the wine-cvs
mailing list