80 Q_DECLARE_METATYPE(QAuthenticator*) |
80 Q_DECLARE_METATYPE(QAuthenticator*) |
81 Q_DECLARE_METATYPE(QNetworkProxy) |
81 Q_DECLARE_METATYPE(QNetworkProxy) |
82 Q_DECLARE_METATYPE(QNetworkProxyQuery) |
82 Q_DECLARE_METATYPE(QNetworkProxyQuery) |
83 Q_DECLARE_METATYPE(QList<QNetworkProxy>) |
83 Q_DECLARE_METATYPE(QList<QNetworkProxy>) |
84 Q_DECLARE_METATYPE(QNetworkReply::NetworkError) |
84 Q_DECLARE_METATYPE(QNetworkReply::NetworkError) |
|
85 Q_DECLARE_METATYPE(QBuffer*) |
85 |
86 |
86 class QNetworkReplyPtr: public QSharedPointer<QNetworkReply> |
87 class QNetworkReplyPtr: public QSharedPointer<QNetworkReply> |
87 { |
88 { |
88 public: |
89 public: |
89 inline QNetworkReplyPtr(QNetworkReply *ptr = 0) |
90 inline QNetworkReplyPtr(QNetworkReply *ptr = 0) |
126 public: |
127 public: |
127 tst_QNetworkReply(); |
128 tst_QNetworkReply(); |
128 ~tst_QNetworkReply(); |
129 ~tst_QNetworkReply(); |
129 QString runSimpleRequest(QNetworkAccessManager::Operation op, const QNetworkRequest &request, |
130 QString runSimpleRequest(QNetworkAccessManager::Operation op, const QNetworkRequest &request, |
130 QNetworkReplyPtr &reply, const QByteArray &data = QByteArray()); |
131 QNetworkReplyPtr &reply, const QByteArray &data = QByteArray()); |
|
132 |
|
133 QString runCustomRequest(const QNetworkRequest &request, QNetworkReplyPtr &reply, |
|
134 const QByteArray &verb, QIODevice *data); |
131 |
135 |
132 public Q_SLOTS: |
136 public Q_SLOTS: |
133 void finished(); |
137 void finished(); |
134 void gotError(); |
138 void gotError(); |
135 void authenticationRequired(QNetworkReply*,QAuthenticator*); |
139 void authenticationRequired(QNetworkReply*,QAuthenticator*); |
173 void postToHttp(); |
177 void postToHttp(); |
174 void deleteFromHttp_data(); |
178 void deleteFromHttp_data(); |
175 void deleteFromHttp(); |
179 void deleteFromHttp(); |
176 void putGetDeleteGetFromHttp_data(); |
180 void putGetDeleteGetFromHttp_data(); |
177 void putGetDeleteGetFromHttp(); |
181 void putGetDeleteGetFromHttp(); |
|
182 void sendCustomRequestToHttp_data(); |
|
183 void sendCustomRequestToHttp(); |
178 |
184 |
179 void ioGetFromData_data(); |
185 void ioGetFromData_data(); |
180 void ioGetFromData(); |
186 void ioGetFromData(); |
181 void ioGetFromFileSpecial_data(); |
187 void ioGetFromFileSpecial_data(); |
182 void ioGetFromFileSpecial(); |
188 void ioGetFromFileSpecial(); |
517 |
525 |
518 QTcpSocket *active = new QTcpSocket(this); |
526 QTcpSocket *active = new QTcpSocket(this); |
519 active->connectToHost("127.0.0.1", server.serverPort()); |
527 active->connectToHost("127.0.0.1", server.serverPort()); |
520 #ifndef Q_OS_SYMBIAN |
528 #ifndef Q_OS_SYMBIAN |
521 // need more time as working with embedded |
529 // need more time as working with embedded |
522 // device and testing from emualtor |
530 // device and testing from emualtor |
523 // things tend to get slower |
531 // things tend to get slower |
524 if (!active->waitForConnected(1000)) |
532 if (!active->waitForConnected(1000)) |
525 return false; |
533 return false; |
526 |
534 |
527 if (!server.waitForNewConnection(1000)) |
535 if (!server.waitForNewConnection(1000)) |
528 return false; |
536 return false; |
803 return "Network timeout"; |
811 return "Network timeout"; |
804 } |
812 } |
805 return QString(); |
813 return QString(); |
806 } |
814 } |
807 |
815 |
|
816 QString tst_QNetworkReply::runCustomRequest(const QNetworkRequest &request, |
|
817 QNetworkReplyPtr &reply, |
|
818 const QByteArray &verb, |
|
819 QIODevice *data) |
|
820 { |
|
821 reply = manager.sendCustomRequest(request, verb, data); |
|
822 reply->setParent(this); |
|
823 connect(reply, SIGNAL(finished()), SLOT(finished())); |
|
824 connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(gotError())); |
|
825 |
|
826 returnCode = Timeout; |
|
827 loop = new QEventLoop; |
|
828 QTimer::singleShot(20000, loop, SLOT(quit())); |
|
829 int code = returnCode == Timeout ? loop->exec() : returnCode; |
|
830 delete loop; |
|
831 loop = 0; |
|
832 |
|
833 switch (code) { |
|
834 case Failure: |
|
835 return "Request failed: " + reply->errorString(); |
|
836 case Timeout: |
|
837 return "Network timeout"; |
|
838 } |
|
839 return QString(); |
|
840 } |
|
841 |
808 void tst_QNetworkReply::finished() |
842 void tst_QNetworkReply::finished() |
809 { |
843 { |
810 loop->exit(returnCode = Success); |
844 loop->exit(returnCode = Success); |
811 } |
845 } |
812 |
846 |
898 QCOMPARE(reply->error(), QNetworkReply::ProtocolUnknownError); |
932 QCOMPARE(reply->error(), QNetworkReply::ProtocolUnknownError); |
899 } |
933 } |
900 |
934 |
901 void tst_QNetworkReply::getFromData_data() |
935 void tst_QNetworkReply::getFromData_data() |
902 { |
936 { |
903 QTest::addColumn<QString>("request"); |
937 QTest::addColumn<QString>("request"); |
904 QTest::addColumn<QByteArray>("expected"); |
938 QTest::addColumn<QByteArray>("expected"); |
905 QTest::addColumn<QString>("mimeType"); |
939 QTest::addColumn<QString>("mimeType"); |
906 |
940 |
907 const QString defaultMimeType("text/plain;charset=US-ASCII"); |
941 const QString defaultMimeType("text/plain;charset=US-ASCII"); |
908 |
942 |
994 QCOMPARE(reply->readAll(), expected); |
1028 QCOMPARE(reply->readAll(), expected); |
995 } |
1029 } |
996 |
1030 |
997 void tst_QNetworkReply::getFromFile() |
1031 void tst_QNetworkReply::getFromFile() |
998 { |
1032 { |
999 // create the file: |
1033 // create the file: |
1000 QTemporaryFile file(QDir::currentPath() + "/temp-XXXXXX"); |
1034 QTemporaryFile file(QDir::currentPath() + "/temp-XXXXXX"); |
1001 file.setAutoRemove(true); |
1035 file.setAutoRemove(true); |
1002 QVERIFY(file.open()); |
1036 QVERIFY(file.open()); |
1003 |
1037 |
1004 QNetworkRequest request(QUrl::fromLocalFile(file.fileName())); |
1038 QNetworkRequest request(QUrl::fromLocalFile(file.fileName())); |
1042 QTest::addColumn<QString>("url"); |
1076 QTest::addColumn<QString>("url"); |
1043 |
1077 |
1044 QTest::newRow("resource") << ":/resource" << "qrc:/resource"; |
1078 QTest::newRow("resource") << ":/resource" << "qrc:/resource"; |
1045 QTest::newRow("search-path") << "srcdir:/rfc3252.txt" << "srcdir:/rfc3252.txt"; |
1079 QTest::newRow("search-path") << "srcdir:/rfc3252.txt" << "srcdir:/rfc3252.txt"; |
1046 QTest::newRow("bigfile-path") << "srcdir:/bigfile" << "srcdir:/bigfile"; |
1080 QTest::newRow("bigfile-path") << "srcdir:/bigfile" << "srcdir:/bigfile"; |
|
1081 #ifdef Q_OS_WIN |
|
1082 QTest::newRow("smb-path") << "srcdir:/smb-file.txt" << "file://" + QtNetworkSettings::winServerName() + "/testshare/test.pri"; |
|
1083 #endif |
1047 } |
1084 } |
1048 |
1085 |
1049 void tst_QNetworkReply::getFromFileSpecial() |
1086 void tst_QNetworkReply::getFromFileSpecial() |
1050 { |
1087 { |
1051 QFETCH(QString, fileName); |
1088 QFETCH(QString, fileName); |
1052 QFETCH(QString, url); |
1089 QFETCH(QString, url); |
1053 |
1090 |
1054 // open the resource so we can find out its size |
1091 // open the resource so we can find out its size |
1055 QFile resource(fileName); |
1092 QFile resource(fileName); |
1056 QVERIFY(resource.open(QIODevice::ReadOnly)); |
1093 QVERIFY(resource.open(QIODevice::ReadOnly)); |
1076 QTest::newRow("bigfile") << SRCDIR "/bigfile" << "ftp://" + QtNetworkSettings::serverName() + "/qtest/bigfile"; |
1113 QTest::newRow("bigfile") << SRCDIR "/bigfile" << "ftp://" + QtNetworkSettings::serverName() + "/qtest/bigfile"; |
1077 } |
1114 } |
1078 |
1115 |
1079 void tst_QNetworkReply::getFromFtp() |
1116 void tst_QNetworkReply::getFromFtp() |
1080 { |
1117 { |
1081 QFETCH(QString, referenceName); |
1118 QFETCH(QString, referenceName); |
1082 QFETCH(QString, url); |
1119 QFETCH(QString, url); |
1083 |
1120 |
1084 QFile reference(referenceName); |
1121 QFile reference(referenceName); |
1085 QVERIFY(reference.open(QIODevice::ReadOnly)); |
1122 QVERIFY(reference.open(QIODevice::ReadOnly)); |
1086 |
1123 |
1105 QTest::newRow("bigfile-internal") << SRCDIR "/bigfile" << "http://" + QtNetworkSettings::serverName() + "/qtest/bigfile"; |
1142 QTest::newRow("bigfile-internal") << SRCDIR "/bigfile" << "http://" + QtNetworkSettings::serverName() + "/qtest/bigfile"; |
1106 } |
1143 } |
1107 |
1144 |
1108 void tst_QNetworkReply::getFromHttp() |
1145 void tst_QNetworkReply::getFromHttp() |
1109 { |
1146 { |
1110 QFETCH(QString, referenceName); |
1147 QFETCH(QString, referenceName); |
1111 QFETCH(QString, url); |
1148 QFETCH(QString, url); |
1112 |
1149 |
1113 QFile reference(referenceName); |
1150 QFile reference(referenceName); |
1114 QVERIFY(reference.open(QIODevice::ReadOnly)); |
1151 QVERIFY(reference.open(QIODevice::ReadOnly)); |
1115 |
1152 |
1461 QCOMPARE(reply->error(), get2Error); |
1498 QCOMPARE(reply->error(), get2Error); |
1462 QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), get2ResultCode); |
1499 QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), get2ResultCode); |
1463 |
1500 |
1464 } |
1501 } |
1465 |
1502 |
|
1503 void tst_QNetworkReply::sendCustomRequestToHttp_data() |
|
1504 { |
|
1505 QTest::addColumn<QUrl>("url"); |
|
1506 QTest::addColumn<QByteArray>("verb"); |
|
1507 QTest::addColumn<QBuffer *>("device"); |
|
1508 QTest::addColumn<int>("resultCode"); |
|
1509 QTest::addColumn<QNetworkReply::NetworkError>("error"); |
|
1510 QTest::addColumn<QByteArray>("expectedContent"); |
|
1511 |
|
1512 QTest::newRow("options") << QUrl("http://" + QtNetworkSettings::serverName()) << |
|
1513 QByteArray("OPTIONS") << (QBuffer *) 0 << 200 << QNetworkReply::NoError << QByteArray(); |
|
1514 QTest::newRow("trace") << QUrl("http://" + QtNetworkSettings::serverName()) << |
|
1515 QByteArray("TRACE") << (QBuffer *) 0 << 200 << QNetworkReply::NoError << QByteArray(); |
|
1516 QTest::newRow("connect") << QUrl("http://" + QtNetworkSettings::serverName()) << |
|
1517 QByteArray("CONNECT") << (QBuffer *) 0 << 400 << QNetworkReply::UnknownContentError << QByteArray(); // 400 = Bad Request |
|
1518 QTest::newRow("nonsense") << QUrl("http://" + QtNetworkSettings::serverName()) << |
|
1519 QByteArray("NONSENSE") << (QBuffer *) 0 << 501 << QNetworkReply::ProtocolUnknownError << QByteArray(); // 501 = Method Not Implemented |
|
1520 |
|
1521 QByteArray ba("test"); |
|
1522 QBuffer *buffer = new QBuffer; |
|
1523 buffer->setData(ba); |
|
1524 buffer->open(QIODevice::ReadOnly); |
|
1525 QTest::newRow("post") << QUrl("http://" + QtNetworkSettings::serverName() + "/qtest/cgi-bin/md5sum.cgi") << QByteArray("POST") |
|
1526 << buffer << 200 << QNetworkReply::NoError << QByteArray("098f6bcd4621d373cade4e832627b4f6\n"); |
|
1527 |
|
1528 QByteArray ba2("test"); |
|
1529 QBuffer *buffer2 = new QBuffer; |
|
1530 buffer2->setData(ba2); |
|
1531 buffer2->open(QIODevice::ReadOnly); |
|
1532 QTest::newRow("put") << QUrl("http://" + QtNetworkSettings::serverName() + "/qtest/cgi-bin/md5sum.cgi") << QByteArray("PUT") |
|
1533 << buffer2 << 200 << QNetworkReply::NoError << QByteArray("098f6bcd4621d373cade4e832627b4f6\n"); |
|
1534 } |
|
1535 |
|
1536 void tst_QNetworkReply::sendCustomRequestToHttp() |
|
1537 { |
|
1538 QFETCH(QUrl, url); |
|
1539 QNetworkRequest request(url); |
|
1540 QNetworkReplyPtr reply; |
|
1541 QFETCH(QByteArray, verb); |
|
1542 QFETCH(QBuffer *, device); |
|
1543 runCustomRequest(request, reply, verb, device); |
|
1544 QCOMPARE(reply->url(), url); |
|
1545 QFETCH(QNetworkReply::NetworkError, error); |
|
1546 QCOMPARE(reply->error(), error); |
|
1547 QFETCH(int, resultCode); |
|
1548 QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), resultCode); |
|
1549 QFETCH(QByteArray, expectedContent); |
|
1550 if (! expectedContent.isEmpty()) |
|
1551 QCOMPARE(reply->readAll(), expectedContent); |
|
1552 } |
|
1553 |
1466 void tst_QNetworkReply::ioGetFromData_data() |
1554 void tst_QNetworkReply::ioGetFromData_data() |
1467 { |
1555 { |
1468 QTest::addColumn<QString>("urlStr"); |
1556 QTest::addColumn<QString>("urlStr"); |
1469 QTest::addColumn<QByteArray>("data"); |
1557 QTest::addColumn<QByteArray>("data"); |
1470 |
1558 |
3296 realDate.setTimeSpec(Qt::UTC); |
3384 realDate.setTimeSpec(Qt::UTC); |
3297 |
3385 |
3298 QCOMPARE(header, realDate); |
3386 QCOMPARE(header, realDate); |
3299 } |
3387 } |
3300 |
3388 |
|
3389 void tst_QNetworkReply::httpCanReadLine() |
|
3390 { |
|
3391 QNetworkRequest request(QUrl("http://" + QtNetworkSettings::serverName() + "/qtest/rfc3252.txt")); |
|
3392 QNetworkReplyPtr reply = manager.get(request); |
|
3393 |
|
3394 connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop())); |
|
3395 QTestEventLoop::instance().enterLoop(10); |
|
3396 QVERIFY(!QTestEventLoop::instance().timeout()); |
|
3397 QCOMPARE(reply->error(), QNetworkReply::NoError); |
|
3398 |
|
3399 QVERIFY(reply->canReadLine()); |
|
3400 QVERIFY(!reply->readAll().isEmpty()); |
|
3401 QVERIFY(!reply->canReadLine()); |
|
3402 } |
|
3403 |
3301 void tst_QNetworkReply::rateControl_data() |
3404 void tst_QNetworkReply::rateControl_data() |
3302 { |
3405 { |
3303 QTest::addColumn<int>("rate"); |
3406 QTest::addColumn<int>("rate"); |
3304 |
3407 |
3305 QTest::newRow("15") << 15; |
3408 QTest::newRow("15") << 15; |
3359 QTest::newRow("small") << 4; |
3462 QTest::newRow("small") << 4; |
3360 #ifndef Q_OS_SYMBIAN |
3463 #ifndef Q_OS_SYMBIAN |
3361 QTest::newRow("big") << 4096; |
3464 QTest::newRow("big") << 4096; |
3362 #else |
3465 #else |
3363 // it can run even with 4096 |
3466 // it can run even with 4096 |
3364 // but it takes lot time |
3467 // but it takes lot time |
3365 //especially on emulator |
3468 //especially on emulator |
3366 QTest::newRow("big") << 1024; |
3469 QTest::newRow("big") << 1024; |
3367 #endif |
3470 #endif |
3368 } |
3471 } |
3369 |
3472 |
3370 void tst_QNetworkReply::downloadProgress() |
3473 void tst_QNetworkReply::downloadProgress() |
3549 QTest::newRow("invalid-cookie-domain") << "a=b; domain=.example.com" << header << jar; |
3652 QTest::newRow("invalid-cookie-domain") << "a=b; domain=.example.com" << header << jar; |
3550 } |
3653 } |
3551 |
3654 |
3552 void tst_QNetworkReply::receiveCookiesFromHttp() |
3655 void tst_QNetworkReply::receiveCookiesFromHttp() |
3553 { |
3656 { |
3554 QFETCH(QString, cookieString); |
3657 QFETCH(QString, cookieString); |
3555 |
3658 |
3556 QByteArray data = cookieString.toLatin1() + '\n'; |
3659 QByteArray data = cookieString.toLatin1() + '\n'; |
3557 QUrl url("http://" + QtNetworkSettings::serverName() + "/qtest/cgi-bin/set-cookie.cgi"); |
3660 QUrl url("http://" + QtNetworkSettings::serverName() + "/qtest/cgi-bin/set-cookie.cgi"); |
3558 QNetworkRequest request(url); |
3661 QNetworkRequest request(url); |
3559 QNetworkReplyPtr reply; |
3662 QNetworkReplyPtr reply; |