File indexing completed on 2024-05-05 05:53:09

0001 /*
0002  * SPDX-License-Identifier: GPL-3.0-or-later
0003  * SPDX-FileCopyrightText: 2019-2020 Johan Ouwerkerk <jm.ouwerkerk@gmail.com>
0004  */
0005 #include "base32/base32.h"
0006 
0007 #include <QTest>
0008 #include <QtDebug>
0009 
0010 class Base32DecodingTest: public QObject
0011 {
0012     Q_OBJECT
0013 private Q_SLOTS:
0014     void testValidSample(void);
0015     void testValidSample_data(void);
0016     void testInvalidSample(void);
0017     void testInvalidSample_data(void);
0018 };
0019 
0020 static void define_valid_test_case(const char *testCase, const char *data, int length, const QString &base32)
0021 {
0022     QTest::newRow(qPrintable(QLatin1String(testCase))) << base32 << QByteArray(data, length);
0023 }
0024 
0025 static void define_invalid_test_case(const char *testCase, const QString &base32)
0026 {
0027     QTest::newRow(qPrintable(QLatin1String(testCase))) << base32;
0028 }
0029 
0030 void Base32DecodingTest::testValidSample(void)
0031 {
0032     QFETCH(QString, base32);
0033     QFETCH(QByteArray, expected);
0034 
0035     QByteArray work;
0036     work.reserve(expected.size());
0037     work.resize(expected.size());
0038     work.fill('\x0');
0039 
0040     QCOMPARE(base32::decode(base32, work.data(), work.size()), std::optional<size_t>(expected.size()));
0041     QCOMPARE(work, expected);
0042 
0043     QCOMPARE(base32::decode(base32), std::optional<QByteArray>(expected));
0044 }
0045 
0046 void Base32DecodingTest::testInvalidSample(void)
0047 {
0048     QFETCH(QString, base32);
0049 
0050     QByteArray work;
0051     work.reserve(100);
0052     work.resize(100);
0053     work.fill('\x0');
0054 
0055     QCOMPARE(base32::decode(base32, work.data(), work.size()), std::nullopt);
0056     QCOMPARE(base32::decode(base32), std::nullopt);
0057 }
0058 
0059 void Base32DecodingTest::testValidSample_data(void)
0060 {
0061     static const char ok_corpus[13][5] = {
0062         { 'A', 'B', 'C', 'D', '\xA' },
0063         { '?', 'A', 'B', 'C', 'D' },
0064         { '2', '0', '1', '6' },
0065         { '=', '=' },
0066         { '?' },
0067         { '8' },
0068 
0069         { '\x0', '\x1', '\x2' },
0070         { '\x1', '\x0', '\x2' },
0071         { '\x1', '\x2', '\x0' },
0072 
0073 
0074         { '\x0', 'A', 'B', '\x1', '\x2' },
0075         { '\x1', 'A', 'B', '\x0', '\x2' },
0076         { '\x1', 'A', 'B', '\x2', '\x0' },
0077 
0078         {}
0079     };
0080 
0081     QTest::addColumn<QString>("base32");
0082     QTest::addColumn<QByteArray>("expected");
0083 
0084     define_valid_test_case("'ABCD\\n'", ok_corpus[0], 5, QLatin1String("IFBEGRAK"));
0085     define_valid_test_case("'?ABCD'", ok_corpus[1], 5, QLatin1String("H5AUEQ2E"));
0086     define_valid_test_case("'2016'", ok_corpus[2], 4, QLatin1String("GIYDCNQ="));
0087     define_valid_test_case("'=='", ok_corpus[3], 2, QLatin1String("HU6Q===="));
0088     define_valid_test_case("'?'", ok_corpus[4], 1, QLatin1String("H4======"));
0089     define_valid_test_case("'8'", ok_corpus[5], 1, QLatin1String("HA======"));
0090 
0091     define_valid_test_case("'\\x0\\x1\\x2'", ok_corpus[6], 3, QLatin1String("AAAQE==="));
0092     define_valid_test_case("'\\x1\\x0\\x2'", ok_corpus[7], 3, QLatin1String("AEAAE==="));
0093     define_valid_test_case("'\\x1\\x2\\x0'", ok_corpus[8], 3, QLatin1String("AEBAA==="));
0094 
0095     define_valid_test_case("'\\x0AB\\x1\\x2'", ok_corpus[9], 5, QLatin1String("ABAUEAIC"));
0096     define_valid_test_case("'\\x1AB\\x0\\x2'", ok_corpus[10], 5, QLatin1String("AFAUEAAC"));
0097     define_valid_test_case("'\\x1AB\\x2\\x0'", ok_corpus[11], 5, QLatin1String("AFAUEAQA"));
0098 
0099     define_valid_test_case("''", ok_corpus[12], 0, QLatin1String(""));
0100 }
0101 
0102 void Base32DecodingTest::testInvalidSample_data(void)
0103 {
0104     QTest::addColumn<QString>("base32");
0105 
0106     define_invalid_test_case("without any padding", QLatin1String("ZZ"));
0107     define_invalid_test_case("too little padding", QLatin1String("ZZ==="));
0108     define_invalid_test_case("padding only", QLatin1String("========"));
0109     define_invalid_test_case("embedded spaces", QLatin1String("ZZ \n===="));
0110     define_invalid_test_case("invalid base32 (1)", QLatin1String("1AABBCCD"));
0111     define_invalid_test_case("invalid base32 (8)", QLatin1String("AABBCC8D"));
0112     define_invalid_test_case("invalid base32 (@)", QLatin1String("AABBCCD@"));
0113 }
0114 
0115 QTEST_APPLESS_MAIN(Base32DecodingTest)
0116 
0117 #include "base32-decode.moc"