Files
graphene/LibOS/shim/test/fs/read_write.c
Rafał Wojdyła baab561a75 [LibOS] Add tests for some typical FS use cases
These tests perform common FS operations in various ways:
- open/close
- read/write
- create/delete
- read/change size
- seek/tell
- memory-mapped read/write
- copy directory in different ways

Tests use both direct syscalls and stdio wrappers (FILE).

To run, call `make test` in `LibOS/shim/test/fs`.
2019-12-03 15:25:47 +01:00

47 lines
1.5 KiB
C

#include "common.h"
void read_write(const char* file_path) {
const size_t size = 1024 * 1024;
int fd = open_output_fd(file_path, /*rdwr=*/true);
printf("open(%s) RW OK\n", file_path);
void* buf1 = alloc_buffer(size);
void* buf2 = alloc_buffer(size);
fill_random(buf1, size);
write_fd(file_path, fd, buf1, size);
printf("write(%s) RW OK\n", file_path);
seek_fd(file_path, fd, 0, SEEK_SET);
printf("seek(%s) RW OK\n", file_path);
read_fd(file_path, fd, buf2, size);
printf("read(%s) RW OK\n", file_path);
if (memcmp(buf1, buf2, size) != 0)
fatal_error("Read data is different from what was written\n");
printf("compare(%s) RW OK\n", file_path);
for (size_t i = 0; i < 1024; i++) {
size_t offset = rand() % (size - 1024);
size_t chunk_size = rand() % 1024;
fill_random(buf1, chunk_size);
seek_fd(file_path, fd, offset, SEEK_SET);
write_fd(file_path, fd, buf1, chunk_size);
seek_fd(file_path, fd, offset, SEEK_SET);
read_fd(file_path, fd, buf2, chunk_size);
if (memcmp(buf1, buf2, chunk_size) != 0)
fatal_error("Chunk data is different from what was written (offset %zu, size %zu)\n", offset, chunk_size);
}
close_fd(file_path, fd);
printf("close(%s) RW OK\n", file_path);
free(buf1);
free(buf2);
}
int main(int argc, char* argv[]) {
if (argc < 2)
fatal_error("Usage: %s <file_path>\n", argv[0]);
setup();
read_write(argv[1]);
return 0;
}