File indexing completed on 2025-02-16 13:12:22
0001 /* 0002 This file is part of the kxmlrpc library. 0003 SPDX-FileCopyrightText: 2006 Narayan Newton <narayannewton@gmail.com> 0004 0005 SPDX-License-Identifier: LGPL-2.0-or-later 0006 */ 0007 0008 #include <QTest> 0009 0010 #include "querytest.h" 0011 0012 #include "query_p.h" 0013 0014 QTEST_MAIN(QueryTest) 0015 0016 using namespace KXmlRpc; 0017 0018 #define XML_CALL_HEAD(call) QByteArray("<?xml version=\"1.0\" ?>\r\n<methodCall>\r\n<methodName>" call "</methodName>\r\n<params>\r\n") + 0019 #define XML_CALL_END "</params>\r\n</methodCall>\r\n" 0020 0021 #define XML_RESPONSE_HEAD QByteArray("<?xml version=\"1.0\" ?>\r\n<methodResponse>\r\n<params>\r\n") + 0022 #define XML_RESPONSE_END "</params>\r\n</methodResponse>\r\n" 0023 0024 #define XML_FAULT_HEAD QByteArray("<?xml version=\"1.0\" ?>\r\n<methodResponse>\r\n<fault>\r\n") + 0025 #define XML_FAULT_END "</fault>\r\n</methodResponse>\r\n" 0026 0027 void QueryTest::testValidity() 0028 { 0029 Query *q = Query::create(); 0030 QVERIFY(q != nullptr); 0031 } 0032 0033 void QueryTest::testMarkupCall_data() 0034 { 0035 QTest::addColumn<QString>("methodName"); 0036 QTest::addColumn<QList<QVariant>>("arguments"); 0037 QTest::addColumn<QByteArray>("xml"); 0038 0039 /* clang-format off */ 0040 QTest::newRow("int") << QString::fromLatin1("MyMethod") 0041 << (QVariantList() << 1) 0042 << XML_CALL_HEAD("MyMethod") 0043 "<param>\r\n" 0044 "<value><int>1</int></value>\r\n" 0045 "</param>\r\n" 0046 XML_CALL_END; 0047 QTest::newRow("string") << QString::fromLatin1("MyMethod") 0048 << (QVariantList() << QLatin1String("data")) 0049 << XML_CALL_HEAD("MyMethod") 0050 "<param>\r\n" 0051 "<value><string><![CDATA[data]]></string></value>\r\n" 0052 "</param>\r\n" 0053 XML_CALL_END; 0054 QTest::newRow("string (utf8)") << QString::fromLatin1("MyMethod") 0055 // make sure it is UTF-8, so do *not* use QStringLiteral below 0056 << (QVariantList() << QString::fromUtf8("Žlutý kůň pěl ďábelské ódy")) 0057 << XML_CALL_HEAD("MyMethod") 0058 "<param>\r\n" 0059 "<value><string><![CDATA[Žlutý kůň pěl ďábelské ódy]]></string></value>\r\n" 0060 "</param>\r\n" 0061 XML_CALL_END; 0062 QTest::newRow("stringlist") << QString::fromLatin1("MyMethod") 0063 << (QVariantList() << (QStringList() << QLatin1String("data1") << QLatin1String("data2"))) 0064 << XML_CALL_HEAD("MyMethod") 0065 "<param>\r\n" 0066 "<value><array><data><value><string><![CDATA[data1]]></string></value>\r\n" 0067 "<value><string><![CDATA[data2]]></string></value>\r\n" 0068 "</data></array></value>" 0069 "</param>\r\n" 0070 XML_CALL_END; 0071 QTest::newRow("double") << QString::fromLatin1("MyMethod") 0072 << (QVariantList() << (double) 3.14) 0073 << XML_CALL_HEAD("MyMethod") 0074 "<param>\r\n" 0075 "<value><double>3.14</double></value>\r\n" 0076 "</param>\r\n" 0077 XML_CALL_END; 0078 QTest::newRow("bool") << QString::fromLatin1("MyMethod") 0079 << (QVariantList() << true) 0080 << XML_CALL_HEAD("MyMethod") 0081 "<param>\r\n" 0082 "<value><boolean>1</boolean></value>\r\n" 0083 "</param>\r\n" 0084 XML_CALL_END; 0085 QTest::newRow("bytearray") << QString::fromLatin1("MyMethod") 0086 << (QVariantList() << QByteArray("Hello World!")) 0087 << XML_CALL_HEAD("MyMethod") 0088 "<param>\r\n" 0089 "<value><base64>SGVsbG8gV29ybGQh</base64></value>\r\n" 0090 "</param>\r\n" 0091 XML_CALL_END; 0092 QTest::newRow("datetime") << QString::fromLatin1("MyMethod") 0093 << (QVariantList() << QDateTime(QDate(2015, 01, 05), QTime(17, 16, 32))) 0094 << XML_CALL_HEAD("MyMethod") 0095 "<param>\r\n" 0096 "<value><dateTime.iso8601>2015-01-05T17:16:32</dateTime.iso8601></value>\r\n" 0097 "</param>\r\n" 0098 XML_CALL_END; 0099 QTest::newRow("list") << QString::fromLatin1("MyMethod") 0100 << (QVariantList() << QVariant(QVariantList() << QLatin1String("data") << 42 << true << 5.678)) 0101 << XML_CALL_HEAD("MyMethod") 0102 "<param>\r\n" 0103 "<value><array><data>\r\n" 0104 "<value><string><![CDATA[data]]></string></value>\r\n" 0105 "<value><int>42</int></value>\r\n" 0106 "<value><boolean>1</boolean></value>\r\n" 0107 "<value><double>5.678</double></value>\r\n" 0108 "</data></array></value>\r\n" 0109 "</param>\r\n" 0110 XML_CALL_END; 0111 0112 QVariantMap map; 0113 map[QLatin1String("key1")] = 13; 0114 map[QLatin1String("key2")] = QLatin1String("data"); 0115 map[QLatin1String("key3")] = false; 0116 QTest::newRow("map") << QString::fromLatin1("MyMethod") 0117 << (QVariantList() << map) 0118 << XML_CALL_HEAD("MyMethod") 0119 "<param>\r\n" 0120 "<value><struct>\r\n" 0121 "<member>\r\n<name>key1</name>\r\n<value><int>13</int></value>\r\n</member>\r\n" 0122 "<member>\r\n<name>key2</name>\r\n<value><string><![CDATA[data]]></string></value>\r\n</member>\r\n" 0123 "<member>\r\n<name>key3</name>\r\n<value><boolean>0</boolean></value>\r\n</member>\r\n" 0124 "</struct></value>\r\n" 0125 "</param>\r\n" 0126 XML_CALL_END; 0127 /* clang-format on */ 0128 } 0129 0130 void QueryTest::testMarkupCall() 0131 { 0132 QFETCH(QString, methodName); 0133 QFETCH(QList<QVariant>, arguments); 0134 QFETCH(QByteArray, xml); 0135 0136 const QByteArray markup = QueryPrivate::markupCall(methodName, arguments); 0137 QCOMPARE(markup, xml); 0138 } 0139 0140 void QueryTest::testResponse_data() 0141 { 0142 QTest::addColumn<bool>("isSuccess"); 0143 QTest::addColumn<QByteArray>("xml"); 0144 QTest::addColumn<QVariantList>("arguments"); 0145 0146 QVariantMap map; 0147 map[QLatin1String("faultCode")] = 10; 0148 map[QLatin1String("faultString")] = QLatin1String("Fatal Server Error"); 0149 0150 /* clang-format off */ 0151 QTest::newRow("fault") << false 0152 << XML_FAULT_HEAD 0153 "<value><struct>" 0154 "<member><name>faultCode</name><value><int>10</int></value></member>" 0155 "<member><name>faultString</name><value><string><![CDATA[Fatal Server Error]]></string></value></member>" 0156 "</struct></value>" XML_FAULT_END 0157 << (QVariantList() << map); 0158 0159 QTest::newRow("string") << true 0160 << XML_RESPONSE_HEAD 0161 "<param>" 0162 "<value><STRING><![CDATA[result]]></STRING></value>" 0163 "</param>" XML_RESPONSE_END 0164 << (QVariantList() << QLatin1String("result")); 0165 QTest::newRow("int") << true 0166 << XML_RESPONSE_HEAD 0167 "<param>" 0168 "<value><INT>1</INT></value>" 0169 "</param>" XML_RESPONSE_END 0170 << (QVariantList() << 1); 0171 QTest::newRow("i4") << true << XML_RESPONSE_HEAD "<param><value><I4>42</I4></value></param>" XML_RESPONSE_END << (QVariantList() << 42); 0172 QTest::newRow("boolean (num)") << true << XML_RESPONSE_HEAD "<param><value><BOOLEAN>1</BOOLEAN></value></param>" XML_RESPONSE_END 0173 << (QVariantList() << true); 0174 QTest::newRow("boolean (str)") << true << XML_RESPONSE_HEAD "<param><value><BOOLEAN>TruE</BOOLEAN></value></param>" XML_RESPONSE_END 0175 << (QVariantList() << true); 0176 QTest::newRow("base64") << true << XML_RESPONSE_HEAD "<param><value><BASE64>VmFsaWQgcmVzcG9uc2UK</BASE64></value></param>" XML_RESPONSE_END 0177 << (QVariantList() << QByteArray("Valid response\n")); 0178 QTest::newRow("datetime") << true << XML_RESPONSE_HEAD "<param><value><DATETIME>2015-01-05T18:02:22</DATETIME></value></param>" XML_RESPONSE_END 0179 << (QVariantList() << QDateTime(QDate(2015, 01, 05), QTime(18, 02, 22))); 0180 QTest::newRow("datetime 2") << true 0181 << XML_RESPONSE_HEAD "<param><value><dateTime.iso8601>2015-01-05T17:03:15Z</dateTime.iso8601></value></param>" XML_RESPONSE_END 0182 << (QVariantList() << QDateTime(QDate(2015, 01, 05), QTime(17, 03, 15), Qt::UTC)); 0183 QTest::newRow("array") << true 0184 << XML_RESPONSE_HEAD 0185 "<param><value><ARRAY><data>" 0186 "<value><STRING><![CDATA[item 1]]></STRING></value>" 0187 "<value><STRING><![CDATA[item 2]]></STRING></value>" 0188 "</data></ARRAY></value></param>" XML_RESPONSE_END 0189 << (QVariantList() << QVariant(QVariantList() << QLatin1String("item 1") << QLatin1String("item 2"))); 0190 0191 map.clear(); 0192 map[QLatin1String("Key 1")] = 15; 0193 map[QLatin1String("Key 2")] = QLatin1String("Value"); 0194 QTest::newRow("struct") << true 0195 << XML_RESPONSE_HEAD 0196 "<param><value><STRUCT>" 0197 "<member><name>Key 1</name><value><I4>15</I4></value></member>" 0198 "<member><name>Key 2</name><value><string><![CDATA[Value]]></string></value></member>" 0199 "</STRUCT></value></param>" XML_RESPONSE_END 0200 << (QVariantList() << map); 0201 /* clang-format on */ 0202 } 0203 0204 void QueryTest::testResponse() 0205 { 0206 QFETCH(bool, isSuccess); 0207 QFETCH(QByteArray, xml); 0208 QFETCH(QVariantList, arguments); 0209 0210 QDomDocument doc; 0211 QVERIFY(doc.setContent(xml)); 0212 0213 QCOMPARE(QueryPrivate::isMessageResponse(doc), isSuccess); 0214 QCOMPARE(QueryPrivate::isFaultResponse(doc), !isSuccess); 0215 0216 if (isSuccess) { 0217 const KXmlRpc::Result result = QueryPrivate::parseMessageResponse(doc); 0218 QVERIFY(result.success()); 0219 QCOMPARE(result.errorCode(), -1); 0220 QVERIFY(result.errorString().isEmpty()); 0221 QCOMPARE(result.data(), arguments); 0222 } else { 0223 const KXmlRpc::Result result = QueryPrivate::parseFaultResponse(doc); 0224 QVERIFY(!result.success()); 0225 QCOMPARE(result.errorCode(), arguments[0].toMap()[QLatin1String("faultCode")].toInt()); 0226 QCOMPARE(result.errorString(), arguments[0].toMap()[QLatin1String("faultString")].toString()); 0227 QVERIFY(result.data().isEmpty()); 0228 } 0229 } 0230 0231 #include "moc_querytest.cpp"