Fix tests of QMimeDatabase.

- Use temporary directories to avoid instabilities
  due to remains of previous failed tests and locked
  directories.
- Replace SRCDIR by QFINDTESTDATA(), reference only
  the freedesktop.org.xml contained in the Qt source
  tree by $$QT.corelib.sources.
- Improve some error messages, test suite instructions
  for Windows.

Change-Id: Idee8e3767ef0a8299df3bdaaac20334164878db0
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Reviewed-by: David Faure <faure@kde.org>
This commit is contained in:
Friedemann Kleint 2012-02-24 14:18:08 +01:00 committed by Qt by Nokia
parent 39e616c159
commit bcb0f28a4d
7 changed files with 121 additions and 65 deletions

View File

@ -7,6 +7,6 @@ QT = core testlib concurrent
SOURCES = tst_qmimedatabase-cache.cpp SOURCES = tst_qmimedatabase-cache.cpp
HEADERS = ../tst_qmimedatabase.h HEADERS = ../tst_qmimedatabase.h
DEFINES += SRCDIR='"\\"$$PWD/../\\""' DEFINES += CORE_SOURCES='"\\"$$QT.core.sources\\""'
*-g++*:QMAKE_CXXFLAGS += -W -Wall -Wextra -Werror -Wshadow -Wno-long-long -Wnon-virtual-dtor *-g++*:QMAKE_CXXFLAGS += -W -Wall -Wextra -Werror -Wshadow -Wno-long-long -Wnon-virtual-dtor

View File

@ -47,10 +47,9 @@
#include "../tst_qmimedatabase.cpp" #include "../tst_qmimedatabase.cpp"
tst_QMimeDatabase::tst_QMimeDatabase() void tst_QMimeDatabase::init()
{ {
QDir here = QDir::currentPath(); const QString mimeDirName = m_globalXdgDir + QStringLiteral("/mime");
const QString tempMime = here.absolutePath() + QString::fromLatin1("/mime"); runUpdateMimeDatabase(mimeDirName);
runUpdateMimeDatabase(tempMime); QVERIFY(QFile::exists(mimeDirName + QStringLiteral("/mime.cache")));
QVERIFY(QFile::exists(tempMime + QString::fromLatin1("/mime.cache")));
} }

View File

@ -9,6 +9,6 @@ CONFIG += depend_includepath
SOURCES += tst_qmimedatabase-xml.cpp SOURCES += tst_qmimedatabase-xml.cpp
HEADERS += ../tst_qmimedatabase.h HEADERS += ../tst_qmimedatabase.h
DEFINES += SRCDIR='"\\"$$PWD/../\\""' DEFINES += CORE_SOURCES='"\\"$$QT.core.sources\\""'
*-g++*:QMAKE_CXXFLAGS += -W -Wall -Wextra -Werror -Wshadow -Wno-long-long -Wnon-virtual-dtor *-g++*:QMAKE_CXXFLAGS += -W -Wall -Wextra -Werror -Wshadow -Wno-long-long -Wnon-virtual-dtor

View File

@ -40,10 +40,8 @@
****************************************************************************/ ****************************************************************************/
#include "../tst_qmimedatabase.h" #include "../tst_qmimedatabase.h"
#include <QDebug>
#include <QDir>
tst_QMimeDatabase::tst_QMimeDatabase() void tst_QMimeDatabase::init()
{ {
qputenv("QT_NO_MIME_CACHE", "1"); qputenv("QT_NO_MIME_CACHE", "1");
} }

View File

@ -1,3 +1,3 @@
TEMPLATE = subdirs TEMPLATE = subdirs
SUBDIRS = qmimedatabase-xml SUBDIRS = qmimedatabase-xml
unix: SUBDIRS += qmimedatabase-cache unix:!mac: SUBDIRS += qmimedatabase-cache

View File

