tests/auto/qnetworkreply/tst_qnetworkreply.cpp
branchRCL_3
changeset 4 3b1da2848fc7
parent 3 41300fa6a67c
child 7 3f74d0d4af4c
equal deleted inserted replaced
3:41300fa6a67c 4:3b1da2848fc7
     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 **
    52 #include <QtNetwork/QTcpSocket>
    52 #include <QtNetwork/QTcpSocket>
    53 #include <QtNetwork/QLocalSocket>
    53 #include <QtNetwork/QLocalSocket>
    54 #include <QtNetwork/QLocalServer>
    54 #include <QtNetwork/QLocalServer>
    55 #include <QtNetwork/QHostInfo>
    55 #include <QtNetwork/QHostInfo>
    56 #include <QtNetwork/QFtp>
    56 #include <QtNetwork/QFtp>
       
    57 #include <QtNetwork/QAbstractNetworkCache>
    57 #include <QtNetwork/qauthenticator.h>
    58 #include <QtNetwork/qauthenticator.h>
    58 #include <QtNetwork/qnetworkaccessmanager.h>
    59 #include <QtNetwork/qnetworkaccessmanager.h>
    59 #include <QtNetwork/qnetworkrequest.h>
    60 #include <QtNetwork/qnetworkrequest.h>
    60 #include <QtNetwork/qnetworkreply.h>
    61 #include <QtNetwork/qnetworkreply.h>
    61 #include <QtNetwork/qnetworkcookie.h>
    62 #include <QtNetwork/qnetworkcookie.h>
   196     void ioGetFromHttpsWithIgnoreSslErrors();
   197     void ioGetFromHttpsWithIgnoreSslErrors();
   197     void ioGetFromHttpsWithSslHandshakeError();
   198     void ioGetFromHttpsWithSslHandshakeError();
   198 #endif
   199 #endif
   199     void ioGetFromHttpBrokenServer_data();
   200     void ioGetFromHttpBrokenServer_data();
   200     void ioGetFromHttpBrokenServer();
   201     void ioGetFromHttpBrokenServer();
       
   202     void ioGetFromHttpWithCache_data();
       
   203     void ioGetFromHttpWithCache();
   201 
   204 
   202     void ioGetWithManyProxies_data();
   205     void ioGetWithManyProxies_data();
   203     void ioGetWithManyProxies();
   206     void ioGetWithManyProxies();
   204 
   207 
   205     void ioPutToFileFromFile_data();
   208     void ioPutToFileFromFile_data();
   221     void ioPostToHttpFromMiddleOfFileToEnd();
   224     void ioPostToHttpFromMiddleOfFileToEnd();
   222     void ioPostToHttpFromMiddleOfFileFiveBytes();
   225     void ioPostToHttpFromMiddleOfFileFiveBytes();
   223     void ioPostToHttpFromMiddleOfQBufferFiveBytes();
   226     void ioPostToHttpFromMiddleOfQBufferFiveBytes();
   224     void ioPostToHttpNoBufferFlag();
   227     void ioPostToHttpNoBufferFlag();
   225     void ioPostToHttpUploadProgress();
   228     void ioPostToHttpUploadProgress();
   226     void ioPostToHttpEmtpyUploadProgress();
   229     void ioPostToHttpEmptyUploadProgress();
   227 
   230 
   228     void lastModifiedHeaderForFile();
   231     void lastModifiedHeaderForFile();
   229     void lastModifiedHeaderForHttp();
   232     void lastModifiedHeaderForHttp();
   230 
   233 
   231     void rateControl_data();
   234     void rateControl_data();
   316 
   319 
   317 public:
   320 public:
   318     QByteArray dataToTransmit;
   321     QByteArray dataToTransmit;
   319     QByteArray receivedData;
   322     QByteArray receivedData;
   320     bool doClose;
   323     bool doClose;
   321 
   324     int totalConnections;
   322     MiniHttpServer(const QByteArray &data) : client(0), dataToTransmit(data), doClose(true)
   325 
       
   326     MiniHttpServer(const QByteArray &data) : client(0), dataToTransmit(data), doClose(true), totalConnections(0)
   323     {
   327     {
   324         listen();
   328         listen();
   325         connect(this, SIGNAL(newConnection()), this, SLOT(doAccept()));
   329         connect(this, SIGNAL(newConnection()), this, SLOT(doAccept()));
   326     }
   330     }
   327 
   331 
   328 public slots:
   332 public slots:
   329     void doAccept()
   333     void doAccept()
   330     {
   334     {
   331         client = nextPendingConnection();
   335         client = nextPendingConnection();
       
   336         ++totalConnections;
   332         connect(client, SIGNAL(readyRead()), this, SLOT(sendData()));
   337         connect(client, SIGNAL(readyRead()), this, SLOT(sendData()));
   333     }
   338     }
   334 
   339 
   335     void sendData()
   340     void sendData()
   336     {
   341     {
   376         lastQuery = query;
   381         lastQuery = query;
   377         ++callCount;
   382         ++callCount;
   378         return toReturn;
   383         return toReturn;
   379     }
   384     }
   380 };
   385 };
       
   386 
       
   387 class MyMemoryCache: public QAbstractNetworkCache
       
   388 {
       
   389 public:
       
   390     typedef QPair<QNetworkCacheMetaData, QByteArray> CachedContent;
       
   391     typedef QHash<QByteArray, CachedContent> CacheData;
       
   392     CacheData cache;
       
   393 
       
   394     MyMemoryCache(QObject *parent) : QAbstractNetworkCache(parent) {}
       
   395 
       
   396     QNetworkCacheMetaData metaData(const QUrl &url)
       
   397     {
       
   398         return cache.value(url.toEncoded()).first;
       
   399     }
       
   400 
       
   401     void updateMetaData(const QNetworkCacheMetaData &metaData)
       
   402     {
       
   403         cache[metaData.url().toEncoded()].first = metaData;
       
   404     }
       
   405 
       
   406     QIODevice *data(const QUrl &url)
       
   407     {
       
   408         CacheData::ConstIterator it = cache.find(url.toEncoded());
       
   409         if (it == cache.constEnd())
       
   410             return 0;
       
   411         QBuffer *io = new QBuffer(this);
       
   412         io->setData(it->second);
       
   413         io->open(QIODevice::ReadOnly);
       
   414         io->seek(0);
       
   415         return io;
       
   416     }
       
   417 
       
   418     bool remove(const QUrl &url)
       
   419     {
       
   420         cache.remove(url.toEncoded());
       
   421         return true;
       
   422     }
       
   423 
       
   424     qint64 cacheSize() const
       
   425     {
       
   426         qint64 total = 0;
       
   427         foreach (const CachedContent &entry, cache)
       
   428             total += entry.second.size();
       
   429         return total;
       
   430     }
       
   431 
       
   432     QIODevice *prepare(const QNetworkCacheMetaData &)
       
   433     { Q_ASSERT(0 && "Should not have tried to add to the cache"); return 0; }
       
   434     void insert(QIODevice *)
       
   435     { Q_ASSERT(0 && "Should not have tried to add to the cache"); }
       
   436 
       
   437     void clear() { cache.clear(); }
       
   438 };
       
   439 Q_DECLARE_METATYPE(MyMemoryCache::CachedContent)
       
   440 Q_DECLARE_METATYPE(MyMemoryCache::CacheData)
   381 
   441 
   382 class DataReader: public QObject
   442 class DataReader: public QObject
   383 {
   443 {
   384     Q_OBJECT
   444     Q_OBJECT
   385 public:
   445 public:
   760     QVERIFY(!file.exists() || file.remove());
   820     QVERIFY(!file.exists() || file.remove());
   761 
   821 
   762     // clear the internal cache
   822     // clear the internal cache
   763     QNetworkAccessManagerPrivate::clearCache(&manager);
   823     QNetworkAccessManagerPrivate::clearCache(&manager);
   764     manager.setProxy(QNetworkProxy());
   824     manager.setProxy(QNetworkProxy());
       
   825     manager.setCache(0);
   765 
   826 
   766     // clear cookies
   827     // clear cookies
   767     cookieJar->setAllCookies(QList<QNetworkCookie>());
   828     cookieJar->setAllCookies(QList<QNetworkCookie>());
   768 }
   829 }
   769 
   830 
   775 
   836 
   776     QVERIFY(reply.data());
   837     QVERIFY(reply.data());
   777     QVERIFY(reply->isOpen());
   838     QVERIFY(reply->isOpen());
   778     QVERIFY(reply->isReadable());
   839     QVERIFY(reply->isReadable());
   779     QVERIFY(!reply->isWritable());
   840     QVERIFY(!reply->isWritable());
   780     QCOMPARE(reply->errorString(), QString("Unknown error"));
   841 
       
   842     // both behaviours are OK since we might change underlying behaviour again
       
   843     if (!reply->isFinished())
       
   844         QCOMPARE(reply->errorString(), QString("Unknown error"));
       
   845     else
       
   846         QVERIFY(!reply->errorString().isEmpty());
       
   847 
   781 
   848 
   782     QCOMPARE(reply->manager(), &manager);
   849     QCOMPARE(reply->manager(), &manager);
   783     QCOMPARE(reply->request(), req);
   850     QCOMPARE(reply->request(), req);
   784     QCOMPARE(int(reply->operation()), int(QNetworkAccessManager::GetOperation));
   851     QCOMPARE(int(reply->operation()), int(QNetworkAccessManager::GetOperation));
   785     QCOMPARE(reply->error(), QNetworkReply::NoError);
   852     // error and not error are OK since we might change underlying behaviour again
   786     QCOMPARE(reply->isFinished(), false);
   853     if (!reply->isFinished())
       
   854         QCOMPARE(reply->error(), QNetworkReply::NoError);
   787     QCOMPARE(reply->url(), url);
   855     QCOMPARE(reply->url(), url);
   788 
   856 
   789     reply->abort();
   857     reply->abort();
   790 }
   858 }
   791 
   859 
  1088     QFETCH(QString, url);
  1156     QFETCH(QString, url);
  1089     QNetworkRequest request(url);
  1157     QNetworkRequest request(url);
  1090     QNetworkReplyPtr reply = manager.get(request);
  1158     QNetworkReplyPtr reply = manager.get(request);
  1091     reply->setParent(this);     // we have expect-fails
  1159     reply->setParent(this);     // we have expect-fails
  1092 
  1160 
  1093     QCOMPARE(reply->error(), QNetworkReply::NoError);
  1161     if (!reply->isFinished())
       
  1162         QCOMPARE(reply->error(), QNetworkReply::NoError);
  1094 
  1163 
  1095     // now run the request:
  1164     // now run the request:
  1096     connect(reply, SIGNAL(finished()),
  1165     connect(reply, SIGNAL(finished()),
  1097             &QTestEventLoop::instance(), SLOT(exitLoop()));
  1166             &QTestEventLoop::instance(), SLOT(exitLoop()));
  1098     QTestEventLoop::instance().enterLoop(10);
  1167     QTestEventLoop::instance().enterLoop(10);
  1449     file.flush();
  1518     file.flush();
  1450     QCOMPARE(file.size(), qint64(data.size()));
  1519     QCOMPARE(file.size(), qint64(data.size()));
  1451 
  1520 
  1452     QNetworkRequest request(QUrl::fromLocalFile(file.fileName()));
  1521     QNetworkRequest request(QUrl::fromLocalFile(file.fileName()));
  1453     QNetworkReplyPtr reply = manager.get(request);
  1522     QNetworkReplyPtr reply = manager.get(request);
       
  1523     QVERIFY(reply->isFinished()); // a file should immediatly be done
  1454     DataReader reader(reply);
  1524     DataReader reader(reply);
  1455 
  1525 
  1456     connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
  1526     connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
  1457     QTestEventLoop::instance().enterLoop(10);
  1527     QTestEventLoop::instance().enterLoop(10);
  1458     QVERIFY(!QTestEventLoop::instance().timeout());
  1528     QVERIFY(!QTestEventLoop::instance().timeout());
  1980     QTestEventLoop::instance().enterLoop(10);
  2050     QTestEventLoop::instance().enterLoop(10);
  1981     QVERIFY(!QTestEventLoop::instance().timeout());
  2051     QVERIFY(!QTestEventLoop::instance().timeout());
  1982 
  2052 
  1983     QCOMPARE(reply->url(), request.url());
  2053     QCOMPARE(reply->url(), request.url());
  1984     QVERIFY(reply->error() != QNetworkReply::NoError);
  2054     QVERIFY(reply->error() != QNetworkReply::NoError);
       
  2055 }
       
  2056 
       
  2057 void tst_QNetworkReply::ioGetFromHttpWithCache_data()
       
  2058 {
       
  2059     qRegisterMetaType<MyMemoryCache::CachedContent>();
       
  2060     QTest::addColumn<QByteArray>("dataToSend");
       
  2061     QTest::addColumn<QString>("body");
       
  2062     QTest::addColumn<MyMemoryCache::CachedContent>("cachedReply");
       
  2063     QTest::addColumn<int>("cacheMode");
       
  2064     QTest::addColumn<bool>("loadedFromCache");
       
  2065     QTest::addColumn<bool>("networkUsed");
       
  2066 
       
  2067     QByteArray reply200 =
       
  2068             "HTTP/1.0 200\r\n"
       
  2069             "Connection: keep-alive\r\n"
       
  2070             "Content-Type: text/plain\r\n"
       
  2071             "Cache-control: no-cache\r\n"
       
  2072             "Content-length: 8\r\n"
       
  2073             "\r\n"
       
  2074             "Reloaded";
       
  2075     QByteArray reply304 =
       
  2076             "HTTP/1.0 304 Use Cache\r\n"
       
  2077             "Connection: keep-alive\r\n"
       
  2078             "\r\n";
       
  2079 
       
  2080     QTest::newRow("not-cached,always-network")
       
  2081             << reply200 << "Reloaded" << MyMemoryCache::CachedContent() << int(QNetworkRequest::AlwaysNetwork) << false << true;
       
  2082     QTest::newRow("not-cached,prefer-network")
       
  2083             << reply200 << "Reloaded" << MyMemoryCache::CachedContent() << int(QNetworkRequest::PreferNetwork) << false << true;
       
  2084     QTest::newRow("not-cached,prefer-cache")
       
  2085             << reply200 << "Reloaded" << MyMemoryCache::CachedContent() << int(QNetworkRequest::PreferCache) << false << true;
       
  2086 
       
  2087     QDateTime present = QDateTime::currentDateTime().toUTC();
       
  2088     QDateTime past = present.addSecs(-3600);
       
  2089     QDateTime future = present.addSecs(3600);
       
  2090     static const char dateFormat[] = "ddd, dd MMM yyyy hh:mm:ss 'GMT'";
       
  2091 
       
  2092     QNetworkCacheMetaData::RawHeaderList rawHeaders;
       
  2093     MyMemoryCache::CachedContent content;
       
  2094     content.second = "Not-reloaded";
       
  2095     content.first.setLastModified(past);
       
  2096 
       
  2097     //
       
  2098     // Set to expired
       
  2099     //
       
  2100     rawHeaders.clear();
       
  2101     rawHeaders << QNetworkCacheMetaData::RawHeader("Date", QLocale::c().toString(past, dateFormat).toLatin1())
       
  2102             << QNetworkCacheMetaData::RawHeader("Cache-control", "max-age=0"); // isn't used in cache loading
       
  2103     content.first.setRawHeaders(rawHeaders);
       
  2104     content.first.setLastModified(past);
       
  2105 
       
  2106     QTest::newRow("expired,200,prefer-network")
       
  2107             << reply200 << "Reloaded" << content << int(QNetworkRequest::PreferNetwork) << false << true;
       
  2108     QTest::newRow("expired,200,prefer-cache")
       
  2109             << reply200 << "Reloaded" << content << int(QNetworkRequest::PreferCache) << false << true;
       
  2110 
       
  2111     QTest::newRow("expired,304,prefer-network")
       
  2112             << reply304 << "Not-reloaded" << content << int(QNetworkRequest::PreferNetwork) << true << true;
       
  2113     QTest::newRow("expired,304,prefer-cache")
       
  2114             << reply304 << "Not-reloaded" << content << int(QNetworkRequest::PreferCache) << true << true;
       
  2115 
       
  2116     //
       
  2117     // Set to not-expired
       
  2118     //
       
  2119     rawHeaders.clear();
       
  2120     rawHeaders << QNetworkCacheMetaData::RawHeader("Date", QLocale::c().toString(past, dateFormat).toLatin1())
       
  2121             << QNetworkCacheMetaData::RawHeader("Cache-control", "max-age=7200"); // isn't used in cache loading
       
  2122     content.first.setRawHeaders(rawHeaders);
       
  2123     content.first.setExpirationDate(future);
       
  2124 
       
  2125     QTest::newRow("not-expired,200,always-network")
       
  2126             << reply200 << "Reloaded" << content << int(QNetworkRequest::AlwaysNetwork) << false << true;
       
  2127     QTest::newRow("not-expired,200,prefer-network")
       
  2128             << reply200 << "Not-reloaded" << content << int(QNetworkRequest::PreferNetwork) << true << false;
       
  2129     QTest::newRow("not-expired,200,prefer-cache")
       
  2130             << reply200 << "Not-reloaded" << content << int(QNetworkRequest::PreferCache) << true << false;
       
  2131     QTest::newRow("not-expired,200,always-cache")
       
  2132             << reply200 << "Not-reloaded" << content << int(QNetworkRequest::AlwaysCache) << true << false;
       
  2133 
       
  2134     QTest::newRow("not-expired,304,prefer-network")
       
  2135             << reply304 << "Not-reloaded" << content << int(QNetworkRequest::PreferNetwork) << true << false;
       
  2136     QTest::newRow("not-expired,304,prefer-cache")
       
  2137             << reply304 << "Not-reloaded" << content << int(QNetworkRequest::PreferCache) << true << false;
       
  2138     QTest::newRow("not-expired,304,always-cache")
       
  2139             << reply304 << "Not-reloaded" << content << int(QNetworkRequest::AlwaysCache) << true << false;
       
  2140 
       
  2141     //
       
  2142     // Set must-revalidate now
       
  2143     //
       
  2144     rawHeaders.clear();
       
  2145     rawHeaders << QNetworkCacheMetaData::RawHeader("Date", QLocale::c().toString(past, dateFormat).toLatin1())
       
  2146             << QNetworkCacheMetaData::RawHeader("Cache-control", "max-age=7200, must-revalidate"); // must-revalidate is used
       
  2147     content.first.setRawHeaders(rawHeaders);
       
  2148 
       
  2149     QTest::newRow("must-revalidate,200,always-network")
       
  2150             << reply200 << "Reloaded" << content << int(QNetworkRequest::AlwaysNetwork) << false << true;
       
  2151     QTest::newRow("must-revalidate,200,prefer-network")
       
  2152             << reply200 << "Reloaded" << content << int(QNetworkRequest::PreferNetwork) << false << true;
       
  2153     QTest::newRow("must-revalidate,200,prefer-cache")
       
  2154             << reply200 << "Not-reloaded" << content << int(QNetworkRequest::PreferCache) << true << false;
       
  2155     QTest::newRow("must-revalidate,200,always-cache")
       
  2156             << reply200 << "Not-reloaded" << content << int(QNetworkRequest::AlwaysCache) << true << false;
       
  2157 
       
  2158     QTest::newRow("must-revalidate,304,prefer-network")
       
  2159             << reply304 << "Not-reloaded" << content << int(QNetworkRequest::PreferNetwork) << true << true;
       
  2160     QTest::newRow("must-revalidate,304,prefer-cache")
       
  2161             << reply304 << "Not-reloaded" << content << int(QNetworkRequest::PreferCache) << true << false;
       
  2162     QTest::newRow("must-revalidate,304,always-cache")
       
  2163             << reply304 << "Not-reloaded" << content << int(QNetworkRequest::AlwaysCache) << true << false;
       
  2164 }
       
  2165 
       
  2166 void tst_QNetworkReply::ioGetFromHttpWithCache()
       
  2167 {
       
  2168     QFETCH(QByteArray, dataToSend);
       
  2169     MiniHttpServer server(dataToSend);
       
  2170     server.doClose = false;
       
  2171 
       
  2172     MyMemoryCache *memoryCache = new MyMemoryCache(&manager);
       
  2173     manager.setCache(memoryCache);
       
  2174 
       
  2175     QFETCH(MyMemoryCache::CachedContent, cachedReply);
       
  2176     QUrl url = "http://localhost:" + QString::number(server.serverPort());
       
  2177     cachedReply.first.setUrl(url);
       
  2178     if (!cachedReply.second.isNull())
       
  2179         memoryCache->cache.insert(url.toEncoded(), cachedReply);
       
  2180 
       
  2181     QFETCH(int, cacheMode);
       
  2182     QNetworkRequest request(url);
       
  2183     request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, cacheMode);
       
  2184     request.setAttribute(QNetworkRequest::CacheSaveControlAttribute, false);
       
  2185     QNetworkReplyPtr reply = manager.get(request);
       
  2186 
       
  2187     connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
       
  2188     QTestEventLoop::instance().enterLoop(10);
       
  2189     QVERIFY(!QTestEventLoop::instance().timeout());
       
  2190 
       
  2191     QTEST(reply->attribute(QNetworkRequest::SourceIsFromCacheAttribute).toBool(), "loadedFromCache");
       
  2192     QTEST(server.totalConnections > 0, "networkUsed");
       
  2193     QFETCH(QString, body);
       
  2194     QCOMPARE(reply->readAll().constData(), qPrintable(body));
  1985 }
  2195 }
  1986 
  2196 
  1987 void tst_QNetworkReply::ioGetWithManyProxies_data()
  2197 void tst_QNetworkReply::ioGetWithManyProxies_data()
  1988 {
  2198 {
  1989     QTest::addColumn<QList<QNetworkProxy> >("proxyList");
  2199     QTest::addColumn<QList<QNetworkProxy> >("proxyList");
  2919 
  3129 
  2920     incomingSocket->close();
  3130     incomingSocket->close();
  2921     server.close();
  3131     server.close();
  2922 }
  3132 }
  2923 
  3133 
  2924 void tst_QNetworkReply::ioPostToHttpEmtpyUploadProgress()
  3134 void tst_QNetworkReply::ioPostToHttpEmptyUploadProgress()
  2925 {
  3135 {
  2926     QByteArray ba;
  3136     QByteArray ba;
  2927     ba.resize(0);
  3137     ba.resize(0);
  2928     QBuffer buffer(&ba,0);
  3138     QBuffer buffer(&ba,0);
  2929     QVERIFY(buffer.open(QIODevice::ReadOnly));
  3139     QVERIFY(buffer.open(QIODevice::ReadOnly));
  2967     server.close();
  3177     server.close();
  2968 }
  3178 }
  2969 
  3179 
  2970 void tst_QNetworkReply::lastModifiedHeaderForFile()
  3180 void tst_QNetworkReply::lastModifiedHeaderForFile()
  2971 {
  3181 {
  2972     QFileInfo fileInfo(SRCDIR "./bigfile");
  3182     QFileInfo fileInfo(SRCDIR "/bigfile");
       
  3183     QVERIFY(fileInfo.exists());
       
  3184 
  2973     QUrl url = QUrl::fromLocalFile(fileInfo.filePath());
  3185     QUrl url = QUrl::fromLocalFile(fileInfo.filePath());
  2974 
  3186 
  2975     QNetworkRequest request(url);
  3187     QNetworkRequest request(url);
  2976     QNetworkReplyPtr reply = manager.head(request);
  3188     QNetworkReplyPtr reply = manager.head(request);
  2977     QSignalSpy spy(reply, SIGNAL(uploadProgress(qint64,qint64)));
       
  2978     connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
  3189     connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
  2979     QTestEventLoop::instance().enterLoop(10);
  3190     QTestEventLoop::instance().enterLoop(10);
  2980     QVERIFY(!QTestEventLoop::instance().timeout());
  3191     QVERIFY(!QTestEventLoop::instance().timeout());
  2981 
  3192 
  2982     QDateTime header = reply->header(QNetworkRequest::LastModifiedHeader).toDateTime();
  3193     QDateTime header = reply->header(QNetworkRequest::LastModifiedHeader).toDateTime();
  2988     // Tue, 22 May 2007 12:04:57 GMT according to webserver
  3199     // Tue, 22 May 2007 12:04:57 GMT according to webserver
  2989     QUrl url = "http://" + QtNetworkSettings::serverName() + "/gif/fluke.gif";
  3200     QUrl url = "http://" + QtNetworkSettings::serverName() + "/gif/fluke.gif";
  2990 
  3201 
  2991     QNetworkRequest request(url);
  3202     QNetworkRequest request(url);
  2992     QNetworkReplyPtr reply = manager.head(request);
  3203     QNetworkReplyPtr reply = manager.head(request);
  2993     QSignalSpy spy(reply, SIGNAL(uploadProgress(qint64,qint64)));
       
  2994     connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
  3204     connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
  2995     QTestEventLoop::instance().enterLoop(10);
  3205     QTestEventLoop::instance().enterLoop(10);
  2996     QVERIFY(!QTestEventLoop::instance().timeout());
  3206     QVERIFY(!QTestEventLoop::instance().timeout());
  2997 
  3207 
  2998     QDateTime header = reply->header(QNetworkRequest::LastModifiedHeader).toDateTime();
  3208     QDateTime header = reply->header(QNetworkRequest::LastModifiedHeader).toDateTime();