mirror of
https://github.com/reactos/wine.git
synced 2024-12-05 02:07:16 +00:00
msvcrt/tests: Add a test for fwrite flushing behavior.
This commit is contained in:
parent
9614283996
commit
147be95a68
@ -2219,6 +2219,65 @@ static void test__open_osfhandle(void)
|
|||||||
CloseHandle(tmp);
|
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)
|
START_TEST(file)
|
||||||
{
|
{
|
||||||
int arg_c;
|
int arg_c;
|
||||||
@ -2284,6 +2343,7 @@ START_TEST(file)
|
|||||||
test_stdin();
|
test_stdin();
|
||||||
test_mktemp();
|
test_mktemp();
|
||||||
test__open_osfhandle();
|
test__open_osfhandle();
|
||||||
|
test_write_flush();
|
||||||
|
|
||||||
/* Wait for the (_P_NOWAIT) spawned processes to finish to make sure the report
|
/* Wait for the (_P_NOWAIT) spawned processes to finish to make sure the report
|
||||||
* file contains lines in the correct order
|
* file contains lines in the correct order
|
||||||
|
Loading…
Reference in New Issue
Block a user