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"