diff --git a/autotests/parttest.cpp b/autotests/parttest.cpp index 4c7e907a8..871a07ed7 100644 --- a/autotests/parttest.cpp +++ b/autotests/parttest.cpp @@ -96,6 +96,9 @@ class PartTest void test388288(); void testSaveAs(); void testSaveAs_data(); + void testSaveAsToNonExistingPath(); + void testSaveAsToSymlink(); + void testSaveIsSymlink(); void testSidebarItemAfterSaving(); void testSaveAsUndoStackAnnotations(); void testSaveAsUndoStackAnnotations_data(); @@ -809,6 +812,92 @@ void PartTest::simulateMouseSelection(double startX, double startY, double endX, events.simulate(target); } +void PartTest::testSaveAsToNonExistingPath() +{ + Okular::Part part(nullptr, nullptr, QVariantList()); + part.openDocument( KDESRCDIR "data/file1.pdf" ); + + QString saveFilePath; + { + QTemporaryFile saveFile( QString( "%1/okrXXXXXX.pdf" ).arg( QDir::tempPath() ) ); + saveFile.open(); + saveFilePath = saveFile.fileName(); + // QTemporaryFile is destroyed and the file it created is gone, this is a TOCTOU but who cares + } + + QVERIFY( !QFileInfo::exists( saveFilePath ) ); + + QVERIFY( part.saveAs( QUrl::fromLocalFile( saveFilePath ), Part::NoSaveAsFlags ) ); + + QFile::remove( saveFilePath ); +} + +void PartTest::testSaveAsToSymlink() +{ +#ifdef Q_OS_UNIX + Okular::Part part(nullptr, nullptr, QVariantList()); + part.openDocument( KDESRCDIR "data/file1.pdf" ); + + QTemporaryFile newFile( QString( "%1/okrXXXXXX.pdf" ).arg( QDir::tempPath() ) ); + newFile.open(); + + QString linkFilePath; + { + QTemporaryFile linkFile( QString( "%1/okrXXXXXX.pdf" ).arg( QDir::tempPath() ) ); + linkFile.open(); + linkFilePath = linkFile.fileName(); + // QTemporaryFile is destroyed and the file it created is gone, this is a TOCTOU but who cares + } + + QFile::link( newFile.fileName(), linkFilePath ); + + QVERIFY( QFileInfo( linkFilePath ).isSymLink() ); + + QVERIFY( part.saveAs( QUrl::fromLocalFile( linkFilePath ), Part::NoSaveAsFlags ) ); + + QVERIFY( QFileInfo( linkFilePath ).isSymLink() ); + + QFile::remove( linkFilePath ); +#endif +} + +void PartTest::testSaveIsSymlink() +{ +#ifdef Q_OS_UNIX + Okular::Part part(nullptr, nullptr, QVariantList()); + + QString newFilePath; + { + QTemporaryFile newFile( QString( "%1/okrXXXXXX.pdf" ).arg( QDir::tempPath() ) ); + newFile.open(); + newFilePath = newFile.fileName(); + // QTemporaryFile is destroyed and the file it created is gone, this is a TOCTOU but who cares + } + + QFile::copy( KDESRCDIR "data/file1.pdf", newFilePath ); + + QString linkFilePath; + { + QTemporaryFile linkFile( QString( "%1/okrXXXXXX.pdf" ).arg( QDir::tempPath() ) ); + linkFile.open(); + linkFilePath = linkFile.fileName(); + // QTemporaryFile is destroyed and the file it created is gone, this is a TOCTOU but who cares + } + + QFile::link( newFilePath, linkFilePath ); + + QVERIFY( QFileInfo( linkFilePath ).isSymLink() ); + + part.openDocument( linkFilePath ); + QVERIFY( part.saveAs( QUrl::fromLocalFile( linkFilePath ), Part::NoSaveAsFlags ) ); + + QVERIFY( QFileInfo( linkFilePath ).isSymLink() ); + + QFile::remove( newFilePath ); + QFile::remove( linkFilePath ); +#endif +} + void PartTest::testSaveAs() { QFETCH(QString, file);