mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-16 12:31:52 -04:00
tools/nolibc: Add a simple test for writing to a FILE and reading it back
Add a test that exercises create->write->seek->read to check that using the stream functions (fwrite() etc) is not totally broken. The only edge cases this is testing for are: - Reading the file after writing but without rewinding reads nothing. - Trying to read more items than the file contains returns the count of fully read items. Signed-off-by: Daniel Palmer <daniel@thingy.jp> Link: https://patch.msgid.link/20260105023629.1502801-4-daniel@thingy.jp Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
This commit is contained in:
committed by
Thomas Weißschuh
parent
109770cc81
commit
a5f00be9b3
@@ -878,6 +878,58 @@ int test_file_stream(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int test_file_stream_wsr(void)
|
||||
{
|
||||
const char dataout[] = "foo";
|
||||
const size_t datasz = sizeof(dataout);
|
||||
char datain[datasz];
|
||||
int fd, r;
|
||||
FILE *f;
|
||||
|
||||
fd = open("/tmp", O_TMPFILE | O_RDWR, 0644);
|
||||
if (fd == -1)
|
||||
return -1;
|
||||
|
||||
f = fdopen(fd, "w+");
|
||||
if (!f)
|
||||
return -1;
|
||||
|
||||
errno = 0;
|
||||
r = fwrite(dataout, 1, datasz, f);
|
||||
if (r != datasz)
|
||||
return -1;
|
||||
|
||||
/* Attempt to read from the file without rewinding,
|
||||
* we should read 0 items.
|
||||
*/
|
||||
r = fread(datain, 1, datasz, f);
|
||||
if (r)
|
||||
return -1;
|
||||
|
||||
/* Rewind the file to the start */
|
||||
r = fseek(f, 0, SEEK_SET);
|
||||
if (r)
|
||||
return -1;
|
||||
|
||||
/* Attempt to read back more than was written to
|
||||
* make sure we handle short reads properly.
|
||||
* fread() should return the number of complete items.
|
||||
*/
|
||||
r = fread(datain, 1, datasz + 1, f);
|
||||
if (r != datasz)
|
||||
return -1;
|
||||
|
||||
/* Data we read should match the data we just wrote */
|
||||
if (memcmp(datain, dataout, datasz) != 0)
|
||||
return -1;
|
||||
|
||||
r = fclose(f);
|
||||
if (r)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
enum fork_type {
|
||||
FORK_STANDARD,
|
||||
FORK_VFORK,
|
||||
@@ -1352,6 +1404,7 @@ int run_syscall(int min, int max)
|
||||
CASE_TEST(fchdir_stdin); EXPECT_SYSER(1, fchdir(STDIN_FILENO), -1, ENOTDIR); break;
|
||||
CASE_TEST(fchdir_badfd); EXPECT_SYSER(1, fchdir(-1), -1, EBADF); break;
|
||||
CASE_TEST(file_stream); EXPECT_SYSZR(1, test_file_stream()); break;
|
||||
CASE_TEST(file_stream_wsr); EXPECT_SYSZR(1, test_file_stream_wsr()); break;
|
||||
CASE_TEST(fork); EXPECT_SYSZR(1, test_fork(FORK_STANDARD)); break;
|
||||
CASE_TEST(getdents64_root); EXPECT_SYSNE(1, test_getdents64("/"), -1); break;
|
||||
CASE_TEST(getdents64_null); EXPECT_SYSER(1, test_getdents64("/dev/null"), -1, ENOTDIR); break;
|
||||
|
||||
Reference in New Issue
Block a user