diff options
author | cc4b05f61e2d8f77114750386c9f9a60 <cc4b05f61e2d8f7@7114750386c9f9a60> | 2023-07-31 20:39:25 +0000 |
---|---|---|
committer | cc4b05f61e2d8f77114750386c9f9a60 <cc4b05f61e2d8f7@7114750386c9f9a60> | 2023-07-31 20:39:25 +0000 |
commit | 2879103290bfed992b6be6c301bd2c19a60269ba (patch) | |
tree | 64bf89e31e449c08b7dbec98091fcc7f42bd75cd /test/ut.c | |
parent | d200efe3756b8dcc71e079698213ad6504611f2d (diff) | |
download | dmsdosnow-2879103290bfed992b6be6c301bd2c19a60269ba.tar.gz |
Diffstat (limited to 'test/ut.c')
-rw-r--r-- | test/ut.c | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/test/ut.c b/test/ut.c new file mode 100644 index 0000000..8a5fd91 --- /dev/null +++ b/test/ut.c @@ -0,0 +1,133 @@ +#include "contrib/fctx/fct.h" +#include <stdlib.h> +#include <errno.h> + +#include <stdlib.h> + +#include "lib/dmsdos.h" +#include "lib/lib_interface.h" + +#define SECSZ 512 + +static int create_image(int fd) { + FILE* src = popen("cat data/DRVSPACE.001.xz | unxz", "r"); + if (!src) { + perror("unable to open data source: "); + return -1; + } + + FILE* dst = fdopen(fd, "r+"); + if (!dst) { + perror("fdopen error: "); + fclose(src); + return -1; + } + + char buf[1024]; + size_t bytes; + while (0 < (bytes = fread(buf, 1, sizeof(buf), src))) + fwrite(buf, 1, bytes, dst); + + if (fclose(dst) == -1) { + perror("fclose error: "); + return -1; + } + + if (pclose(src) == -1) { + perror("pclose error: "); + return -1; + } + + return 0; +} + +static int prepare_env(char* template) { + int temp_fd = mkstemp(template); + if (temp_fd < 0) { + perror("mkstemp failed: "); + return -1; + } + +// if (unlink(template) < 0) { +// perror("unlink failed: "); +// return -1; +// } + + if (create_image(temp_fd) < 0) { + return -1; + } + + return temp_fd; +} + +#define PREPARE_ENV \ + char template[] = "/tmp/dmsdos_ut_XXXXXX"; \ + do { \ + int fd = prepare_env(template); \ + fct_chk(fd > 0); \ + } while (0) \ + + +static int check_short_filename(const unsigned char* data, short offset, + const char* expected) +{ + char filename[9] = {0}; + int j = 0; + while (j < 8 && data[offset + j] != ' ') { + filename[j] = data[offset + j]; + j++; + } + + return strcmp(filename, expected) == 0; +} + +FCT_BGN() +{ + FCT_SUITE_BGN(RW) + { + FCT_TEST_BGN(UpdateDirEntry) + { + PREPARE_ENV; + struct super_block* sb = open_cvf(template, 1); + fct_chk(sb); + Dblsb* dblsb = MSDOS_SB(sb)->private_data; + fct_chk(dblsb); + size_t sz = dblsb->s_sectperclust * SECSZ; + unsigned char* data = malloc(sz); + fct_chk(data); + + // Read directory + int i = dmsdos_read_cluster(sb, data, 6); + fct_chk(i > 0); + + fct_chk(check_short_filename(data, 96, "TESTFI~1")); + + data[96] = 'X'; + + // Write new cluster + dmsdos_write_cluster(sb, data, sz, 6, 0, UC_NORMAL); + + memset(data, 0, sz); + + // Read directory again + i = dmsdos_read_cluster(sb, data, 6); + fct_chk(i > 0); + fct_chk(check_short_filename(data, 96, "XESTFI~1")); + + close_cvf(sb); + + sb = open_cvf(template, 1); + fct_chk(sb); + dblsb = MSDOS_SB(sb)->private_data; + fct_chk(dblsb); + + // Read directory again + i = dmsdos_read_cluster(sb, data, 6); + fct_chk(i > 0); + fct_chk(check_short_filename(data, 96, "XESTFI~1")); + } + FCT_TEST_END(); + } + FCT_SUITE_END(); +} +FCT_END(); |