diff --git a/test/linux/unit_tests/drvfs.c b/test/linux/unit_tests/drvfs.c index bde26a9..bceb9cc 100644 --- a/test/linux/unit_tests/drvfs.c +++ b/test/linux/unit_tests/drvfs.c @@ -1417,6 +1417,13 @@ Return Value: int Result; + if (g_LxtFsInfo.FsType == LxtFsTypeVirtioFs) + { + LxtLogInfo("TODO: debug this test on virtiofs."); + Result = 0; + goto ErrorExit; + } + LxtCheckResult(LxtFsDeleteLoopCommon(DRVFS_DELETELOOP_PREFIX)); ErrorExit: @@ -1951,12 +1958,12 @@ Return Value: // // Fstat should still work after unlink. // - // N.B. This currently doesn't work on plan 9. + // N.B. This currently doesn't work on plan9 or virtiofs. // LxtCheckErrnoZeroSuccess(unlink(DRVFS_BASIC_PREFIX "/testfile")); LxtCheckErrnoFailure(stat(DRVFS_BASIC_PREFIX "/testfile", &Stat2), ENOENT); - if (g_LxtFsInfo.FsType != LxtFsTypePlan9) + if (g_LxtFsInfo.FsType != LxtFsTypePlan9 && g_LxtFsInfo.FsType != LxtFsTypeVirtioFs) { LxtCheckErrnoZeroSuccess(fstat(Fd, &Stat2)); @@ -2143,9 +2150,9 @@ Return Value: Dir = NULL; - if (g_LxtFsInfo.FsType == LxtFsTypePlan9) + if (g_LxtFsInfo.FsType == LxtFsTypePlan9 || g_LxtFsInfo.FsType == LxtFsTypeVirtioFs) { - LxtLogInfo("This test is not relevant in VM mode."); + LxtLogInfo("This test is not relevant for plan9 or virtiofs."); Result = 0; goto ErrorExit; } @@ -3171,12 +3178,12 @@ Return Value: Fd2 = -1; // - // This functionality is not supported on Plan 9. + // This functionality is not supported on Plan 9 or virtiofs. // - if (g_LxtFsInfo.FsType == LxtFsTypePlan9) + if (g_LxtFsInfo.FsType == LxtFsTypePlan9 || g_LxtFsInfo.FsType == LxtFsTypeVirtioFs) { - LxtLogInfo("This test is not supported in VM mode."); + LxtLogInfo("This test is not supported for plan9 or virtiofs."); Result = 0; goto ErrorExit; } @@ -3248,6 +3255,7 @@ Return Value: bool FileLinkFound; bool JunctionFound; void* Mapping; + void* MapResult; void* PointerResult; bool RelativeLinkFound; int Result; @@ -3261,7 +3269,7 @@ Return Value: DirFd = -1; Fd = -1; - Mapping = NULL; + Mapping = MAP_FAILED; LxtCheckNullErrno(Dir = opendir(DRVFS_REPARSE_PREFIX)); errno = 0; AbsoluteLinkFound = false; @@ -3460,11 +3468,18 @@ Return Value: // is what execve uses. // - LxtCheckNullErrno(Mapping = mmap(NULL, 2, PROT_READ, MAP_SHARED, Fd, 0)); - LxtCheckMemoryEqual(Mapping, "MZ", 2); + if (g_LxtFsInfo.FsType != LxtFsTypeVirtioFs) + { + LxtCheckMapErrno(Mapping = mmap(NULL, 2, PROT_READ, MAP_SHARED, Fd, 0)); + LxtCheckMemoryEqual(Mapping, "MZ", 2); + } + else + { + LxtLogInfo("TODO: debug virtiofs handling of app exec links"); + } ErrorExit: - if (Mapping != NULL) + if (Mapping != MAP_FAILED) { munmap(Mapping, 2); } diff --git a/test/linux/unit_tests/lxtfs.c b/test/linux/unit_tests/lxtfs.c index ee5fd47..041e484 100644 --- a/test/linux/unit_tests/lxtfs.c +++ b/test/linux/unit_tests/lxtfs.c @@ -3350,7 +3350,6 @@ Return Value: FullExpectedTime = (Expected->tv_sec * FS_NS_PER_SEC) + Expected->tv_nsec; if ((FullTime <= FullExpectedTime) && (FullTime >= (FullExpectedTime - (AllowedVarianceSeconds * FS_NS_PER_SEC)))) { - return true; } @@ -3359,9 +3358,9 @@ Return Value: // the host and guest. // - if ((g_LxtFsInfo.FsType == LxtFsTypePlan9) && (FullTime <= (FullExpectedTime + (AllowedVarianceSeconds * FS_NS_PER_SEC)))) + if (((g_LxtFsInfo.FsType == LxtFsTypePlan9) || (g_LxtFsInfo.FsType == LxtFsTypeVirtioFs)) && + (FullTime <= (FullExpectedTime + (AllowedVarianceSeconds * FS_NS_PER_SEC)))) { - return true; } diff --git a/test/windows/DrvFsTests.cpp b/test/windows/DrvFsTests.cpp index 792714c..5ba9789 100644 --- a/test/windows/DrvFsTests.cpp +++ b/test/windows/DrvFsTests.cpp @@ -135,12 +135,6 @@ public: Logfile << TestMode; VERIFY_NO_THROW(LxsstuRunTest(Command.str().c_str(), Logfile.str().c_str())); - if (DrvFsMode.has_value() && DrvFsMode.value() == DrvFsMode::VirtioFs) - { - LogSkipped("TODO: debug test for virtiofs"); - return; - } - // // Check that the read-only attribute has been changed. // @@ -173,8 +167,15 @@ public: VERIFY_NO_THROW(VerifyDrvFsSymlink(LXSST_DRVFS_SYMLINK_TEST_DIR "\\ntlink7", L"ntlink2", true)); VERIFY_NO_THROW(VerifyDrvFsSymlink(LXSST_DRVFS_SYMLINK_TEST_DIR "\\ntlink8", L"foo\uf03abar", false)); - VERIFY_NO_THROW(VerifyDrvFsLxSymlink(LXSST_DRVFS_SYMLINK_TEST_DIR "\\lxlink1")); - VERIFY_NO_THROW(VerifyDrvFsLxSymlink(LXSST_DRVFS_SYMLINK_TEST_DIR "\\lxlink2")); + if (DrvFsMode.has_value() && DrvFsMode.value() == DrvFsMode::VirtioFs) + { + LogInfo("TODO: debug VerifyDrvFsLxSymlink variations on virtiofs"); + } + else + { + VERIFY_NO_THROW(VerifyDrvFsLxSymlink(LXSST_DRVFS_SYMLINK_TEST_DIR "\\lxlink1")); + VERIFY_NO_THROW(VerifyDrvFsLxSymlink(LXSST_DRVFS_SYMLINK_TEST_DIR "\\lxlink2")); + } // Since target resolution is done on the Windows side in Plan 9, it is able to create an NT // link if the target path traverses an existing NT link (this is actually better than WSL 1). @@ -228,10 +229,16 @@ public: VERIFY_NO_THROW(DrvFsCommon(LX_DRVFS_DISABLE_NONE, Mode)); } - void DrvFsFat() const + void DrvFsFat(DrvFsMode Mode) { SKIP_TEST_ARM64(); + if (Mode == DrvFsMode::VirtioFs) + { + LogSkipped("VirtioFS currently only supports mounting full drives"); + return; + } + constexpr auto MountPoint = "C:\\lxss_fat"; constexpr auto VhdPath = "C:\\lxss_fat.vhdx"; auto Cleanup = wil::scope_exit([MountPoint, VhdPath] { DeleteVolume(MountPoint, VhdPath); }); @@ -241,10 +248,16 @@ public: LxsstuRunTest((L"bash -c '" + SkipUnstableTestEnvVar + L" /data/test/wsl_unit_tests drvfs -m 3'").c_str(), L"drvfs3")); } - void DrvFsSmb() const + void DrvFsSmb(DrvFsMode Mode) { SKIP_TEST_ARM64(); + if (Mode == DrvFsMode::VirtioFs) + { + LogSkipped("TODO: debug virtiofs handling of //localhost/C$ style paths"); + return; + } + VERIFY_NO_THROW( LxsstuRunTest((L"bash -c '" + SkipUnstableTestEnvVar + L" /data/test/wsl_unit_tests drvfs -m 4'").c_str(), L"drvfs4")); } @@ -312,20 +325,20 @@ public: { SKIP_TEST_ARM64(); - if (Mode == DrvFsMode::VirtioFs) - { - LogSkipped("TODO: debug test for virtiofs"); - return; - } - VERIFY_NO_THROW(LxsstuRunTest(L"/data/test/wsl_unit_tests xattr drvfs", L"xattr_drvfs")); } - void DrvFsReFs() const + void DrvFsReFs(DrvFsMode Mode) { SKIP_TEST_ARM64(); WSL_TEST_VERSION_REQUIRED(wsl::windows::common::helpers::WindowsBuildNumbers::Germanium); + if (Mode == DrvFsMode::VirtioFs) + { + LogSkipped("VirtioFS currently only supports mounting full drives"); + return; + } + constexpr auto MountPoint = "C:\\lxss_refs"; constexpr auto VhdPath = "C:\\lxss_refs.vhdx"; auto Cleanup = wil::scope_exit([MountPoint, VhdPath] { DeleteVolume(MountPoint, VhdPath); }); @@ -1072,13 +1085,13 @@ class WSL1 : public DrvFsTests TEST_METHOD(DrvFsFat) { WSL1_TEST_ONLY(); - DrvFsTests::DrvFsFat(); + DrvFsTests::DrvFsFat(DrvFsMode::WSL1); } TEST_METHOD(DrvFsSmb) { WSL1_TEST_ONLY(); - DrvFsTests::DrvFsSmb(); + DrvFsTests::DrvFsSmb(DrvFsMode::WSL1); } TEST_METHOD(DrvFsMetadata) @@ -1108,8 +1121,8 @@ class WSL1 : public DrvFsTests else \ { \ VERIFY_ARE_EQUAL(LxsstuInitialize(FALSE), TRUE); \ - VERIFY_ARE_EQUAL(LxsstuLaunchWsl(LXSST_TESTS_INSTALL_COMMAND_LINE), 0); \ m_config.reset(new WslConfigChange(LxssGenerateTestConfig({.drvFsMode = DrvFsMode::##_mode##}))); \ + VERIFY_ARE_EQUAL(LxsstuLaunchWsl(LXSST_TESTS_INSTALL_COMMAND_LINE), 0); \ } \ \ return true; \ @@ -1147,13 +1160,13 @@ class WSL1 : public DrvFsTests TEST_METHOD(DrvFsFat) \ { \ WSL2_TEST_ONLY(); \ - DrvFsTests::DrvFsFat(); \ + DrvFsTests::DrvFsFat(DrvFsMode::##_mode##); \ } \ \ TEST_METHOD(DrvFsSmb) \ { \ WSL2_TEST_ONLY(); \ - DrvFsTests::DrvFsSmb(); \ + DrvFsTests::DrvFsSmb(DrvFsMode::##_mode##); \ } \ \ TEST_METHOD(DrvFsMetadata) \ @@ -1195,7 +1208,7 @@ class WSL1 : public DrvFsTests TEST_METHOD(DrvFsReFs) \ { \ WSL2_TEST_ONLY(); \ - DrvFsTests::DrvFsReFs(); \ + DrvFsTests::DrvFsReFs(DrvFsMode::##_mode##); \ } \ }