/* This file is part of the KDE project Copyright (C) 2009 David Faure This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include class TestDesktop : public QObject { Q_OBJECT public: TestDesktop() {} private Q_SLOTS: void initTestCase() { setenv( "KDE_FORK_SLAVES", "yes", true ); //make KIOs use test mode too setenv("KIOSLAVE_ENABLE_TESTMODE", "1", 1); QStandardPaths::setTestModeEnabled(true); // Warning: even with test mode enabled, this is the real user's Desktop directory m_desktopPath = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); m_testFileName = QLatin1String("kio_desktop_test_file"); cleanupTestCase(); } void cleanupTestCase() { QFile::remove(m_desktopPath + '/' + m_testFileName); QFile::remove(m_desktopPath + '/' + m_testFileName + ".part"); QFile::remove(m_desktopPath + '/' + m_testFileName + "_link"); } void testCopyToDesktop() { QTemporaryFile tempFile; QVERIFY(tempFile.open()); tempFile.write( "Hello world\n", 12 ); QString fileName = tempFile.fileName(); tempFile.close(); KIO::Job* job = KIO::file_copy(QUrl::fromLocalFile(fileName), QUrl("desktop:/" + m_testFileName), -1, KIO::HideProgressInfo); job->setUiDelegate(nullptr); QVERIFY(job->exec()); QVERIFY(QFile::exists(m_desktopPath + '/' + m_testFileName)); } void testMostLocalUrl() // relies on testCopyToDesktop being run before { const QUrl desktopUrl("desktop:/" + m_testFileName); const QString filePath(m_desktopPath + '/' + m_testFileName); KIO::StatJob* job = KIO::mostLocalUrl(desktopUrl, KIO::HideProgressInfo); QVERIFY(job); bool ok = job->exec(); QVERIFY(ok); QCOMPARE(job->mostLocalUrl().toLocalFile(), filePath); } void testCreateSymlink() { const QUrl desktopUrl("desktop:/" + m_testFileName); const QUrl desktopLink("desktop:/" + m_testFileName + "_link"); const QString source = m_desktopPath + '/' + m_testFileName; const QString localLink = source + "_link"; // Create a symlink using kio_desktop KIO::Job* linkJob = KIO::symlink(m_testFileName, desktopLink, KIO::HideProgressInfo); QVERIFY(linkJob->exec()); QVERIFY(QFileInfo(localLink).isSymLink()); QCOMPARE(QFileInfo(localLink).symLinkTarget(), source); // Now try changing the link target, without Overwrite -> error linkJob = KIO::symlink(m_testFileName + "2", desktopLink, KIO::HideProgressInfo); QVERIFY(!linkJob->exec()); QCOMPARE(linkJob->error(), (int)KIO::ERR_FILE_ALREADY_EXIST); // Now try changing the link target, with Overwrite (bug 360487) linkJob = KIO::symlink(m_testFileName + "3", desktopLink, KIO::Overwrite | KIO::HideProgressInfo); QVERIFY(linkJob->exec()); QVERIFY(QFileInfo(localLink).isSymLink()); QCOMPARE(QFileInfo(localLink).symLinkTarget(), source + "3"); } void testRename_data() { QTest::addColumn("withDirListerCache"); QTest::addColumn("srcUrl"); QTest::addColumn("destUrl"); const QString str = "desktop:/" + m_testFileName; const QUrl orig(str); const QUrl part(str + ".part"); QTest::newRow("orig_to_part") << false << orig << part; QTest::newRow("part_to_orig") << false << part << orig; // Warnings: all tests without dirlister cache should above this line // and all tests with it should be below - the cache stays forever once it exists. QTest::newRow("orig_to_part_with_cache") << true << orig << part; QTest::newRow("part_to_orig_with_cache") << true << part << orig; // #218719 } void testRename() // relies on testCopyToDesktop being run before { QFETCH(bool, withDirListerCache); QFETCH(QUrl, srcUrl); QFETCH(QUrl, destUrl); QScopedPointer lister(nullptr); if (withDirListerCache) { lister.reset(new KDirLister); lister->openUrl(QUrl(QStringLiteral("desktop:/"))); QSignalSpy spyCompleted(lister.data(), static_cast(&KDirLister::completed)); spyCompleted.wait(); } org::kde::KDirNotify kdirnotify(QString(), QString(), QDBusConnection::sessionBus(), this); QSignalSpy spyFilesAdded(&kdirnotify, &org::kde::KDirNotify::FilesAdded); QSignalSpy spyFileRenamed(&kdirnotify, &org::kde::KDirNotify::FileRenamed); QSignalSpy spyFileRenamedWithLocalPath(&kdirnotify, &org::kde::KDirNotify::FileRenamedWithLocalPath); const QString srcFilePath(m_desktopPath + srcUrl.path()); QVERIFY(QFile::exists(srcFilePath)); const QString destFilePath(m_desktopPath + destUrl.path()); QVERIFY(!QFile::exists(destFilePath)); KIO::Job* job = KIO::rename(srcUrl, destUrl, KIO::HideProgressInfo); job->setUiDelegate(nullptr); QVERIFY(job); bool ok = job->exec(); QVERIFY(ok); QVERIFY(!QFile::exists(srcFilePath)); QVERIFY(QFile::exists(destFilePath)); // kio_desktop's rename() calls org::kde::KDirNotify::emitFileRenamedWithLocalPath QTRY_COMPARE(spyFileRenamed.count(), 1); QTRY_COMPARE(spyFileRenamedWithLocalPath.count(), 1); // and then desktopnotifier notices something changed and emits KDirNotify::FilesAdded QTRY_VERIFY(spyFilesAdded.count() >= 1); // can be 3, depending on kdirwatch's behaviour in desktopnotifier // check that KDirLister now has the correct item (#382341) if (lister) { const KFileItem fileItem = lister->findByUrl(destUrl); QVERIFY(!fileItem.isNull()); QCOMPARE(fileItem.targetUrl(), QUrl::fromLocalFile(destFilePath)); } } private: QString m_desktopPath; QString m_testFileName; }; QTEST_GUILESS_MAIN(TestDesktop) #include "kio_desktop_test.moc"