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; |
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"); |