aboutsummaryrefslogtreecommitdiffstats
path: root/test/ut.c
diff options
context:
space:
mode:
authorcc4b05f61e2d8f77114750386c9f9a60 <cc4b05f61e2d8f7@7114750386c9f9a60>2023-07-31 20:39:25 +0000
committercc4b05f61e2d8f77114750386c9f9a60 <cc4b05f61e2d8f7@7114750386c9f9a60>2023-07-31 20:39:25 +0000
commit2879103290bfed992b6be6c301bd2c19a60269ba (patch)
tree64bf89e31e449c08b7dbec98091fcc7f42bd75cd /test/ut.c
parentd200efe3756b8dcc71e079698213ad6504611f2d (diff)
downloaddmsdosnow-2879103290bfed992b6be6c301bd2c19a60269ba.tar.gz
Update dir entry simple utHEADmaster
Diffstat (limited to 'test/ut.c')
-rw-r--r--test/ut.c133
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();