kautosavefiletest.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. /*
  2. This file is part of the KDE libraries
  3. SPDX-FileCopyrightText: 2006 Jacob R Rideout <kde@jacobrideout.net>
  4. SPDX-License-Identifier: LGPL-2.0-or-later
  5. */
  6. #include "kautosavefiletest.h"
  7. #include <QFile>
  8. #include <QTextStream>
  9. #include <QtAlgorithms>
  10. #include <QTemporaryFile>
  11. #include <kautosavefile.h>
  12. #include <QTest>
  13. QTEST_MAIN(KAutoSaveFileTest)
  14. void KAutoSaveFileTest::initTestCase()
  15. {
  16. QCoreApplication::instance()->setApplicationName(QLatin1String("qttest")); // TODO do this in qtestlib itself
  17. }
  18. void KAutoSaveFileTest::cleanupTestCase()
  19. {
  20. for (const QString &fileToRemove : std::as_const(filesToRemove)) {
  21. QFile::remove(fileToRemove);
  22. }
  23. }
  24. void KAutoSaveFileTest::test_readWrite()
  25. {
  26. QTemporaryFile file;
  27. QVERIFY(file.open());
  28. QUrl normalFile = QUrl::fromLocalFile(QFileInfo(file).absoluteFilePath());
  29. // Test basic functionality
  30. KAutoSaveFile saveFile(normalFile);
  31. QVERIFY(!QFile::exists(saveFile.fileName()));
  32. QVERIFY(saveFile.open(QIODevice::ReadWrite));
  33. QString inText = QString::fromLatin1("This is test data one.\n");
  34. {
  35. QTextStream ts(&saveFile);
  36. ts << inText;
  37. ts.flush();
  38. }
  39. saveFile.close();
  40. {
  41. QFile testReader(saveFile.fileName());
  42. testReader.open(QIODevice::ReadWrite);
  43. QTextStream ts(&testReader);
  44. QString outText = ts.readAll();
  45. QCOMPARE(outText, inText);
  46. }
  47. filesToRemove << file.fileName();
  48. }
  49. void KAutoSaveFileTest::test_fileNameMaxLength()
  50. {
  51. // In KAutoSaveFilePrivate::tempFile() the name of the kautosavefile that's going to be created
  52. // is concatanated in the form:
  53. // fileName + junk.truncated + protocol + _ + path.truncated + junk
  54. // see tempFile() for details.
  55. //
  56. // Make sure that the generated filename (e.g. as you would get from QUrl::fileName()) doesn't
  57. // exceed NAME_MAX (the maximum length allowed for filenames, see e.g. /usr/include/linux/limits.h)
  58. // otherwise the file can't be opened.
  59. //
  60. // see https://phabricator.kde.org/D24489
  61. QString s;
  62. s.fill(QLatin1Char('b'), 80);
  63. // create a long path that:
  64. // - exceeds NAME_MAX (255)
  65. // - is less than the maximum allowed path length, PATH_MAX (4096)
  66. // see e.g. /usr/include/linux/limits.h
  67. const QString path = QDir::tempPath() + QLatin1Char('/') + s + QLatin1Char('/') + s + QLatin1Char('/') + s + QLatin1Char('/') + s;
  68. QFile file(path + QLatin1Char('/') + QLatin1String("testFile.txt"));
  69. QUrl normalFile = QUrl::fromLocalFile(file.fileName());
  70. KAutoSaveFile saveFile(normalFile);
  71. QVERIFY(!QFile::exists(saveFile.fileName()));
  72. QVERIFY(saveFile.open(QIODevice::ReadWrite));
  73. filesToRemove << file.fileName();
  74. }
  75. void KAutoSaveFileTest::test_fileStaleFiles()
  76. {
  77. QUrl normalFile = QUrl::fromLocalFile(QDir::temp().absoluteFilePath(QStringLiteral("test directory/tîst me.txt")));
  78. KAutoSaveFile saveFile(normalFile);
  79. QVERIFY(saveFile.open(QIODevice::ReadWrite));
  80. saveFile.write("testdata");
  81. // Make sure the stale file is found
  82. const auto listOfStaleFiles = saveFile.staleFiles(normalFile, QStringLiteral("qttest"));
  83. QVERIFY(listOfStaleFiles.count() == 1);
  84. saveFile.releaseLock();
  85. qDeleteAll(listOfStaleFiles);
  86. // Make sure the stale file is deleted
  87. QVERIFY(saveFile.staleFiles(normalFile, QStringLiteral("qttest")).isEmpty());
  88. }
  89. void KAutoSaveFileTest::test_applicationStaleFiles()
  90. {
  91. // TODO
  92. }
  93. void KAutoSaveFileTest::test_locking()
  94. {
  95. QUrl normalFile(QString::fromLatin1("fish://user@example.com/home/remote/test.txt"));
  96. KAutoSaveFile saveFile(normalFile);
  97. QVERIFY(!QFile::exists(saveFile.fileName()));
  98. QVERIFY(saveFile.open(QIODevice::ReadWrite));
  99. const QList<KAutoSaveFile *> staleFiles(KAutoSaveFile::staleFiles(normalFile));
  100. QVERIFY(!staleFiles.isEmpty());
  101. KAutoSaveFile *saveFile2 = staleFiles.at(0);
  102. const QString fn = saveFile2->fileName();
  103. // It looks like $XDG_DATA_HOME/stalefiles/qttest/test.txtXXXfish_%2Fhome%2FremoteXXXXXXX
  104. QVERIFY2(fn.contains(QLatin1String("stalefiles/qttest/test.txt")), qPrintable(fn));
  105. QVERIFY2(fn.contains(QLatin1String("fish_%2Fhome%2Fremote")), qPrintable(fn));
  106. QVERIFY(QFile::exists(saveFile2->fileName()));
  107. QVERIFY(!saveFile2->open(QIODevice::ReadWrite));
  108. saveFile.releaseLock();
  109. QVERIFY(saveFile2->open(QIODevice::ReadWrite));
  110. qDeleteAll(staleFiles);
  111. }
  112. #include "moc_kautosavefiletest.cpp"