@ -44,49 +44,85 @@
#include "qstandardpaths.h" #include "qstandardpaths.h"
#include <QtCore/QFile> #include <QtCore/QFile>
#include <QtCore/QFileInfo>
#include <QtCore/QTextStream>
#include <QtConcurrent/QtConcurrentRun> #include <QtConcurrent/QtConcurrentRun>
#include <QtConcurrent/QFuture> #include <QtConcurrent/QFuture>
#include <QtTest/QtTest> #include <QtTest/QtTest>
static const char yastFileName[] ="yast2-metapackage-handler-mimetypes.xml";
void initializeLang() void initializeLang()
{ {
qputenv("LC_ALL", ""); qputenv("LC_ALL", "");
qputenv("LANG", "en_US"); qputenv("LANG", "en_US");
QCoreApplication::setApplicationName("tst_qmimedatabase"); // temporary directory pattern
}
static inline QString testSuiteWarning()
{
QString result;
QTextStream str(&result);
str << "\nCannot find the shared-mime-info test suite\nstarting from: "
<< QDir::toNativeSeparators(QDir::currentPath()) << "\n"
"cd " << QDir::toNativeSeparators(QStringLiteral("tests/auto/corelib/mimetypes/qmimedatabase")) << "\n"
"wget http://cgit.freedesktop.org/xdg/shared-mime-info/snapshot/Release-1-0.zip\n"
"unzip Release-1-0.zip\n";
#ifdef Q_OS_WIN
str << "mkdir testfiles\nxcopy /s Release-1-0\\tests testfiles\n";
#else
str << "ln -s Release-1-0/tests testfiles\n";
#endif
return result;
} }
// Set LANG before QCoreApplication is created // Set LANG before QCoreApplication is created
Q_CONSTRUCTOR_FUNCTION(initializeLang) Q_CONSTRUCTOR_FUNCTION(initializeLang)
tst_QMimeDatabase::tst_QMimeDatabase()
{
}
void tst_QMimeDatabase::initTestCase() void tst_QMimeDatabase::initTestCase()
{ {
QVERIFY(m_temporaryDir.isValid());
// Create a "global" and a "local" XDG data dir, right here. // Create a "global" and a "local" XDG data dir, right here.
// The local dir will be empty initially, while the global dir will contain a copy of freedesktop.org.xml // The local dir will be empty initially, while the global dir will contain a copy of freedesktop.org.xml
QDir here = QDir::currentPath(); const QDir here = QDir(m_temporaryDir.path());
qputenv("XDG_DATA_DIRS", QFile::encodeName(here.absolutePath())); m_globalXdgDir = m_temporaryDir.path() + QStringLiteral("/global");
QDir(here.absolutePath() + "/mime").removeRecursively(); m_localXdgDir = m_temporaryDir.path() + QStringLiteral("/local");
here.mkpath(QString::fromLatin1("mime/packages"));
QFile xml(QFile::decodeName(SRCDIR "../../../src/mimetypes/mime/packages/freedesktop.org.xml")); const QString globalPackageDir = m_globalXdgDir + QStringLiteral("/mime/packages");
const QString mimeDir = here.absolutePath() + QLatin1String("/mime"); QVERIFY(here.mkpath(globalPackageDir) && here.mkpath(m_localXdgDir));
xml.copy(mimeDir + QLatin1String("/packages/freedesktop.org.xml"));
m_dataHome = here.absolutePath() + QLatin1String("/../datahome"); qputenv("XDG_DATA_DIRS", QFile::encodeName(m_globalXdgDir));
qputenv("XDG_DATA_HOME", QFile::encodeName(m_dataHome)); qputenv("XDG_DATA_HOME", QFile::encodeName(m_localXdgDir));
//qDebug() << "XDG_DATA_HOME=" << m_dataHome; qDebug() << "\nLocal XDG_DATA_HOME: " << m_localXdgDir
<< "\nGlobal XDG_DATA_DIRS: " << m_globalXdgDir;
// Make sure we start clean const QString freeDesktopXml = QStringLiteral("freedesktop.org.xml");
cleanupTestCase(); const QString xmlFileName = QLatin1String(CORE_SOURCES)
} + QStringLiteral("/mimetypes/mime/packages/")
+ freeDesktopXml;
QVERIFY2(QFileInfo(xmlFileName).exists(), qPrintable(xmlFileName + QStringLiteral(" does not exist")));
QFile xml(xmlFileName);
QVERIFY(xml.copy(globalPackageDir + '/' + freeDesktopXml));
void tst_QMimeDatabase::cleanupTestCase() m_testSuite = QFINDTESTDATA("testfiles");
{ if (m_testSuite.isEmpty())
QDir here = QDir::currentPath(); qWarning("%s", qPrintable(testSuiteWarning()));
here.remove(QString::fromLatin1("mime/packages/yast2-metapackage-handler-mimetypes.xml"));
QDir(m_dataHome).removeRecursively(); m_yastMimeTypes = QFINDTESTDATA(yastFileName);
QVERIFY2(!m_yastMimeTypes.isEmpty(),
qPrintable(QString::fromLatin1("Cannot find '%1' starting from '%2'").
arg(yastFileName, QDir::currentPath())));
init();
} }
void tst_QMimeDatabase::mimeTypeForName() void tst_QMimeDatabase::mimeTypeForName()
@ -173,6 +209,19 @@ void tst_QMimeDatabase::mimeTypeForFileName_data()
QTest::newRow("doesn't exist but has known extension") << "IDontExist.txt" << "text/plain"; QTest::newRow("doesn't exist but has known extension") << "IDontExist.txt" << "text/plain";
} }
static inline QByteArray msgMimeTypeForFileNameFailed(const QList<QMimeType> &actual,
const QString &expected)
{
QByteArray result = "Actual (";
foreach (const QMimeType &m, actual) {
result += m.name().toLocal8Bit();
result += ' ';
}
result += ") , expected: ";
result += expected.toLocal8Bit();
return result;
}
void tst_QMimeDatabase::mimeTypeForFileName() void tst_QMimeDatabase::mimeTypeForFileName()
{ {
QFETCH(QString, fileName); QFETCH(QString, fileName);
@ -186,8 +235,8 @@ void tst_QMimeDatabase::mimeTypeForFileName()
if (expectedMimeType == "application/octet-stream") { if (expectedMimeType == "application/octet-stream") {
QVERIFY(mimes.isEmpty()); QVERIFY(mimes.isEmpty());
} else { } else {
QVERIFY(!mimes.isEmpty()); QVERIFY2(!mimes.isEmpty(), msgMimeTypeForFileNameFailed(mimes, expectedMimeType).constData());
QCOMPARE(mimes.count(), 1); QVERIFY2(mimes.count() == 1, msgMimeTypeForFileNameFailed(mimes, expectedMimeType).constData());
QCOMPARE(mimes.first().name(), expectedMimeType); QCOMPARE(mimes.first().name(), expectedMimeType);
} }
} }
@ -549,20 +598,14 @@ void tst_QMimeDatabase::findByFileName_data()
QTest::addColumn<QString>("mimeTypeName"); QTest::addColumn<QString>("mimeTypeName");
QTest::addColumn<QString>("xFail"); QTest::addColumn<QString>("xFail");
QString prefix = QLatin1String(SRCDIR "testfiles/"); if (m_testSuite.isEmpty())
QFile f(prefix + QLatin1String("list"));
if (!f.open(QIODevice::ReadOnly)) {
const QString warning = QString::fromLatin1(
"Please download the shared-mime-info test suite:\n"
"cd tests/auto/corelib/mimetypes/qmimedatabase\n"
"wget http://cgit.freedesktop.org/xdg/shared-mime-info/snapshot/Release-1-0.zip\n"
"unzip Release-1-0.zip\n"
"ln -s Release-1-0/tests testfiles\n"
);
qWarning() << warning;
QSKIP("shared-mime-info test suite not available."); QSKIP("shared-mime-info test suite not available.");
}
const QString prefix = m_testSuite + QLatin1Char('/');
const QString fileName = prefix + QLatin1String("list");
QFile f(fileName);
QVERIFY2(f.open(QIODevice::ReadOnly|QIODevice::Text),
qPrintable(QString::fromLatin1("Cannot open %1: %2").arg(fileName, f.errorString())));
QByteArray line(1024, Qt::Uninitialized); QByteArray line(1024, Qt::Uninitialized);
@ -582,7 +625,9 @@ void tst_QMimeDatabase::findByFileName_data()
if (list.size() >= 3) if (list.size() >= 3)
xFail = list.at(2); xFail = list.at(2);
QTest::newRow(filePath.toLatin1().constData()) << QString(prefix + filePath) << mimeTypeType << xFail; QTest::newRow(filePath.toLatin1().constData())
<< QString(prefix + filePath)
<< mimeTypeType << xFail;
} }
} }
@ -717,13 +762,21 @@ void tst_QMimeDatabase::fromThreads()
static bool runUpdateMimeDatabase(const QString &path) // TODO make it a QMimeDatabase method? static bool runUpdateMimeDatabase(const QString &path) // TODO make it a QMimeDatabase method?
{ {
const QString umd = QStandardPaths::findExecutable(QString::fromLatin1("update-mime-database")); const QString umdCommand = QString::fromLatin1("update-mime-database");
if (umd.isEmpty()) const QString umd = QStandardPaths::findExecutable(umdCommand);
if (umd.isEmpty()) {
qWarning("%s does not exist.", qPrintable(umdCommand));
return false; return false;
}
QProcess proc; QProcess proc;
proc.setProcessChannelMode(QProcess::MergedChannels); // silence output proc.setProcessChannelMode(QProcess::MergedChannels); // silence output
proc.start(umd, QStringList() << path); proc.start(umd, QStringList(path));
if (!proc.waitForStarted()) {
qWarning("Cannot start %s: %s",
qPrintable(umd), qPrintable(proc.errorString()));
return false;
}
proc.waitForFinished(); proc.waitForFinished();
//qDebug() << "runUpdateMimeDatabase" << path; //qDebug() << "runUpdateMimeDatabase" << path;
return true; return true;
@ -733,7 +786,7 @@ static bool waitAndRunUpdateMimeDatabase(const QString &path)
{ {
QFileInfo mimeCacheInfo(path + QString::fromLatin1("/mime.cache")); QFileInfo mimeCacheInfo(path + QString::fromLatin1("/mime.cache"));
if (mimeCacheInfo.exists()) { if (mimeCacheInfo.exists()) {
// Wait until the begining of the next second // Wait until the beginning of the next second
while (mimeCacheInfo.lastModified().secsTo(QDateTime::currentDateTime()) == 0) { while (mimeCacheInfo.lastModified().secsTo(QDateTime::currentDateTime()) == 0) {
QTest::qSleep(200); QTest::qSleep(200);
} }
@ -767,16 +820,15 @@ void tst_QMimeDatabase::installNewGlobalMimeType()
QMimeDatabase db; QMimeDatabase db;
QVERIFY(!db.mimeTypeForName(QLatin1String("text/x-suse-ymp")).isValid()); QVERIFY(!db.mimeTypeForName(QLatin1String("text/x-suse-ymp")).isValid());
const QString fileName = QLatin1String("yast2-metapackage-handler-mimetypes.xml"); const QString mimeDir = m_globalXdgDir + QLatin1String("/mime");
const QString srcFile = QFile::decodeName(SRCDIR) + fileName;
QDir here = QDir::currentPath();
const QString mimeDir = here.absolutePath() + QLatin1String("/mime");
const QString destDir = mimeDir + QLatin1String("/packages/"); const QString destDir = mimeDir + QLatin1String("/packages/");
const QString destFile = destDir + fileName; const QString destFile = destDir + QLatin1String(yastFileName);
QFile::remove(destFile); QFile::remove(destFile);
//qDebug() << destFile; //qDebug() << destFile;
QVERIFY(QFile::copy(srcFile, destFile));
if (!QFileInfo(destDir).isDir())
QVERIFY(QDir(m_globalXdgDir).mkpath(destDir));
QVERIFY(QFile::copy(m_yastMimeTypes, destFile));
if (!waitAndRunUpdateMimeDatabase(mimeDir)) if (!waitAndRunUpdateMimeDatabase(mimeDir))
QSKIP("shared-mime-info not found, skipping mime.cache test"); QSKIP("shared-mime-info not found, skipping mime.cache test");
@ -801,16 +853,17 @@ void tst_QMimeDatabase::installNewLocalMimeType()
QMimeDatabase db; QMimeDatabase db;
QVERIFY(!db.mimeTypeForName(QLatin1String("text/x-suse-ymp")).isValid()); QVERIFY(!db.mimeTypeForName(QLatin1String("text/x-suse-ymp")).isValid());
const QString fileName = QLatin1String("yast2-metapackage-handler-mimetypes.xml"); const QString mimeDir = m_localXdgDir + QLatin1String("/mime");
const QString srcFile = QFile::decodeName(SRCDIR) + fileName;
const QString mimeDir = m_dataHome + QLatin1String("/mime");
const QString destDir = mimeDir + QLatin1String("/packages/"); const QString destDir = mimeDir + QLatin1String("/packages/");
QDir().mkpath(destDir); QDir().mkpath(destDir);
const QString destFile = destDir + fileName; const QString destFile = destDir + QLatin1String(yastFileName);
QFile::remove(destFile); QFile::remove(destFile);
QVERIFY(QFile::copy(srcFile, destFile)); QVERIFY(QFile::copy(m_yastMimeTypes, destFile));
if (!runUpdateMimeDatabase(mimeDir)) if (!runUpdateMimeDatabase(mimeDir)) {
QSKIP("shared-mime-info not found, skipping mime.cache test");; const QString skipWarning = QStringLiteral("shared-mime-info not found, skipping mime.cache test (")
+ QDir::toNativeSeparators(mimeDir) + QLatin1Char(')');
QSKIP(qPrintable(skipWarning));
}
QCOMPARE(db.mimeTypeForFile(QLatin1String("foo.ymu"), QMimeDatabase::MatchExtension).name(), QCOMPARE(db.mimeTypeForFile(QLatin1String("foo.ymu"), QMimeDatabase::MatchExtension).name(),
QString::fromLatin1("text/x-suse-ymu")); QString::fromLatin1("text/x-suse-ymu"));

View File

@ -43,6 +43,7 @@
#define TST_QMIMEDATABASE_H #define TST_QMIMEDATABASE_H
#include <QtCore/QObject> #include <QtCore/QObject>
#include <QtCore/QTemporaryDir>
class tst_QMimeDatabase : public QObject class tst_QMimeDatabase : public QObject
{ {
@ -53,7 +54,6 @@ public:
private slots: private slots:
void initTestCase(); void initTestCase();
void cleanupTestCase();
void mimeTypeForName(); void mimeTypeForName();
void mimeTypeForFileName_data(); void mimeTypeForFileName_data();
@ -93,7 +93,13 @@ private slots:
void installNewLocalMimeType(); void installNewLocalMimeType();
private: private:
QString m_dataHome; void init(); // test-specific
QString m_globalXdgDir;
QString m_localXdgDir;
QString m_yastMimeTypes;
QTemporaryDir m_temporaryDir;
QString m_testSuite;
}; };
#endif // TST_QMIMEDATABASE_H #endif // TST_QMIMEDATABASE_H