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

0001 /*
0002     SPDX-FileCopyrightText: 2023 Volker Krause <vkrause@kde.org>
0003     SPDX-License-Identifier: LGPL-2.0-or-later
0004 */
0005 
0006 #include "../lib/protobuf/protobufstreamreader.h"
0007 
0008 #include <QDebug>
0009 #include <QObject>
0010 #include <QTest>
0011 
0012 using namespace KItinerary;
0013 
0014 Q_DECLARE_METATYPE(KItinerary::ProtobufStreamReader::WireType)
0015 
0016 class ProtobufStreamReaderTest: public QObject
0017 {
0018     Q_OBJECT
0019 private Q_SLOTS:
0020     void testVarint_data()
0021     {
0022         QTest::addColumn<QByteArray>("input");
0023         QTest::addColumn<uint64_t>("output");
0024 
0025         QTest::newRow("empty") << QByteArray() << (uint64_t)0;
0026         QTest::newRow("0") << QByteArray("\x00", 1) << (uint64_t)0;
0027         QTest::newRow("150") << QByteArray("\x96\x01") << (uint64_t)150;
0028         QTest::newRow("7") << QByteArray("\x07\01\00", 3) << (uint64_t)7;
0029         QTest::newRow("1579970760000") << QByteArray("\xC0\x9A\xE2\xEC\xFD\x2D") << (uint64_t)1579970760000;
0030     }
0031 
0032     void testVarint()
0033     {
0034         QFETCH(QByteArray, input);
0035         QFETCH(uint64_t, output);
0036 
0037         ProtobufStreamReader r(std::string_view(input.constBegin(), input.size()));
0038         QCOMPARE(r.peekVarint(), output);
0039         QCOMPARE(r.peekVarint(), output);
0040         QCOMPARE(r.readVarint(), output);
0041     }
0042 
0043     void testFieldRead_data()
0044     {
0045         QTest::addColumn<QByteArray>("input");
0046         QTest::addColumn<uint64_t>("fieldNum");
0047         QTest::addColumn<ProtobufStreamReader::WireType>("wireType");
0048 
0049         QTest::newRow("number") << QByteArray::fromHex("089601") << (uint64_t)1 << ProtobufStreamReader::VARINT;
0050         QTest::newRow("string-testing") << QByteArray::fromHex("120774657374696e67") << (uint64_t)2 << ProtobufStreamReader::LEN;
0051         QTest::newRow("sub-message") << QByteArray::fromHex("1a03089601") << (uint64_t)3 << ProtobufStreamReader::LEN;
0052     }
0053 
0054     void testFieldRead()
0055     {
0056         QFETCH(QByteArray, input);
0057         QFETCH(uint64_t, fieldNum);
0058         QFETCH(ProtobufStreamReader::WireType, wireType);
0059 
0060         ProtobufStreamReader r(std::string_view(input.constBegin(), input.size()));
0061         QCOMPARE(r.fieldNumber(), fieldNum);
0062         QCOMPARE(r.wireType(), wireType);
0063         QCOMPARE(r.fieldNumber(), fieldNum);
0064         QCOMPARE(r.wireType(), wireType);
0065 
0066         QVERIFY(!r.atEnd());
0067         r.skip();
0068         QVERIFY(r.atEnd());
0069     }
0070 
0071     void testLengthDelimitedRecord()
0072     {
0073         const auto stringData = QByteArray::fromHex("120774657374696e67");
0074         ProtobufStreamReader r(std::string_view(stringData.constData(), stringData.size()));
0075         QCOMPARE(r.readString(), QLatin1StringView("testing"));
0076 
0077         const auto subMessage = QByteArray::fromHex("1a03089601");
0078         r = ProtobufStreamReader(std::string_view(subMessage.constData(), subMessage.size()));
0079         auto subR = r.readSubMessage();
0080         QCOMPARE(subR.readVarintField(), 150);
0081         QVERIFY(subR.atEnd());
0082         QVERIFY(r.atEnd());
0083     }
0084 };
0085 
0086 QTEST_GUILESS_MAIN(ProtobufStreamReaderTest)
0087 
0088 #include "protobufstreamreadertest.moc"