File indexing completed on 2024-04-28 03:51:40

0001 /*
0002     This file is part of the Baloo KDE project.
0003     SPDX-FileCopyrightText: 2011 Sebastian Trueg <trueg@kde.org>
0004     SPDX-FileCopyrightText: 2018 Michael Heidelbach <ottwolt@gmail.com>
0005 
0006     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0007 */
0008 
0009 #include "fileindexerconfig.h"
0010 #include "fileindexerconfigutils.h"
0011 
0012 #include <memory>
0013 #include <QObject>
0014 #include <QFile>
0015 #include <QTest>
0016 #include <QTemporaryDir>
0017 
0018 namespace Baloo {
0019 namespace Test {
0020 
0021 class FileIndexerConfigTest : public QObject
0022 {
0023     Q_OBJECT
0024 private Q_SLOTS:
0025 
0026     void initTestCase();
0027     void cleanupTestCase();
0028 
0029     void testShouldFolderBeIndexed();
0030     void testShouldFolderBeIndexed_data();
0031 
0032     void testShouldFolderBeIndexedHidden();
0033     void testShouldFolderBeIndexedHidden_data();
0034 
0035     void testShouldBeIndexed();
0036     void testShouldBeIndexed_data();
0037 
0038     void testShouldBeIndexedHidden();
0039     void testShouldBeIndexedHidden_data();
0040 
0041     void testShouldExcludeFilterOnFolders();
0042     void testShouldExcludeFilterOnFolders_data();
0043 
0044 private:
0045     std::unique_ptr<QTemporaryDir> m_mainDir;
0046     QString m_dirPrefix;
0047 };
0048 
0049 namespace
0050 {
0051 const QString excludeFilter1 = QStringLiteral("build");
0052 const QString excludeFilter2 = QStringLiteral("foo?ar");
0053 
0054 const QString excludedFilterSubDir1 = indexedRootDir + QLatin1String("/") + excludeFilter1;
0055 const QString excludedFilterSubSubDir1 = excludedFilterSubDir1 + QLatin1String("/sub1");
0056 
0057 const QString excludedFilterSubDir2 = indexedRootDir + QLatin1String("/foobar");
0058 const QString excludedFilterSubSubDir2 = excludedFilterSubDir2 + QLatin1String("/sub2");
0059 
0060 const QString includedFilterSubDir = excludedFilterSubDir1 + QLatin1String("/sub3");
0061 const QString includedFilterSubSubDir = includedFilterSubDir + QLatin1String("/sub");
0062 }
0063 
0064 void FileIndexerConfigTest::initTestCase()
0065 {
0066      m_mainDir = createTmpFolders(QStringList{
0067         indexedRootDir,
0068         indexedSubDir,
0069         indexedSubSubDir,
0070         excludedSubDir,
0071         excludedSubSubDir,
0072         hiddenSubSubDir,
0073         ignoredSubFolderToIndexedHidden,
0074         indexedSubFolderToIndexedHidden,
0075         indexedSubDirToExcluded,
0076         indexedHiddenSubDirToExcluded,
0077         excludedRootDir,
0078         hiddenSubDir,
0079         indexedHiddenSubDir,
0080         ignoredRootDir,
0081 
0082         excludedFilterSubDir1,
0083         excludedFilterSubSubDir1,
0084         excludedFilterSubDir2,
0085         excludedFilterSubSubDir2,
0086         includedFilterSubDir,
0087         includedFilterSubSubDir
0088      });
0089      m_dirPrefix = m_mainDir->path() + QLatin1Char('/');
0090 }
0091 
0092 void FileIndexerConfigTest::cleanupTestCase()
0093 {
0094     m_mainDir.reset();
0095 }
0096 
0097 void FileIndexerConfigTest::testShouldFolderBeIndexed_data()
0098 {
0099     const auto indexed = QStringList{
0100         indexedRootDir,
0101         indexedSubDir,
0102         indexedSubSubDir,
0103         indexedSubFolderToIndexedHidden,
0104         indexedSubDirToExcluded,
0105         indexedHiddenSubDir
0106     };
0107 
0108     const auto excluded = QStringList{
0109         excludedSubSubDir,
0110         hiddenSubSubDir,
0111         ignoredSubFolderToIndexedHidden,
0112         excludedSubDir,
0113         hiddenSubDir,
0114         ignoredRootDir,
0115         excludedRootDir
0116     };
0117 
0118     QTest::addColumn<QString>("path");
0119     QTest::addColumn<bool>("shouldBeIndexed");
0120 
0121     for (const auto& key : indexed) {
0122         QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key)));
0123         QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << true;
0124     }
0125 
0126     for (const auto& key : excluded) {
0127        QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key)));
0128         QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << false;
0129     }
0130 }
0131 
0132 void FileIndexerConfigTest::testShouldFolderBeIndexed()
0133 {
0134     writeIndexerConfig(QStringList{
0135             m_dirPrefix + indexedRootDir,
0136             m_dirPrefix + indexedSubFolderToIndexedHidden,
0137             m_dirPrefix + indexedHiddenSubDir,
0138             m_dirPrefix + indexedSubDirToExcluded
0139         },
0140         QStringList{
0141             m_dirPrefix + excludedRootDir,
0142             m_dirPrefix + excludedSubDir,
0143             m_dirPrefix + excludedSubSubDir
0144         },
0145         QStringList(),
0146         false);
0147 
0148     // create our test config object
0149     Baloo::FileIndexerConfig cfg;
0150     QFETCH(QString, path);
0151     QFETCH(bool, shouldBeIndexed);
0152 
0153     QCOMPARE(cfg.shouldFolderBeIndexed(path), shouldBeIndexed);
0154 }
0155 
0156 void FileIndexerConfigTest::testShouldFolderBeIndexedHidden_data()
0157 {
0158     const auto indexed = QStringList{
0159         indexedRootDir,
0160         indexedSubDir,
0161         indexedSubSubDir,
0162         hiddenSubSubDir,
0163         ignoredSubFolderToIndexedHidden,
0164         indexedSubFolderToIndexedHidden,
0165         indexedSubDirToExcluded,
0166         hiddenSubDir,
0167         indexedHiddenSubDir
0168     };
0169     const auto excluded = QStringList{
0170         excludedSubSubDir,
0171         excludedSubDir,
0172         ignoredRootDir,
0173         excludedRootDir
0174     };
0175 
0176     QTest::addColumn<QString>("path");
0177     QTest::addColumn<bool>("shouldBeIndexed");
0178 
0179     for (const auto& key : indexed) {
0180         QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key)));
0181         QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << true;
0182     }
0183 
0184     for (const auto& key : excluded) {
0185         QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key)));
0186         QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << false;
0187     }
0188 }
0189 
0190 void FileIndexerConfigTest::testShouldFolderBeIndexedHidden()
0191 {
0192     writeIndexerConfig(QStringList{
0193             m_dirPrefix + indexedRootDir,
0194             m_dirPrefix + indexedSubFolderToIndexedHidden,
0195             m_dirPrefix + indexedHiddenSubDir,
0196             m_dirPrefix + indexedSubDirToExcluded
0197         },
0198         QStringList{
0199             m_dirPrefix + excludedRootDir,
0200             m_dirPrefix + excludedSubDir,
0201             m_dirPrefix + excludedSubSubDir
0202         },
0203         QStringList(),
0204         true);
0205 
0206     // create our test config object
0207     Baloo::FileIndexerConfig cfg;
0208     cfg.forceConfigUpdate();
0209 
0210     QFETCH(QString, path);
0211     QFETCH(bool, shouldBeIndexed);
0212 
0213     QCOMPARE(cfg.shouldFolderBeIndexed(path), shouldBeIndexed);
0214 }
0215 
0216 void FileIndexerConfigTest::testShouldBeIndexed_data()
0217 {
0218     const QString fileName = QStringLiteral("/somefile.txt");
0219     const auto indexed = QStringList{
0220         indexedRootDir,
0221         indexedSubDir,
0222         indexedSubSubDir,
0223         indexedSubFolderToIndexedHidden,
0224         indexedSubDirToExcluded,
0225         indexedHiddenSubDir,
0226     };
0227     const auto indexedFilenames = QStringList{
0228         indexedRootDir + fileName,
0229         indexedSubDir + fileName,
0230         indexedSubSubDir + fileName,
0231         indexedSubFolderToIndexedHidden + fileName,
0232         indexedSubDirToExcluded + fileName,
0233         indexedHiddenSubDir + fileName
0234     };
0235     const auto excluded = QStringList{
0236         excludedSubSubDir,
0237         hiddenSubSubDir,
0238         ignoredSubFolderToIndexedHidden,
0239         excludedSubDir,
0240         hiddenSubDir,
0241         ignoredRootDir,
0242         excludedRootDir,
0243     };
0244     const auto excludedFilenames = QStringList{
0245         excludedSubSubDir + fileName,
0246         hiddenSubSubDir + fileName,
0247         ignoredSubFolderToIndexedHidden + fileName,
0248         excludedSubDir + fileName,
0249         hiddenSubDir + fileName,
0250         ignoredRootDir + fileName,
0251         excludedRootDir + fileName,
0252     };
0253 
0254     QTest::addColumn<QString>("path");
0255     QTest::addColumn<bool>("shouldBeIndexed");
0256 
0257     for (const auto& key : indexed) {
0258         QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key)));
0259         QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << true;
0260     }
0261 
0262     for (const auto& key : indexedFilenames) {
0263         QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << true;
0264     }
0265 
0266     for (const auto& key : excluded) {
0267         QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key)));
0268         QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << false;
0269     }
0270 
0271     for (const auto& key : excludedFilenames) {
0272         QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << false;
0273     }
0274 }
0275 
0276 void FileIndexerConfigTest::testShouldBeIndexed()
0277 {
0278     writeIndexerConfig(QStringList{
0279             m_dirPrefix + indexedRootDir,
0280             m_dirPrefix + indexedSubFolderToIndexedHidden,
0281             m_dirPrefix + indexedHiddenSubDir,
0282             m_dirPrefix + indexedSubDirToExcluded
0283         },
0284         QStringList{
0285             m_dirPrefix + excludedRootDir,
0286             m_dirPrefix + excludedSubDir,
0287             m_dirPrefix + excludedSubSubDir
0288         },
0289         QStringList(),
0290         false);
0291 
0292     // create our test config object
0293     Baloo::FileIndexerConfig cfg;
0294     cfg.forceConfigUpdate();
0295 
0296     QFETCH(QString, path);
0297     QFETCH(bool, shouldBeIndexed);
0298 
0299     QCOMPARE(cfg.shouldBeIndexed(path), shouldBeIndexed);
0300 }
0301 
0302 void FileIndexerConfigTest::testShouldBeIndexedHidden_data()
0303 {
0304     const QString fileName = QStringLiteral("/somefile.txt");
0305     const auto indexed = QStringList{
0306         indexedRootDir,
0307         indexedSubDir,
0308         indexedSubSubDir,
0309         hiddenSubSubDir,
0310         ignoredSubFolderToIndexedHidden,
0311         indexedSubFolderToIndexedHidden,
0312         indexedSubDirToExcluded,
0313         hiddenSubDir,
0314         indexedHiddenSubDir
0315     };
0316     const auto indexedFilenames = QStringList{
0317         indexedRootDir + fileName,
0318         indexedSubDir + fileName,
0319         indexedSubSubDir + fileName,
0320         hiddenSubSubDir + fileName,
0321         ignoredSubFolderToIndexedHidden + fileName,
0322         indexedSubFolderToIndexedHidden + fileName,
0323         indexedSubDirToExcluded + fileName,
0324         hiddenSubDir + fileName,
0325         indexedHiddenSubDir + fileName
0326     };
0327     const auto excluded = QStringList{
0328         excludedSubSubDir,
0329         excludedSubDir,
0330         ignoredRootDir,
0331         excludedRootDir
0332     };
0333     const auto excludedFilenames = QStringList{
0334         excludedSubSubDir + fileName,
0335         excludedSubDir + fileName,
0336         ignoredRootDir + fileName,
0337         excludedRootDir + fileName
0338     };
0339 
0340     QTest::addColumn<QString>("path");
0341     QTest::addColumn<bool>("shouldBeIndexed");
0342 
0343     for (const auto& key : indexed) {
0344         QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key)));
0345         QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << true;
0346     }
0347 
0348     for (const auto& key : indexedFilenames) {
0349         QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << true;
0350     }
0351 
0352     for (const auto& key : excluded) {
0353         QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key)));
0354         QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << false;
0355     }
0356 
0357     for (const auto& key : excludedFilenames) {
0358         QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << false;
0359     }
0360 }
0361 
0362 void FileIndexerConfigTest::testShouldBeIndexedHidden()
0363 {
0364     writeIndexerConfig(QStringList{
0365             m_dirPrefix + indexedRootDir,
0366             m_dirPrefix + indexedSubFolderToIndexedHidden,
0367             m_dirPrefix + indexedHiddenSubDir,
0368             m_dirPrefix + indexedSubDirToExcluded
0369         },
0370         QStringList{
0371             m_dirPrefix + excludedRootDir,
0372             m_dirPrefix + excludedSubDir,
0373             m_dirPrefix + excludedSubSubDir
0374         },
0375         QStringList(),
0376         true);
0377 
0378     // create our test config object
0379     Baloo::FileIndexerConfig cfg;
0380     cfg.forceConfigUpdate();
0381 
0382     QFETCH(QString, path);
0383     QFETCH(bool, shouldBeIndexed);
0384 
0385     QCOMPARE(cfg.shouldBeIndexed(path), shouldBeIndexed);
0386 }
0387 
0388 void FileIndexerConfigTest::testShouldExcludeFilterOnFolders_data()
0389 {
0390     const QString fileName = QStringLiteral("/somefile.txt");
0391     const auto indexed = QStringList{
0392         indexedRootDir,
0393         includedFilterSubDir,
0394         includedFilterSubSubDir,
0395     };
0396     const auto indexedFilenames = QStringList{
0397         indexedRootDir + fileName,
0398         includedFilterSubDir + fileName,
0399         includedFilterSubSubDir + fileName
0400     };
0401     const auto excluded = QStringList{
0402         excludedFilterSubDir1,
0403         excludedFilterSubSubDir1,
0404         excludedFilterSubDir2,
0405         excludedFilterSubSubDir2,
0406     };
0407     const auto excludedFilenames = QStringList{
0408         excludedFilterSubDir1 + fileName,
0409         excludedFilterSubSubDir1 + fileName,
0410         excludedFilterSubDir2 + fileName,
0411         excludedFilterSubSubDir2 + fileName
0412     };
0413 
0414     QTest::addColumn<QString>("path");
0415     QTest::addColumn<bool>("shouldBeIndexed");
0416 
0417     for (const auto& key : indexed) {
0418         QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key)));
0419         QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << true;
0420     }
0421 
0422     for (const auto& key : indexedFilenames) {
0423         QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << true;
0424     }
0425 
0426     for (const auto& key : excluded) {
0427         QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key)));
0428         QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << false;
0429     }
0430 
0431     for (const auto& key : excludedFilenames) {
0432         QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << false;
0433     }
0434 }
0435 
0436 void FileIndexerConfigTest::testShouldExcludeFilterOnFolders()
0437 {
0438     writeIndexerConfig(QStringList{
0439             m_dirPrefix + indexedRootDir,
0440             m_dirPrefix + includedFilterSubDir
0441         },
0442         QStringList(),
0443         QStringList{
0444             excludeFilter1,
0445             excludeFilter2
0446         },
0447         false);
0448 
0449     // create our test config object
0450     QFETCH(QString, path);
0451     QFETCH(bool, shouldBeIndexed);
0452 
0453     Baloo::FileIndexerConfig cfg;
0454     cfg.forceConfigUpdate();                                //Maybe this was left out on purpose
0455 
0456     QCOMPARE(cfg.shouldFolderBeIndexed(path), shouldBeIndexed);
0457 }
0458 
0459 } // namespace Test
0460 } // namespace Baloo
0461 
0462 using namespace Baloo::Test;
0463 
0464 QTEST_GUILESS_MAIN(FileIndexerConfigTest)
0465 
0466 #include "fileindexerconfigtest.moc"