summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp110
1 files changed, 56 insertions, 54 deletions
diff --git a/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
index 2226f99432..ae95b18b7b 100644
--- a/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
+++ b/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
@@ -4745,71 +4745,73 @@ void tst_QNetworkReply::rateControl()
void tst_QNetworkReply::downloadProgress_data()
{
- QTest::addColumn<int>("loopCount");
+ QTest::addColumn<QUrl>("url");
+ QTest::addColumn<int>("expectedSize");
- QTest::newRow("empty") << 0;
- QTest::newRow("small") << 4;
- QTest::newRow("big") << 4096;
+ QTest::newRow("empty") << QUrl::fromLocalFile(QFINDTESTDATA("empty")) << 0;
+ QTest::newRow("http:small") << QUrl("http://" + QtNetworkSettings::serverName() + "/qtest/rfc3252.txt") << 25962;
+ QTest::newRow("http:big") << QUrl("http://" + QtNetworkSettings::serverName() + "/qtest/bigfile") << 519240;
+ QTest::newRow("http:no-length") << QUrl("http://" + QtNetworkSettings::serverName() + "/qtest/deflate/rfc2616.html") << -1;
+ QTest::newRow("ftp:small") << QUrl("http://" + QtNetworkSettings::serverName() + "/qtest/rfc3252.txt") << 25962;
+ QTest::newRow("ftp:big") << QUrl("http://" + QtNetworkSettings::serverName() + "/qtest/bigfile") << 519240;
}
-void tst_QNetworkReply::downloadProgress()
+class SlowReader : public QObject
{
-#if !defined(QT_BUILD_INTERNAL)
- QSKIP("backend for testing not available!");
-#endif
- QTcpServer server;
- QVERIFY(server.listen());
-
- QNetworkRequest request("debugpipe://127.0.0.1:" + QString::number(server.serverPort()) + "/?bare=1");
- QNetworkReplyPtr reply(manager.get(request));
- QSignalSpy spy(reply.data(), SIGNAL(downloadProgress(qint64,qint64)));
- connect(reply, SIGNAL(downloadProgress(qint64,qint64)),
- &QTestEventLoop::instance(), SLOT(exitLoop()));
- QVERIFY(spy.isValid());
- QVERIFY(!reply->isFinished());
- QVERIFY(reply->isRunning());
-
- QCoreApplication::instance()->processEvents();
- if (!server.hasPendingConnections())
- server.waitForNewConnection(1000);
- QVERIFY(server.hasPendingConnections());
- QCOMPARE(spy.count(), 0);
-
- QByteArray data(128, 'a');
- QTcpSocket *sender = server.nextPendingConnection();
- QVERIFY(sender);
-
- QFETCH(int, loopCount);
- for (int i = 1; i <= loopCount; ++i) {
- sender->write(data);
- QVERIFY2(sender->waitForBytesWritten(2000), "Network timeout");
-
- spy.clear();
- QTestEventLoop::instance().enterLoop(2);
- QVERIFY(!QTestEventLoop::instance().timeout());
- QVERIFY(spy.count() > 0);
- QVERIFY(!reply->isFinished());
- QVERIFY(reply->isRunning());
+ Q_OBJECT
+public:
+ SlowReader(QIODevice *dev)
+ : device(dev)
+ {
+ connect(device, SIGNAL(readyRead()), this, SLOT(deviceReady()));
+ }
+private slots:
+ void deviceReady()
+ {
+ QTimer::singleShot(100, this, SLOT(doRead()));
+ }
- QList<QVariant> args = spy.last();
- QCOMPARE(args.at(0).toInt(), i*data.size());
- QCOMPARE(args.at(1).toInt(), -1);
+ void doRead()
+ {
+ device->readAll();
}
+private:
+ QIODevice *device;
+};
- // close the connection:
- delete sender;
+void tst_QNetworkReply::downloadProgress()
+{
+ QFETCH(QUrl, url);
+ QFETCH(int, expectedSize);
- spy.clear();
- QTestEventLoop::instance().enterLoop(2);
- QCOMPARE(reply->error(), QNetworkReply::NoError);
+ QNetworkRequest request(url);
+ QNetworkReplyPtr reply(manager.get(request));
+ //artificially slow down the test, otherwise only the final signal is emitted
+ reply->setReadBufferSize(qMax(20000, expectedSize / 4));
+ SlowReader reader(reply.data());
+ QSignalSpy spy(reply.data(), SIGNAL(downloadProgress(qint64,qint64)));
+ connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
+ QTestEventLoop::instance().enterLoop(30);
QVERIFY(!QTestEventLoop::instance().timeout());
- QVERIFY(spy.count() > 0);
- QVERIFY(!reply->isRunning());
QVERIFY(reply->isFinished());
- QList<QVariant> args = spy.last();
- QCOMPARE(args.at(0).toInt(), loopCount * data.size());
- QCOMPARE(args.at(1).toInt(), loopCount * data.size());
+ QVERIFY(spy.count() > 0);
+
+ //final progress should have equal current & total
+ QList<QVariant> args = spy.takeLast();
+ QCOMPARE(args.at(0).toInt(), args.at(1).toInt());
+
+ qint64 current = 0;
+ //intermediate progress ascending and has expected total
+ while (!spy.isEmpty()) {
+ args = spy.takeFirst();
+ QVERIFY(args.at(0).toInt() >= current);
+ if (expectedSize >=0)
+ QCOMPARE(args.at(1).toInt(), expectedSize);
+ else
+ QVERIFY(args.at(1).toInt() == expectedSize || args.at(1).toInt() == args.at(0).toInt());
+ current = args.at(0).toInt();
+ }
}
void tst_QNetworkReply::uploadProgress_data()