include/unotest/directories.hxx    |   42 ++++++++++++++++++++++++++++++-------
 sc/qa/unit/filters-test.cxx        |   21 +++++-------------
 test/source/unoapi_test.cxx        |    4 +--
 unotest/source/cpp/directories.cxx |   20 -----------------
 4 files changed, 43 insertions(+), 44 deletions(-)

New commits:
commit 3d80b47851ad9e3dfa48374efaac38ba8e45bea1
Author:     Mike Kaganski <mike.kagan...@collabora.com>
AuthorDate: Tue Jul 15 23:32:07 2025 +0500
Commit:     Mike Kaganski <mike.kagan...@collabora.com>
CommitDate: Wed Jul 16 07:14:22 2025 +0200

    Avoid double slashes in unit test paths / URLs
    
    Like file:///C:/lo/core//sw/qa/extras/rtfexport/data//tabs.rtf
    
    Reimplement Directories::get{URL,Path}From{Src,Workdir} to check
    and insert missing / remove excessive slashes as needed.
    
    Change-Id: Ibd3657b0557bf1712c2de9ac74db0977754a2ed9
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/187932
    Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com>
    Tested-by: Jenkins

diff --git a/include/unotest/directories.hxx b/include/unotest/directories.hxx
index efdcd93a6acf..31bc84c349ce 100644
--- a/include/unotest/directories.hxx
+++ b/include/unotest/directories.hxx
@@ -15,6 +15,7 @@
 #include <string_view>
 
 #include <rtl/ustring.hxx>
+#include <rtl/ustrbuf.hxx>
 #include <unotest/detail/unotestdllapi.hxx>
 
 namespace test
@@ -27,23 +28,50 @@ private:
     OUString m_aWorkdirRootURL;
     OUString m_aWorkdirRootPath;
 
+    static void concatEnsureSeparator(OUStringBuffer& buf, std::u16string_view 
s)
+    {
+        while (s.starts_with('/'))
+            s = s.substr(1);
+        assert(!s.empty());
+        if (!OUString::unacquired(buf).endsWith("/"))
+            buf.append("/");
+        buf.append(s);
+    }
+
 public:
     Directories();
 
-    const OUString& getSrcRootURL() const { return m_aSrcRootURL; }
-    const OUString& getSrcRootPath() const { return m_aSrcRootPath; }
-
     // return a URL to a given path from the source directory
-    OUString getURLFromSrc(std::u16string_view rPath) const;
+    template <typename... Segments> OUString getURLFromSrc(Segments... 
segments) const
+    {
+        OUStringBuffer buf(m_aSrcRootURL);
+        (..., concatEnsureSeparator(buf, segments));
+        return buf.makeStringAndClear();
+    }
 
     // return a Path to a given path from the source directory
-    OUString getPathFromSrc(std::u16string_view rPath) const;
+    template <typename... Segments> OUString getPathFromSrc(Segments... 
segments) const
+    {
+        OUStringBuffer buf(m_aSrcRootPath);
+        (..., concatEnsureSeparator(buf, segments));
+        return buf.makeStringAndClear();
+    }
 
     // return a URL to a given path from the workdir directory
-    OUString getURLFromWorkdir(std::u16string_view rPath) const;
+    OUString getURLFromWorkdir(std::u16string_view rPath) const
+    {
+        OUStringBuffer buf(m_aWorkdirRootURL);
+        concatEnsureSeparator(buf, rPath);
+        return buf.makeStringAndClear();
+    }
 
     // return a Path to a given path from the workdir directory
-    OUString getPathFromWorkdir(std::u16string_view rPath) const;
+    OUString getPathFromWorkdir(std::u16string_view rPath) const
+    {
+        OUStringBuffer buf(m_aWorkdirRootPath);
+        concatEnsureSeparator(buf, rPath);
+        return buf.makeStringAndClear();
+    }
 };
 }
 
diff --git a/sc/qa/unit/filters-test.cxx b/sc/qa/unit/filters-test.cxx
index 933b48ceba8f..ed9c5ef3ff66 100644
--- a/sc/qa/unit/filters-test.cxx
+++ b/sc/qa/unit/filters-test.cxx
@@ -51,20 +51,13 @@ public:
     CPPUNIT_TEST_SUITE_END();
 
 private:
