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