dosemu2/test/func_mfs_truename.py
geos_one 91736529d5
Some checks failed
Master / Scheduled (FULL) (push) Has been cancelled
Master / Triggered (push) Has been cancelled
Master / Triggered (ASAN) (push) Has been cancelled
Master / Triggered (FULL) (push) Has been cancelled
New upstream version 2.0pre9.2
2025-08-10 12:35:43 +02:00

151 lines
3.6 KiB
Python

from pathlib import Path
from common_framework import (VFAT_MNTPNT,
setup_vfat_mounted_image, teardown_vfat_mounted_image)
def mfs_truename(self, fstype, tocreate, tests):
ename = "mfstruen"
if fstype == "UFS":
testdir = Path("test-imagedir/dXXXXs/d")
testdir.mkdir(parents=True, exist_ok=True)
batchfile = """\
mkdir RootC
d:
cd Sub
c:\\%s
rem end
""" % ename
config = """\
$_hdimage = "dXXXXs/c:hdtype1 dXXXXs/d:hdtype1 +1"
$_floppy_a = ""
"""
elif fstype == "VFAT":
testdir = Path(VFAT_MNTPNT)
setup_vfat_mounted_image(self)
batchfile = """\
lredir X: /mnt/dosemu
lredir
mkdir RootC
x:
cd Sub
c:\\%s
rem end
""" % ename
config = """\
$_hdimage = "dXXXXs/c:hdtype1 +1"
$_floppy_a = ""
$_lredir_paths = "/mnt/dosemu"
"""
else:
self.fail("Incorrect argument")
# Make test files and directory names
for i in tocreate:
p = testdir / i[1]
if i[0] == "FILE":
p.parents[0].mkdir(parents=True, exist_ok=True)
p.write_text("Some data")
elif i[0] == "DIR":
p.mkdir(parents=True, exist_ok=True)
self.mkfile("testit.bat", batchfile, newline="\r\n")
def mkctests(xtests):
cnv = {
'LFN0': ('0x7160', '0'),
'LFN1': ('0x7160', '1'),
'LFN2': ('0x7160', '2'),
'SFN': ('0x6000', '0'),
}
results = "test_t test[] = {\n"
for t in xtests:
results += ' {%s, %s, "%s", "%s"},\n' % (*cnv[t[0]], t[1], t[2])
results += ' };\n'
results += ' int tlen = %d;' % len(xtests)
return results
# compile sources
self.mkcom_with_ia16(ename, r"""
#include <i86.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
typedef struct {
uint16_t intr;
uint8_t tipo;
const char *input;
const char *expected;
} test_t;
%s
char dst[1024];
int main(void)
{
int ret = 0;
union REGS r = {};
struct SREGS rs;
int i;
for (i = 0; i < tlen; i++) {
r.x.ax = test[i].intr;
if (r.x.ax == 0x7160)
r.x.cx = test[i].tipo;
rs.ds = FP_SEG(test[i].input);
r.x.si = FP_OFF(test[i].input);
rs.es = FP_SEG(dst);
r.x.di = FP_OFF(dst);
// need to set CF so we can detect if the function is implemented
r.x.cflag = 1;
int86x(0x21, &r, &r, &rs);
if (r.x.cflag) {
if (r.x.ax == 0x7100) {
snprintf(dst, sizeof(dst), "ERROR: not implemented, or perhaps ignored as not our drive\n");
} else if (r.x.ax == 0x2) {
snprintf(dst, sizeof(dst), "ERROR: invalid component");
} else if (r.x.ax == 0x3) {
snprintf(dst, sizeof(dst), "ERROR: malformed path or invalid drive letter");
} else {
snprintf(dst, sizeof(dst), "ERROR: unknown error code 0x%%04x", r.x.ax);
}
}
if (strcmp(dst, test[i].expected) != 0) {
printf("FAIL: 0x%%04x/%%d, (sent '%%s', expected '%%s', got '%%s')\n",
test[i].intr, test[i].tipo, test[i].input, test[i].expected, dst);
ret += 1;
} else {
if (test[i].intr == 0x7160) {
printf("OKAY: 0x%%04x/%%d, (sent '%%s', got '%%s')\n",
test[i].intr, test[i].tipo, test[i].input, dst);
} else {
printf("OKAY: 0x%%04x , (sent '%%s', got '%%s')\n",
test[i].intr, test[i].input, dst);
}
}
}
if (ret == 0)
printf("PASS:\n");
return ret;
}
""" % mkctests(tests))
results = self.runDosemu("testit.bat", config=config)
if fstype == "VFAT":
teardown_vfat_mounted_image(self)
self.assertRegex(results, r"X: = .*LINUX\\FS/mnt/dosemu")
self.assertNotIn("FAIL", results)