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:
Daniel Palmer
2026-01-05 11:36:29 +09:00
committed by Thomas Weißschuh
parent 109770cc81
commit a5f00be9b3

View File

@@ -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;