aos/usr/test/filereader/main.c
2022-06-01 06:44:52 +00:00

418 lines
15 KiB
C

/**
* \file
* \brief file system test application
*/
/*
* Copyright (c) 2016 ETH Zurich.
* All rights reserved.
*
* This file is distributed under the terms in the attached LICENSE file.
* If you do not find this file, copies can be found by writing to:
* ETH Zurich D-INFK, CAB F.78, Universitaetstr. 6, CH-8092 Zurich,
* Attn: Systems Group.
*/
#include <stdio.h>
#include <aos/aos.h>
#include <aos/systime.h>
#include <fs/fs.h>
#include <fs/dirent.h>
static uint64_t systime_to_ms(systime_t time){
return systime_to_us(time) / 1000;
}
#define ENABLE_LONG_FILENAME_TEST 1
/* reading */
#define MOUNTPOINT "/sdcard"
#define SUBDIR "/parent"
#define SUBDIR_LONG "/parent-directory"
#define SUBDIR_INVALID "/parent.txtt"
#define DIR_NOT_EXIST "/not-exist"
#define FILENAME "/myfile2.txt"
#define LONGFILENAME "/mylongfilenamefile.txt"
#define LONGFILENAME2 "/mylongfilenamefilesecond.txt"
#define FILE_NOT_EXIST "/not-exist.txt"
char *long_text = "Hello World! Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
#define TEST_PREAMBLE(arg) \
printf("\n-------------------------------\n"); \
printf("%s(%s)\n", __FUNCTION__, arg);
#define TEST_END \
printf("-------------------------------\n");
#define EXPECT_SUCCESS(err, test, _time) \
do{ \
if(err_is_fail(err)){ \
DEBUG_ERR(err, test); \
} else { \
printf("SUCCESS: " test " took %" PRIu64 " ms\n", _time);\
}\
} while(0);\
#define EXPECT_FAILURE(err, _test, _time) \
do{ \
if(err_is_fail(err)){ \
printf("SUCCESS: failure expected " _test " took %" PRIu64 " ms\n", _time);\
} else { \
DEBUG_ERR(err, "FAILURE: failure expected, but test succeeded" _test); \
}\
} while(0);\
#define run_test(fn, arg) \
do { \
tstart = systime_now(); \
err = fn(arg); \
tend = systime_now(); \
EXPECT_SUCCESS(err, #fn, systime_to_ms(tend-tstart)); \
TEST_END \
} while(0); \
#define run_test_fail(fn, arg) \
do { \
tstart = systime_now(); \
err = fn(arg); \
tend = systime_now(); \
EXPECT_FAILURE(err, #fn, systime_to_ms(tend-tstart)); \
TEST_END \
} while(0); \
static errval_t test_make_dir(char *dir)
{
TEST_PREAMBLE(dir)
return mkdir(dir);
}
static errval_t test_rm_dir(char *dir)
{
TEST_PREAMBLE(dir)
return rmdir(dir);
}
static errval_t test_rm_file(char *dir)
{
TEST_PREAMBLE(dir)
return rm(dir);
}
static errval_t test_read_dir(char *dir)
{
errval_t err;
TEST_PREAMBLE(dir)
fs_dirhandle_t dh;
err = opendir(dir, &dh);
if (err_is_fail(err)) {
return err;
}
assert(dh);
do {
char *name;
err = readdir(dh, &name);
if (err_no(err) == FS_ERR_INDEX_BOUNDS) {
break;
} else if (err_is_fail(err)) {
goto err_out;
}
printf("%s\n", name);
} while(err_is_ok(err));
return closedir(dh);
err_out:
return err;
}
static errval_t test_delete_open_file(char *file)
{
int res = 0;
TEST_PREAMBLE(file)
FILE *f = fopen(file, "r");
if (f == NULL) {
// because failure would be recongnized as good
return SYS_ERR_OK;
}
errval_t err = rm(file);
res = fclose(f);
if (res) {
// because failure would be recongnized as good
return SYS_ERR_OK;
}
return err;
}
static errval_t test_delete_open_dir(char *dir)
{
errval_t err;
TEST_PREAMBLE(dir)
fs_dirhandle_t dh;
err = opendir(dir, &dh);
if (err_is_fail(err)) {
// because failure would be recongnized as good
return SYS_ERR_OK;
}
errval_t res_err = rmdir(dir);
err = closedir(dh);
if (err_is_fail(err)) {
// because failure would be recongnized as good
return SYS_ERR_OK;
}
return res_err;
}
static errval_t test_fread_big(char *file)
{
int res = 0;
TEST_PREAMBLE(file)
FILE *f = fopen(file, "r");
if (f == NULL) {
return FS_ERR_OPEN;
}
/* obtain the file size */
res = fseek (f , 0 , SEEK_END);
if (res) {
return FS_ERR_INVALID_FH;
}
size_t filesize = ftell (f);
rewind (f);
printf("File size is %zu\n", filesize);
if(filesize != strlen(long_text)) {
return FS_ERR_READ;
}
char *buf = calloc(filesize + 2, sizeof(char));
if (buf == NULL) {
return LIB_ERR_MALLOC_FAIL;
}
size_t read = fread(buf, 1, filesize, f);
if (read != filesize) {
return FS_ERR_READ;
}
if(memcmp(buf, long_text, strlen(long_text))) {
return FS_ERR_READ;
}
// printf("read: %s\n", buf);
res = fclose(f);
if (res) {
return FS_ERR_CLOSE;
}
return SYS_ERR_OK;
}
static errval_t test_fwrite_big(char *file)
{
int res = 0;
TEST_PREAMBLE(file)
FILE *f = fopen(file, "w");
if (f == NULL) {
return FS_ERR_OPEN;
}
printf("file opened\n");
// write in splits
for (size_t i = 0; i < strlen(long_text); ++i) {
size_t written = fwrite(long_text + i, 1, 1, f);
if (written != 1) return FS_ERR_WRITE;
}
res = fclose(f);
if (res) {
return FS_ERR_CLOSE;
}
return SYS_ERR_OK;
}
static errval_t test_fread(char *file)
{
int res = 0;
TEST_PREAMBLE(file)
FILE *f = fopen(file, "r");
if (f == NULL) {
return FS_ERR_OPEN;
}
/* obtain the file size */
res = fseek (f , 0 , SEEK_END);
if (res) {
return FS_ERR_INVALID_FH;
}
size_t filesize = ftell (f);
rewind (f);
printf("File size is %zu\n", filesize);
char *buf = calloc(filesize + 2, sizeof(char));
if (buf == NULL) {
return LIB_ERR_MALLOC_FAIL;
}
size_t read = fread(buf, 1, filesize, f);
printf("read: %s\n", buf);
if (read != filesize) {
return FS_ERR_READ;
}
rewind(f);
size_t nchars = 0;
int c;
do {
c = fgetc (f);
nchars++;
} while (c != EOF);
if (nchars < filesize) {
return FS_ERR_READ;
}
free(buf);
res = fclose(f);
if (res) {
return FS_ERR_CLOSE;
}
return SYS_ERR_OK;
}
static errval_t test_fwrite(char *file)
{
int res = 0;
TEST_PREAMBLE(file)
FILE *f = fopen(file, "w");
if (f == NULL) {
return FS_ERR_OPEN;
}
printf("file opened\n");
const char *inspirational_quote = "I love deadlines. I like the whooshing "
"sound they make as they fly by.";
size_t written = fwrite(inspirational_quote, 1, strlen(inspirational_quote),
f);
printf("wrote %zu bytes\n", written);
if (written != strlen(inspirational_quote)) {
return FS_ERR_READ;
}
res = fclose(f);
if (res) {
return FS_ERR_CLOSE;
}
return SYS_ERR_OK;
}
int main(int argc, char *argv[])
{
errval_t err;
uint64_t tstart, tend;
printf("Filereader test\n");
printf("initializing filesystem...\n");
err = filesystem_init();
EXPECT_SUCCESS(err, "fs init", 0);
run_test(test_read_dir, MOUNTPOINT "/");
run_test_fail(test_read_dir, DIR_NOT_EXIST);
run_test(test_fwrite, MOUNTPOINT FILENAME);
run_test(test_fread, MOUNTPOINT FILENAME);
// NOTE rueegges: part added by me
// MKDIR
// create a new directory
run_test(test_make_dir, MOUNTPOINT SUBDIR);
// create subdirectory
run_test(test_make_dir, MOUNTPOINT SUBDIR SUBDIR);
// try to create existing directory
run_test_fail(test_make_dir, MOUNTPOINT SUBDIR);
// too long dirname
run_test_fail(test_make_dir, MOUNTPOINT SUBDIR_LONG);
// too long name extension
run_test_fail(test_make_dir, MOUNTPOINT SUBDIR_INVALID);
// RMDIR
// try to delete non-empty directory
run_test_fail(test_rm_dir, MOUNTPOINT SUBDIR);
// delete subdirectory
run_test(test_rm_dir, MOUNTPOINT SUBDIR SUBDIR);
// try to delete again after deleting subdir
run_test(test_rm_dir, MOUNTPOINT SUBDIR);
// non-existent directory
run_test_fail(test_rm_dir, MOUNTPOINT DIR_NOT_EXIST);
// dry to delete file using rmdir
run_test_fail(test_rm_dir, MOUNTPOINT FILENAME);
// RM
// delete a valid file
run_test(test_rm_file, MOUNTPOINT FILENAME)
// delete non-existent file
run_test_fail(test_rm_file, MOUNTPOINT FILENAME)
// FILE OPERATIONS (more extensive than what was already present, exploring cluster/sector bounds)
run_test(test_make_dir, MOUNTPOINT SUBDIR);
run_test(test_fwrite_big, MOUNTPOINT SUBDIR FILENAME);
run_test(test_fread_big, MOUNTPOINT SUBDIR FILENAME);
// delete open file and directory
run_test_fail(test_delete_open_file, MOUNTPOINT SUBDIR FILENAME);
run_test_fail(test_delete_open_dir, MOUNTPOINT SUBDIR);
run_test(test_rm_file, MOUNTPOINT SUBDIR FILENAME);
run_test(test_rm_dir, MOUNTPOINT SUBDIR);
return EXIT_SUCCESS;
}