File indexing completed on 2024-05-12 05:17:30

0001 /*
0002     SPDX-FileCopyrightText: 2021 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "testhelpers.h"
0008 
0009 #include <KItinerary/ExtractorDocumentNode>
0010 #include <KItinerary/ExtractorDocumentNodeFactory>
0011 #include <KItinerary/ExtractorDocumentProcessor>
0012 #include <KItinerary/ExtractorEngine>
0013 #include <KItinerary/ExtractorResult>
0014 #include <KItinerary/ScriptExtractor>
0015 
0016 #include <QDebug>
0017 #include <QFile>
0018 #include <QJsonDocument>
0019 #include <QTest>
0020 
0021 using namespace KItinerary;
0022 
0023 #define s(x) QStringLiteral(x)
0024 
0025 void initLocale()
0026 {
0027     qputenv("LC_ALL", "en_US.utf-8");
0028     qputenv("TZ", "Europe/Brussels");
0029 }
0030 
0031 Q_CONSTRUCTOR_FUNCTION(initLocale)
0032 
0033 static void expandRecursive(ExtractorDocumentNode &node, const ExtractorEngine *engine)
0034 {
0035     if (node.isNull()) {
0036         return;
0037     }
0038     node.processor()->expandNode(node, engine);
0039     for (auto child : node.childNodes()) {
0040         expandRecursive(child, engine);
0041     }
0042 
0043     node.processor()->preExtract(node, engine);
0044 }
0045 
0046 class ExtractorScriptEngineTest : public QObject
0047 {
0048     Q_OBJECT
0049 private Q_SLOTS:
0050     void testArguments_data()
0051     {
0052         QTest::addColumn<QString>("inputFile");
0053         QTest::addColumn<QString>("refFile");
0054 
0055         QTest::newRow("text/plain") << s(SOURCE_DIR "/scriptenginedata/plain-text.txt") << s(SOURCE_DIR "/scriptenginedata/plain-text.txt.json");
0056         QTest::newRow("pkpass") << s(SOURCE_DIR "/pkpassdata/swiss.pkpass") << s(SOURCE_DIR "/scriptenginedata/swiss.pkpass.json");
0057         QTest::newRow("IATA BCBP PDF") << s(SOURCE_DIR "/extractordata/synthetic/iata-bcbp-demo.pdf")
0058             << s(SOURCE_DIR "/scriptenginedata/iata-bcbp-demo.pdf.json");
0059         QTest::newRow("ical") << s(SOURCE_DIR "/extractordata/ical/eventreservation.ics") << s(SOURCE_DIR "/scriptenginedata/eventreservation.ics.json");
0060         QTest::newRow("uic9183") << s(SOURCE_DIR "/uic918-3/valid/Testw_VOW8XG6_A9E8DXL_0.bin") << s(SOURCE_DIR "/scriptenginedata/Testw_VOW8XG6_A9E8DXL_0.bin.json");
0061         QTest::newRow("html") << s(SOURCE_DIR "/structureddata/google-flight-reservation-json-ld.html") << s(SOURCE_DIR "/scriptenginedata/google-flight-reservation-json-ld.html.json");
0062     }
0063 
0064     void testArguments()
0065     {
0066         QFETCH(QString, inputFile);
0067         QFETCH(QString, refFile);
0068 
0069         QFile in(inputFile);
0070         const auto openFlags = inputFile.endsWith(QLatin1StringView(".txt"))
0071                                    ? QFile::Text
0072                                    : QFile::ReadOnly;
0073         QVERIFY(in.open(QFile::ReadOnly | openFlags));
0074 
0075         ExtractorEngine engine;
0076         auto root = engine.documentNodeFactory()->createNode(in.readAll(), inputFile);
0077         QVERIFY(!root.isNull());
0078         expandRecursive(root, &engine);
0079 
0080         ScriptExtractor extractor;
0081         extractor.setScriptFileName(s(":/reflector.js"));
0082         extractor.setScriptFunction(s("dumpArgs"));
0083         const auto result = extractor.extract(root, &engine).jsonLdResult();
0084 
0085         QFile ref(refFile);
0086         QVERIFY(ref.open(QFile::ReadOnly));
0087         const auto refResult = QJsonDocument::fromJson(ref.readAll()).array();
0088         QVERIFY(Test::compareJson(refFile, result, refResult));
0089     }
0090 
0091     void testInfiniteLoop()
0092     {
0093         QFile in(s(SOURCE_DIR "/scriptenginedata/plain-text.txt"));
0094         QVERIFY(in.open(QFile::ReadOnly));
0095 
0096         ExtractorEngine engine;
0097         auto root = engine.documentNodeFactory()->createNode(in.readAll());
0098         QVERIFY(!root.isNull());
0099         expandRecursive(root, &engine);
0100 
0101         ScriptExtractor extractor;
0102         extractor.setScriptFileName(s(":/buggy.js"));
0103         extractor.setScriptFunction(s("infiniteLoop"));
0104         const auto result = extractor.extract(root, &engine).jsonLdResult();
0105     }
0106 };
0107 
0108 QTEST_GUILESS_MAIN(ExtractorScriptEngineTest)
0109 
0110 #include "extractorscriptenginetest.moc"