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"