-    void createFileURL(std::u16string_view aFileBase, std::u16string_view 
aFileExtension, OUString& rFilePath);
+    OUString createFileURL(std::u16string_view aFileName);
 };
 
-void ScFiltersTest::createFileURL(
-    std::u16string_view aFileBase, std::u16string_view aFileExtension, 
OUString& rFilePath)
+OUString ScFiltersTest::createFileURL(std::u16string_view aFileName)
 {
-    // aFileBase may contain multiple segments, so use
-    // GetNewAbsURL instead of insertName for them:
-    INetURLObject url(m_directories.getSrcRootURL());
-    url.setFinalSlash();
-    url.GetNewAbsURL(u"sc/qa/unit/data"_ustr, &url);
-    url.insertName(aFileExtension, true);
-    url.GetNewAbsURL(OUString::Concat(aFileBase) + aFileExtension, &url);
-    rFilePath = url.GetMainURL(INetURLObject::DecodeMechanism::NONE);
+    std::u16string_view aFileExtension = 
aFileName.substr(aFileName.find_last_of('.') + 1);
+    return m_directories.getURLFromSrc(u"sc/qa/unit/data", aFileExtension, 
aFileName);
 }
 
 
@@ -116,8 +109,7 @@ void ScFiltersTest::testCVEs()
 
 void ScFiltersTest::testContentofz9704()
 {
-    OUString aFileName;
-    createFileURL(u"ofz9704.", u"123", aFileName);
+    OUString aFileName = createFileURL(u"ofz9704.123");
     SvFileStream aFileStream(aFileName, StreamMode::READ);
     TestImportWKS(aFileStream);
 }
@@ -129,8 +121,7 @@ void ScFiltersTest::testTdf90299()
     const OUString aSavedFileURL = utl::CreateTempURL(&aTmpDirectory1URL);
 
     OUString aReferencedFileURL;
-    OUString aReferencingFileURL;
-    createFileURL(u"tdf90299.", u"xls", aReferencingFileURL);
+    OUString aReferencingFileURL = createFileURL(u"tdf90299.xls");
 
     auto eError = osl::File::copy(aReferencingFileURL, aTmpDirectory1URL + 
"/tdf90299.xls");
     CPPUNIT_ASSERT_EQUAL(osl::File::E_None, eError);
diff --git a/test/source/unoapi_test.cxx b/test/source/unoapi_test.cxx
index 3dcaa35b699e..b833d96a7dc4 100644
--- a/test/source/unoapi_test.cxx
+++ b/test/source/unoapi_test.cxx
@@ -60,12 +60,12 @@ void UnoApiTest::tearDown()
 
 OUString UnoApiTest::createFileURL(std::u16string_view aFileBase)
 {
-    return m_directories.getSrcRootURL() + m_aBaseString + "/" + aFileBase;
+    return m_directories.getURLFromSrc(m_aBaseString, aFileBase);
 }
 
 OUString UnoApiTest::createFilePath(std::u16string_view aFileBase)
 {
-    return m_directories.getSrcRootPath() + "/" + m_aBaseString + "/" + 
aFileBase;
+    return m_directories.getPathFromSrc(m_aBaseString, aFileBase);
 }
 
 void UnoApiTest::setTestInteractionHandler(const char* pPassword,
diff --git a/unotest/source/cpp/directories.cxx 
b/unotest/source/cpp/directories.cxx
index 93bcd4daed6d..5d2c31929458 100644
--- a/unotest/source/cpp/directories.cxx
+++ b/unotest/source/cpp/directories.cxx
@@ -43,24 +43,4 @@ test::Directories::Directories()
     m_aWorkdirRootURL = getFileURLFromSystemPath(m_aWorkdirRootPath);
 }
 
-OUString test::Directories::getURLFromSrc(std::u16string_view rPath) const
-{
-    return m_aSrcRootURL + rPath;
-}
-
-OUString test::Directories::getPathFromSrc(std::u16string_view rPath) const
-{
-    return m_aSrcRootPath + rPath;
-}
-
-OUString test::Directories::getURLFromWorkdir(std::u16string_view rPath) const
-{
-    return m_aWorkdirRootURL + rPath;
-}
-
-OUString test::Directories::getPathFromWorkdir(std::u16string_view rPath) const
-{
-    return m_aWorkdirRootPath + rPath;
-}
-
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Reply via email to