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"