File indexing completed on 2024-04-28 04:48:44

0001 /*
0002    SPDX-FileCopyrightText: 2015 (c) Matthieu Gallien <matthieu_gallien@yahoo.fr>
0003 
0004    SPDX-License-Identifier: LGPL-3.0-or-later
0005  */
0006 
0007 #include "databasetestdata.h"
0008 
0009 #include "file/localfilelisting.h"
0010 #include "elisa_settings.h"
0011 
0012 #include "config-upnp-qt.h"
0013 
0014 #include <QObject>
0015 #include <QUrl>
0016 #include <QString>
0017 #include <QStringList>
0018 #include <QHash>
0019 #include <QVector>
0020 #include <QThread>
0021 #include <QStandardPaths>
0022 #include <QDir>
0023 #include <QFile>
0024 
0025 #include <QSignalSpy>
0026 #include <QTest>
0027 
0028 #include <algorithm>
0029 
0030 class LocalFileListingTests: public QObject, public DatabaseTestData
0031 {
0032     Q_OBJECT
0033 
0034 public:
0035 
0036     LocalFileListingTests(QObject *parent = nullptr) : QObject(parent)
0037     {
0038     }
0039 
0040 private Q_SLOTS:
0041 
0042     void initTestCase()
0043     {
0044         qRegisterMetaType<QHash<qulonglong,int>>("QHash<qulonglong,int>");
0045         qRegisterMetaType<QHash<QString,QUrl>>("QHash<QString,QUrl>");
0046         qRegisterMetaType<QVector<qlonglong>>("QVector<qlonglong>");
0047         qRegisterMetaType<QHash<qlonglong,int>>("QHash<qlonglong,int>");
0048         qRegisterMetaType<QList<QUrl>>("QList<QUrl>");
0049         Elisa::ElisaConfiguration::instance(QStringLiteral("scanAtStartupFeature"));
0050     }
0051 
0052     void initialTestWithNoTrack()
0053     {
0054         LocalFileListing myListing;
0055 
0056         QSignalSpy tracksListSpy(&myListing, &LocalFileListing::tracksList);
0057         QSignalSpy removedTracksListSpy(&myListing, &LocalFileListing::removedTracksList);
0058 
0059         QCOMPARE(tracksListSpy.count(), 0);
0060         QCOMPARE(removedTracksListSpy.count(), 0);
0061 
0062         myListing.init();
0063 
0064         QCOMPARE(tracksListSpy.count(), 0);
0065         QCOMPARE(removedTracksListSpy.count(), 0);
0066 
0067         myListing.setAllRootPaths({QStringLiteral("/directoryNotExist")});
0068 
0069         QCOMPARE(tracksListSpy.count(), 0);
0070         QCOMPARE(removedTracksListSpy.count(), 0);
0071 
0072         QCOMPARE(myListing.allRootPaths(), QStringList{QStringLiteral("/directoryNotExist")});
0073 
0074         myListing.refreshContent();
0075 
0076         QCOMPARE(tracksListSpy.count(), 0);
0077         QCOMPARE(removedTracksListSpy.count(), 0);
0078     }
0079 
0080     void initialTestWithEnabledScanOnStartupSetting()
0081     {
0082         LocalFileListing myListing;
0083 
0084         Elisa::ElisaConfiguration::self()->setDefaults();
0085 
0086         QSignalSpy tracksListSpy(&myListing, &LocalFileListing::tracksList);
0087         QSignalSpy askRestoredTracksSpy(&myListing, &LocalFileListing::askRestoredTracks);
0088 
0089         QCOMPARE(tracksListSpy.count(), 0);
0090         QCOMPARE(askRestoredTracksSpy.count(), 0);
0091 
0092         myListing.init();
0093 
0094         QCOMPARE(tracksListSpy.count(), 0);
0095         QCOMPARE(askRestoredTracksSpy.count(), 1);
0096     }
0097 
0098     void initialTestWithDisabledScanOnStartupSetting()
0099     {
0100         LocalFileListing myListing;
0101 
0102         Elisa::ElisaConfiguration::self()->setDefaults();
0103         Elisa::ElisaConfiguration::self()->setScanAtStartup(false);
0104 
0105         QSignalSpy tracksListSpy(&myListing, &LocalFileListing::tracksList);
0106         QSignalSpy askRestoredTracksSpy(&myListing, &LocalFileListing::askRestoredTracks);
0107 
0108         QCOMPARE(tracksListSpy.count(), 0);
0109         QCOMPARE(askRestoredTracksSpy.count(), 0);
0110 
0111         myListing.init();
0112 
0113         QCOMPARE(tracksListSpy.count(), 0);
0114         QCOMPARE(askRestoredTracksSpy.count(), 0);
0115     }
0116 
0117     void initialTestWithTracks()
0118     {
0119         LocalFileListing myListing;
0120 
0121         QString musicPath = QStringLiteral(LOCAL_FILE_TESTS_SAMPLE_FILES_PATH) + QStringLiteral("/music");
0122 
0123         QSignalSpy tracksListSpy(&myListing, &LocalFileListing::tracksList);
0124         QSignalSpy removedTracksListSpy(&myListing, &LocalFileListing::removedTracksList);
0125 
0126         QCOMPARE(tracksListSpy.count(), 0);
0127         QCOMPARE(removedTracksListSpy.count(), 0);
0128 
0129         myListing.init();
0130 
0131         QCOMPARE(tracksListSpy.count(), 0);
0132         QCOMPARE(removedTracksListSpy.count(), 0);
0133 
0134         myListing.setAllRootPaths({musicPath});
0135 
0136         QCOMPARE(tracksListSpy.count(), 0);
0137         QCOMPARE(removedTracksListSpy.count(), 0);
0138 
0139         //QCOMPARE(myListing.rootPath(), musicPath);
0140 
0141         myListing.refreshContent();
0142 
0143         QCOMPARE(tracksListSpy.count(), 2);
0144         QCOMPARE(removedTracksListSpy.count(), 0);
0145 
0146         const auto &firstNewTracksSignal = tracksListSpy.at(0);
0147         auto firstNewTracks = firstNewTracksSignal.at(0).value<DataTypes::ListTrackDataType>();
0148         const auto &secondNewTracksSignal = tracksListSpy.at(1);
0149         auto secondNewTracks = secondNewTracksSignal.at(0).value<DataTypes::ListTrackDataType>();
0150         auto newCovers = secondNewTracksSignal.at(1).value<QHash<QString, QUrl>>();
0151 
0152         QCOMPARE(firstNewTracks.count() + secondNewTracks.count(), 5);
0153         QCOMPARE(newCovers.count(), 5);
0154     }
0155 
0156     void addAndRemoveTracks()
0157     {
0158         LocalFileListing myListing;
0159 
0160         QString musicOriginPath = QStringLiteral(LOCAL_FILE_TESTS_SAMPLE_FILES_PATH) + QStringLiteral("/music");
0161 
0162         QString musicPath = QStringLiteral(LOCAL_FILE_TESTS_WORKING_PATH) + QStringLiteral("/music2/data/innerData");
0163 
0164         QString musicParentPath = QStringLiteral(LOCAL_FILE_TESTS_WORKING_PATH) + QStringLiteral("/music2");
0165         QDir musicParentDirectory(musicParentPath);
0166         QDir rootDirectory(QStringLiteral(LOCAL_FILE_TESTS_WORKING_PATH));
0167 
0168         musicParentDirectory.removeRecursively();
0169         rootDirectory.mkpath(QStringLiteral("music2/data/innerData"));
0170 
0171         QSignalSpy tracksListSpy(&myListing, &LocalFileListing::tracksList);
0172         QSignalSpy removedTracksListSpy(&myListing, &LocalFileListing::removedTracksList);
0173         QSignalSpy errorWatchingFileSystemChangesSpy(&myListing, &LocalFileListing::errorWatchingFileSystemChanges);
0174 
0175         QCOMPARE(tracksListSpy.count(), 0);
0176         QCOMPARE(removedTracksListSpy.count(), 0);
0177 
0178         myListing.init();
0179 
0180         QCOMPARE(tracksListSpy.count(), 0);
0181         QCOMPARE(removedTracksListSpy.count(), 0);
0182 
0183         myListing.setAllRootPaths({musicParentPath});
0184 
0185         QCOMPARE(tracksListSpy.count(), 0);
0186         QCOMPARE(removedTracksListSpy.count(), 0);
0187 
0188         QCOMPARE(myListing.allRootPaths(), QStringList{musicParentPath});
0189 
0190         myListing.refreshContent();
0191 
0192         QCOMPARE(tracksListSpy.count(), 0);
0193         QCOMPARE(removedTracksListSpy.count(), 0);
0194 
0195         QFile myTrack(musicOriginPath + QStringLiteral("/test.ogg"));
0196         myTrack.copy(musicPath + QStringLiteral("/test.ogg"));
0197         QFile myCover(musicOriginPath + QStringLiteral("/cover.jpg"));
0198         myCover.copy(musicPath + QStringLiteral("/cover.jpg"));
0199 
0200         QCOMPARE(tracksListSpy.wait(), true);
0201 
0202         QCOMPARE(tracksListSpy.count(), 1);
0203         QCOMPARE(removedTracksListSpy.count(), 0);
0204 
0205         auto newTracksSignal = tracksListSpy.at(0);
0206         auto newTracks = newTracksSignal.at(0).value<DataTypes::ListTrackDataType>();
0207         auto newCovers = newTracksSignal.at(1).value<QHash<QString, QUrl>>();
0208 
0209         QCOMPARE(newTracks.count(), 1);
0210         QCOMPARE(newCovers.count(), 1);
0211 
0212         QDir musicDirectory(musicPath);
0213         QCOMPARE(musicDirectory.removeRecursively(), true);
0214 
0215         auto removedFilesWorking = removedTracksListSpy.wait();
0216 
0217         if (!removedFilesWorking && errorWatchingFileSystemChangesSpy.count()) {
0218             QEXPECT_FAIL("", "Impossible watching file system for changes", Abort);
0219         }
0220         QCOMPARE(removedFilesWorking, true);
0221 
0222         QCOMPARE(tracksListSpy.count(), 1);
0223         QCOMPARE(removedTracksListSpy.count(), 1);
0224 
0225         auto removeSignal = removedTracksListSpy.at(0);
0226         auto removedTracks = removeSignal.at(0).value<QList<QUrl>>();
0227         QCOMPARE(removedTracks.isEmpty(), false);
0228 
0229         QCOMPARE(rootDirectory.mkpath(QStringLiteral("music2/data/innerData")), true);
0230         QCOMPARE(myTrack.copy(musicPath + QStringLiteral("/test.ogg")), true);
0231         QCOMPARE(myCover.copy(musicPath + QStringLiteral("/cover.jpg")), true);
0232 
0233         if (tracksListSpy.count() == 1) {
0234             QCOMPARE(tracksListSpy.wait(), true);
0235         }
0236 
0237         QCOMPARE(tracksListSpy.count(), 2);
0238         QCOMPARE(removedTracksListSpy.count(), 1);
0239 
0240         auto newTracksSignalLast = tracksListSpy.at(1);
0241         auto newTracksLast = newTracksSignalLast.at(0).value<DataTypes::ListTrackDataType>();
0242         auto newCoversLast = newTracksSignalLast.at(1).value<QHash<QString, QUrl>>();
0243 
0244         QCOMPARE(newTracksLast.count(), 1);
0245         QCOMPARE(newCoversLast.count(), 1);
0246     }
0247 
0248     void addTracksAndRemoveDirectory()
0249     {
0250         LocalFileListing myListing;
0251 
0252         QString musicOriginPath = QStringLiteral(LOCAL_FILE_TESTS_SAMPLE_FILES_PATH) + QStringLiteral("/music");
0253 
0254         QString musicPath = QStringLiteral(LOCAL_FILE_TESTS_WORKING_PATH) + QStringLiteral("/music2/data/innerData");
0255 
0256         QString innerMusicPath = QStringLiteral(LOCAL_FILE_TESTS_WORKING_PATH) + QStringLiteral("/music2/data");
0257 
0258         QString musicParentPath = QStringLiteral(LOCAL_FILE_TESTS_WORKING_PATH) + QStringLiteral("/music2");
0259         QDir musicParentDirectory(musicParentPath);
0260         QDir rootDirectory(QStringLiteral(LOCAL_FILE_TESTS_WORKING_PATH));
0261 
0262         musicParentDirectory.removeRecursively();
0263         rootDirectory.mkpath(QStringLiteral("music2/data/innerData"));
0264 
0265         QSignalSpy tracksListSpy(&myListing, &LocalFileListing::tracksList);
0266         QSignalSpy removedTracksListSpy(&myListing, &LocalFileListing::removedTracksList);
0267         QSignalSpy errorWatchingFileSystemChangesSpy(&myListing, &LocalFileListing::errorWatchingFileSystemChanges);
0268 
0269         QCOMPARE(tracksListSpy.count(), 0);
0270         QCOMPARE(removedTracksListSpy.count(), 0);
0271 
0272         myListing.init();
0273 
0274         QCOMPARE(tracksListSpy.count(), 0);
0275         QCOMPARE(removedTracksListSpy.count(), 0);
0276 
0277         myListing.setAllRootPaths({musicParentPath});
0278 
0279         QCOMPARE(tracksListSpy.count(), 0);
0280         QCOMPARE(removedTracksListSpy.count(), 0);
0281 
0282         QCOMPARE(myListing.allRootPaths(), QStringList{musicParentPath});
0283 
0284         myListing.refreshContent();
0285 
0286         QCOMPARE(tracksListSpy.count(), 0);
0287         QCOMPARE(removedTracksListSpy.count(), 0);
0288 
0289         QFile myTrack(musicOriginPath + QStringLiteral("/test.ogg"));
0290         myTrack.copy(musicPath + QStringLiteral("/test.ogg"));
0291         QFile myCover(musicOriginPath + QStringLiteral("/cover.jpg"));
0292         myCover.copy(musicPath + QStringLiteral("/cover.jpg"));
0293 
0294         QCOMPARE(tracksListSpy.wait(), true);
0295 
0296         QCOMPARE(tracksListSpy.count(), 1);
0297         QCOMPARE(removedTracksListSpy.count(), 0);
0298 
0299         auto newTracksSignal = tracksListSpy.at(0);
0300         auto newTracks = newTracksSignal.at(0).value<DataTypes::ListTrackDataType>();
0301         auto newCovers = newTracksSignal.at(1).value<QHash<QString, QUrl>>();
0302 
0303         QCOMPARE(newTracks.count(), 1);
0304         QCOMPARE(newCovers.count(), 1);
0305 
0306         QDir musicDirectory(innerMusicPath);
0307         musicDirectory.removeRecursively();
0308 
0309         auto removedFilesWorking = removedTracksListSpy.wait();
0310 
0311         if (!removedFilesWorking && errorWatchingFileSystemChangesSpy.count()) {
0312             QEXPECT_FAIL("", "Impossible watching file system for changes", Abort);
0313         }
0314         QCOMPARE(removedFilesWorking, true);
0315 
0316         QCOMPARE(tracksListSpy.count(), 1);
0317         QCOMPARE(removedTracksListSpy.count(), 1);
0318 
0319         auto removeSignal = removedTracksListSpy.at(0);
0320         auto removedTracks = removeSignal.at(0).value<QList<QUrl>>();
0321         QCOMPARE(removedTracks.isEmpty(), false);
0322 
0323         QCOMPARE(rootDirectory.mkpath(QStringLiteral("music2/data/innerData")), true);
0324         QCOMPARE(myTrack.copy(musicPath + QStringLiteral("/test.ogg")), true);
0325         QCOMPARE(myCover.copy(musicPath + QStringLiteral("/cover.jpg")), true);
0326 
0327         if (tracksListSpy.count() == 1) {
0328             QCOMPARE(tracksListSpy.wait(), true);
0329         }
0330 
0331         QCOMPARE(tracksListSpy.count(), 2);
0332         QCOMPARE(removedTracksListSpy.count(), 1);
0333 
0334         auto newTracksSignalLast = tracksListSpy.at(1);
0335         auto newTracksLast = newTracksSignalLast.at(0).value<DataTypes::ListTrackDataType>();
0336         auto newCoversLast = newTracksSignalLast.at(1).value<QHash<QString, QUrl>>();
0337 
0338         QCOMPARE(newTracksLast.count(), 1);
0339         QCOMPARE(newCoversLast.count(), 1);
0340     }
0341 
0342     void addAndMoveTracks()
0343     {
0344         LocalFileListing myListing;
0345 
0346         QString musicOriginPath = QStringLiteral(LOCAL_FILE_TESTS_SAMPLE_FILES_PATH) + QStringLiteral("/music");
0347 
0348         QString musicPath = QStringLiteral(LOCAL_FILE_TESTS_WORKING_PATH) + QStringLiteral("/music2/data/innerData");
0349         QDir musicDirectory(musicPath);
0350 
0351         QString musicParentPath = QStringLiteral(LOCAL_FILE_TESTS_WORKING_PATH) + QStringLiteral("/music2");
0352         QDir musicParentDirectory(musicParentPath);
0353 
0354         QString musicFriendPath = QStringLiteral(LOCAL_FILE_TESTS_WORKING_PATH) + QStringLiteral("/music3");
0355         QDir musicFriendDirectory(musicFriendPath);
0356 
0357         QCOMPARE(musicFriendDirectory.removeRecursively(), true);
0358         QCOMPARE(musicParentDirectory.removeRecursively(), true);
0359 
0360         musicFriendDirectory.mkpath(musicFriendPath);
0361         musicDirectory.mkpath(musicPath);
0362 
0363         QSignalSpy tracksListSpy(&myListing, &LocalFileListing::tracksList);
0364         QSignalSpy removedTracksListSpy(&myListing, &LocalFileListing::removedTracksList);
0365         QSignalSpy modifiedTracksListSpy(&myListing, &LocalFileListing::modifyTracksList);
0366         QSignalSpy errorWatchingFileSystemChangesSpy(&myListing, &LocalFileListing::errorWatchingFileSystemChanges);
0367 
0368         QCOMPARE(tracksListSpy.count(), 0);
0369         QCOMPARE(removedTracksListSpy.count(), 0);
0370         QCOMPARE(modifiedTracksListSpy.count(), 0);
0371 
0372         myListing.init();
0373 
0374         QCOMPARE(tracksListSpy.count(), 0);
0375         QCOMPARE(removedTracksListSpy.count(), 0);
0376         QCOMPARE(modifiedTracksListSpy.count(), 0);
0377 
0378         myListing.setAllRootPaths({musicParentPath});
0379 
0380         QCOMPARE(tracksListSpy.count(), 0);
0381         QCOMPARE(removedTracksListSpy.count(), 0);
0382         QCOMPARE(modifiedTracksListSpy.count(), 0);
0383 
0384         QCOMPARE(myListing.allRootPaths(), QStringList{musicParentPath});
0385 
0386         myListing.refreshContent();
0387 
0388         QCOMPARE(tracksListSpy.count(), 0);
0389         QCOMPARE(removedTracksListSpy.count(), 0);
0390         QCOMPARE(modifiedTracksListSpy.count(), 0);
0391 
0392         QFile myTrack(musicOriginPath + QStringLiteral("/test.ogg"));
0393         myTrack.copy(musicPath + QStringLiteral("/test.ogg"));
0394         QFile myCover(musicOriginPath + QStringLiteral("/cover.jpg"));
0395         myCover.copy(musicPath + QStringLiteral("/cover.jpg"));
0396 
0397         QCOMPARE(tracksListSpy.wait(), true);
0398 
0399         QCOMPARE(tracksListSpy.count(), 1);
0400         QCOMPARE(removedTracksListSpy.count(), 0);
0401         QCOMPARE(modifiedTracksListSpy.count(), 0);
0402 
0403         auto newTracksSignal = tracksListSpy.at(0);
0404         auto newTracks = newTracksSignal.at(0).value<DataTypes::ListTrackDataType>();
0405         auto newCovers = newTracksSignal.at(1).value<QHash<QString, QUrl>>();
0406 
0407         QCOMPARE(newTracks.count(), 1);
0408         QCOMPARE(newCovers.count(), 1);
0409 
0410         QDir().rename(musicPath, musicFriendPath);
0411 
0412         auto removedFilesWorking = removedTracksListSpy.wait();
0413 
0414         if (!removedFilesWorking && errorWatchingFileSystemChangesSpy.count()) {
0415             QEXPECT_FAIL("", "Impossible watching file system for changes", Abort);
0416         }
0417         QCOMPARE(removedFilesWorking, true);
0418 
0419         QCOMPARE(tracksListSpy.count(), 1);
0420         QCOMPARE(removedTracksListSpy.count(), 1);
0421         QCOMPARE(modifiedTracksListSpy.count(), 0);
0422 
0423         auto removeSignal = removedTracksListSpy.at(0);
0424         auto removedTracks = removeSignal.at(0).value<QList<QUrl>>();
0425         QCOMPARE(removedTracks.isEmpty(), false);
0426 
0427         QCOMPARE(musicFriendDirectory.mkpath(musicFriendPath), true);
0428         QCOMPARE(musicDirectory.mkpath(musicPath), true);
0429         QCOMPARE(myTrack.copy(musicPath + QStringLiteral("/test.ogg")), true);
0430         QCOMPARE(myCover.copy(musicPath + QStringLiteral("/cover.jpg")), true);
0431 
0432         if (tracksListSpy.count() == 1) {
0433             QCOMPARE(tracksListSpy.wait(), true);
0434         }
0435 
0436         QCOMPARE(tracksListSpy.count(), 2);
0437         QCOMPARE(removedTracksListSpy.count(), 1);
0438         QCOMPARE(modifiedTracksListSpy.count(), 0);
0439 
0440         auto newTracksSignalLast = tracksListSpy.at(1);
0441         auto newTracksLast = newTracksSignalLast.at(0).value<DataTypes::ListTrackDataType>();
0442         auto newCoversLast = newTracksSignalLast.at(1).value<QHash<QString, QUrl>>();
0443 
0444         QCOMPARE(newTracksLast.count(), 1);
0445         QCOMPARE(newCoversLast.count(), 1);
0446     }
0447 
0448     void restoreRemovedTracks()
0449     {
0450         LocalFileListing myListing;
0451 
0452         Elisa::ElisaConfiguration::self()->setDefaults();
0453 
0454         QSignalSpy tracksListSpy(&myListing, &LocalFileListing::tracksList);
0455         QSignalSpy removedTracksListSpy(&myListing, &LocalFileListing::removedTracksList);
0456         QSignalSpy modifiedTracksListSpy(&myListing, &LocalFileListing::modifyTracksList);
0457         QSignalSpy indexingStartedSpy(&myListing, &LocalFileListing::indexingStarted);
0458         QSignalSpy indexingFinishedSpy(&myListing, &LocalFileListing::indexingFinished);
0459         QSignalSpy askRestoredTracksSpy(&myListing, &LocalFileListing::askRestoredTracks);
0460 
0461         QCOMPARE(tracksListSpy.count(), 0);
0462         QCOMPARE(removedTracksListSpy.count(), 0);
0463         QCOMPARE(modifiedTracksListSpy.count(), 0);
0464         QCOMPARE(indexingStartedSpy.count(), 0);
0465         QCOMPARE(indexingFinishedSpy.count(), 0);
0466         QCOMPARE(askRestoredTracksSpy.count(), 0);
0467 
0468         myListing.setAllRootPaths({QStringLiteral("/does/not/exists")});
0469 
0470         QCOMPARE(tracksListSpy.count(), 0);
0471         QCOMPARE(removedTracksListSpy.count(), 0);
0472         QCOMPARE(modifiedTracksListSpy.count(), 0);
0473         QCOMPARE(indexingStartedSpy.count(), 0);
0474         QCOMPARE(indexingFinishedSpy.count(), 0);
0475         QCOMPARE(askRestoredTracksSpy.count(), 0);
0476 
0477         myListing.init();
0478 
0479         QCOMPARE(tracksListSpy.count(), 0);
0480         QCOMPARE(removedTracksListSpy.count(), 0);
0481         QCOMPARE(modifiedTracksListSpy.count(), 0);
0482         QCOMPARE(indexingStartedSpy.count(), 0);
0483         QCOMPARE(indexingFinishedSpy.count(), 0);
0484         QCOMPARE(askRestoredTracksSpy.count(), 1);
0485 
0486         myListing.restoredTracks({{QUrl::fromLocalFile(QStringLiteral("/removed/files1")), QDateTime::fromMSecsSinceEpoch(1)},
0487                                   {QUrl::fromLocalFile(QStringLiteral("/removed/files2")), QDateTime::fromMSecsSinceEpoch(2)}});
0488 
0489         QCOMPARE(tracksListSpy.count(), 0);
0490         QCOMPARE(removedTracksListSpy.count(), 1);
0491         QCOMPARE(modifiedTracksListSpy.count(), 0);
0492         QCOMPARE(indexingStartedSpy.count(), 1);
0493         QCOMPARE(indexingFinishedSpy.count(), 0);
0494         QCOMPARE(askRestoredTracksSpy.count(), 1);
0495 
0496         auto removedTracksSignal = removedTracksListSpy.at(0);
0497 
0498         QCOMPARE(removedTracksSignal.count(), 1);
0499 
0500         auto removedTracks = removedTracksSignal.at(0).value<QList<QUrl>>();
0501 
0502         QCOMPARE(removedTracks.count(), 2);
0503 
0504         std::sort(removedTracks.begin(), removedTracks.end());
0505 
0506         QCOMPARE(removedTracks[0], QUrl::fromLocalFile(QStringLiteral("/removed/files1")));
0507         QCOMPARE(removedTracks[1], QUrl::fromLocalFile(QStringLiteral("/removed/files2")));
0508     }
0509 };
0510 
0511 QTEST_GUILESS_MAIN(LocalFileListingTests)
0512 
0513 
0514 #include "localfilelistingtest.moc"