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"