File indexing completed on 2024-04-28 05:50:04

0001 /*
0002  * SPDX-License-Identifier: GPL-3.0-or-later
0003  * SPDX-FileCopyrightText: 2020 Johan Ouwerkerk <jm.ouwerkerk@gmail.com>
0004  */
0005 #include "uri/uri.h"
0006 
0007 #include <QTest>
0008 #include <QVector>
0009 #include <QtDebug>
0010 
0011 class PercentEncodingTest: public QObject // clazy:exclude=ctor-missing-parent-argument
0012 {
0013     Q_OBJECT
0014 private Q_SLOTS:
0015     void testValidString(void);
0016     void testValidString_data(void);
0017     void testValidByteArray(void);
0018     void testValidByteArray_data(void);
0019     void testInvalidString(void);
0020     void testInvalidString_data(void);
0021     void testInvalidByteArray(void);
0022     void testInvalidByteArray_data(void);
0023 };
0024 
0025 void PercentEncodingTest::testValidString(void)
0026 {
0027     QFETCH(QByteArray, input);
0028     const std::optional<QString> result = uri::decodePercentEncoding(input);
0029     QVERIFY2(result, "should decode valid input successfully");
0030     QTEST(*result, "expected");
0031 }
0032 
0033 void PercentEncodingTest::testValidString_data(void)
0034 {
0035     QTest::addColumn<QByteArray>("input");
0036     QTest::addColumn<QString>("expected");
0037     QVector<QByteArray> validStringInputs = QVector<QByteArray>() << QByteArray("%3A");
0038     QStringList validStringOutputs = QStringList() << QStringLiteral(":");
0039     int i = 0;
0040     for (const auto &input : qAsConst(validStringInputs)) {
0041         QTest::newRow(input.constData()) << input << validStringOutputs[i];
0042         i++;
0043     }
0044 }
0045 
0046 void PercentEncodingTest::testValidByteArray(void)
0047 {
0048     QFETCH(QByteArray, input);
0049     const std::optional<QByteArray> result = uri::fromPercentEncoding(input);
0050     QVERIFY2(result, "should decode valid input successfully");
0051     QTEST(*result, "expected");
0052 }
0053 
0054 void PercentEncodingTest::testValidByteArray_data(void)
0055 {
0056     QTest::addColumn<QByteArray>("input");
0057     QTest::addColumn<QByteArray>("expected");
0058 
0059     QVector<QByteArray> validByteArrayInputs = QVector<QByteArray>()
0060         << QByteArray("%01")
0061         << QByteArray("%3A")
0062         << QByteArray("%00")
0063         << QByteArray("a%20valid%20sample")
0064         << QByteArray("%2f")
0065         << QByteArray("embedded%00works");
0066 
0067     QVector<QByteArray> validByteArrayOutputs = QVector<QByteArray>()
0068         << QByteArray("\x1")
0069         << QByteArray(":")
0070         << QByteArray("Z").replace('Z', '\0')
0071         << QByteArray("a valid sample")
0072         << QByteArray("/")
0073         << QByteArray("embeddedZworks").replace('Z', '\0');
0074 
0075     int i = 0;
0076     for (const auto &input : qAsConst(validByteArrayInputs)) {
0077         QTest::newRow(input.constData()) << input << validByteArrayOutputs[i];
0078         i++;
0079     }
0080 }
0081 
0082 void PercentEncodingTest::testInvalidString(void)
0083 {
0084     QFETCH(QByteArray, input);
0085     QVERIFY2(!uri::decodePercentEncoding(input), "should reject invalid input");
0086 }
0087 
0088 void PercentEncodingTest::testInvalidString_data(void)
0089 {
0090     QTest::addColumn<QByteArray>("input");
0091     QVector<QByteArray> invalidStringInputs = QVector<QByteArray>()
0092         << QByteArray("%ff broken multibyte (no 0 in leading char)")
0093         << QByteArray("%cf broken multibyte (next char not marked)")
0094         << QByteArray("%c0%7f broken multibyte (over long)")
0095         << QByteArray("truncated multibyte %c0");
0096     for (const auto &input : std::as_const(invalidStringInputs)) {
0097         QTest::newRow(input.constData()) << input;
0098     }
0099 }
0100 
0101 void PercentEncodingTest::testInvalidByteArray(void)
0102 {
0103     QFETCH(QByteArray, input);
0104     QVERIFY2(!uri::fromPercentEncoding(input), "should reject invalid input");
0105 }
0106 
0107 void PercentEncodingTest::testInvalidByteArray_data(void)
0108 {
0109     QTest::addColumn<QByteArray>("input");
0110     QVector<QByteArray> invalidByteArrayInputs = QVector<QByteArray>()
0111         << QByteArray("%")
0112         << QByteArray("invalid%")
0113         << QByteArray("%G5")
0114         << QByteArray("%5");
0115     for (const auto &input : qAsConst(invalidByteArrayInputs)) {
0116         QTest::newRow(input.constData()) << input;
0117     }
0118 }
0119 
0120 QTEST_APPLESS_MAIN(PercentEncodingTest)
0121 
0122 #include "percent-encoding.moc"