knetworkmountstestcanonical.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. /*
  2. This software is a contribution of the LiMux project of the city of Munich.
  3. SPDX-FileCopyrightText: 2021 Robert Hoffmann <robert@roberthoffmann.de>
  4. SPDX-License-Identifier: LGPL-2.0-or-later
  5. */
  6. #include "knetworkmountstestcanonical.h"
  7. #include <KNetworkMounts>
  8. #include <QFile>
  9. #include <QProcess>
  10. #include <QStandardPaths>
  11. #include <QTest>
  12. QTEST_MAIN(KNetworkMountsTestCanonical)
  13. void KNetworkMountsTestCanonical::initTestCase()
  14. {
  15. QStandardPaths::setTestModeEnabled(true);
  16. m_configFileName = QStringLiteral("%1/network_mounts").arg(QStandardPaths::writableLocation(QStandardPaths::ConfigLocation));
  17. QFile::remove(m_configFileName);
  18. QVERIFY(!QFile::exists(m_configFileName));
  19. // create directory structure
  20. QVERIFY(m_tmpDir.isValid());
  21. const QString relLinkToPath = QStringLiteral("dir");
  22. const QString relSymlinkDirectory = QStringLiteral("symlinkDirectory");
  23. const QStringList relPaths = {relLinkToPath,
  24. QStringLiteral("dir/subdir1"),
  25. QStringLiteral("dir/subdir1/subdir1"),
  26. QStringLiteral("dir/subdir1/subdir2"),
  27. QStringLiteral("dir/subdir1/subdir3"),
  28. QStringLiteral("dir/subdir2"),
  29. QStringLiteral("dir/subdir2/subdir1"),
  30. QStringLiteral("dir/subdir2/subdir2"),
  31. QStringLiteral("dir/subdir2/subdir3"),
  32. relSymlinkDirectory};
  33. const QString relSymlinkToSmbPath = QStringLiteral("symlinkToSmbPath");
  34. QDir dir(m_tmpDir.path());
  35. for (const QString &relPath : relPaths) {
  36. QVERIFY(dir.mkpath(relPath));
  37. QVERIFY(QFile::exists(m_tmpDir.path() + QLatin1Char('/') + relPath));
  38. const QString fileName = m_tmpDir.path() + QLatin1Char('/') + relPath + QLatin1String("/file.txt");
  39. QFile file(fileName);
  40. QVERIFY(file.open(QIODevice::WriteOnly | QIODevice::Text));
  41. file.close();
  42. QVERIFY(QFile::exists(fileName));
  43. }
  44. const QString linkToPath = m_tmpDir.path() + QLatin1Char('/') + relLinkToPath;
  45. // SymlinkToNetworkMount
  46. const QString symlinkToSmbPath = dir.path() + QLatin1Char('/') + relSymlinkToSmbPath;
  47. QVERIFY(QFile::link(linkToPath, symlinkToSmbPath));
  48. qDebug() << "linkToPath=" << linkToPath << ", symlinkToSmbPath=" << symlinkToSmbPath;
  49. // SymlinkDirectory
  50. QVERIFY(dir.cd(relSymlinkDirectory));
  51. const QString symlinkDirectory = dir.path();
  52. const QString linkStr = symlinkDirectory + QLatin1Char('/') + relLinkToPath;
  53. QVERIFY(QFile::link(linkToPath, linkStr));
  54. qDebug() << "linkToPath=" << linkToPath << ", symlinkDirectory=" << symlinkDirectory << ", linkStr=" << linkStr;
  55. // setup config
  56. KNetworkMounts::self()->setEnabled(true);
  57. const QStringList paths = {linkToPath};
  58. KNetworkMounts::self()->setPaths(paths, KNetworkMounts::SmbPaths);
  59. const QStringList savedPaths = {linkToPath + QLatin1Char('/')};
  60. QCOMPARE(KNetworkMounts::self()->paths(), savedPaths);
  61. // SymlinkDirectory
  62. const QStringList symlinkDirectories = {symlinkDirectory};
  63. KNetworkMounts::self()->setPaths(symlinkDirectories, KNetworkMounts::SymlinkDirectory);
  64. const QStringList savedSymlinkDirectories = {symlinkDirectory + QLatin1Char('/')};
  65. QCOMPARE(KNetworkMounts::self()->paths(KNetworkMounts::SmbPaths), savedPaths);
  66. QCOMPARE(KNetworkMounts::self()->paths(KNetworkMounts::SymlinkDirectory), savedSymlinkDirectories);
  67. // SymlinkToNetworkMount
  68. // addPath
  69. KNetworkMounts::self()->addPath(symlinkToSmbPath, KNetworkMounts::SymlinkToNetworkMount);
  70. const QString savedSymlinkToSmbPath = symlinkToSmbPath + QLatin1Char('/');
  71. const QStringList savedSymlinkToSmbPaths = {savedSymlinkToSmbPath};
  72. QCOMPARE(KNetworkMounts::self()->paths(KNetworkMounts::SymlinkToNetworkMount), savedSymlinkToSmbPaths);
  73. // setPaths
  74. const QStringList symlinkToSmbPaths = {symlinkToSmbPath};
  75. KNetworkMounts::self()->setPaths(symlinkToSmbPaths, KNetworkMounts::SymlinkToNetworkMount);
  76. QCOMPARE(KNetworkMounts::self()->paths(KNetworkMounts::SymlinkToNetworkMount), savedSymlinkToSmbPaths);
  77. QCOMPARE(KNetworkMounts::self()->paths(KNetworkMounts::SmbPaths), savedPaths);
  78. QCOMPARE(KNetworkMounts::self()->paths(KNetworkMounts::SymlinkDirectory), savedSymlinkDirectories);
  79. }
  80. void KNetworkMountsTestCanonical::cleanupTestCase()
  81. {
  82. KNetworkMounts::self()->sync();
  83. QFile::remove(m_configFileName);
  84. }
  85. void KNetworkMountsTestCanonical::testCanonicalSymlinkPath_data()
  86. {
  87. QTest::addColumn<QString>("relPath");
  88. QTest::addColumn<QString>("symlinkedRelPath");
  89. // SymlinkDirectory
  90. QTest::newRow("symlinkDirectory/dir") << "dir"
  91. << "symlinkDirectory/dir";
  92. QTest::newRow("symlinkDirectory/dir/file.txt") << "dir/file.txt"
  93. << "symlinkDirectory/dir/file.txt";
  94. QTest::newRow("symlinkDirectory/dir/subdir1") << "dir/subdir1"
  95. << "symlinkDirectory/dir/subdir1";
  96. QTest::newRow("symlinkDirectory/dir/subdir1/file.txt") << "dir/subdir1/file.txt"
  97. << "symlinkDirectory/dir/subdir1/file.txt";
  98. QTest::newRow("symlinkDirectory/dir/subdir1/subdir1") << "dir/subdir1/subdir1"
  99. << "symlinkDirectory/dir/subdir1/subdir1";
  100. QTest::newRow("symlinkDirectory/dir/subdir1/subdir1/file.txt") << "dir/subdir1/subdir1/file.txt"
  101. << "symlinkDirectory/dir/subdir1/subdir1/file.txt";
  102. QTest::newRow("symlinkDirectory/dir/subdir1/subdir2") << "dir/subdir1/subdir2"
  103. << "symlinkDirectory/dir/subdir1/subdir2";
  104. QTest::newRow("symlinkDirectory/dir/subdir1/subdir2/file.txt") << "dir/subdir1/subdir2/file.txt"
  105. << "symlinkDirectory/dir/subdir1/subdir2/file.txt";
  106. QTest::newRow("symlinkDirectory/dir/subdir1/subdir3") << "dir/subdir1/subdir3"
  107. << "symlinkDirectory/dir/subdir1/subdir3";
  108. QTest::newRow("symlinkDirectory/dir/subdir1/subdir3/file.txt") << "dir/subdir1/subdir3/file.txt"
  109. << "symlinkDirectory/dir/subdir1/subdir3/file.txt";
  110. QTest::newRow("symlinkDirectory/dir/subdir2") << "dir/subdir2"
  111. << "symlinkDirectory/dir/subdir2";
  112. QTest::newRow("symlinkDirectory/dir/subdir2/file.txt") << "dir/subdir2/file.txt"
  113. << "symlinkDirectory/dir/subdir2/file.txt";
  114. QTest::newRow("symlinkDirectory/dir/subdir2/subdir1") << "dir/subdir2/subdir1"
  115. << "symlinkDirectory/dir/subdir2/subdir1";
  116. QTest::newRow("symlinkDirectory/dir/subdir2/subdir1/file.txt") << "dir/subdir2/subdir1/file.txt"
  117. << "symlinkDirectory/dir/subdir2/subdir1/file.txt";
  118. QTest::newRow("symlinkDirectory/dir/subdir2/subdir2") << "dir/subdir2/subdir2"
  119. << "symlinkDirectory/dir/subdir2/subdir2";
  120. QTest::newRow("symlinkDirectory/dir/subdir2/subdir2/file.txt") << "dir/subdir2/subdir2/file.txt"
  121. << "symlinkDirectory/dir/subdir2/subdir2/file.txt";
  122. QTest::newRow("symlinkDirectory/dir/subdir2/subdir3") << "dir/subdir2/subdir3"
  123. << "symlinkDirectory/dir/subdir2/subdir3";
  124. QTest::newRow("symlinkDirectory/dir/subdir2/subdir3/file.txt") << "dir/subdir2/subdir3/file.txt"
  125. << "symlinkDirectory/dir/subdir2/subdir3/file.txt";
  126. QTest::newRow("symlinkDirectory") << "symlinkDirectory"
  127. << "symlinkDirectory";
  128. QTest::newRow("symlinkDirectory/file.txt") << "symlinkDirectory/file.txt"
  129. << "symlinkDirectory/file.txt";
  130. // SymlinkToNetworkMount
  131. QTest::newRow("symlinkToSmbPath") << "dir"
  132. << "symlinkToSmbPath";
  133. QTest::newRow("symlinkToSmbPath/file.txt") << "dir/file.txt"
  134. << "symlinkToSmbPath/file.txt";
  135. QTest::newRow("symlinkToSmbPath/subdir1") << "dir/subdir1"
  136. << "symlinkToSmbPath/subdir1";
  137. QTest::newRow("symlinkToSmbPath/subdir1/file.txt") << "dir/subdir1/file.txt"
  138. << "symlinkToSmbPath/subdir1/file.txt";
  139. QTest::newRow("symlinkToSmbPath/subdir1/subdir1") << "dir/subdir1/subdir1"
  140. << "symlinkToSmbPath/subdir1/subdir1";
  141. QTest::newRow("symlinkToSmbPath/subdir1/subdir1/file.txt") << "dir/subdir1/subdir1/file.txt"
  142. << "symlinkToSmbPath/subdir1/subdir1/file.txt";
  143. QTest::newRow("symlinkToSmbPath/subdir1/subdir2") << "dir/subdir1/subdir2"
  144. << "symlinkToSmbPath/subdir1/subdir2";
  145. QTest::newRow("symlinkToSmbPath/subdir1/subdir2/file.txt") << "dir/subdir1/subdir2/file.txt"
  146. << "symlinkToSmbPath/subdir1/subdir2/file.txt";
  147. QTest::newRow("symlinkToSmbPath/subdir1/subdir3") << "dir/subdir1/subdir3"
  148. << "symlinkToSmbPath/subdir1/subdir3";
  149. QTest::newRow("symlinkToSmbPath/subdir1/subdir3/file.txt") << "dir/subdir1/subdir3/file.txt"
  150. << "symlinkToSmbPath/subdir1/subdir3/file.txt";
  151. QTest::newRow("symlinkToSmbPath/subdir2") << "dir/subdir2"
  152. << "symlinkToSmbPath/subdir2";
  153. QTest::newRow("symlinkToSmbPath/subdir2/file.txt") << "dir/subdir2/file.txt"
  154. << "symlinkToSmbPath/subdir2/file.txt";
  155. QTest::newRow("symlinkToSmbPath/subdir2/subdir1") << "dir/subdir2/subdir1"
  156. << "symlinkToSmbPath/subdir2/subdir1";
  157. QTest::newRow("symlinkToSmbPath/subdir2/subdir1/file.txt") << "dir/subdir2/subdir1/file.txt"
  158. << "symlinkToSmbPath/subdir2/subdir1/file.txt";
  159. QTest::newRow("symlinkToSmbPath/subdir2/subdir2") << "dir/subdir2/subdir2"
  160. << "symlinkToSmbPath/subdir2/subdir2";
  161. QTest::newRow("symlinkToSmbPath/subdir2/subdir2/file.txt") << "dir/subdir2/subdir2/file.txt"
  162. << "symlinkToSmbPath/subdir2/subdir2/file.txt";
  163. QTest::newRow("symlinkToSmbPath/subdir2/subdir3") << "dir/subdir2/subdir3"
  164. << "symlinkToSmbPath/subdir2/subdir3";
  165. QTest::newRow("symlinkToSmbPath/subdir2/subdir3/file.txt") << "dir/subdir2/subdir3/file.txt"
  166. << "symlinkToSmbPath/subdir2/subdir3/file.txt";
  167. }
  168. void KNetworkMountsTestCanonical::testCanonicalSymlinkPath()
  169. {
  170. QFETCH(QString, relPath);
  171. QFETCH(QString, symlinkedRelPath);
  172. #ifdef Q_OS_WIN
  173. QSKIP("QFile::link creates a shortcut on Windows, not a symlink, so no effect on canonical paths, skipped");
  174. #endif
  175. const QString path = m_tmpDir.path() + QLatin1Char('/') + relPath;
  176. const QString symlinkedPath = m_tmpDir.path() + QLatin1Char('/') + symlinkedRelPath;
  177. const QString canonicalPath = QFileInfo(symlinkedPath).canonicalFilePath();
  178. // default with cache
  179. QCOMPARE(KNetworkMounts::self()->canonicalSymlinkPath(symlinkedPath), canonicalPath);
  180. QCOMPARE(path, canonicalPath);
  181. qDebug() << "path=" << path << ", canonicalPath=" << canonicalPath << ", symlinkedPath=" << symlinkedPath;
  182. // from cache
  183. QCOMPARE(KNetworkMounts::self()->canonicalSymlinkPath(symlinkedPath), canonicalPath);
  184. // no cache
  185. KNetworkMounts::self()->clearCache();
  186. QCOMPARE(KNetworkMounts::self()->canonicalSymlinkPath(symlinkedPath), canonicalPath);
  187. KNetworkMounts::self()->clearCache();
  188. KNetworkMounts::self()->setOption(KNetworkMounts::SymlinkPathsUseCache, false);
  189. QCOMPARE(KNetworkMounts::self()->canonicalSymlinkPath(symlinkedPath), canonicalPath);
  190. // with cache
  191. KNetworkMounts::self()->setOption(KNetworkMounts::SymlinkPathsUseCache, true);
  192. QCOMPARE(KNetworkMounts::self()->canonicalSymlinkPath(symlinkedPath), canonicalPath);
  193. QCOMPARE(KNetworkMounts::self()->canonicalSymlinkPath(symlinkedPath), canonicalPath);
  194. }
  195. #include "moc_knetworkmountstestcanonical.cpp"