/**************************************************************************** ** ** This file is part of the KD Soap project. ** ** SPDX-FileCopyrightText: 2010 Klarälvdalens Datakonsult AB, a KDAB Group company ** ** SPDX-License-Identifier: MIT ** ****************************************************************************/ #include "httpserver_p.h" #include "wsdl_mywsdl_rpc.h" #include #include #include using namespace KDSoapUnitTestHelpers; class WsdlRPCTest : public QObject { Q_OBJECT private Q_SLOTS: // Using wsdl-generated code, make a call, and check the xml that was sent, // and check that the server's response was correctly parsed. void testRequest() { // Prepare response QByteArray responseData = QByteArray(xmlEnvBegin11()) + ">" "Foo" " " + xmlEnvEnd(); HttpServerThread server(responseData, HttpServerThread::Public); // For testing the http server with telnet or wget: // httpGet(server.endPoint()); // QEventLoop testLoop; // testLoop.exec(); MyWsdl service; service.setEndPoint(server.endPoint()); KDAB__EmployeeAchievements achievements; QList lst; KDAB__EmployeeAchievement achievement1; achievement1.setType(QString::fromLatin1("Project")); achievement1.setLabel(QString::fromLatin1("Management")); lst.append(achievement1); KDAB__EmployeeAchievement achievement2; achievement2.setType(QString::fromLatin1("Development")); achievement2.setLabel(QString::fromLatin1("C++")); lst.append(achievement2); achievements.setItems(lst); KDAB__EmployeeType employeeType; employeeType.setType(KDAB__EmployeeTypeEnum::Developer); employeeType.setOtherRoles(QList() << KDAB__EmployeeTypeEnum::TeamLeader); KDAB__EmployeeTypeEnumList otherRoles; otherRoles.setEntries(QList() << KDAB__EmployeeTypeEnum::TeamLeader << KDAB__EmployeeTypeEnum::Developer); employeeType.setOtherRolesAsList(otherRoles); KDAB__Numbers lottoNumbers; // Ensure that the range-checking code works QTest::ignoreMessage(QtDebugMsg, "Invalid range in KDAB__LottoNumbers::setValue()"); lottoNumbers.setEntries(QList() << 7 << 21 << 30 << 42); employeeType.setLottoNumbers(lottoNumbers); employeeType.setTeam(QList() << QString::fromLatin1("Minitel")); KDAB__AnonListType anonList; anonList.setEntries(QList() << KDAB__AnonListTypeListItem::Detailed << KDAB__AnonListTypeListItem::DetailedMerged); employeeType.setAnonList(anonList); KDAB__JeansSize jeansSize; jeansSize.setValue(24); KDAB__LoginElement login; login.setUser(QLatin1String("foo")); login.setPass(QLatin1String("bar")); KDAB__SessionElement session; session.setSessionId(QLatin1String("id")); service.setLoginHeader(login); service.setSessionHeader(session); QString ret = service.addEmployee(employeeType, QString::fromLatin1("David Faure"), QString::fromLatin1("France"), achievements, jeansSize, 0); if (!service.lastError().isEmpty()) { qDebug() << service.lastError(); } QVERIFY(service.lastError().isEmpty()); QCOMPARE(ret, QString::fromLatin1("Foo")); const QByteArray expectedHeader = "" "" "foo" "bar" "" "" "id" "" ""; // Check what we sent QByteArray requestXmlTemplate = QByteArray(xmlEnvBegin11()) + " xmlns:n1=\"http://www.kdab.com/xml/MyWsdl/\">%1" "" "" + serializedEmployee() + "" "" + xmlEnvEnd() + '\n'; // added by QXmlStreamWriter::writeEndDocument { QByteArray expectedRequestXml = requestXmlTemplate; expectedRequestXml.replace("%1", expectedHeader); QVERIFY(xmlBufferCompare(server.receivedData(), expectedRequestXml)); QCOMPARE(QString::fromUtf8(server.receivedData().constData()), QString::fromUtf8(expectedRequestXml.constData())); const QByteArray headers = server.receivedHeaders(); QVERIFY(headers.contains("SoapAction: \"http://www.kdab.com/AddEmployee\"") || headers.contains("soapaction: \"http://www.kdab.com/AddEmployee\"")); // Qt >= 6.8 } // Test utf8 { // This second call also tests that persistent headers are indeed persistent. server.resetReceivedBuffers(); requestXmlTemplate.replace("David Faure", "Hervé"); requestXmlTemplate.replace("France", "фгн7"); QByteArray expectedRequestXml = requestXmlTemplate; expectedRequestXml.replace("%1", expectedHeader); ret = service.addEmployee(employeeType, QString::fromUtf8("Hervé"), QString::fromUtf8("фгн7"), // random russian letters achievements, jeansSize, 0); QVERIFY(service.lastError().isEmpty()); QCOMPARE(ret, QString::fromLatin1("Foo")); QVERIFY(xmlBufferCompare(server.receivedData(), expectedRequestXml)); } // Test removing headers { server.resetReceivedBuffers(); service.clearLoginHeader(); service.clearSessionHeader(); ret = service.addEmployee(employeeType, QString::fromUtf8("Hervé"), QString::fromUtf8("фгн7"), // random russian letters achievements, jeansSize, 0); QByteArray expectedRequestXml = requestXmlTemplate; expectedRequestXml.replace("%1", ""); QVERIFY(xmlBufferCompare(server.receivedData(), expectedRequestXml)); } } void testResponse() { // Prepare response QByteArray responseData = QByteArray(xmlEnvBegin11()) + ">" "" "" + serializedEmployee() + "" "" " " + xmlEnvEnd(); HttpServerThread server(responseData, HttpServerThread::Public); MyWsdl service; service.setEndPoint(server.endPoint()); const KDAB__Employee employee = service.getEmployee(QString::fromLatin1("David Faure")); const KDAB__EmployeeType employeeType = employee.employeeType(); QCOMPARE(employeeType.team().first().value().value(), QString::fromLatin1("Minitel")); QCOMPARE(employeeType.type().type(), KDAB__EmployeeTypeEnum::Developer); QCOMPARE(employeeType.otherRoles(), QList() << KDAB__EmployeeTypeEnum::TeamLeader); QCOMPARE(employeeType.otherRolesAsList().entries(), QList() << KDAB__EmployeeTypeEnum::TeamLeader << KDAB__EmployeeTypeEnum::Developer); QCOMPARE(KDAB__Numbers(employeeType.lottoNumbers()).entries(), QList() << 7 << 21 << 30 << 42); QCOMPARE(employee.employeeName().value().value(), QString::fromLatin1("David Faure")); QCOMPARE(employee.employeeCountry().value(), QString::fromLatin1("France")); QCOMPARE(employee.employeeJeansSize().value().toInt(), 24); } // Test calls with 'simple type' arguments // Same as the call made by builtinhttp, but here using the wsdl-generated code void testSimpleType() { HttpServerThread server(countryResponse(), HttpServerThread::Public); MyWsdl service; service.setEndPoint(server.endPoint()); KDAB__LimitedString employeeCountry = service.getEmployeeCountry(KDAB__EmployeeName(QString::fromUtf8("David Ä Faure"))); if (!service.lastError().isEmpty()) { qDebug() << service.lastError(); } QVERIFY(service.lastError().isEmpty()); QCOMPARE(employeeCountry.value(), QString::fromLatin1("France")); QVERIFY(xmlBufferCompare(server.receivedData(), expectedCountryRequest())); QCOMPARE(QString::fromUtf8(server.receivedData().constData()), QString::fromUtf8(expectedCountryRequest().constData())); } // Test enum deserialization void testEnums() { // Prepare response QByteArray responseData = QByteArray(xmlEnvBegin11()) + ">" "" "" "TeamLeader" "Minitel" "" "" "" + xmlEnvEnd(); HttpServerThread server(responseData, HttpServerThread::Public); MyWsdl service; service.setEndPoint(server.endPoint()); KDAB__EmployeeType employeeType = service.getEmployeeType(KDAB__EmployeeName(QLatin1String("Joe"))); if (!service.lastError().isEmpty()) { qDebug() << service.lastError(); } QVERIFY(service.lastError().isEmpty()); QCOMPARE(employeeType.team().first().value().value(), QLatin1String("Minitel")); QCOMPARE(employeeType.otherRoles().count(), 1); QCOMPARE(employeeType.otherRoles().at(0).type(), KDAB__EmployeeTypeEnum::TeamLeader); QCOMPARE(( int )employeeType.type().type(), ( int )KDAB__EmployeeTypeEnum::Developer); } void testByteArrays() { // Prepare response QByteArray responseData = QByteArray(xmlEnvBegin11()) + ">" "" "466f6f" "" "" + xmlEnvEnd(); HttpServerThread server(responseData, HttpServerThread::Public); MyWsdl service; service.setEndPoint(server.endPoint()); const KDAB__Telegram ret = service.sendTelegram(KDAB__Telegram("Hello")); QCOMPARE(service.lastError(), QString()); QCOMPARE(ret.value(), QByteArray("Foo")); const QByteArray expectedRequestXml = QByteArray(xmlEnvBegin11()) + ">" "" "" "48656c6c6f" "" "" + xmlEnvEnd(); QVERIFY(xmlBufferCompare(server.receivedData(), expectedRequestXml)); } private: static QByteArray serializedEmployeeType() { return QByteArray("" "TeamLeader" "TeamLeader Developer" "7 21 30 42" "Minitel" "Detailed DetailedMerged" ""); } static QByteArray serializedEmployee() { return serializedEmployeeType() + "David Faure" "France" "" "" "Project" "" "" "" "Development" "" "" "" "24" "0"; } static QByteArray countryResponse() { return QByteArray(xmlEnvBegin11()) + ">" "" "France" "" " " + xmlEnvEnd(); } static QByteArray expectedCountryRequest() { return QByteArray(xmlEnvBegin11()) + ">" "" "" "David Ä Faure" "" "" "" + xmlEnvEnd() + '\n'; // added by QXmlStreamWriter::writeEndDocument } }; QTEST_MAIN(WsdlRPCTest) #include "test_wsdl_rpc.moc"