File indexing completed on 2024-04-28 03:51:40
0001 /* 0002 SPDX-FileCopyrightText: 2014 Pinak Ahuja <pinak.ahuja@gmail.com> 0003 0004 SPDX-License-Identifier: LGPL-2.1-or-later 0005 */ 0006 0007 #include "basicindexingjob.h" 0008 0009 #include <vector> 0010 #include <QByteArray> 0011 #include <QDateTime> 0012 #include <QFile> 0013 #include <QString> 0014 #include <QTest> 0015 #include <QTemporaryDir> 0016 #include <QVector> 0017 #include <KFileMetaData/Types> 0018 0019 namespace Baloo { 0020 0021 class BasicIndexingJobTest : public QObject 0022 { 0023 Q_OBJECT 0024 0025 private Q_SLOTS: 0026 void initTestCase(); 0027 0028 void testBasicIndexing_data(); 0029 void testBasicIndexing(); 0030 void testBasicIndexingTypes_data(); 0031 void testBasicIndexingTypes(); 0032 0033 private: 0034 struct TestFile { 0035 QString filename; 0036 QString mimetype; 0037 QList<KFileMetaData::Type::Type> types; 0038 }; 0039 std::vector<TestFile> m_testFiles; 0040 0041 qint64 m_startTime; 0042 QTemporaryDir m_workDir; 0043 }; 0044 0045 } 0046 using namespace Baloo; 0047 0048 void BasicIndexingJobTest::initTestCase() 0049 { 0050 m_startTime = QDateTime::currentSecsSinceEpoch(); 0051 0052 using Type = KFileMetaData::Type::Type; 0053 m_testFiles = { 0054 {QStringLiteral("test.epub"), QStringLiteral("application/epub+zip"), {Type::Document}}, 0055 {QStringLiteral("test.jpg"), QStringLiteral("image/jpeg"), {Type::Image}}, 0056 {QStringLiteral("test.mp3"), QStringLiteral("audio/mpeg"), {Type::Audio}}, 0057 {QStringLiteral("test.ogv"), QStringLiteral("video/x-theora+ogg"), {Type::Video}}, 0058 {QStringLiteral("test.odp"), QStringLiteral("application/vnd.oasis.opendocument.presentation"), {Type::Document, Type::Presentation}}, 0059 {QStringLiteral("test.odt"), QStringLiteral("application/vnd.oasis.opendocument.text"), {Type::Document}}, 0060 {QStringLiteral("test.tar.bz2"), QStringLiteral("application/x-bzip-compressed-tar"), {Type::Archive}}, 0061 {QStringLiteral("empty.jpg"), QStringLiteral("application/x-zerosize"), {}}, 0062 }; 0063 0064 for (const auto& entry : m_testFiles) { 0065 QFile file(m_workDir.filePath(entry.filename)); 0066 file.open(QIODevice::WriteOnly); 0067 if (entry.filename.startsWith(QStringLiteral("test"))) { 0068 file.write("\0", 1); 0069 } 0070 file.close(); 0071 } 0072 } 0073 0074 void BasicIndexingJobTest::testBasicIndexing_data() 0075 { 0076 QTest::addColumn<QString>("filename"); 0077 QTest::addColumn<QString>("mimetype"); 0078 0079 for (const auto& entry : m_testFiles) { 0080 QTest::addRow("%s", qPrintable(entry.mimetype)) 0081 << entry.filename << entry.mimetype; 0082 } 0083 } 0084 0085 void BasicIndexingJobTest::testBasicIndexing() 0086 { 0087 QFETCH(QString, filename); 0088 QFETCH(QString, mimetype); 0089 0090 QString filepath(m_workDir.filePath(filename)); 0091 BasicIndexingJob job(filepath, mimetype, BasicIndexingJob::IndexingLevel::NoLevel); 0092 0093 QVERIFY(job.index()); 0094 0095 auto doc = job.document(); 0096 0097 QVERIFY(doc.id()); 0098 QVERIFY(doc.parentId()); 0099 0100 QCOMPARE(doc.url(), QFile::encodeName(filepath)); 0101 QVERIFY(doc.m_mTime >= m_startTime); 0102 QVERIFY(doc.m_cTime >= m_startTime); 0103 0104 auto fileNameTerms = doc.m_fileNameTerms.keys(); 0105 std::sort(fileNameTerms.begin(), fileNameTerms.end()); 0106 0107 QCOMPARE(fileNameTerms.size(), filename.count(QLatin1Char('.')) + 1); 0108 } 0109 0110 void BasicIndexingJobTest::testBasicIndexingTypes_data() 0111 { 0112 QTest::addColumn<QString>("filename"); 0113 QTest::addColumn<QString>("mimetype"); 0114 QTest::addColumn<QList<QByteArray>>("types"); 0115 0116 for (const auto& entry : m_testFiles) { 0117 QByteArrayList list; 0118 for(const auto type : entry.types) { 0119 list.append("T" + QByteArray::number(static_cast<int>(type))); 0120 } 0121 QTest::addRow("%s", qPrintable(entry.mimetype)) << entry.filename << entry.mimetype << list; 0122 } 0123 } 0124 0125 void BasicIndexingJobTest::testBasicIndexingTypes() 0126 { 0127 QFETCH(QString, filename); 0128 QFETCH(QString, mimetype); 0129 QFETCH(QList<QByteArray>, types); 0130 0131 QString filepath(m_workDir.filePath(filename)); 0132 BasicIndexingJob job(filepath, mimetype, BasicIndexingJob::IndexingLevel::NoLevel); 0133 0134 QVERIFY(job.index()); 0135 0136 auto doc = job.document(); 0137 0138 auto terms = doc.m_terms.keys(); 0139 auto split = std::partition(terms.begin(), terms.end(), 0140 [](const QByteArray& t) { return t[0] == 'T'; }); 0141 0142 // Types 0143 QByteArrayList docTypes{terms.begin(), split}; 0144 std::sort(docTypes.begin(), docTypes.end()); 0145 QCOMPARE(types, docTypes); 0146 0147 // Mimetype terms 0148 QByteArrayList docMimeTerms{split, terms.end()}; 0149 QVERIFY(docMimeTerms.size() >= 2); 0150 for (const auto& term : docMimeTerms) { 0151 QByteArray mimeBA = mimetype.toLatin1(); 0152 // Strip 'M' prefix from term 0153 auto stripped = term.mid(1); 0154 QVERIFY2(mimeBA.contains(stripped), stripped.constData()); 0155 } 0156 } 0157 0158 QTEST_GUILESS_MAIN(BasicIndexingJobTest) 0159 0160 #include "basicindexingjobtest.moc"