// SPDX-License-Identifier: GPL-3.0-only // SPDX-FileCopyrightText: 2026 Project Tick // SPDX-FileContributor: Project Tick Team #include #include using projt::logs::LogEventParser; class LogEventParserTest : public QObject { Q_OBJECT private slots: void parseLog4jComplete() { LogEventParser parser; const QString xml = "" "Hello World" ""; parser.pushLine(xml); auto item = parser.popNext(); QVERIFY(item.has_value()); QVERIFY(std::holds_alternative(item.value())); auto entry = std::get(item.value()); QCOMPARE(entry.logger, QStringLiteral("Test.Logger")); QCOMPARE(entry.levelText, QStringLiteral("WARN")); QCOMPARE(entry.level, MessageLevel::Warning); QCOMPARE(entry.thread, QStringLiteral("Main")); QCOMPARE(entry.message, QStringLiteral("Hello World")); QCOMPARE(entry.timestamp.toSecsSinceEpoch(), 1700000000LL); } void parseLog4jMissingLogger() { LogEventParser parser; const QString xml = "" "Missing logger" ""; parser.pushLine(xml); auto item = parser.popNext(); QVERIFY(!item.has_value()); auto err = parser.lastError(); QVERIFY(err.has_value()); QVERIFY(err->message.contains(QStringLiteral("missing logger"), Qt::CaseInsensitive)); } void parseLog4jPendingChunk() { LogEventParser parser; const QString partial = "" "Partial"; const QString remainder = ""; parser.pushLine(partial); auto first = parser.popNext(); QVERIFY(first.has_value()); QVERIFY(std::holds_alternative(first.value())); parser.pushLine(remainder); auto second = parser.popNext(); QVERIFY(second.has_value()); QVERIFY(std::holds_alternative(second.value())); auto entry = std::get(second.value()); QCOMPARE(entry.message, QStringLiteral("Partial")); } void parseLog4jLeadingWhitespace() { LogEventParser parser; const QString xml = " " "Whitespace" ""; parser.pushLine(xml); auto item = parser.popNext(); QVERIFY(item.has_value()); QVERIFY(std::holds_alternative(item.value())); } void guessLevelFromLine_data() { QTest::addColumn("line"); QTest::addColumn("fallback"); QTest::addColumn("expected"); QTest::newRow("header-info") << "[12:34:56] [Server thread/INFO] Hello" << static_cast(MessageLevel::Unknown) << static_cast(MessageLevel::Info); QTest::newRow("bracket-severe") << "[SEVERE] Something bad" << static_cast(MessageLevel::Unknown) << static_cast(MessageLevel::Error); QTest::newRow("warning-tag") << "[WARNING] Potential issue" << static_cast(MessageLevel::Unknown) << static_cast(MessageLevel::Warning); QTest::newRow("fatal-overwrite") << "overwriting existing" << static_cast(MessageLevel::Unknown) << static_cast(MessageLevel::Fatal); QTest::newRow("fallback-preserved") << "overwriting existing" << static_cast(MessageLevel::Info) << static_cast(MessageLevel::Info); } void guessLevelFromLine() { QFETCH(QString, line); QFETCH(int, fallback); QFETCH(int, expected); auto result = LogEventParser::guessLevelFromLine(line, static_cast(fallback)); QCOMPARE(static_cast(result), expected); } }; QTEST_GUILESS_MAIN(LogEventParserTest) #include "LogEventParser_test.moc"