|
|
@ -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"));
|
|
|
|