1 /*
2 This file is part of the Baloo KDE project.
3 SPDX-FileCopyrightText: 2011 Sebastian Trueg <trueg@kde.org>
4 SPDX-FileCopyrightText: 2018 Michael Heidelbach <ottwolt@gmail.com>
5
6 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
7 */
8
9 #include "fileindexerconfigtest.h"
10 #include "fileindexerconfig.h"
11 #include "fileindexerconfigutils.h"
12
13
14 #include <QFile>
15 #include <QScopedPointer>
16 #include <QTest>
17
18
19 using namespace Baloo::Test;
20
21 namespace
22 {
23 const QString excludeFilter1 = QStringLiteral("build");
24 const QString excludeFilter2 = QStringLiteral("foo?ar");
25
26 const QString excludedFilterSubDir1 = indexedRootDir + QLatin1String("/") + excludeFilter1;
27 const QString excludedFilterSubSubDir1 = excludedFilterSubDir1 + QLatin1String("/sub1");
28
29 const QString excludedFilterSubDir2 = indexedRootDir + QLatin1String("/foobar");
30 const QString excludedFilterSubSubDir2 = excludedFilterSubDir2 + QLatin1String("/sub2");
31
32 const QString includedFilterSubDir = excludedFilterSubDir1 + QLatin1String("/sub3");
33 const QString includedFilterSubSubDir = includedFilterSubDir + QLatin1String("/sub");
34 }
35
initTestCase()36 void FileIndexerConfigTest::initTestCase()
37 {
38
39 m_mainDir = createTmpFolders(QStringList{
40 indexedRootDir,
41 indexedSubDir,
42 indexedSubSubDir,
43 excludedSubDir,
44 excludedSubSubDir,
45 hiddenSubSubDir,
46 ignoredSubFolderToIndexedHidden,
47 indexedSubFolderToIndexedHidden,
48 indexedSubDirToExcluded,
49 indexedHiddenSubDirToExcluded,
50 excludedRootDir,
51 hiddenSubDir,
52 indexedHiddenSubDir,
53 ignoredRootDir,
54
55 excludedFilterSubDir1,
56 excludedFilterSubSubDir1,
57 excludedFilterSubDir2,
58 excludedFilterSubSubDir2,
59 includedFilterSubDir,
60 includedFilterSubSubDir
61 });
62 m_dirPrefix = m_mainDir->path() + QLatin1Char('/');
63 }
64
cleanupTestCase()65 void FileIndexerConfigTest::cleanupTestCase()
66 {
67 delete m_mainDir;
68 }
69
testShouldFolderBeIndexed_data()70 void FileIndexerConfigTest::testShouldFolderBeIndexed_data()
71 {
72 const auto indexed = QStringList{
73 indexedRootDir,
74 indexedSubDir,
75 indexedSubSubDir,
76 indexedSubFolderToIndexedHidden,
77 indexedSubDirToExcluded,
78 indexedHiddenSubDir
79 };
80
81 const auto excluded = QStringList{
82 excludedSubSubDir,
83 hiddenSubSubDir,
84 ignoredSubFolderToIndexedHidden,
85 excludedSubDir,
86 hiddenSubDir,
87 ignoredRootDir,
88 excludedRootDir
89 };
90
91 QTest::addColumn<QString>("path");
92 QTest::addColumn<bool>("shouldBeIndexed");
93
94 for (const auto& key : indexed) {
95 QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key)));
96 QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << true;
97 }
98
99 for (const auto& key : excluded) {
100 QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key)));
101 QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << false;
102 }
103 }
104
testShouldFolderBeIndexed()105 void FileIndexerConfigTest::testShouldFolderBeIndexed()
106 {
107 writeIndexerConfig(QStringList{
108 m_dirPrefix + indexedRootDir,
109 m_dirPrefix + indexedSubFolderToIndexedHidden,
110 m_dirPrefix + indexedHiddenSubDir,
111 m_dirPrefix + indexedSubDirToExcluded
112 },
113 QStringList{
114 m_dirPrefix + excludedRootDir,
115 m_dirPrefix + excludedSubDir,
116 m_dirPrefix + excludedSubSubDir
117 },
118 QStringList(),
119 false);
120
121 // create our test config object
122 QScopedPointer<Baloo::FileIndexerConfig> cfg(new Baloo::FileIndexerConfig());
123 QFETCH(QString, path);
124 QFETCH(bool, shouldBeIndexed);
125
126 QCOMPARE(cfg->shouldFolderBeIndexed(path), shouldBeIndexed);
127 }
128
testShouldFolderBeIndexedHidden_data()129 void FileIndexerConfigTest::testShouldFolderBeIndexedHidden_data()
130 {
131
132 const auto indexed = QStringList{
133 indexedRootDir,
134 indexedSubDir,
135 indexedSubSubDir,
136 hiddenSubSubDir,
137 ignoredSubFolderToIndexedHidden,
138 indexedSubFolderToIndexedHidden,
139 indexedSubDirToExcluded,
140 hiddenSubDir,
141 indexedHiddenSubDir
142 };
143 const auto excluded = QStringList{
144 excludedSubSubDir,
145 excludedSubDir,
146 ignoredRootDir,
147 excludedRootDir
148 };
149
150 QTest::addColumn<QString>("path");
151 QTest::addColumn<bool>("shouldBeIndexed");
152
153 for (const auto& key : indexed) {
154 QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key)));
155 QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << true;
156 }
157
158 for (const auto& key : excluded) {
159 QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key)));
160 QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << false;
161 }
162 }
163
testShouldFolderBeIndexedHidden()164 void FileIndexerConfigTest::testShouldFolderBeIndexedHidden()
165 {
166 writeIndexerConfig(QStringList{
167 m_dirPrefix + indexedRootDir,
168 m_dirPrefix + indexedSubFolderToIndexedHidden,
169 m_dirPrefix + indexedHiddenSubDir,
170 m_dirPrefix + indexedSubDirToExcluded
171 },
172 QStringList{
173 m_dirPrefix + excludedRootDir,
174 m_dirPrefix + excludedSubDir,
175 m_dirPrefix + excludedSubSubDir
176 },
177 QStringList(),
178 true);
179
180 // create our test config object
181 QScopedPointer<Baloo::FileIndexerConfig> cfg(new Baloo::FileIndexerConfig());
182 cfg->forceConfigUpdate();
183
184 QFETCH(QString, path);
185 QFETCH(bool, shouldBeIndexed);
186
187 QCOMPARE(cfg->shouldFolderBeIndexed(path), shouldBeIndexed);
188 }
189
testShouldBeIndexed_data()190 void FileIndexerConfigTest::testShouldBeIndexed_data()
191 {
192 const QString fileName = QStringLiteral("/somefile.txt");
193 const auto indexed = QStringList{
194 indexedRootDir,
195 indexedSubDir,
196 indexedSubSubDir,
197 indexedSubFolderToIndexedHidden,
198 indexedSubDirToExcluded,
199 indexedHiddenSubDir,
200 };
201 const auto indexedFilenames = QStringList{
202 indexedRootDir + fileName,
203 indexedSubDir + fileName,
204 indexedSubSubDir + fileName,
205 indexedSubFolderToIndexedHidden + fileName,
206 indexedSubDirToExcluded + fileName,
207 indexedHiddenSubDir + fileName
208 };
209 const auto excluded = QStringList{
210 excludedSubSubDir,
211 hiddenSubSubDir,
212 ignoredSubFolderToIndexedHidden,
213 excludedSubDir,
214 hiddenSubDir,
215 ignoredRootDir,
216 excludedRootDir,
217 };
218 const auto excludedFilenames = QStringList{
219 excludedSubSubDir + fileName,
220 hiddenSubSubDir + fileName,
221 ignoredSubFolderToIndexedHidden + fileName,
222 excludedSubDir + fileName,
223 hiddenSubDir + fileName,
224 ignoredRootDir + fileName,
225 excludedRootDir + fileName,
226 };
227
228 QTest::addColumn<QString>("path");
229 QTest::addColumn<bool>("shouldBeIndexed");
230
231 for (const auto& key : indexed) {
232 QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key)));
233 QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << true;
234 }
235
236 for (const auto& key : indexedFilenames) {
237 QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << true;
238 }
239
240 for (const auto& key : excluded) {
241 QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key)));
242 QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << false;
243 }
244
245 for (const auto& key : excludedFilenames) {
246 QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << false;
247 }
248 }
249
testShouldBeIndexed()250 void FileIndexerConfigTest::testShouldBeIndexed()
251 {
252 writeIndexerConfig(QStringList{
253 m_dirPrefix + indexedRootDir,
254 m_dirPrefix + indexedSubFolderToIndexedHidden,
255 m_dirPrefix + indexedHiddenSubDir,
256 m_dirPrefix + indexedSubDirToExcluded
257 },
258 QStringList{
259 m_dirPrefix + excludedRootDir,
260 m_dirPrefix + excludedSubDir,
261 m_dirPrefix + excludedSubSubDir
262 },
263 QStringList(),
264 false);
265
266 // create our test config object
267 QScopedPointer<Baloo::FileIndexerConfig> cfg(new Baloo::FileIndexerConfig());
268 cfg->forceConfigUpdate();
269
270 QFETCH(QString, path);
271 QFETCH(bool, shouldBeIndexed);
272
273 QCOMPARE(cfg->shouldBeIndexed(path), shouldBeIndexed);
274
275 }
276
testShouldBeIndexedHidden_data()277 void FileIndexerConfigTest::testShouldBeIndexedHidden_data()
278 {
279 const QString fileName = QStringLiteral("/somefile.txt");
280 const auto indexed = QStringList{
281 indexedRootDir,
282 indexedSubDir,
283 indexedSubSubDir,
284 hiddenSubSubDir,
285 ignoredSubFolderToIndexedHidden,
286 indexedSubFolderToIndexedHidden,
287 indexedSubDirToExcluded,
288 hiddenSubDir,
289 indexedHiddenSubDir
290 };
291 const auto indexedFilenames = QStringList{
292 indexedRootDir + fileName,
293 indexedSubDir + fileName,
294 indexedSubSubDir + fileName,
295 hiddenSubSubDir + fileName,
296 ignoredSubFolderToIndexedHidden + fileName,
297 indexedSubFolderToIndexedHidden + fileName,
298 indexedSubDirToExcluded + fileName,
299 hiddenSubDir + fileName,
300 indexedHiddenSubDir + fileName
301 };
302 const auto excluded = QStringList{
303 excludedSubSubDir,
304 excludedSubDir,
305 ignoredRootDir,
306 excludedRootDir
307 };
308 const auto excludedFilenames = QStringList{
309 excludedSubSubDir + fileName,
310 excludedSubDir + fileName,
311 ignoredRootDir + fileName,
312 excludedRootDir + fileName
313 };
314
315 QTest::addColumn<QString>("path");
316 QTest::addColumn<bool>("shouldBeIndexed");
317
318 for (const auto& key : indexed) {
319 QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key)));
320 QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << true;
321 }
322
323 for (const auto& key : indexedFilenames) {
324 QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << true;
325 }
326
327 for (const auto& key : excluded) {
328 QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key)));
329 QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << false;
330 }
331
332 for (const auto& key : excludedFilenames) {
333 QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << false;
334 }
335 }
336
testShouldBeIndexedHidden()337 void FileIndexerConfigTest::testShouldBeIndexedHidden()
338 {
339 writeIndexerConfig(QStringList{
340 m_dirPrefix + indexedRootDir,
341 m_dirPrefix + indexedSubFolderToIndexedHidden,
342 m_dirPrefix + indexedHiddenSubDir,
343 m_dirPrefix + indexedSubDirToExcluded
344 },
345 QStringList{
346 m_dirPrefix + excludedRootDir,
347 m_dirPrefix + excludedSubDir,
348 m_dirPrefix + excludedSubSubDir
349 },
350 QStringList(),
351 true);
352
353 // create our test config object
354 QScopedPointer<Baloo::FileIndexerConfig> cfg(new Baloo::FileIndexerConfig());
355 cfg->forceConfigUpdate();
356
357 QFETCH(QString, path);
358 QFETCH(bool, shouldBeIndexed);
359
360 QCOMPARE(cfg->shouldBeIndexed(path), shouldBeIndexed);
361 }
362
testShouldExcludeFilterOnFolders_data()363 void FileIndexerConfigTest::testShouldExcludeFilterOnFolders_data()
364 {
365 const QString fileName = QStringLiteral("/somefile.txt");
366 const auto indexed = QStringList{
367 indexedRootDir,
368 includedFilterSubDir,
369 includedFilterSubSubDir,
370 };
371 const auto indexedFilenames = QStringList{
372 indexedRootDir + fileName,
373 includedFilterSubDir + fileName,
374 includedFilterSubSubDir + fileName
375 };
376 const auto excluded = QStringList{
377 excludedFilterSubDir1,
378 excludedFilterSubSubDir1,
379 excludedFilterSubDir2,
380 excludedFilterSubSubDir2,
381 };
382 const auto excludedFilenames = QStringList{
383 excludedFilterSubDir1 + fileName,
384 excludedFilterSubSubDir1 + fileName,
385 excludedFilterSubDir2 + fileName,
386 excludedFilterSubSubDir2 + fileName
387 };
388
389 QTest::addColumn<QString>("path");
390 QTest::addColumn<bool>("shouldBeIndexed");
391
392 for (const auto& key : indexed) {
393 QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key)));
394 QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << true;
395 }
396
397 for (const auto& key : indexedFilenames) {
398 QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << true;
399 }
400
401 for (const auto& key : excluded) {
402 QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key)));
403 QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << false;
404 }
405
406 for (const auto& key : excludedFilenames) {
407 QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << false;
408 }
409 }
410
testShouldExcludeFilterOnFolders()411 void FileIndexerConfigTest::testShouldExcludeFilterOnFolders()
412 {
413 writeIndexerConfig(QStringList{
414 m_dirPrefix + indexedRootDir,
415 m_dirPrefix + includedFilterSubDir
416 },
417 QStringList(),
418 QStringList{
419 excludeFilter1,
420 excludeFilter2
421 },
422 false);
423
424 // create our test config object
425 QFETCH(QString, path);
426 QFETCH(bool, shouldBeIndexed);
427
428 QScopedPointer<Baloo::FileIndexerConfig> cfg(new Baloo::FileIndexerConfig());
429 cfg->forceConfigUpdate(); //Maybe this was left out on purpose
430
431 QCOMPARE(cfg->shouldFolderBeIndexed(path), shouldBeIndexed);
432 }
433
434 QTEST_GUILESS_MAIN(FileIndexerConfigTest)
435