tests/auto/qnetworkdiskcache/tst_qnetworkdiskcache.cpp
changeset 0 1918ee327afb
child 4 3b1da2848fc7
equal deleted inserted replaced
-1:000000000000 0:1918ee327afb
       
     1 /****************************************************************************
       
     2 **
       
     3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     4 ** All rights reserved.
       
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
       
     6 **
       
     7 ** This file is part of the test suite of the Qt Toolkit.
       
     8 **
       
     9 ** $QT_BEGIN_LICENSE:LGPL$
       
    10 ** No Commercial Usage
       
    11 ** This file contains pre-release code and may not be distributed.
       
    12 ** You may use this file in accordance with the terms and conditions
       
    13 ** contained in the Technology Preview License Agreement accompanying
       
    14 ** this package.
       
    15 **
       
    16 ** GNU Lesser General Public License Usage
       
    17 ** Alternatively, this file may be used under the terms of the GNU Lesser
       
    18 ** General Public License version 2.1 as published by the Free Software
       
    19 ** Foundation and appearing in the file LICENSE.LGPL included in the
       
    20 ** packaging of this file.  Please review the following information to
       
    21 ** ensure the GNU Lesser General Public License version 2.1 requirements
       
    22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
       
    23 **
       
    24 ** In addition, as a special exception, Nokia gives you certain additional
       
    25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
       
    26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
       
    27 **
       
    28 ** If you have questions regarding the use of this file, please contact
       
    29 ** Nokia at qt-info@nokia.com.
       
    30 **
       
    31 **
       
    32 **
       
    33 **
       
    34 **
       
    35 **
       
    36 **
       
    37 **
       
    38 ** $QT_END_LICENSE$
       
    39 **
       
    40 ****************************************************************************/
       
    41 
       
    42 
       
    43 #include <QtTest/QtTest>
       
    44 #include <QtNetwork/QtNetwork>
       
    45 #include <qnetworkdiskcache.h>
       
    46 #include "../../shared/util.h"
       
    47 
       
    48 #define EXAMPLE_URL "http://user:pass@www.example.com/#foo"
       
    49 
       
    50 class tst_QNetworkDiskCache : public QObject
       
    51 {
       
    52     Q_OBJECT
       
    53 
       
    54 public slots:
       
    55     void initTestCase();
       
    56     void cleanupTestCase();
       
    57     void init();
       
    58     void cleanup();
       
    59 
       
    60 private slots:
       
    61     void qnetworkdiskcache_data();
       
    62     void qnetworkdiskcache();
       
    63 
       
    64     void prepare();
       
    65     void cacheSize();
       
    66     void clear();
       
    67     void data_data();
       
    68     void data();
       
    69     void metaData();
       
    70     void remove();
       
    71     void setCacheDirectory_data();
       
    72     void setCacheDirectory();
       
    73     void updateMetaData();
       
    74     void fileMetaData();
       
    75     void expire();
       
    76 
       
    77     void oldCacheVersionFile_data();
       
    78     void oldCacheVersionFile();
       
    79     
       
    80     void sync();
       
    81 };
       
    82 
       
    83 // Subclass that exposes the protected functions.
       
    84 class SubQNetworkDiskCache : public QNetworkDiskCache
       
    85 {
       
    86 public:
       
    87     ~SubQNetworkDiskCache()
       
    88     {
       
    89         if (!cacheDirectory().isEmpty())
       
    90             clear();
       
    91     }
       
    92 
       
    93     QNetworkCacheMetaData call_fileMetaData(QString const &fileName)
       
    94         { return SubQNetworkDiskCache::fileMetaData(fileName); }
       
    95 
       
    96     qint64 call_expire()
       
    97         { return SubQNetworkDiskCache::expire(); }
       
    98 
       
    99     void setupWithOne(const QUrl &url, const QNetworkCacheMetaData &metaData = QNetworkCacheMetaData())
       
   100     {
       
   101         setCacheDirectory(QDir::tempPath() + "/diskCache");
       
   102 
       
   103         QIODevice *d = 0;
       
   104         if (metaData.isValid()) {
       
   105             d = prepare(metaData);
       
   106         } else {
       
   107             QNetworkCacheMetaData m;
       
   108             m.setUrl(url);
       
   109             QNetworkCacheMetaData::RawHeader header("content-type", "text/html");
       
   110             QNetworkCacheMetaData::RawHeaderList list;
       
   111             list.append(header);
       
   112             m.setRawHeaders(list);
       
   113             d = prepare(m);
       
   114         }
       
   115         d->write("Hello World!");
       
   116         insert(d);
       
   117     }
       
   118 };
       
   119 
       
   120 // This will be called before the first test function is executed.
       
   121 // It is only called once.
       
   122 void tst_QNetworkDiskCache::initTestCase()
       
   123 {
       
   124     SubQNetworkDiskCache cache;
       
   125     cache.setCacheDirectory(QDir::tempPath() + "/diskCache");
       
   126     cache.clear();
       
   127     QString s = QDir::tempPath() + "/diskCache/";
       
   128     QDir dir;
       
   129     dir.rmdir(s + "http");
       
   130     dir.rmdir(s + "https");
       
   131     dir.rmdir(s + "prepared");
       
   132     dir.rmdir(s);
       
   133 }
       
   134 
       
   135 // This will be called after the last test function is executed.
       
   136 // It is only called once.
       
   137 void tst_QNetworkDiskCache::cleanupTestCase()
       
   138 {
       
   139 }
       
   140 
       
   141 // This will be called before each test function is executed.
       
   142 void tst_QNetworkDiskCache::init()
       
   143 {
       
   144 }
       
   145 
       
   146 // This will be called after every test function.
       
   147 void tst_QNetworkDiskCache::cleanup()
       
   148 {
       
   149 }
       
   150 
       
   151 void tst_QNetworkDiskCache::qnetworkdiskcache_data()
       
   152 {
       
   153 }
       
   154 
       
   155 void tst_QNetworkDiskCache::qnetworkdiskcache()
       
   156 {
       
   157     QUrl url(EXAMPLE_URL);
       
   158     SubQNetworkDiskCache cache;
       
   159     QCOMPARE(cache.cacheDirectory(), QString());
       
   160     QCOMPARE(cache.cacheSize(), qint64(0));
       
   161     cache.clear();
       
   162     QCOMPARE(cache.metaData(QUrl()), QNetworkCacheMetaData());
       
   163     QCOMPARE(cache.remove(QUrl()), false);
       
   164     QCOMPARE(cache.remove(url), false);
       
   165     cache.insert((QIODevice*)0);
       
   166     cache.setCacheDirectory(QString());
       
   167     cache.updateMetaData(QNetworkCacheMetaData());
       
   168     cache.prepare(QNetworkCacheMetaData());
       
   169     QCOMPARE(cache.call_fileMetaData(QString()), QNetworkCacheMetaData());
       
   170 
       
   171     // leave one hanging around...
       
   172     QNetworkDiskCache badCache;
       
   173     QNetworkCacheMetaData metaData;
       
   174     metaData.setUrl(url);
       
   175     badCache.prepare(metaData);
       
   176     badCache.setCacheDirectory(QDir::tempPath() + "/diskCache");
       
   177     badCache.prepare(metaData);
       
   178 }
       
   179 
       
   180 void tst_QNetworkDiskCache::prepare()
       
   181 {
       
   182     SubQNetworkDiskCache cache;
       
   183     cache.setCacheDirectory(QDir::tempPath() + "/diskCache");
       
   184 
       
   185     QUrl url(EXAMPLE_URL);
       
   186     QNetworkCacheMetaData metaData;
       
   187     metaData.setUrl(url);
       
   188 
       
   189     cache.prepare(metaData);
       
   190     cache.remove(url);
       
   191 }
       
   192 
       
   193 // public qint64 cacheSize() const
       
   194 void tst_QNetworkDiskCache::cacheSize()
       
   195 {
       
   196     SubQNetworkDiskCache cache;
       
   197     cache.setCacheDirectory(QDir::tempPath() + "/diskCache");
       
   198     QCOMPARE(cache.cacheSize(), qint64(0));
       
   199 
       
   200     QUrl url(EXAMPLE_URL);
       
   201     QNetworkCacheMetaData metaData;
       
   202     metaData.setUrl(url);
       
   203     QIODevice *d = cache.prepare(metaData);
       
   204     cache.insert(d);
       
   205     QVERIFY(cache.cacheSize() > qint64(0));
       
   206 
       
   207     cache.clear();
       
   208     QCOMPARE(cache.cacheSize(), qint64(0));
       
   209 }
       
   210 
       
   211 static QStringList countFiles(const QString dir)
       
   212 {
       
   213     QStringList list;
       
   214     QDir::Filters filter(QDir::AllEntries | QDir::NoDotAndDotDot);
       
   215     QDirIterator it(dir, filter, QDirIterator::Subdirectories);
       
   216     while (it.hasNext())
       
   217         list.append(it.next());
       
   218     return list;
       
   219 }
       
   220 
       
   221 // public void clear()
       
   222 void tst_QNetworkDiskCache::clear()
       
   223 {
       
   224     SubQNetworkDiskCache cache;
       
   225     QUrl url(EXAMPLE_URL);
       
   226     cache.setupWithOne(url);
       
   227     QVERIFY(cache.cacheSize() > qint64(0));
       
   228 
       
   229     QString cacheDirectory = cache.cacheDirectory();
       
   230     QCOMPARE(countFiles(cacheDirectory).count(), 3);
       
   231     cache.clear();
       
   232     QCOMPARE(countFiles(cacheDirectory).count(), 2);
       
   233 
       
   234     // don't delete files that it didn't create
       
   235     QTemporaryFile file(cacheDirectory + "/cache_XXXXXX");
       
   236     if (file.open()) {
       
   237         QCOMPARE(countFiles(cacheDirectory).count(), 3);
       
   238         cache.clear();
       
   239         QCOMPARE(countFiles(cacheDirectory).count(), 3);
       
   240     }
       
   241 }
       
   242 
       
   243 Q_DECLARE_METATYPE(QNetworkCacheMetaData)
       
   244 void tst_QNetworkDiskCache::data_data()
       
   245 {
       
   246     QTest::addColumn<QNetworkCacheMetaData>("data");
       
   247 
       
   248     QTest::newRow("null") << QNetworkCacheMetaData();
       
   249 
       
   250     QUrl url(EXAMPLE_URL);
       
   251     QNetworkCacheMetaData metaData;
       
   252     metaData.setUrl(url);
       
   253     QNetworkCacheMetaData::RawHeaderList headers;
       
   254     headers.append(QNetworkCacheMetaData::RawHeader("type", "bin"));
       
   255     metaData.setRawHeaders(headers);
       
   256     QTest::newRow("null") << metaData;
       
   257 }
       
   258 
       
   259 // public QIODevice* data(QUrl const& url)
       
   260 void tst_QNetworkDiskCache::data()
       
   261 {
       
   262 #ifdef Q_OS_SYMBIAN
       
   263     QSKIP("Due to mmap(...) bug in Open C [Temtrack DEF142242]", SkipAll);
       
   264 #endif
       
   265     QFETCH(QNetworkCacheMetaData, data);
       
   266     SubQNetworkDiskCache cache;
       
   267     QUrl url(EXAMPLE_URL);
       
   268     cache.setupWithOne(url, data);
       
   269 
       
   270     // flush the cache
       
   271     QTemporaryFile file(cache.cacheDirectory() + "/cache_XXXXXX.cache");
       
   272     if (file.open()) {
       
   273         cache.call_fileMetaData(file.fileName());
       
   274     }
       
   275 
       
   276     for (int i = 0; i < 3; ++i) {
       
   277         QIODevice *d = cache.data(url);
       
   278         QVERIFY(d);
       
   279         QCOMPARE(d->readAll(), QByteArray("Hello World!"));
       
   280         delete d;
       
   281     }
       
   282 }
       
   283 
       
   284 // public QNetworkCacheMetaData metaData(QUrl const& url)
       
   285 void tst_QNetworkDiskCache::metaData()
       
   286 {
       
   287     SubQNetworkDiskCache cache;
       
   288 
       
   289     QUrl url(EXAMPLE_URL);
       
   290     QNetworkCacheMetaData metaData;
       
   291     metaData.setUrl(url);
       
   292     QNetworkCacheMetaData::RawHeaderList headers;
       
   293     headers.append(QNetworkCacheMetaData::RawHeader("type", "bin"));
       
   294     metaData.setRawHeaders(headers);
       
   295     metaData.setLastModified(QDateTime::currentDateTime());
       
   296     metaData.setExpirationDate(QDateTime::currentDateTime());
       
   297     metaData.setSaveToDisk(true);
       
   298 
       
   299     cache.setupWithOne(url, metaData);
       
   300 
       
   301     for (int i = 0; i < 3; ++i) {
       
   302         QNetworkCacheMetaData cacheMetaData = cache.metaData(url);
       
   303         QVERIFY(cacheMetaData.isValid());
       
   304         QCOMPARE(metaData, cacheMetaData);
       
   305     }
       
   306 }
       
   307 
       
   308 // public bool remove(QUrl const& url)
       
   309 void tst_QNetworkDiskCache::remove()
       
   310 {
       
   311     SubQNetworkDiskCache cache;
       
   312     QUrl url(EXAMPLE_URL);
       
   313     cache.setupWithOne(url);
       
   314     QString cacheDirectory = cache.cacheDirectory();
       
   315     QCOMPARE(countFiles(cacheDirectory).count(), 3);
       
   316     cache.remove(url);
       
   317     QCOMPARE(countFiles(cacheDirectory).count(), 2);
       
   318 }
       
   319 
       
   320 void tst_QNetworkDiskCache::setCacheDirectory_data()
       
   321 {
       
   322     QTest::addColumn<QString>("cacheDir");
       
   323     QTest::newRow("null") << QString();
       
   324     QDir dir("foo");
       
   325     QTest::newRow("foo") << dir.absolutePath() + QString("/");
       
   326 }
       
   327 
       
   328 // public void setCacheDirectory(QString const& cacheDir)
       
   329 void tst_QNetworkDiskCache::setCacheDirectory()
       
   330 {
       
   331     QFETCH(QString, cacheDir);
       
   332 
       
   333     SubQNetworkDiskCache cache;
       
   334     cache.setCacheDirectory(cacheDir);
       
   335     QCOMPARE(cache.cacheDirectory(), cacheDir);
       
   336 }
       
   337 
       
   338 // public void updateMetaData(QNetworkCacheMetaData const& metaData)
       
   339 void tst_QNetworkDiskCache::updateMetaData()
       
   340 {
       
   341 #ifdef Q_OS_SYMBIAN
       
   342     QSKIP("Due to mmap(...) bug in Open C [Temtrack DEF142242]", SkipAll);
       
   343 #endif
       
   344     QUrl url(EXAMPLE_URL);
       
   345     SubQNetworkDiskCache cache;
       
   346     cache.setupWithOne(url);
       
   347 
       
   348     QNetworkCacheMetaData metaData = cache.metaData(url);
       
   349     metaData.setLastModified(QDateTime::currentDateTime());
       
   350     cache.updateMetaData(metaData);
       
   351     QNetworkCacheMetaData newMetaData = cache.metaData(url);
       
   352     QCOMPARE(newMetaData, metaData);
       
   353 }
       
   354 
       
   355 // protected QNetworkCacheMetaData fileMetaData(QString const& fileName)
       
   356 void tst_QNetworkDiskCache::fileMetaData()
       
   357 {
       
   358     SubQNetworkDiskCache cache;
       
   359     QUrl url(EXAMPLE_URL);
       
   360     cache.setupWithOne(url);
       
   361 
       
   362     url.setPassword(QString());
       
   363     url.setFragment(QString());
       
   364 
       
   365     QString cacheDirectory = cache.cacheDirectory();
       
   366     QStringList list = countFiles(cacheDirectory);
       
   367     QCOMPARE(list.count(), 3);
       
   368     foreach(QString fileName, list) {
       
   369         QFileInfo info(fileName);
       
   370         if (info.isFile()) {
       
   371             QNetworkCacheMetaData metaData = cache.call_fileMetaData(fileName);
       
   372             QCOMPARE(metaData.url(), url);
       
   373         }
       
   374     }
       
   375 
       
   376     QTemporaryFile file(cacheDirectory + "/qt_temp.XXXXXX");
       
   377     if (file.open()) {
       
   378         QNetworkCacheMetaData metaData = cache.call_fileMetaData(file.fileName());
       
   379         QVERIFY(!metaData.isValid());
       
   380     }
       
   381 }
       
   382 
       
   383 // protected qint64 expire()
       
   384 void tst_QNetworkDiskCache::expire()
       
   385 {
       
   386     SubQNetworkDiskCache cache;
       
   387     cache.setCacheDirectory(QDir::tempPath() + "/diskCache");
       
   388     QCOMPARE(cache.call_expire(), (qint64)0);
       
   389     QUrl url(EXAMPLE_URL);
       
   390     cache.setupWithOne(url);
       
   391     QVERIFY(cache.call_expire() > (qint64)0);
       
   392     qint64 limit = (1024 * 1024 / 4) * 5;
       
   393     cache.setMaximumCacheSize(limit);
       
   394 
       
   395     qint64 max = cache.maximumCacheSize();
       
   396     QCOMPARE(max, limit);
       
   397     for (int i = 0; i < 10; ++i) {
       
   398         if (i % 3 == 0)
       
   399             QTest::qWait(2000);
       
   400         QNetworkCacheMetaData m;
       
   401         m.setUrl(QUrl("http://www.foo.com/" + QString::number(i)));
       
   402         QIODevice *d = cache.prepare(m);
       
   403         QString bigString;
       
   404         bigString.fill(QLatin1Char('Z'), (1024 * 1024 / 4));
       
   405         d->write(bigString.toLatin1().data());
       
   406         cache.insert(d);
       
   407         QVERIFY(cache.call_expire() < max);
       
   408     }
       
   409 
       
   410     QString cacheDirectory = cache.cacheDirectory();
       
   411     QStringList list = countFiles(cacheDirectory);
       
   412     QStringList cacheList;
       
   413     foreach(QString fileName, list) {
       
   414         QFileInfo info(fileName);
       
   415         if (info.isFile()) {
       
   416             QNetworkCacheMetaData metaData = cache.call_fileMetaData(fileName);
       
   417             cacheList.append(metaData.url().toString());
       
   418         }
       
   419     }
       
   420     qSort(cacheList);
       
   421     for (int i = 0; i < cacheList.count(); ++i) {
       
   422         QString fileName = cacheList[i];
       
   423         QCOMPARE(fileName, QString("http://www.foo.com/%1").arg(i + 6));
       
   424     }
       
   425 }
       
   426 
       
   427 void tst_QNetworkDiskCache::oldCacheVersionFile_data()
       
   428 {
       
   429     QTest::addColumn<int>("pass");
       
   430     QTest::newRow("0") << 0;
       
   431     QTest::newRow("1") << 1;
       
   432 }
       
   433 
       
   434 void tst_QNetworkDiskCache::oldCacheVersionFile()
       
   435 {
       
   436     QFETCH(int, pass);
       
   437     SubQNetworkDiskCache cache;
       
   438     QUrl url(EXAMPLE_URL);
       
   439     cache.setupWithOne(url);
       
   440 
       
   441     if (pass == 0) {
       
   442         QString name;
       
   443         {
       
   444         QTemporaryFile file(cache.cacheDirectory() + "/cache_XXXXXX.cache");
       
   445         file.setAutoRemove(false);
       
   446         QVERIFY(file.open());
       
   447         QDataStream out(&file);
       
   448         out << qint32(0xe8);
       
   449         out << qint32(2);
       
   450         name = file.fileName();
       
   451         file.close();
       
   452         }
       
   453 
       
   454         QVERIFY(QFile::exists(name));
       
   455         QNetworkCacheMetaData metaData = cache.call_fileMetaData(name);
       
   456         QVERIFY(!metaData.isValid());
       
   457         QVERIFY(!QFile::exists(name));
       
   458     } else {
       
   459         QStringList files = countFiles(cache.cacheDirectory());
       
   460         QCOMPARE(files.count(), 3);
       
   461         // find the file
       
   462         QString cacheFile;
       
   463         foreach (QString file, files) {
       
   464             QFileInfo info(file);
       
   465             if (info.isFile())
       
   466                 cacheFile = file;
       
   467         }
       
   468         QVERIFY(QFile::exists(cacheFile));
       
   469 
       
   470         QFile file(cacheFile);
       
   471         QVERIFY(file.open(QFile::ReadWrite));
       
   472         QDataStream out(&file);
       
   473         out << qint32(0xe8);
       
   474         out << qint32(2);
       
   475         file.close();
       
   476 
       
   477         QIODevice *device = cache.data(url);
       
   478         QVERIFY(!device);
       
   479         QVERIFY(!QFile::exists(cacheFile));
       
   480     }
       
   481 }
       
   482 
       
   483 class Runner : public QThread
       
   484 {
       
   485 
       
   486 public:
       
   487     Runner()
       
   488         : QThread()
       
   489         , other(0)
       
   490     {}
       
   491 
       
   492     void run()
       
   493     {
       
   494         QByteArray longString = "Hello World, this is some long string, well not really that long";
       
   495         for (int j = 0; j < 10; ++j)
       
   496             longString += longString;
       
   497         QByteArray longString2 = "Help, I am stuck in an autotest!";
       
   498         QUrl url(EXAMPLE_URL);
       
   499 
       
   500         QNetworkCacheMetaData metaData;
       
   501         metaData.setUrl(url);
       
   502         QNetworkCacheMetaData::RawHeaderList headers;
       
   503         headers.append(QNetworkCacheMetaData::RawHeader("type", "bin"));
       
   504         metaData.setRawHeaders(headers);
       
   505         metaData.setLastModified(dt);
       
   506         metaData.setSaveToDisk(true);
       
   507 
       
   508         QNetworkCacheMetaData metaData2 = metaData;
       
   509         metaData2.setExpirationDate(dt);
       
   510 
       
   511         QNetworkDiskCache cache;
       
   512         cache.setCacheDirectory(QDir::tempPath() + "/diskCache");
       
   513 
       
   514         int read = 0;
       
   515 
       
   516         int i = 0;
       
   517         for (; i < 5000; ++i) {
       
   518             if (other && other->isFinished())
       
   519                 break;
       
   520 
       
   521             if (write) {
       
   522                 QNetworkCacheMetaData m;
       
   523                 if (qrand() % 2 == 0)
       
   524                     m = metaData;
       
   525                 else
       
   526                     m = metaData2;
       
   527 
       
   528                 if (qrand() % 20 == 1) {
       
   529                     //qDebug() << "write update";
       
   530                     cache.updateMetaData(m);
       
   531                     continue;
       
   532                 }
       
   533 
       
   534                 QIODevice *device = cache.prepare(m);
       
   535                 if (qrand() % 20 == 1) {
       
   536                     //qDebug() << "write remove";
       
   537                     cache.remove(url);
       
   538                     continue;
       
   539                 }
       
   540                 QVERIFY(device);
       
   541                 if (qrand() % 2 == 0)
       
   542                     device->write(longString);
       
   543                 else
       
   544                     device->write(longString2);
       
   545                 //qDebug() << "write write" << device->size();
       
   546                 cache.insert(device);
       
   547                 continue;
       
   548             }
       
   549 
       
   550             QNetworkCacheMetaData gotMetaData = cache.metaData(url);
       
   551             if (gotMetaData.isValid()) {
       
   552                 QVERIFY(gotMetaData == metaData || gotMetaData == metaData2);
       
   553                 QIODevice *d = cache.data(url);
       
   554                 if (d) {
       
   555                     QByteArray x = d->readAll();
       
   556                     if (x != longString && x != longString2) {
       
   557                         qDebug() << x.length() << QString(x);
       
   558                         gotMetaData = cache.metaData(url);
       
   559                         qDebug() << (gotMetaData.url().toString())
       
   560                          << gotMetaData.lastModified()
       
   561                          << gotMetaData.expirationDate()
       
   562                          << gotMetaData.saveToDisk();
       
   563                     }
       
   564                     if (gotMetaData.isValid())
       
   565                         QVERIFY(x == longString || x == longString2);
       
   566                     read++;
       
   567                     delete d;
       
   568                 }
       
   569             }
       
   570             if (qrand() % 5 == 1)
       
   571                 cache.remove(url);
       
   572             if (qrand() % 5 == 1)
       
   573                 cache.clear();
       
   574             sleep(0);
       
   575         }
       
   576         //qDebug() << "read!" << read << i;
       
   577     }
       
   578 
       
   579     QDateTime dt;
       
   580     bool write;
       
   581     Runner *other;
       
   582 };
       
   583 
       
   584 void tst_QNetworkDiskCache::sync()
       
   585 {
       
   586     // This tests would be a nice to have, but is currently not supported.
       
   587     return;
       
   588 
       
   589     QTime midnight(0, 0, 0);
       
   590     qsrand(midnight.secsTo(QTime::currentTime()));
       
   591     Runner reader;
       
   592     reader.dt = QDateTime::currentDateTime();
       
   593     reader.write = false;
       
   594 
       
   595     Runner writer;
       
   596     writer.dt = reader.dt;
       
   597     writer.write = true;
       
   598 
       
   599     writer.other = &reader;
       
   600     reader.other = &writer;
       
   601 
       
   602     writer.start();
       
   603     reader.start();
       
   604     writer.wait();
       
   605     reader.wait();
       
   606 }
       
   607 
       
   608 QTEST_MAIN(tst_QNetworkDiskCache)
       
   609 #include "tst_qnetworkdiskcache.moc"
       
   610