diff options
Diffstat (limited to 'tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp')
-rw-r--r-- | tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp | 241 |
1 files changed, 147 insertions, 94 deletions
diff --git a/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp b/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp index 9c680c84d9..9c7f5fa820 100644 --- a/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp +++ b/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp @@ -1,5 +1,5 @@ // Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include "tst_qmimedatabase.h" #include <qmimedatabase.h> @@ -16,10 +16,12 @@ #include <QtCore/QElapsedTimer> #include <QtCore/QFile> #include <QtCore/QFileInfo> +#include <QtCore/qspan.h> #include <QtCore/QStandardPaths> #include <QtCore/QTemporaryDir> #include <QtCore/QTextStream> #include <QtConcurrent/QtConcurrentRun> +#include <QtCore/private/qduplicatetracker_p.h> #include <QTest> #include <QBuffer> @@ -30,15 +32,24 @@ using namespace Qt::StringLiterals; -static const char *const additionalMimeFiles[] = { +static const std::array additionalGlobalMimeFiles = { + "yast2-metapackage-handler-mimetypes.xml", + "qml-again.xml", + "magic-and-hierarchy.xml", +}; + +static const std::array additionalLocalMimeFiles = { + "add-extension.xml", // adds *.jnewext to image/jpeg "yast2-metapackage-handler-mimetypes.xml", "qml-again.xml", "text-x-objcsrc.xml", + "text-plain-subclass.xml", "invalid-magic1.xml", "invalid-magic2.xml", "invalid-magic3.xml", "magic-and-hierarchy.xml", - 0 + "circular-inheritance.xml", + "webm-glob-deleteall.xml", }; static const auto s_resourcePrefix = ":/qt-project.org/qmime/"_L1; @@ -119,7 +130,6 @@ void tst_QMimeDatabase::initTestCase() if (QDir(m_localMimeDir).exists()) { QVERIFY2(QDir(m_localMimeDir).removeRecursively(), qPrintable(m_localMimeDir + ": " + qt_error_string())); } - QString errorMessage; #ifdef USE_XDG_DATA_DIRS // Create a temporary "global" XDG data dir for later use @@ -131,14 +141,13 @@ void tst_QMimeDatabase::initTestCase() const QString globalPackageDir = m_globalXdgDir + QStringLiteral("/mime/packages"); QVERIFY(here.mkpath(globalPackageDir)); - QString overrideDir = QFINDTESTDATA("mimetypes-override/"); - QByteArray env = QFile::encodeName(overrideDir) + ':' + QFile::encodeName(m_globalXdgDir); - qputenv("XDG_DATA_DIRS", env); + qputenv("XDG_DATA_DIRS", QFile::encodeName(m_globalXdgDir)); qDebug() << "\nGlobal XDG_DATA_DIRS: " << m_globalXdgDir; const QString freeDesktopXml = QStringLiteral("freedesktop.org.xml"); const QString xmlFileName = s_resourcePrefix + "packages/"_L1 + freeDesktopXml; const QString xmlTargetFileName = globalPackageDir + QLatin1Char('/') + freeDesktopXml; + QString errorMessage; QVERIFY2(copyResourceFile(xmlFileName, xmlTargetFileName, &errorMessage), qPrintable(errorMessage)); #endif @@ -146,14 +155,6 @@ void tst_QMimeDatabase::initTestCase() if (m_testSuite.isEmpty()) qWarning("%s", qPrintable(testSuiteWarning())); - errorMessage = QString::fromLatin1("Cannot find '%1'"); - for (uint i = 0; i < sizeof additionalMimeFiles / sizeof additionalMimeFiles[0] - 1; i++) { - const QString resourceFilePath = s_resourcePrefix + QLatin1String(additionalMimeFiles[i]); - QVERIFY2(QFile::exists(resourceFilePath), qPrintable(errorMessage.arg(resourceFilePath))); - m_additionalMimeFileNames.append(QLatin1String(additionalMimeFiles[i])); - m_additionalMimeFilePaths.append(resourceFilePath); - } - initTestCaseInternal(); m_isUsingCacheProvider = !qEnvironmentVariableIsSet("QT_NO_MIME_CACHE"); } @@ -175,7 +176,7 @@ void tst_QMimeDatabase::mimeTypeForName() QMimeType s0 = db.mimeTypeForName(QString::fromLatin1("application/x-zerosize")); QVERIFY(s0.isValid()); QCOMPARE(s0.name(), QString::fromLatin1("application/x-zerosize")); - QCOMPARE(s0.comment(), QString::fromLatin1("empty document")); + QCOMPARE(s0.comment(), QString::fromLatin1("Empty document")); QMimeType s0Again = db.mimeTypeForName(QString::fromLatin1("application/x-zerosize")); QCOMPARE(s0Again.name(), s0.name()); @@ -183,7 +184,6 @@ void tst_QMimeDatabase::mimeTypeForName() QMimeType s1 = db.mimeTypeForName(QString::fromLatin1("text/plain")); QVERIFY(s1.isValid()); QCOMPARE(s1.name(), QString::fromLatin1("text/plain")); - //qDebug("Comment is %s", qPrintable(s1.comment())); QMimeType krita = db.mimeTypeForName(QString::fromLatin1("application/x-krita")); QVERIFY(krita.isValid()); @@ -195,7 +195,7 @@ void tst_QMimeDatabase::mimeTypeForName() QMimeType bzip2 = db.mimeTypeForName(QString::fromLatin1("application/x-bzip2")); QVERIFY(bzip2.isValid()); - QCOMPARE(bzip2.comment(), QString::fromLatin1("Bzip archive")); + QCOMPARE(bzip2.comment(), QString::fromLatin1("Bzip2 archive")); QMimeType defaultMime = db.mimeTypeForName(QString::fromLatin1("application/octet-stream")); QVERIFY(defaultMime.isValid()); @@ -241,8 +241,10 @@ void tst_QMimeDatabase::mimeTypeForFileName_data() QTest::newRow("desktop file") << "foo.desktop" << "application/x-desktop"; QTest::newRow("old kdelnk file is x-desktop too") << "foo.kdelnk" << "application/x-desktop"; - QTest::newRow("double-extension file") << "foo.tar.bz2" << "application/x-bzip-compressed-tar"; - QTest::newRow("single-extension file") << "foo.bz2" << "application/x-bzip"; + QTest::newRow("double-extension file") << "foo.tar.bz2" + << "application/x-bzip2-compressed-tar"; + QTest::newRow("single-extension file") << "foo.bz2" + << "application/x-bzip2"; QTest::newRow(".doc should assume msword") << "somefile.doc" << "application/msword"; // #204139 QTest::newRow("glob that uses [] syntax, 1") << "Makefile" << "text/x-makefile"; QTest::newRow("glob that uses [] syntax, 2") << "makefile" << "text/x-makefile"; @@ -263,7 +265,7 @@ static inline QByteArray msgMimeTypeForFileNameFailed(const QList<QMimeType> &ac const QString &expected) { QByteArray result = "Actual ("; - foreach (const QMimeType &m, actual) { + for (const QMimeType &m : actual) { result += m.name().toLocal8Bit(); result += ' '; } @@ -281,7 +283,7 @@ void tst_QMimeDatabase::mimeTypeForFileName() QVERIFY(mime.isValid()); QCOMPARE(mime.name(), expectedMimeType); - QList<QMimeType> mimes = db.mimeTypesForFileName(fileName); + const QList<QMimeType> mimes = db.mimeTypesForFileName(fileName); if (expectedMimeType == "application/octet-stream") { QVERIFY(mimes.isEmpty()); } else { @@ -322,24 +324,6 @@ void tst_QMimeDatabase::mimeTypesForFileName() QCOMPARE(mimeNames, expectedMimeTypes); } -void tst_QMimeDatabase::mimeTypesForFileName_glob_deleteall() -{ -#if !defined(USE_XDG_DATA_DIRS) - QSKIP("This test requires XDG_DATA_DIRS"); -#endif - - QMimeDatabase mdb; - QList<QMimeType> mimes = mdb.mimeTypesForFileName(u"foo.webm"_s); - - // "*.webm" glob pattern is deleted with "glob-deleteall" - QVERIFY2(mimes.isEmpty(), qPrintable(mimeTypeNames(mimes).join(u','))); - mimes = mdb.mimeTypesForFileName(u"foo.videowebm"_s); - QCOMPARE(mimes.size(), 1); - QCOMPARE(mimes.at(0).globPatterns(), QStringList{"*.videowebm"}); - // Custom "*.videowebm" pattern is used instead - QCOMPARE(mimes.at(0).name(), u"video/webm"); -} - void tst_QMimeDatabase::inheritance() { QMimeDatabase db; @@ -404,6 +388,13 @@ void tst_QMimeDatabase::inheritance() const QMimeType mswordTemplate = db.mimeTypeForName(QString::fromLatin1("application/msword-template")); QVERIFY(mswordTemplate.isValid()); QVERIFY(mswordTemplate.inherits(QLatin1String("application/msword"))); + + // Check that buggy type definitions that have circular inheritance don't cause an infinite + // loop, especially when resolving a conflict between the file's name and its contents + const QMimeType ecmascript = db.mimeTypeForName(QString::fromLatin1("application/ecmascript")); + QVERIFY(ecmascript.allAncestors().contains("text/plain")); + const QMimeType javascript = db.mimeTypeForFileNameAndData("xml.js", "<?xml?>"); + QVERIFY(javascript.inherits(QString::fromLatin1("text/javascript"))); } void tst_QMimeDatabase::aliases() @@ -476,7 +467,10 @@ void tst_QMimeDatabase::comment() QMimeType directory = db.mimeTypeForName(s_inodeMimetype); QCOMPARE(directory.comment(), QStringLiteral("Ordner")); QLocale::setDefault(QLocale("fr")); - QCOMPARE(directory.comment(), QStringLiteral("dossier")); + // Missing in s-m-i 2.3 due to case changes + // QCOMPARE(directory.comment(), QStringLiteral("dossier")); + QMimeType cpp = db.mimeTypeForName("text/x-c++src"); + QCOMPARE(cpp.comment(), QStringLiteral("code source C++")); } // In here we do the tests that need some content in a temporary file. @@ -657,6 +651,9 @@ void tst_QMimeDatabase::mimeTypeForFileNameAndData() #ifdef Q_OS_UNIX void tst_QMimeDatabase::mimeTypeForUnixSpecials_data() { +#ifndef AT_FDCWD + QSKIP("fdopendir and fstatat are not available"); +#else QTest::addColumn<QString>("name"); QTest::addColumn<QString>("expected"); @@ -717,6 +714,7 @@ void tst_QMimeDatabase::mimeTypeForUnixSpecials_data() if (!found) nothingfound(); +#endif } void tst_QMimeDatabase::mimeTypeForUnixSpecials() @@ -737,9 +735,9 @@ void tst_QMimeDatabase::allMimeTypes() QVERIFY(!lst.isEmpty()); // Hardcoding this is the only way to check both providers find the same number of mimetypes. - QCOMPARE(lst.size(), 851); + QCOMPARE(lst.size(), 908); - foreach (const QMimeType &mime, lst) { + for (const QMimeType &mime : lst) { const QString name = mime.name(); QVERIFY(!name.isEmpty()); QCOMPARE(name.count(QLatin1Char('/')), 1); @@ -758,7 +756,9 @@ void tst_QMimeDatabase::suffixes_data() QTest::newRow("mimetype with a single pattern") << "application/pdf" << "*.pdf" << "pdf"; QTest::newRow("mimetype-with-multiple-patterns-kpr") << "application/x-kpresenter" << "*.kpr;*.kpt" << "kpr"; // The preferred suffix for image/jpeg is *.jpg, as per https://bugs.kde.org/show_bug.cgi?id=176737 - QTest::newRow("jpeg") << "image/jpeg" << "*.jpe;*.jpg;*.jpeg" << "jpg"; + QTest::newRow("jpeg") << "image/jpeg" + << "*.jfif;*.jpe;*.jpg;*.jpeg" + << "jpg"; QTest::newRow("mimetype with many patterns") << "application/vnd.wordperfect" << "*.wp;*.wp4;*.wp5;*.wp6;*.wpd;*.wpp" << "wp"; QTest::newRow("oasis text mimetype") << "application/vnd.oasis.opendocument.text" << "*.odt" << "odt"; QTest::newRow("oasis presentation mimetype") << "application/vnd.oasis.opendocument.presentation" << "*.odp" << "odp"; @@ -797,6 +797,26 @@ void tst_QMimeDatabase::knownSuffix() QCOMPARE(db.suffixForFileName(QString::fromLatin1("foo.anim2")), QString()); // the glob is anim[0-9], no way to extract the extension without expensive regexp capturing } +void tst_QMimeDatabase::filterString_data() +{ + QTest::addColumn<QString>("mimeType"); + QTest::addColumn<QString>("expectedFilterString"); + + QTest::newRow("single-pattern") << "application/pdf" + << "PDF document (*.pdf)"; + QTest::newRow("multiple-patterns-text-plain") << "text/plain" + << "Plain text document (*.txt *.asc *,v)"; +} + +void tst_QMimeDatabase::filterString() +{ + QFETCH(QString, mimeType); + QFETCH(QString, expectedFilterString); + + QMimeDatabase db; + QCOMPARE(db.mimeTypeForName(mimeType).filterString(), expectedFilterString); +} + void tst_QMimeDatabase::symlinkToFifo() // QTBUG-48529 { #if defined(Q_OS_UNIX) && !defined(Q_OS_INTEGRITY) @@ -836,6 +856,8 @@ void tst_QMimeDatabase::findByFileName_data() QByteArray line(1024, Qt::Uninitialized); + QDuplicateTracker<QString, 800> seen; + while (!f.atEnd()) { const qint64 len = f.readLine(line.data(), 1023); @@ -851,10 +873,16 @@ void tst_QMimeDatabase::findByFileName_data() QString xFail; if (list.size() >= 3) xFail = list.at(2); + QString rowTag = filePath; + if (seen.hasSeen(rowTag)) { + // Two testcases for the same file, e.g. + // test.ogg audio/ogg oxx + // test.ogg audio/x-vorbis+ogg x + rowTag += "_2"; + } - QTest::newRow(filePath.toLatin1().constData()) - << QString(prefix + filePath) - << mimeTypeType << xFail; + QTest::newRow(rowTag.toLatin1().constData()) + << QString(prefix + filePath) << mimeTypeType << xFail; } } @@ -866,25 +894,8 @@ void tst_QMimeDatabase::findByFileName() QMimeDatabase database; - //qDebug() << Q_FUNC_INFO << filePath; - const QMimeType resultMimeType(database.mimeTypeForFile(filePath, QMimeDatabase::MatchExtension)); - if (resultMimeType.isValid()) { - //qDebug() << Q_FUNC_INFO << "MIME type" << resultMimeType.name() << "has generic icon name" << resultMimeType.genericIconName() << "and icon name" << resultMimeType.iconName(); - -// Loading icons depend on the icon theme, we can't enable this test -#if 0 - QCOMPARE(resultMimeType.genericIconName(), QIcon::fromTheme(resultMimeType.genericIconName()).name()); - QVERIFY2(!QIcon::fromTheme(resultMimeType.genericIconName()).isNull(), qPrintable(resultMimeType.genericIconName())); - QVERIFY2(QIcon::hasThemeIcon(resultMimeType.genericIconName()), qPrintable(resultMimeType.genericIconName())); - - QCOMPARE(resultMimeType.iconName(), QIcon::fromTheme(resultMimeType.iconName()).name()); - QVERIFY2(!QIcon::fromTheme(resultMimeType.iconName()).isNull(), qPrintable(resultMimeType.iconName())); - QVERIFY2(QIcon::hasThemeIcon(resultMimeType.iconName()), qPrintable(resultMimeType.iconName())); -#endif - } const QString resultMimeTypeName = resultMimeType.name(); - //qDebug() << Q_FUNC_INFO << "mimeTypeForFile() returned" << resultMimeTypeName; const bool failed = resultMimeTypeName != mimeTypeName; const bool shouldFail = (xFail.size() >= 1 && xFail.at(0) == QLatin1Char('x')); @@ -897,7 +908,6 @@ void tst_QMimeDatabase::findByFileName() QVERIFY2(resultMimeType == foundMimeType, qPrintable(resultMimeType.name() + QString::fromLatin1(" vs. ") + foundMimeType.name())); if (foundMimeType.isValid()) { const QString extension = QFileInfo(filePath).suffix(); - //qDebug() << Q_FUNC_INFO << "globPatterns:" << foundMimeType.globPatterns() << "- extension:" << QString() + "*." + extension; if (foundMimeType.globPatterns().contains(QString::fromLatin1("*.") + extension)) return; } @@ -964,7 +974,6 @@ void tst_QMimeDatabase::findByFile() QMimeDatabase database; const QString resultMimeTypeName = database.mimeTypeForFile(filePath).name(); - //qDebug() << Q_FUNC_INFO << filePath << "->" << resultMimeTypeName; if (xFail.size() >= 3 && xFail.at(2) == QLatin1Char('x')) { // Expected to fail QVERIFY2(resultMimeTypeName != mimeTypeName, qPrintable(resultMimeTypeName)); @@ -1046,7 +1055,8 @@ static void checkHasMimeType(const QString &mimeType) QVERIFY(db.mimeTypeForName(mimeType).isValid()); bool found = false; - foreach (const QMimeType &mt, db.allMimeTypes()) { + const auto all = db.allMimeTypes(); + for (const QMimeType &mt : all) { if (mt.name() == mimeType) { found = true; break; @@ -1067,6 +1077,30 @@ QT_BEGIN_NAMESPACE extern Q_CORE_EXPORT int qmime_secondsBetweenChecks; // see qmimeprovider.cpp QT_END_NAMESPACE +void copyFiles(const QSpan<const char *const> &additionalMimeFiles, const QString &destDir) +{ + const QString notFoundErrorMessage = QString::fromLatin1("Cannot find '%1'"); + for (const char *mimeFile : additionalMimeFiles) { + const QString resourceFilePath = s_resourcePrefix + QLatin1String(mimeFile); + QVERIFY2(QFile::exists(resourceFilePath), + qPrintable(notFoundErrorMessage.arg(resourceFilePath))); + + const QString destFile = destDir + QLatin1String(mimeFile); + QFile::remove(destFile); + QString errorMessage; + QVERIFY2(copyResourceFile(resourceFilePath, destFile, &errorMessage), + qPrintable(errorMessage)); + } +} + +void deleteFiles(const QSpan<const char *const> &additionalMimeFiles, const QString &destDir) +{ + for (const char *mimeFile : additionalMimeFiles) { + const QString destFile = destDir + QLatin1String(mimeFile); + QFile::remove(destFile); + } +} + void tst_QMimeDatabase::installNewGlobalMimeType() { #if !defined(USE_XDG_DATA_DIRS) @@ -1086,18 +1120,11 @@ void tst_QMimeDatabase::installNewGlobalMimeType() if (!QFileInfo(destDir).isDir()) QVERIFY(QDir(m_globalXdgDir).mkpath(destDir)); - QString errorMessage; - for (int i = 0; i < m_additionalMimeFileNames.size(); ++i) { - const QString destFile = destDir + m_additionalMimeFileNames.at(i); - QFile::remove(destFile); - QVERIFY2(copyResourceFile(m_additionalMimeFilePaths.at(i), destFile, &errorMessage), qPrintable(errorMessage)); - } + copyFiles(additionalGlobalMimeFiles, destDir); + QVERIFY(!QTest::currentTestFailed()); if (m_isUsingCacheProvider && !waitAndRunUpdateMimeDatabase(mimeDir)) QSKIP("shared-mime-info not found, skipping mime.cache test"); - if (!m_isUsingCacheProvider) - ignoreInvalidMimetypeWarnings(mimeDir); - QCOMPARE(db.mimeTypeForFile(QLatin1String("foo.ymu"), QMimeDatabase::MatchExtension).name(), QString::fromLatin1("text/x-SuSE-ymu")); QVERIFY(db.mimeTypeForName(QLatin1String("text/x-suse-ymp")).isValid()); @@ -1111,12 +1138,6 @@ void tst_QMimeDatabase::installNewGlobalMimeType() QCOMPARE(db.mimeTypeForFile(qmlTestFile).name(), QString::fromLatin1("text/x-qml")); - { - QMimeType objcsrc = db.mimeTypeForName(QStringLiteral("text/x-objcsrc")); - QVERIFY(objcsrc.isValid()); - QCOMPARE(objcsrc.globPatterns(), QStringList()); - } - const QString fooTestFile = s_resourcePrefix + "magic-and-hierarchy.foo"_L1; QCOMPARE(db.mimeTypeForFile(fooTestFile).name(), QString::fromLatin1("application/foo")); @@ -1138,8 +1159,7 @@ void tst_QMimeDatabase::installNewGlobalMimeType() } // Now test removing the mimetype definitions again - for (int i = 0; i < m_additionalMimeFileNames.size(); ++i) - QFile::remove(destDir + m_additionalMimeFileNames.at(i)); + deleteFiles(additionalGlobalMimeFiles, destDir); if (m_isUsingCacheProvider && !waitAndRunUpdateMimeDatabase(mimeDir)) QSKIP("shared-mime-info not found, skipping mime.cache test"); QCOMPARE(db.mimeTypeForFile(QLatin1String("foo.ymu"), QMimeDatabase::MatchExtension).name(), @@ -1148,11 +1168,29 @@ void tst_QMimeDatabase::installNewGlobalMimeType() #endif // QT_CONFIG(process) } +void tst_QMimeDatabase::installNewLocalMimeType_data() +{ + QTest::addColumn<bool>("useLocalBinaryCache"); + + // Test mixing the providers: + // * m_isUsingCacheProvider is about the global directory. + // ** when true, we'll test both for the local directory. + // ** when false, we can't, because QT_NO_MIME_CACHE is set, so it's XML+XML only + +#if QT_CONFIG(process) + if (m_isUsingCacheProvider) + QTest::newRow("with_binary_cache") << true; +#endif + QTest::newRow("without_binary_cache") << false; +} + void tst_QMimeDatabase::installNewLocalMimeType() { #if !QT_CONFIG(process) QSKIP("This test requires QProcess support"); #else + QFETCH(bool, useLocalBinaryCache); + qmime_secondsBetweenChecks = 0; QMimeDatabase db; @@ -1163,19 +1201,16 @@ void tst_QMimeDatabase::installNewLocalMimeType() const QString destDir = m_localMimeDir + QLatin1String("/packages/"); QVERIFY(QDir().mkpath(destDir)); - QString errorMessage; - for (int i = 0; i < m_additionalMimeFileNames.size(); ++i) { - const QString destFile = destDir + m_additionalMimeFileNames.at(i); - QFile::remove(destFile); - QVERIFY2(copyResourceFile(m_additionalMimeFilePaths.at(i), destFile, &errorMessage), qPrintable(errorMessage)); - } - if (m_isUsingCacheProvider && !waitAndRunUpdateMimeDatabase(m_localMimeDir)) { + + copyFiles(additionalLocalMimeFiles, destDir); + QVERIFY(!QTest::currentTestFailed()); + if (useLocalBinaryCache && !waitAndRunUpdateMimeDatabase(m_localMimeDir)) { const QString skipWarning = QStringLiteral("shared-mime-info not found, skipping mime.cache test (") + QDir::toNativeSeparators(m_localMimeDir) + QLatin1Char(')'); QSKIP(qPrintable(skipWarning)); } - if (!m_isUsingCacheProvider) + if (!useLocalBinaryCache) ignoreInvalidMimetypeWarnings(m_localMimeDir); QVERIFY(db.mimeTypeForName(QLatin1String("text/x-suse-ymp")).isValid()); @@ -1196,6 +1231,8 @@ void tst_QMimeDatabase::installNewLocalMimeType() QVERIFY(objcsrc.isValid()); QCOMPARE(objcsrc.globPatterns(), QStringList()); } + QCOMPARE(db.mimeTypeForFile(QLatin1String("foo.txt"), QMimeDatabase::MatchExtension).name(), + QString::fromLatin1("text/plain")); // Test that a double-definition of a mimetype doesn't lead to sniffing ("conflicting globs"). const QString qmlTestFile = s_resourcePrefix + "test.qml"_L1; @@ -1205,6 +1242,22 @@ void tst_QMimeDatabase::installNewLocalMimeType() QCOMPARE(db.mimeTypeForFile(qmlTestFile).name(), QString::fromLatin1("text/x-qml")); + { // QTBUG-101755 + QList<QMimeType> mimes = db.mimeTypesForFileName(u"foo.webm"_s); + // "*.webm" glob pattern is deleted with "glob-deleteall" + QVERIFY2(mimes.isEmpty(), qPrintable(mimeTypeNames(mimes).join(u','))); + mimes = db.mimeTypesForFileName(u"foo.videowebm"_s); + QCOMPARE(mimes.size(), 1); + QCOMPARE(mimes.at(0).globPatterns(), QStringList{ "*.videowebm" }); + // Custom "*.videowebm" pattern is used instead + QCOMPARE(mimes.at(0).name(), u"video/webm"); + } + + // QTBUG-116905: globPatterns() should merge all locations + // add-extension.xml adds *.jnewext + const QStringList expectedJpegPatterns{ "*.jpg", "*.jpeg", "*.jpe", "*.jfif", "*.jnewext" }; + QCOMPARE(db.mimeTypeForName(QStringLiteral("image/jpeg")).globPatterns(), expectedJpegPatterns); + // Now that we have two directories with mime definitions, check that everything still works inheritance(); if (QTest::currentTestFailed()) @@ -1233,7 +1286,7 @@ void tst_QMimeDatabase::installNewLocalMimeType() // Now test removing local mimetypes for (int i = 1 ; i <= 3 ; ++i) QFile::remove(destDir + QStringLiteral("invalid-magic%1.xml").arg(i)); - if (m_isUsingCacheProvider && !waitAndRunUpdateMimeDatabase(m_localMimeDir)) + if (useLocalBinaryCache && !waitAndRunUpdateMimeDatabase(m_localMimeDir)) QSKIP("shared-mime-info not found, skipping mime.cache test"); QVERIFY(!db.mimeTypeForName(QLatin1String("text/invalid-magic1")).isValid()); // deleted QVERIFY(db.mimeTypeForName(QLatin1String("text/x-suse-ymp")).isValid()); // still present @@ -1248,7 +1301,7 @@ void tst_QMimeDatabase::installNewLocalMimeType() QCOMPARE(db.mimeTypeForFile(QLatin1String("foo.ymu"), QMimeDatabase::MatchExtension).name(), QString::fromLatin1("application/octet-stream")); QVERIFY(!db.mimeTypeForName(QLatin1String("text/x-suse-ymp")).isValid()); -#endif // QT_CONFIG(process) +#endif } QTEST_GUILESS_MAIN(tst_QMimeDatabase) |