From 12a5ddf456ba8549645a8cb28a8b4ed6197a14da Mon Sep 17 00:00:00 2001 From: Matthew Vogt Date: Mon, 30 Jan 2012 14:16:15 +1000 Subject: Import relevant source from Qt 4.8 Change-Id: I5078db4081d95290c54f39d3c0efc2fc2f62e6a6 --- .../qdeclarativepixmapcache/data/exists.png | Bin 0 -> 2738 bytes .../qdeclarativepixmapcache/data/exists1.png | Bin 0 -> 2738 bytes .../qdeclarativepixmapcache/data/exists2.png | Bin 0 -> 2738 bytes .../qdeclarativepixmapcache/data/http/exists.png | Bin 0 -> 2738 bytes .../qdeclarativepixmapcache/data/http/exists1.png | Bin 0 -> 2738 bytes .../qdeclarativepixmapcache/data/http/exists2.png | Bin 0 -> 2738 bytes .../qdeclarativepixmapcache/data/http/exists3.png | Bin 0 -> 2738 bytes .../qdeclarativepixmapcache/data/http/exists4.png | Bin 0 -> 2738 bytes .../qdeclarativepixmapcache/data/http/exists5.png | Bin 0 -> 2738 bytes .../qdeclarativepixmapcache/data/massive.png | Bin 0 -> 31834 bytes .../qdeclarativepixmapcache.pro | 24 ++ .../tst_qdeclarativepixmapcache.cpp | 396 +++++++++++++++++++++ 12 files changed, 420 insertions(+) create mode 100644 tests/auto/declarative/qdeclarativepixmapcache/data/exists.png create mode 100644 tests/auto/declarative/qdeclarativepixmapcache/data/exists1.png create mode 100644 tests/auto/declarative/qdeclarativepixmapcache/data/exists2.png create mode 100644 tests/auto/declarative/qdeclarativepixmapcache/data/http/exists.png create mode 100644 tests/auto/declarative/qdeclarativepixmapcache/data/http/exists1.png create mode 100644 tests/auto/declarative/qdeclarativepixmapcache/data/http/exists2.png create mode 100644 tests/auto/declarative/qdeclarativepixmapcache/data/http/exists3.png create mode 100644 tests/auto/declarative/qdeclarativepixmapcache/data/http/exists4.png create mode 100644 tests/auto/declarative/qdeclarativepixmapcache/data/http/exists5.png create mode 100644 tests/auto/declarative/qdeclarativepixmapcache/data/massive.png create mode 100644 tests/auto/declarative/qdeclarativepixmapcache/qdeclarativepixmapcache.pro create mode 100644 tests/auto/declarative/qdeclarativepixmapcache/tst_qdeclarativepixmapcache.cpp (limited to 'tests/auto/declarative/qdeclarativepixmapcache') diff --git a/tests/auto/declarative/qdeclarativepixmapcache/data/exists.png b/tests/auto/declarative/qdeclarativepixmapcache/data/exists.png new file mode 100644 index 00000000..399bd0b1 Binary files /dev/null and b/tests/auto/declarative/qdeclarativepixmapcache/data/exists.png differ diff --git a/tests/auto/declarative/qdeclarativepixmapcache/data/exists1.png b/tests/auto/declarative/qdeclarativepixmapcache/data/exists1.png new file mode 100644 index 00000000..399bd0b1 Binary files /dev/null and b/tests/auto/declarative/qdeclarativepixmapcache/data/exists1.png differ diff --git a/tests/auto/declarative/qdeclarativepixmapcache/data/exists2.png b/tests/auto/declarative/qdeclarativepixmapcache/data/exists2.png new file mode 100644 index 00000000..399bd0b1 Binary files /dev/null and b/tests/auto/declarative/qdeclarativepixmapcache/data/exists2.png differ diff --git a/tests/auto/declarative/qdeclarativepixmapcache/data/http/exists.png b/tests/auto/declarative/qdeclarativepixmapcache/data/http/exists.png new file mode 100644 index 00000000..399bd0b1 Binary files /dev/null and b/tests/auto/declarative/qdeclarativepixmapcache/data/http/exists.png differ diff --git a/tests/auto/declarative/qdeclarativepixmapcache/data/http/exists1.png b/tests/auto/declarative/qdeclarativepixmapcache/data/http/exists1.png new file mode 100644 index 00000000..399bd0b1 Binary files /dev/null and b/tests/auto/declarative/qdeclarativepixmapcache/data/http/exists1.png differ diff --git a/tests/auto/declarative/qdeclarativepixmapcache/data/http/exists2.png b/tests/auto/declarative/qdeclarativepixmapcache/data/http/exists2.png new file mode 100644 index 00000000..399bd0b1 Binary files /dev/null and b/tests/auto/declarative/qdeclarativepixmapcache/data/http/exists2.png differ diff --git a/tests/auto/declarative/qdeclarativepixmapcache/data/http/exists3.png b/tests/auto/declarative/qdeclarativepixmapcache/data/http/exists3.png new file mode 100644 index 00000000..399bd0b1 Binary files /dev/null and b/tests/auto/declarative/qdeclarativepixmapcache/data/http/exists3.png differ diff --git a/tests/auto/declarative/qdeclarativepixmapcache/data/http/exists4.png b/tests/auto/declarative/qdeclarativepixmapcache/data/http/exists4.png new file mode 100644 index 00000000..399bd0b1 Binary files /dev/null and b/tests/auto/declarative/qdeclarativepixmapcache/data/http/exists4.png differ diff --git a/tests/auto/declarative/qdeclarativepixmapcache/data/http/exists5.png b/tests/auto/declarative/qdeclarativepixmapcache/data/http/exists5.png new file mode 100644 index 00000000..399bd0b1 Binary files /dev/null and b/tests/auto/declarative/qdeclarativepixmapcache/data/http/exists5.png differ diff --git a/tests/auto/declarative/qdeclarativepixmapcache/data/massive.png b/tests/auto/declarative/qdeclarativepixmapcache/data/massive.png new file mode 100644 index 00000000..bc6cc9e6 Binary files /dev/null and b/tests/auto/declarative/qdeclarativepixmapcache/data/massive.png differ diff --git a/tests/auto/declarative/qdeclarativepixmapcache/qdeclarativepixmapcache.pro b/tests/auto/declarative/qdeclarativepixmapcache/qdeclarativepixmapcache.pro new file mode 100644 index 00000000..88871e95 --- /dev/null +++ b/tests/auto/declarative/qdeclarativepixmapcache/qdeclarativepixmapcache.pro @@ -0,0 +1,24 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative +QT += network +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativepixmapcache.cpp + +INCLUDEPATH += ../shared/ +HEADERS += ../shared/testhttpserver.h +SOURCES += ../shared/testhttpserver.cpp + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +# QMAKE_CXXFLAGS = -fprofile-arcs -ftest-coverage +# LIBS += -lgcov + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativepixmapcache/tst_qdeclarativepixmapcache.cpp b/tests/auto/declarative/qdeclarativepixmapcache/tst_qdeclarativepixmapcache.cpp new file mode 100644 index 00000000..6609485f --- /dev/null +++ b/tests/auto/declarative/qdeclarativepixmapcache/tst_qdeclarativepixmapcache.cpp @@ -0,0 +1,396 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include "testhttpserver.h" +#include "../../../shared/util.h" + +#ifndef QT_NO_CONCURRENT +#include +#include +#endif + +// These don't let normal people run tests! +//#include "../network-settings.h" + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_qdeclarativepixmapcache : public QObject +{ + Q_OBJECT +public: + tst_qdeclarativepixmapcache() : + thisfile(QUrl::fromLocalFile(__FILE__)), + server(14452) + { + server.serveDirectory(SRCDIR "/data/http"); + } + +private slots: + void single(); + void single_data(); + void parallel(); + void parallel_data(); + void massive(); + void cancelcrash(); + void shrinkcache(); +#ifndef QT_NO_CONCURRENT + void networkCrash(); +#endif +private: + QDeclarativeEngine engine; + QUrl thisfile; + TestHTTPServer server; +}; + + +static int slotters=0; + +class Slotter : public QObject +{ + Q_OBJECT +public: + Slotter() + { + gotslot = false; + slotters++; + } + bool gotslot; + +public slots: + void got() + { + gotslot = true; + --slotters; + if (slotters==0) + QTestEventLoop::instance().exitLoop(); + } +}; + +#ifndef QT_NO_LOCALFILE_OPTIMIZED_QML +static const bool localfile_optimized = true; +#else +static const bool localfile_optimized = false; +#endif + +void tst_qdeclarativepixmapcache::single_data() +{ + // Note, since QDeclarativePixmapCache is shared, tests affect each other! + // so use different files fore all test functions. + + QTest::addColumn("target"); + QTest::addColumn("incache"); + QTest::addColumn("exists"); + QTest::addColumn("neterror"); + + // File URLs are optimized + QTest::newRow("local") << thisfile.resolved(QUrl("data/exists.png")) << localfile_optimized << true << false; + QTest::newRow("local") << thisfile.resolved(QUrl("data/notexists.png")) << localfile_optimized << false << false; + QTest::newRow("remote") << QUrl("http://127.0.0.1:14452/exists.png") << false << true << false; + QTest::newRow("remote") << QUrl("http://127.0.0.1:14452/notexists.png") << false << false << true; +} + +void tst_qdeclarativepixmapcache::single() +{ + QFETCH(QUrl, target); + QFETCH(bool, incache); + QFETCH(bool, exists); + QFETCH(bool, neterror); + + QString expectedError; + if (neterror) { + expectedError = "Error downloading " + target.toString() + " - server replied: Not found"; + } else if (!exists) { + expectedError = "Cannot open: " + target.toString(); + } + + QDeclarativePixmap pixmap; + QVERIFY(pixmap.width() <= 0); // Check Qt assumption + + pixmap.load(&engine, target); + + if (incache) { + QCOMPARE(pixmap.error(), expectedError); + if (exists) { + QVERIFY(pixmap.status() == QDeclarativePixmap::Ready); + QVERIFY(pixmap.width() > 0); + } else { + QVERIFY(pixmap.status() == QDeclarativePixmap::Error); + QVERIFY(pixmap.width() <= 0); + } + } else { + QVERIFY(pixmap.width() <= 0); + + Slotter getter; + pixmap.connectFinished(&getter, SLOT(got())); + QTestEventLoop::instance().enterLoop(10); + QVERIFY(!QTestEventLoop::instance().timeout()); + QVERIFY(getter.gotslot); + if (exists) { + QVERIFY(pixmap.status() == QDeclarativePixmap::Ready); + QVERIFY(pixmap.width() > 0); + } else { + QVERIFY(pixmap.status() == QDeclarativePixmap::Error); + QVERIFY(pixmap.width() <= 0); + } + QCOMPARE(pixmap.error(), expectedError); + } +} + +void tst_qdeclarativepixmapcache::parallel_data() +{ + // Note, since QDeclarativePixmapCache is shared, tests affect each other! + // so use different files fore all test functions. + + QTest::addColumn("target1"); + QTest::addColumn("target2"); + QTest::addColumn("incache"); + QTest::addColumn("cancel"); // which one to cancel + + QTest::newRow("local") + << thisfile.resolved(QUrl("data/exists1.png")) + << thisfile.resolved(QUrl("data/exists2.png")) + << (localfile_optimized ? 2 : 0) + << -1; + + QTest::newRow("remote") + << QUrl("http://127.0.0.1:14452/exists2.png") + << QUrl("http://127.0.0.1:14452/exists3.png") + << 0 + << -1; + + QTest::newRow("remoteagain") + << QUrl("http://127.0.0.1:14452/exists2.png") + << QUrl("http://127.0.0.1:14452/exists3.png") + << 2 + << -1; + + QTest::newRow("remotecopy") + << QUrl("http://127.0.0.1:14452/exists4.png") + << QUrl("http://127.0.0.1:14452/exists4.png") + << 0 + << -1; + + QTest::newRow("remotecopycancel") + << QUrl("http://127.0.0.1:14452/exists5.png") + << QUrl("http://127.0.0.1:14452/exists5.png") + << 0 + << 0; +} + +void tst_qdeclarativepixmapcache::parallel() +{ + QFETCH(QUrl, target1); + QFETCH(QUrl, target2); + QFETCH(int, incache); + QFETCH(int, cancel); + + QList targets; + targets << target1 << target2; + + QList pixmaps; + QList pending; + QList getters; + + for (int i=0; iload(&engine, target); + + QVERIFY(pixmap->status() != QDeclarativePixmap::Error); + pixmaps.append(pixmap); + if (pixmap->isReady()) { + QVERIFY(pixmap->width() > 0); + getters.append(0); + pending.append(false); + } else { + QVERIFY(pixmap->width() <= 0); + getters.append(new Slotter); + pixmap->connectFinished(getters[i], SLOT(got())); + pending.append(true); + } + } + + QCOMPARE(incache+slotters, targets.count()); + + if (cancel >= 0) { + pixmaps.at(cancel)->clear(getters[cancel]); + slotters--; + } + + if (slotters) { + QTestEventLoop::instance().enterLoop(10); + QVERIFY(!QTestEventLoop::instance().timeout()); + } + + for (int i=0; igotslot); + } else { + if (pending[i]) + QVERIFY(getters[i]->gotslot); + + QVERIFY(pixmap->isReady()); + QVERIFY(pixmap->width() > 0); + delete getters[i]; + } + } + + qDeleteAll(pixmaps); +} + +void tst_qdeclarativepixmapcache::massive() +{ + QUrl url = thisfile.resolved(QUrl("data/massive.png")); + + // Confirm that massive images remain in the cache while they are + // in use by the application. + { + qint64 cachekey = 0; + QDeclarativePixmap p(0, url); + QVERIFY(p.isReady()); + QVERIFY(p.pixmap().size() == QSize(10000, 1000)); + cachekey = p.pixmap().cacheKey(); + + QDeclarativePixmap p2(0, url); + QVERIFY(p2.isReady()); + QVERIFY(p2.pixmap().size() == QSize(10000, 1000)); + + QVERIFY(p2.pixmap().cacheKey() == cachekey); + } + + // Confirm that massive images are removed from the cache when + // they become unused + { + qint64 cachekey = 0; + { + QDeclarativePixmap p(0, url); + QVERIFY(p.isReady()); + QVERIFY(p.pixmap().size() == QSize(10000, 1000)); + cachekey = p.pixmap().cacheKey(); + } + + QDeclarativePixmap p2(0, url); + QVERIFY(p2.isReady()); + QVERIFY(p2.pixmap().size() == QSize(10000, 1000)); + + QVERIFY(p2.pixmap().cacheKey() != cachekey); + } +} + +// QTBUG-12729 +void tst_qdeclarativepixmapcache::cancelcrash() +{ + QUrl url("http://127.0.0.1:14452/cancelcrash_notexist.png"); + for (int ii = 0; ii < 1000; ++ii) { + QDeclarativePixmap pix(&engine, url); + } +} + +class MyPixmapProvider : public QDeclarativeImageProvider +{ +public: + MyPixmapProvider() + : QDeclarativeImageProvider(Pixmap) {} + + virtual QPixmap requestPixmap(const QString &d, QSize *, const QSize &) { + Q_UNUSED(d) + QPixmap pix(800, 600); + pix.fill(Qt::red); + return pix; + } +}; + +// QTBUG-13345 +void tst_qdeclarativepixmapcache::shrinkcache() +{ + QDeclarativeEngine engine; + engine.addImageProvider(QLatin1String("mypixmaps"), new MyPixmapProvider); + + for (int ii = 0; ii < 4000; ++ii) { + QUrl url("image://mypixmaps/" + QString::number(ii)); + QDeclarativePixmap p(&engine, url); + } +} + +#ifndef QT_NO_CONCURRENT + +void createNetworkServer() +{ + QEventLoop eventLoop; + TestHTTPServer server(14453); + server.serveDirectory(SRCDIR "/data/http"); + QTimer::singleShot(100, &eventLoop, SLOT(quit())); + eventLoop.exec(); +} + +#ifndef QT_NO_CONCURRENT +// QT-3957 +void tst_qdeclarativepixmapcache::networkCrash() +{ + QFuture future = QtConcurrent::run(createNetworkServer); + QDeclarativeEngine engine; + for (int ii = 0; ii < 100 ; ++ii) { + QDeclarativePixmap* pixmap = new QDeclarativePixmap; + pixmap->load(&engine, QUrl(QString("http://127.0.0.1:14453/exists.png"))); + QTest::qSleep(1); + pixmap->clear(); + delete pixmap; + } + future.cancel(); +} +#endif + +#endif + +QTEST_MAIN(tst_qdeclarativepixmapcache) + +#include "tst_qdeclarativepixmapcache.moc" -- cgit v1.2.3