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

0001 /*
0002    SPDX-FileCopyrightText: 2013 Christian Mollekopf <mollekopf@kolabsys.com>
0003 
0004    SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include <QTest>
0008 
0009 #include "imapstreamparser.h"
0010 #include "response_p.h"
0011 #include <QBuffer>
0012 #include <QTest>
0013 
0014 using namespace KIMAP;
0015 
0016 class StreamParserTest : public QObject
0017 {
0018     Q_OBJECT
0019 
0020     QByteArray part1;
0021     QByteArray part2;
0022     QByteArray part3;
0023     QByteArray part4;
0024     QByteArray completeResponse;
0025     QList<QByteArray> expectedList;
0026 
0027 private Q_SLOTS:
0028 
0029     void init()
0030     {
0031         part1 = "* 230 FETCH (FLAGS (\\Recent \\Seen) UID 230 INTERNALDATE \" 1-Nov-2013 13:31:17 +0100\" RFC822.SIZE 37 BODY[] {37}\r";
0032         part2 = "\nDate: Fri, 01 Nov 2013 12:31:13 +0000\n";
0033         part3 = "body\n";
0034         part4 = ")\n\r";
0035         completeResponse = part1 + part2 + part3 + part4;
0036         expectedList.clear();
0037         expectedList << "FLAGS";
0038         expectedList << "(\\Recent \\Seen)";
0039         expectedList << "UID";
0040         expectedList << "230";
0041         expectedList << "INTERNALDATE";
0042         expectedList << " 1-Nov-2013 13:31:17 +0100";
0043         expectedList << "RFC822.SIZE";
0044         expectedList << "37";
0045         expectedList << "BODY[]";
0046         expectedList << "Date: Fri, 01 Nov 2013 12:31:13 +0000";
0047         expectedList << "body";
0048     }
0049 
0050     /**
0051      * Test parsing of the example command if the complete command is in the buffer
0052      */
0053     void testParse()
0054     {
0055         QByteArray buffer;
0056         QBuffer socket(&buffer);
0057         socket.open(QBuffer::WriteOnly);
0058         QVERIFY(socket.write(completeResponse) != -1);
0059 
0060         QBuffer readSocket(&buffer);
0061         readSocket.open(QBuffer::ReadOnly);
0062         ImapStreamParser parser(&readSocket);
0063 
0064         QVERIFY(parser.availableDataSize() != 0);
0065 
0066         Response message;
0067         QList<Response::Part> *payload = &message.content;
0068         QVERIFY(!parser.atCommandEnd());
0069         QVERIFY(parser.hasString());
0070         *payload << Response::Part(parser.readString()); //*
0071         QVERIFY(parser.hasString());
0072         *payload << Response::Part(parser.readString()); // 230
0073         QVERIFY(parser.hasString());
0074         *payload << Response::Part(parser.readString()); // FETCH
0075         QVERIFY(parser.hasList());
0076         *payload << Response::Part(parser.readParenthesizedList());
0077         QVERIFY(parser.atCommandEnd());
0078 
0079         QCOMPARE(message.content.last().toList(), expectedList);
0080     }
0081 
0082     void testLeadingNewline()
0083     {
0084         /**
0085          * Test a the special case when the CRLF after the string octet count, is separated and not initially loaded into the buffer.
0086          */
0087         QByteArray buffer;
0088         QBuffer socket(&buffer);
0089         socket.open(QBuffer::WriteOnly);
0090 
0091         QVERIFY(socket.write(part1) != -1);
0092 
0093         QBuffer readSocket(&buffer);
0094         readSocket.open(QBuffer::ReadOnly);
0095         ImapStreamParser parser(&readSocket);
0096 
0097         QVERIFY(parser.availableDataSize() != 0);
0098 
0099         Response message;
0100         QList<Response::Part> *payload = &message.content;
0101         QVERIFY(!parser.atCommandEnd());
0102         // We wait with writing part2 until the first part is already loaded into the buffer
0103         QVERIFY(socket.write(part2) != -1);
0104         QVERIFY(parser.hasString());
0105         *payload << Response::Part(parser.readString()); //*
0106         QVERIFY(parser.hasString());
0107         *payload << Response::Part(parser.readString()); // 230
0108         QVERIFY(parser.hasString());
0109         *payload << Response::Part(parser.readString()); // FETCH
0110 
0111         QVERIFY(socket.write(part3) != -1);
0112         QVERIFY(socket.write(part4) != -1);
0113 
0114         QVERIFY(parser.hasList());
0115         *payload << Response::Part(parser.readParenthesizedList());
0116         QVERIFY(parser.atCommandEnd());
0117     }
0118 
0119     void testNewLineInString()
0120     {
0121         QByteArray command2;
0122         command2 =
0123             "* 33 FETCH (FLAGS (\\Recent \\Seen) UID 33 INTERNALDATE \" 1-Nov-2013 18:43:34 +0100\" RFC822.SIZE 1203 BODY[HEADER.FIELDS (TO FROM MESSAGE-ID "
0124             "REFERENCES IN-REPLY-TO SUBJECT DATE)] {54}\r\n";
0125         command2 += "Date: Fri, 01 Nov 2013 17:43:29 +0000\n";
0126         command2 += "Subject: uid32\n";
0127         command2 += "\n";
0128         command2 += ")\n\r";
0129 
0130         QByteArray buffer;
0131         QBuffer socket(&buffer);
0132         socket.open(QBuffer::WriteOnly);
0133         QVERIFY(socket.write(command2) != -1);
0134 
0135         QBuffer readSocket(&buffer);
0136         readSocket.open(QBuffer::ReadOnly);
0137         ImapStreamParser parser(&readSocket);
0138 
0139         QVERIFY(parser.availableDataSize() != 0);
0140 
0141         Response message;
0142         QList<Response::Part> *payload = &message.content;
0143         QVERIFY(!parser.atCommandEnd());
0144         QVERIFY(parser.hasString());
0145         *payload << Response::Part(parser.readString()); //*
0146         QVERIFY(parser.hasString());
0147         *payload << Response::Part(parser.readString()); // 33
0148         QVERIFY(parser.hasString());
0149         *payload << Response::Part(parser.readString()); // FETCH
0150         QVERIFY(parser.hasList());
0151         *payload << Response::Part(parser.readParenthesizedList());
0152         QVERIFY(parser.atCommandEnd());
0153     }
0154 };
0155 
0156 QTEST_GUILESS_MAIN(StreamParserTest)
0157 
0158 #include "streamparsertest.moc"