tests/auto/qtcpsocket/tst_qtcpsocket.cpp
changeset 7 f7bc934e204c
parent 3 41300fa6a67c
equal deleted inserted replaced
3:41300fa6a67c 7:f7bc934e204c
     1 /****************************************************************************
     1 /****************************************************************************
     2 **
     2 **
     3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     4 ** All rights reserved.
     4 ** All rights reserved.
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
     6 **
     6 **
     7 ** This file is part of the test suite of the Qt Toolkit.
     7 ** This file is part of the test suite of the Qt Toolkit.
     8 **
     8 **
    80 #include <QTextStream>
    80 #include <QTextStream>
    81 #include <QThread>
    81 #include <QThread>
    82 #include <QTime>
    82 #include <QTime>
    83 #include <QTimer>
    83 #include <QTimer>
    84 #include <QDebug>
    84 #include <QDebug>
    85 #ifndef TEST_QNETWORK_PROXY
       
    86 #define TEST_QNETWORK_PROXY
       
    87 #endif
       
    88 // RVCT compiles also unused inline methods
    85 // RVCT compiles also unused inline methods
    89 # include <QNetworkProxy>
    86 # include <QNetworkProxy>
    90 
    87 
    91 #ifdef Q_OS_LINUX
    88 #ifdef Q_OS_LINUX
    92 #include <stdio.h>
    89 #include <stdio.h>
    93 #include <stdlib.h>
    90 #include <stdlib.h>
    94 #include <sys/stat.h>
    91 #include <sys/stat.h>
    95 #include <unistd.h>
    92 #include <unistd.h>
    96 #endif
    93 #endif
       
    94 
       
    95 #include "private/qhostinfo_p.h"
    97 
    96 
    98 #include "../network-settings.h"
    97 #include "../network-settings.h"
    99 
    98 
   100 Q_DECLARE_METATYPE(QAbstractSocket::SocketError)
    99 Q_DECLARE_METATYPE(QAbstractSocket::SocketError)
   101 Q_DECLARE_METATYPE(QAbstractSocket::SocketState)
   100 Q_DECLARE_METATYPE(QAbstractSocket::SocketState)
   192     void connectToMultiIP();
   191     void connectToMultiIP();
   193     void moveToThread0();
   192     void moveToThread0();
   194     void increaseReadBufferSize();
   193     void increaseReadBufferSize();
   195     void taskQtBug5799ConnectionErrorWaitForConnected();
   194     void taskQtBug5799ConnectionErrorWaitForConnected();
   196     void taskQtBug5799ConnectionErrorEventLoop();
   195     void taskQtBug5799ConnectionErrorEventLoop();
   197 #ifdef TEST_QNETWORK_PROXY
   196 
   198     void invalidProxy_data();
   197     void invalidProxy_data();
   199     void invalidProxy();
   198     void invalidProxy();
   200     void proxyFactory_data();
   199     void proxyFactory_data();
   201     void proxyFactory();
   200     void proxyFactory();
   202 #endif
       
   203 
   201 
   204 protected slots:
   202 protected slots:
   205     void nonBlockingIMAP_hostFound();
   203     void nonBlockingIMAP_hostFound();
   206     void nonBlockingIMAP_connected();
   204     void nonBlockingIMAP_connected();
   207     void nonBlockingIMAP_closed();
   205     void nonBlockingIMAP_closed();
   268     QTest::addColumn<int>("proxyType");
   266     QTest::addColumn<int>("proxyType");
   269     QTest::addColumn<bool>("ssl");
   267     QTest::addColumn<bool>("ssl");
   270 
   268 
   271     qDebug() << QtNetworkSettings::serverName();
   269     qDebug() << QtNetworkSettings::serverName();
   272     QTest::newRow("WithoutProxy") << false << 0 << false;
   270     QTest::newRow("WithoutProxy") << false << 0 << false;
   273 #ifdef TEST_QNETWORK_PROXY
       
   274     QTest::newRow("WithSocks5Proxy") << true << int(Socks5Proxy) << false;
   271     QTest::newRow("WithSocks5Proxy") << true << int(Socks5Proxy) << false;
   275     QTest::newRow("WithSocks5ProxyAuth") << true << int(Socks5Proxy | AuthBasic) << false;
   272     QTest::newRow("WithSocks5ProxyAuth") << true << int(Socks5Proxy | AuthBasic) << false;
   276 
   273 
   277     QTest::newRow("WithHttpProxy") << true << int(HttpProxy) << false;
   274     QTest::newRow("WithHttpProxy") << true << int(HttpProxy) << false;
   278     QTest::newRow("WithHttpProxyBasicAuth") << true << int(HttpProxy | AuthBasic) << false;
   275     QTest::newRow("WithHttpProxyBasicAuth") << true << int(HttpProxy | AuthBasic) << false;
   279 //    QTest::newRow("WithHttpProxyNtlmAuth") << true << int(HttpProxy | AuthNtlm) << false;
   276 //    QTest::newRow("WithHttpProxyNtlmAuth") << true << int(HttpProxy | AuthNtlm) << false;
   280 #endif
   277 
   281 #ifndef QT_NO_OPENSSL
   278 #ifndef QT_NO_OPENSSL
   282     QTest::newRow("WithoutProxy SSL") << false << 0 << true;
   279     QTest::newRow("WithoutProxy SSL") << false << 0 << true;
   283 #ifdef TEST_QNETWORK_PROXY
       
   284     QTest::newRow("WithSocks5Proxy SSL") << true << int(Socks5Proxy) << true;
   280     QTest::newRow("WithSocks5Proxy SSL") << true << int(Socks5Proxy) << true;
   285     QTest::newRow("WithSocks5AuthProxy SSL") << true << int(Socks5Proxy | AuthBasic) << true;
   281     QTest::newRow("WithSocks5AuthProxy SSL") << true << int(Socks5Proxy | AuthBasic) << true;
   286 
   282 
   287     QTest::newRow("WithHttpProxy SSL") << true << int(HttpProxy) << true;
   283     QTest::newRow("WithHttpProxy SSL") << true << int(HttpProxy) << true;
   288     QTest::newRow("WithHttpProxyBasicAuth SSL") << true << int(HttpProxy | AuthBasic) << true;
   284     QTest::newRow("WithHttpProxyBasicAuth SSL") << true << int(HttpProxy | AuthBasic) << true;
   289 //    QTest::newRow("WithHttpProxyNtlmAuth SSL") << true << int(HttpProxy | AuthNtlm) << true;
   285 //    QTest::newRow("WithHttpProxyNtlmAuth SSL") << true << int(HttpProxy | AuthNtlm) << true;
   290 #endif
   286 #endif
   291 #endif
       
   292 }
   287 }
   293 
   288 
   294 void tst_QTcpSocket::init()
   289 void tst_QTcpSocket::init()
   295 {
   290 {
   296     QFETCH_GLOBAL(bool, setProxy);
   291     QFETCH_GLOBAL(bool, setProxy);
   297     if (setProxy) {
   292     if (setProxy) {
   298 #ifdef TEST_QNETWORK_PROXY
       
   299         QFETCH_GLOBAL(int, proxyType);
   293         QFETCH_GLOBAL(int, proxyType);
   300         QString fluke = QHostInfo::fromName(QtNetworkSettings::serverName()).addresses().first().toString();
   294         QString fluke = QHostInfo::fromName(QtNetworkSettings::serverName()).addresses().first().toString();
   301         QNetworkProxy proxy;
   295         QNetworkProxy proxy;
   302 
   296 
   303         switch (proxyType) {
   297         switch (proxyType) {
   320         case HttpProxy | AuthNtlm:
   314         case HttpProxy | AuthNtlm:
   321             proxy = QNetworkProxy(QNetworkProxy::HttpProxy, fluke, 3130);
   315             proxy = QNetworkProxy(QNetworkProxy::HttpProxy, fluke, 3130);
   322             break;
   316             break;
   323         }
   317         }
   324         QNetworkProxy::setApplicationProxy(proxy);
   318         QNetworkProxy::setApplicationProxy(proxy);
   325 #endif
   319     }
   326     }
   320 
       
   321     qt_qhostinfo_clear_cache();
   327 }
   322 }
   328 
   323 
   329 QTcpSocket *tst_QTcpSocket::newSocket() const
   324 QTcpSocket *tst_QTcpSocket::newSocket() const
   330 {
   325 {
   331     QTcpSocket *socket;
   326     QTcpSocket *socket;
   343     return socket;
   338     return socket;
   344 }
   339 }
   345 
   340 
   346 void tst_QTcpSocket::cleanup()
   341 void tst_QTcpSocket::cleanup()
   347 {
   342 {
   348 #ifdef TEST_QNETWORK_PROXY
       
   349     QNetworkProxy::setApplicationProxy(QNetworkProxy::DefaultProxy);
   343     QNetworkProxy::setApplicationProxy(QNetworkProxy::DefaultProxy);
   350 #endif
       
   351 }
   344 }
   352 
   345 
   353 void tst_QTcpSocket::proxyAuthenticationRequired(const QNetworkProxy &, QAuthenticator *auth)
   346 void tst_QTcpSocket::proxyAuthenticationRequired(const QNetworkProxy &, QAuthenticator *auth)
   354 {
   347 {
   355     ++proxyAuthCalled;
   348     ++proxyAuthCalled;
  1068         return;                 // we let the proxies do the lookup now
  1061         return;                 // we let the proxies do the lookup now
  1069 
  1062 
  1070     // just connect and disconnect, then make sure nothing weird happened
  1063     // just connect and disconnect, then make sure nothing weird happened
  1071     QTcpSocket *socket = newSocket();
  1064     QTcpSocket *socket = newSocket();
  1072     socket->connectToHost(QtNetworkSettings::serverName(), 21);
  1065     socket->connectToHost(QtNetworkSettings::serverName(), 21);
  1073     QVERIFY(socket->state() == QAbstractSocket::HostLookupState);
  1066 
       
  1067     // check that connect is in progress
       
  1068     QVERIFY(socket->state() != QAbstractSocket::UnconnectedState);
  1074 
  1069 
  1075     QFETCH(bool, doClose);
  1070     QFETCH(bool, doClose);
  1076     if (doClose) {
  1071     if (doClose) {
  1077         socket->close();
  1072         socket->close();
  1078         QVERIFY(socket->openMode() == QIODevice::NotOpen);
  1073         QVERIFY(socket->openMode() == QIODevice::NotOpen);
  1320 
  1315 
  1321 //----------------------------------------------------------------------------------
  1316 //----------------------------------------------------------------------------------
  1322 void tst_QTcpSocket::dontCloseOnTimeout()
  1317 void tst_QTcpSocket::dontCloseOnTimeout()
  1323 {
  1318 {
  1324     QTcpServer server;
  1319     QTcpServer server;
  1325 #ifdef TEST_QNETWORK_PROXY
       
  1326     server.setProxy(QNetworkProxy(QNetworkProxy::NoProxy));
  1320     server.setProxy(QNetworkProxy(QNetworkProxy::NoProxy));
  1327 #endif
       
  1328     QVERIFY(server.listen());
  1321     QVERIFY(server.listen());
  1329 
  1322 
  1330     QHostAddress serverAddress = QHostAddress::LocalHost;
  1323     QHostAddress serverAddress = QHostAddress::LocalHost;
  1331     if (!(server.serverAddress() == QHostAddress::Any))
  1324     if (!(server.serverAddress() == QHostAddress::Any))
  1332         serverAddress = server.serverAddress();
  1325         serverAddress = server.serverAddress();
  1676     timer.start(15000);
  1669     timer.start(15000);
  1677 
  1670 
  1678     connect(tmpSocket, SIGNAL(hostFound()), this, SLOT(hostLookupSlot()));
  1671     connect(tmpSocket, SIGNAL(hostFound()), this, SLOT(hostLookupSlot()));
  1679     tmpSocket->connectToHost(QtNetworkSettings::serverName(), 143);
  1672     tmpSocket->connectToHost(QtNetworkSettings::serverName(), 143);
  1680 
  1673 
  1681     loop.exec();
  1674     // only execute the loop if not already connected
       
  1675     if (tmpSocket->state() != QAbstractSocket::ConnectedState)
       
  1676         loop.exec();
       
  1677 
  1682     QCOMPARE(timerSpy.count(), 0);
  1678     QCOMPARE(timerSpy.count(), 0);
  1683 
  1679 
  1684     delete tmpSocket;
  1680     delete tmpSocket;
  1685 }
  1681 }
  1686 
  1682 
  1791     QVERIFY(socket->waitForReadyRead(10000));
  1787     QVERIFY(socket->waitForReadyRead(10000));
  1792 
  1788 
  1793     QCOMPARE(readyReadSpy.count(), 1);
  1789     QCOMPARE(readyReadSpy.count(), 1);
  1794 
  1790 
  1795     QString s = socket->readLine();
  1791     QString s = socket->readLine();
  1796 #ifdef TEST_QNETWORK_PROXY
       
  1797     QNetworkProxy::ProxyType proxyType = QNetworkProxy::applicationProxy().type();
       
  1798 #endif
       
  1799     QCOMPARE(s.toLatin1().constData(), QtNetworkSettings::expectedReplyIMAP().constData());
  1792     QCOMPARE(s.toLatin1().constData(), QtNetworkSettings::expectedReplyIMAP().constData());
  1800     QCOMPARE(socket->bytesAvailable(), qint64(0));
  1793     QCOMPARE(socket->bytesAvailable(), qint64(0));
  1801 
  1794 
  1802     QCoreApplication::instance()->processEvents();
  1795     QCoreApplication::instance()->processEvents();
  1803     QCOMPARE(socket->bytesAvailable(), qint64(0));
  1796     QCOMPARE(socket->bytesAvailable(), qint64(0));
  2250     QVERIFY2(socket.state() == QAbstractSocket::UnconnectedState, "Socket connected unexpectedly!");
  2243     QVERIFY2(socket.state() == QAbstractSocket::UnconnectedState, "Socket connected unexpectedly!");
  2251     QVERIFY2(socket.error() == QAbstractSocket::ConnectionRefusedError,
  2244     QVERIFY2(socket.error() == QAbstractSocket::ConnectionRefusedError,
  2252              QString("Could not reach server: %1").arg(socket.errorString()).toLocal8Bit());
  2245              QString("Could not reach server: %1").arg(socket.errorString()).toLocal8Bit());
  2253 }
  2246 }
  2254 
  2247 
  2255 
       
  2256 
       
  2257 #ifdef TEST_QNETWORK_PROXY
       
  2258 void tst_QTcpSocket::invalidProxy_data()
  2248 void tst_QTcpSocket::invalidProxy_data()
  2259 {
  2249 {
  2260     QTest::addColumn<int>("type");
  2250     QTest::addColumn<int>("type");
  2261     QTest::addColumn<QString>("host");
  2251     QTest::addColumn<QString>("host");
  2262     QTest::addColumn<int>("port");
  2252     QTest::addColumn<int>("port");
  2431     // Sometimes, error codes change for the better
  2421     // Sometimes, error codes change for the better
  2432     QTEST(int(socket->error()), "expectedError");
  2422     QTEST(int(socket->error()), "expectedError");
  2433 
  2423 
  2434     delete socket;
  2424     delete socket;
  2435 }
  2425 }
  2436 #endif
       
  2437 
  2426 
  2438 
  2427 
  2439 QTEST_MAIN(tst_QTcpSocket)
  2428 QTEST_MAIN(tst_QTcpSocket)
  2440 #include "tst_qtcpsocket.moc"
  2429 #include "tst_qtcpsocket.moc"