diff -r 000000000000 -r 1918ee327afb tests/auto/qxmlinputsource/tst_qxmlinputsource.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/auto/qxmlinputsource/tst_qxmlinputsource.cpp Mon Jan 11 14:00:40 2010 +0000 @@ -0,0 +1,212 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//TESTED_CLASS= +//TESTED_FILES= + +class tst_QXmlInputSource : public QObject +{ + Q_OBJECT + +private slots: + void reset() const; + void resetSimplified() const; + void waitForReadyIODevice() const; +}; + +/*! + \internal + \since 4.4 + + See task 166278. + */ +void tst_QXmlInputSource::reset() const +{ + const QString input(QString::fromLatin1("")); + + QXmlSimpleReader reader; + QXmlDefaultHandler handler; + reader.setContentHandler(&handler); + + QXmlInputSource source; + source.setData(input); + + QCOMPARE(source.data(), input); + + source.reset(); + QCOMPARE(source.data(), input); + + source.reset(); + QVERIFY(reader.parse(source)); + source.reset(); + QCOMPARE(source.data(), input); +} + +/*! + \internal + \since 4.4 + + See task 166278. + */ +void tst_QXmlInputSource::resetSimplified() const +{ + const QString input(QString::fromLatin1("")); + + QXmlSimpleReader reader; + + QXmlInputSource source; + source.setData(input); + + QVERIFY(reader.parse(source)); + source.reset(); + QCOMPARE(source.data(), input); +} + +class ServerAndClient : public QObject +{ + Q_OBJECT + +public: + ServerAndClient(QEventLoop &ev) : success(false) + , eventLoop(ev) + { + setObjectName("serverAndClient"); + tcpServer = new QTcpServer(this); + connect(tcpServer, SIGNAL(newConnection()), this, SLOT(newConnection())); + tcpServer->listen(QHostAddress::LocalHost, 1088); + httpClient = new QHttp(this); + connect(httpClient, SIGNAL(requestFinished(int, bool)), SLOT(requestFinished(int, bool))); + } + + bool success; + QEventLoop &eventLoop; + +public slots: + void doIt() + { + QUrl url("http://127.0.0.1:1088"); + httpClient->setHost( url.host(), 1088); + QHttpRequestHeader req_head("POST", url.path()); + req_head.setValue("host", url.host()); + req_head.setValue("user-agent", "xml-test"); + req_head.setValue("keep-alive", "false"); + + QByteArray xmlrpc("\r\n\ + SFD.GetVersion\r\n\ + \r\n\ + "); + req_head.setContentLength(xmlrpc.size()); + req_head.setContentType("text/xml"); + + httpClient->request(req_head, xmlrpc); + } + + void requestFinished(int, bool isError) + { + QVERIFY(!isError); + } + +private slots: + void newConnection() + { + QTcpSocket *const s = tcpServer->nextPendingConnection(); + + if(s) + connect(s, SIGNAL(readyRead()), this, SLOT(readyRead())); + } + + void readyRead() + { + QTcpSocket *const s = static_cast(sender()); + int bodyLength = -1; + + while(s->canReadLine()) + { + const QString line(s->readLine()); + + if(line.startsWith("content-length:")) + bodyLength = line.mid(15).toInt(); + + if(line == "\r\n") + { + if(bodyLength == -1) + { + Q_ASSERT_X(false, Q_FUNC_INFO, + "No length was specified in the header."); + return; + } + + QDomDocument domDoc; + success = domDoc.setContent(s->read(bodyLength)); + eventLoop.exit(); + } + } + } + +private: + QTcpServer *tcpServer; + QHttp* httpClient; +}; + +void tst_QXmlInputSource::waitForReadyIODevice() const +{ + QEventLoop el; + ServerAndClient sv(el); + QTimer::singleShot(1, &sv, SLOT(doIt())); + + el.exec(); + QVERIFY(sv.success); +} + +QTEST_MAIN(tst_QXmlInputSource) +#include "tst_qxmlinputsource.moc"