occlum/test/fs_perms/main.c
LI Qing 292fc28340 Add "*at()" system calls
The syscalls implemented in this submission are as follows:
fchmodat, fchownat, linkat, mkdirat, renameat, readlinkat, unlinkat
2020-09-18 12:39:12 +08:00

161 lines
4.6 KiB
C

#include <sys/types.h>
#include <sys/uio.h>
#include <fcntl.h>
#include "test_fs.h"
// ============================================================================
// Helper macros
// ============================================================================
//#define PRINT_DBG(msg) printf("%s %s %d ", msg, __FUNCTION__, __LINE__);
#define PRINT_DBG(msg)
#define OK (0)
#define NG (-1)
#define NUM_TEST_CASES 6
#define NUM_TEST_FILES 5
// ============================================================================
// Helper functions
// ============================================================================
static int open_file(const char *filename, int flags, int mode) {
int fd = -1;
if ((fd = open(filename, flags, mode)) < 0) {
PRINT_DBG("ERROR: failed to open a file\n");
}
return fd;
}
static const char *write_msg = "Hello SEFS 1234567890\n";
static int write_file(int fd) {
int len = strlen(write_msg);
if ((len = write(fd, write_msg, len) <= 0)) {
PRINT_DBG("ERROR: failed to write to the file\n");
return -1;
}
fsync(fd);
close(fd);
return 0;
}
static int read_file(int fd) {
int len;
char read_buf[128] = {0};
if ((len = read(fd, read_buf, sizeof(read_buf) - 1)) <= 0) {
PRINT_DBG("ERROR: failed to read from the file\n");
return -1;
}
close(fd);
if (strcmp(write_msg, read_buf) != 0) {
PRINT_DBG("ERROR: the message read from the file is not as it was written\n");
return -1;
}
return 0;
}
// for each file in test_filename
// open the file with the given flags
// do read or write according to do_write
// check the result of the read/write with the given expected_result
static int do_perm_tests(
const char **files,
size_t num_files,
int flags, int do_write,
int *expected_results) {
flags |= O_CREAT | O_TRUNC;
for (size_t i = 0; i < num_files; i++) {
const char *filename = files[i];
int expected_result = expected_results[i];
int fd = open_file(filename, flags, 0666);
if (fd < 0 && fd != expected_result) {
return -1;
}
int result = do_write ? write_file(fd) : read_file(fd);
if (result != expected_result) {
return -1;
}
}
return 0;
}
// ============================================================================
// Test cases
// ============================================================================
// Test files
static const char *test_files[NUM_TEST_FILES] = {
"/test_fs_perms.txt",
"/bin/test_fs_perms.txt",
"/lib/test_fs_perms.txt",
"/root/test_fs_perms.txt",
"/host/test_fs_perms.txt",
};
// Test cases X Test files -> Test Results
static int test_expected_results[NUM_TEST_CASES][NUM_TEST_FILES] = {
// test_open_ro_then_write()
{NG, NG, NG, NG, NG},
// test_open_wo_then_write()
{OK, OK, OK, OK, OK},
// test_open_rw_then_write()
{OK, OK, OK, OK, OK},
// test_open_ro_then_read()
{OK, OK, OK, OK, OK},
// test_open_wo_then_read()
{NG, NG, NG, NG, NG},
// test_open_rw_then_read()
{OK, OK, OK, OK, OK},
};
int test_open_ro_then_write() {
return do_perm_tests(test_files, NUM_TEST_FILES,
O_RDONLY, 1, test_expected_results[0]);
}
int test_open_wo_then_write() {
return do_perm_tests(test_files, NUM_TEST_FILES,
O_WRONLY, 1, test_expected_results[1]);
}
int test_open_rw_then_write() {
return do_perm_tests(test_files, NUM_TEST_FILES,
O_RDWR, 1, test_expected_results[2]);
}
int test_open_ro_then_read() {
return do_perm_tests(test_files, NUM_TEST_FILES,
O_RDONLY, 0, test_expected_results[3]);
}
int test_open_wo_then_read() {
return do_perm_tests(test_files, NUM_TEST_FILES,
O_WRONLY, 0, test_expected_results[4]);
}
int test_open_rw_then_read() {
return do_perm_tests(test_files, NUM_TEST_FILES,
O_RDWR, 0, test_expected_results[5]);
}
// ============================================================================
// Test suite main
// ============================================================================
test_case_t test_cases[NUM_TEST_CASES] = {
TEST_CASE(test_open_ro_then_write),
TEST_CASE(test_open_wo_then_write),
TEST_CASE(test_open_rw_then_write),
TEST_CASE(test_open_ro_then_read),
TEST_CASE(test_open_wo_then_read),
TEST_CASE(test_open_rw_then_read)
};
int main(int argc, const char *argv[]) {
return test_suite_run(test_cases, NUM_TEST_CASES);
}