aos/usr/test/filereader/main.c
Daniel Schwyn 6d444bf552 Main handout
Signed-off-by: Daniel Schwyn <daniel.schwyn@inf.ethz.ch>
2022-03-03 14:57:51 +01:00

224 lines
4.6 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 DIR_NOT_EXIST "/not-exist"
#define FILENAME "/myfile2.txt"
#define LONGFILENAME "/mylongfilenamefile.txt"
#define LONGFILENAME2 "/mylongfilenamefilesecond.txt"
#define FILE_NOT_EXIST "/not-exist.txt"
#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_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_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;
}
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);
return EXIT_SUCCESS;
}