msvcrt: File read buffer tests.
This commit is contained in:
parent
7f838ca661
commit
1aa8db05a0
|
@ -32,6 +32,7 @@
|
||||||
#include <winnls.h>
|
#include <winnls.h>
|
||||||
#include <process.h>
|
#include <process.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include "msvcrt.h"
|
||||||
|
|
||||||
static void test_fdopen( void )
|
static void test_fdopen( void )
|
||||||
{
|
{
|
||||||
|
@ -132,53 +133,124 @@ static void test_fileops( void )
|
||||||
unlink ("fdopen.tst");
|
unlink ("fdopen.tst");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_asciifileops( void )
|
#define IOMODE (ao?"ascii mode":"binary mode")
|
||||||
|
static void test_readmode( BOOL ascii_mode )
|
||||||
{
|
{
|
||||||
static const char outbuffer[] = "0,1,2,3,4,5,6,7,8,9\r\n\r\nA,B,C,D,E\r\nX,Y,Z";
|
static const char outbuffer[] = "0,1,2,3,4,5,6,7,8,9\r\n\r\nA,B,C,D,E\r\nX,Y,Z";
|
||||||
char buffer[256];
|
static const char padbuffer[] = "ghjghjghjghj";
|
||||||
|
static const char nlbuffer[] = "\r\n";
|
||||||
|
char buffer[MSVCRT_BUFSIZ+256];
|
||||||
int fd;
|
int fd;
|
||||||
FILE *file;
|
FILE *file;
|
||||||
int i;
|
int i, j, fp, ao, *ip, pl;
|
||||||
long l;
|
long l;
|
||||||
|
|
||||||
fd = open ("fdopen.tst", O_WRONLY | O_CREAT | O_BINARY, _S_IREAD |_S_IWRITE);
|
fd = open ("fdopen.tst", O_WRONLY | O_CREAT | O_BINARY, _S_IREAD |_S_IWRITE);
|
||||||
|
/* an internal buffer of MSVCRT_BUFSIZ is maintained, so make a file big
|
||||||
|
* enough to test operations that cross the buffer boundary
|
||||||
|
*/
|
||||||
|
j = (MSVCRT_BUFSIZ-4)/strlen(padbuffer);
|
||||||
|
for (i=0; i<j; i++)
|
||||||
|
write (fd, padbuffer, strlen(padbuffer));
|
||||||
|
j = (MSVCRT_BUFSIZ-4)%strlen(padbuffer);
|
||||||
|
for (i=0; i<j; i++)
|
||||||
|
write (fd, &padbuffer[i], 1);
|
||||||
|
write (fd, nlbuffer, strlen(nlbuffer));
|
||||||
write (fd, outbuffer, sizeof (outbuffer));
|
write (fd, outbuffer, sizeof (outbuffer));
|
||||||
close (fd);
|
close (fd);
|
||||||
|
|
||||||
/* Open file in ascii mode */
|
if (ascii_mode) {
|
||||||
fd = open ("fdopen.tst", O_RDONLY);
|
/* Open file in ascii mode */
|
||||||
file = fdopen (fd, "rb");
|
fd = open ("fdopen.tst", O_RDONLY);
|
||||||
ok(strlen(outbuffer) == (sizeof(outbuffer)-1),"strlen/sizeof error\n");
|
file = fdopen (fd, "r");
|
||||||
ok(ftell(file) == 0,"Did not start at beginning of file\n");
|
ao = -1; /* on offset to account for carriage returns */
|
||||||
ok(fgets(buffer,sizeof(buffer),file) !=0,"line 1 fgets failed unexpected\n");
|
}
|
||||||
ok(fgets(buffer,sizeof(buffer),file) !=0,"line 2 fgets failed unexpected\n");
|
else {
|
||||||
ok(fgets(buffer,sizeof(buffer),file) !=0,"line 3 fgets failed unexpected\n");
|
fd = open ("fdopen.tst", O_RDONLY | O_BINARY);
|
||||||
ok(fgets(buffer,sizeof(buffer),file) !=0,"line 4 fgets failed unexpected\n");
|
file = fdopen (fd, "rb");
|
||||||
ok(fgets(buffer,sizeof(buffer),file) ==0,"fgets didn't signal EOF\n");
|
ao = 0;
|
||||||
ok(feof(file) !=0,"feof doesn't signal EOF\n");
|
}
|
||||||
|
|
||||||
|
/* first is a test of fgets, ftell, fseek */
|
||||||
|
ok(ftell(file) == 0,"Did not start at beginning of file in %s\n", IOMODE);
|
||||||
|
ok(fgets(buffer,MSVCRT_BUFSIZ+256,file) !=0,"padding line fgets failed unexpected in %s\n", IOMODE);
|
||||||
|
l = ftell(file);
|
||||||
|
pl = MSVCRT_BUFSIZ-2;
|
||||||
|
ok(l == pl,"padding line ftell got %ld should be %d in %s\n", l, pl, IOMODE);
|
||||||
|
ok(lstrlenA(buffer) == pl+ao,"padding line fgets got size %d should be %d in %s\n",
|
||||||
|
lstrlenA(buffer), pl+ao, IOMODE);
|
||||||
|
for (fp=0; fp<strlen(outbuffer); fp++)
|
||||||
|
if (outbuffer[fp] == '\n') break;
|
||||||
|
fp++;
|
||||||
|
ok(fgets(buffer,256,file) !=0,"line 1 fgets failed unexpected in %s\n", IOMODE);
|
||||||
|
l = ftell(file);
|
||||||
|
if (ao == -1)
|
||||||
|
todo_wine ok(l == pl+fp,"line 1 ftell got %ld should be %d in %s\n", l, pl+fp, IOMODE);
|
||||||
|
else
|
||||||
|
ok(l == pl+fp,"line 1 ftell got %ld should be %d in %s\n", l, pl+fp, IOMODE);
|
||||||
|
ok(lstrlenA(buffer) == fp+ao,"line 1 fgets got size %d should be %d in %s\n",
|
||||||
|
lstrlenA(buffer), fp+ao, IOMODE);
|
||||||
|
/* test a seek back across the buffer boundary */
|
||||||
|
l = pl;
|
||||||
|
ok(fseek(file,l,SEEK_SET)==0,"seek failure in %s\n", IOMODE);
|
||||||
|
l = ftell(file);
|
||||||
|
ok(l == pl,"ftell after seek got %ld should be %d in %s\n", l, pl, IOMODE);
|
||||||
|
ok(fgets(buffer,256,file) !=0,"second read of line 1 fgets failed unexpected in %s\n", IOMODE);
|
||||||
|
l = ftell(file);
|
||||||
|
if (ao == -1)
|
||||||
|
todo_wine ok(l == pl+fp,"second read of line 1 ftell got %ld should be %d in %s\n", l, pl+fp, IOMODE);
|
||||||
|
else
|
||||||
|
ok(l == pl+fp,"second read of line 1 ftell got %ld should be %d in %s\n", l, pl+fp, IOMODE);
|
||||||
|
ok(lstrlenA(buffer) == fp+ao,"second read of line 1 fgets got size %d should be %d in %s\n",
|
||||||
|
lstrlenA(buffer), fp+ao, IOMODE);
|
||||||
|
ok(fgets(buffer,256,file) !=0,"line 2 fgets failed unexpected in %s\n", IOMODE);
|
||||||
|
fp += 2;
|
||||||
|
l = ftell(file);
|
||||||
|
if (ao == -1)
|
||||||
|
todo_wine ok(l == pl+fp,"line 2 ftell got %ld should be %d in %s\n", l, pl+fp, IOMODE);
|
||||||
|
else
|
||||||
|
ok(l == pl+fp,"line 2 ftell got %ld should be %d in %s\n", l, pl+fp, IOMODE);
|
||||||
|
ok(lstrlenA(buffer) == 2+ao,"line 2 fgets got size %d should be %d in %s\n",
|
||||||
|
lstrlenA(buffer), 2+ao, IOMODE);
|
||||||
|
|
||||||
|
/* test fread across buffer boundary */
|
||||||
rewind(file);
|
rewind(file);
|
||||||
ok(ftell(file) == 0,"Did not rewind to beginning of file\n");
|
ok(ftell(file) == 0,"Did not start at beginning of file in %s\n", IOMODE);
|
||||||
for (i=0; i<strlen(outbuffer); i++)
|
ok(fgets(buffer,MSVCRT_BUFSIZ-6,file) !=0,"padding line fgets failed unexpected in %s\n", IOMODE);
|
||||||
if (outbuffer[i] == '\n') break;
|
j=strlen(outbuffer);
|
||||||
i++;
|
i=fread(buffer,1,256,file);
|
||||||
ok(fgets(buffer,strlen(outbuffer),file) !=0,"line 1 fgets failed unexpected\n");
|
ok(i==j+6+ao*4,"fread failed, expected %d got %d in %s\n", j+6+ao*4, i, IOMODE);
|
||||||
l = ftell(file);
|
l = ftell(file);
|
||||||
todo_wine ok(l == i,"line 1 ftell got %ld should be %d\n", l, i);
|
ok(l == pl+j+1,"ftell after fread got %ld should be %d in %s\n", l, pl+j+1, IOMODE);
|
||||||
ok(lstrlenA(buffer) == i-1,"line 1 fgets got size %d should be %d\n", lstrlenA(buffer), i-1);
|
/* fread should return the requested number of bytes if available */
|
||||||
ok(fgets(buffer,sizeof(outbuffer),file) !=0,"line 2 fgets failed unexpected\n");
|
rewind(file);
|
||||||
i += 2;
|
ok(ftell(file) == 0,"Did not start at beginning of file in %s\n", IOMODE);
|
||||||
l = ftell(file);
|
ok(fgets(buffer,MSVCRT_BUFSIZ-6,file) !=0,"padding line fgets failed unexpected in %s\n", IOMODE);
|
||||||
todo_wine ok(l == i,"line 2 ftell got %ld should be %d\n", l, i);
|
j = fp+10;
|
||||||
ok(lstrlenA(buffer) == 1,"line 2 fgets got size %d should be %d\n", lstrlenA(buffer), 1);
|
i=fread(buffer,1,j,file);
|
||||||
ok(fgets(buffer,sizeof(outbuffer),file) !=0,"line 3 fgets failed unexpected\n");
|
ok(i==j,"fread failed, expected %d got %d in %s\n", j, i, IOMODE);
|
||||||
for (; i<strlen(outbuffer); i++)
|
|
||||||
if (outbuffer[i] == '\n') break;
|
/* test some additional functions */
|
||||||
i++;
|
rewind(file);
|
||||||
l = ftell(file);
|
ok(ftell(file) == 0,"Did not start at beginning of file in %s\n", IOMODE);
|
||||||
ok(l == i,"line 3 ftell got %ld should be %d\n", l, i);
|
ok(fgets(buffer,MSVCRT_BUFSIZ+256,file) !=0,"padding line fgets failed unexpected in %s\n", IOMODE);
|
||||||
|
i = _getw(file);
|
||||||
|
ip = (int *)outbuffer;
|
||||||
|
todo_wine ok(i == *ip,"_getw failed, expected %08x got %08x in %s\n", *ip, i, IOMODE);
|
||||||
|
for (fp=0; fp<strlen(outbuffer); fp++)
|
||||||
|
if (outbuffer[fp] == '\n') break;
|
||||||
|
fp++;
|
||||||
|
/* this will cause the next _getw to cross carriage return characters */
|
||||||
|
ok(fgets(buffer,fp-6,file) !=0,"line 1 fgets failed unexpected in %s\n", IOMODE);
|
||||||
|
for (i=0, j=0; i<6; i++) {
|
||||||
|
if (ao==0 || outbuffer[fp-3+i] != '\r')
|
||||||
|
buffer[j++] = outbuffer[fp-3+i];
|
||||||
|
}
|
||||||
|
i = _getw(file);
|
||||||
|
ip = (int *)buffer;
|
||||||
|
todo_wine ok(i == *ip,"_getw failed, expected %08x got %08x in %s\n", *ip, i, IOMODE);
|
||||||
|
|
||||||
fclose (file);
|
fclose (file);
|
||||||
|
|
||||||
unlink ("fdopen.tst");
|
unlink ("fdopen.tst");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -280,9 +352,29 @@ static void test_file_write_read( void )
|
||||||
static const char mytext[]= "This is test_file_write_read\nsecond line\n";
|
static const char mytext[]= "This is test_file_write_read\nsecond line\n";
|
||||||
static const char dostext[]= "This is test_file_write_read\r\nsecond line\r\n";
|
static const char dostext[]= "This is test_file_write_read\r\nsecond line\r\n";
|
||||||
char btext[LLEN];
|
char btext[LLEN];
|
||||||
int ret;
|
int ret, i;
|
||||||
|
|
||||||
tempf=_tempnam(".","wne");
|
tempf=_tempnam(".","wne");
|
||||||
|
tempfd = _open(tempf,_O_CREAT|_O_TRUNC|_O_BINARY|_O_RDWR,
|
||||||
|
_S_IREAD | _S_IWRITE);
|
||||||
|
ok( tempfd != -1,
|
||||||
|
"Can't open '%s': %d\n", tempf, errno); /* open in BINARY mode */
|
||||||
|
ok(_write(tempfd,dostext,strlen(dostext)) == lstrlenA(dostext),
|
||||||
|
"_write _O_BINARY bad return value\n");
|
||||||
|
_close(tempfd);
|
||||||
|
i = lstrlenA(mytext);
|
||||||
|
tempfd = _open(tempf,_O_RDONLY|_O_BINARY,0); /* open in BINARY mode */
|
||||||
|
ok(_read(tempfd,btext,i) == i,
|
||||||
|
"_read _O_BINARY got bad length\n");
|
||||||
|
ok( memcmp(dostext,btext,i) == 0,
|
||||||
|
"problems with _O_BINARY _write / _read\n");
|
||||||
|
_close(tempfd);
|
||||||
|
tempfd = _open(tempf,_O_RDONLY|_O_TEXT); /* open in TEXT mode */
|
||||||
|
todo_wine ok(_read(tempfd,btext,i) == i-1,
|
||||||
|
"_read _O_TEXT got bad length\n");
|
||||||
|
ok( memcmp(mytext,btext,i-1) == 0,
|
||||||
|
"problems with _O_BINARY _write / _O_TEXT _read\n");
|
||||||
|
_close(tempfd);
|
||||||
tempfd = _open(tempf,_O_CREAT|_O_TRUNC|_O_TEXT|_O_RDWR,
|
tempfd = _open(tempf,_O_CREAT|_O_TRUNC|_O_TEXT|_O_RDWR,
|
||||||
_S_IREAD | _S_IWRITE);
|
_S_IREAD | _S_IWRITE);
|
||||||
ok( tempfd != -1,
|
ok( tempfd != -1,
|
||||||
|
@ -556,7 +648,8 @@ START_TEST(file)
|
||||||
test_fdopen();
|
test_fdopen();
|
||||||
test_fopen_fclose_fcloseall();
|
test_fopen_fclose_fcloseall();
|
||||||
test_fileops();
|
test_fileops();
|
||||||
test_asciifileops();
|
test_readmode(FALSE); /* binary mode */
|
||||||
|
test_readmode(TRUE); /* ascii mode */
|
||||||
test_fgetwc();
|
test_fgetwc();
|
||||||
test_file_put_get();
|
test_file_put_get();
|
||||||
test_tmpnam();
|
test_tmpnam();
|
||||||
|
|
Loading…
Reference in New Issue