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"