tst_qmimedatabase: move local override to the specific test method

When running tst_qmimedatabase with the full shared-mime-info test suite
(which unfortunately requires local setup so this is easy to overlook),
we need *.webm to still be associated with video/webm.

So to test glob-deleteall, do that in installNewLocalMimeType(), with
other similar tests.

This however unearthed the following bug: the handling of glob-deleteall
is only correct when the local dir has no binary cache. It's broken
when using a binary cache. Added a QEXPECT_FAIL for now because this is
going to be fixed as part of a major redesign, coming up.
I also found out that neither xdgmime nor gio do this correctly...

Change-Id: Ib075fcdb792f60a859f23db8c2d7e1c6524f9050
(cherry picked from commit 994311a66bd31983bec5d75d87f5e03f53f14def)
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
David Faure 2023-09-11 16:25:29 +02:00
parent 6bc35430f9
commit 37cff48a27
5 changed files with 41 additions and 29 deletions

View File

@ -35,6 +35,7 @@ set(testdata_resource_files
"../test.qml" "../test.qml"
"../text-x-objcsrc.xml" "../text-x-objcsrc.xml"
"../text-plain-subclass.xml" "../text-plain-subclass.xml"
"../webm-glob-deleteall.xml"
"../yast2-metapackage-handler-mimetypes.xml" "../yast2-metapackage-handler-mimetypes.xml"
) )

View File

@ -35,6 +35,7 @@ set(testdata_resource_files
"../test.qml" "../test.qml"
"../text-x-objcsrc.xml" "../text-x-objcsrc.xml"
"../text-plain-subclass.xml" "../text-plain-subclass.xml"
"../webm-glob-deleteall.xml"
"../yast2-metapackage-handler-mimetypes.xml" "../yast2-metapackage-handler-mimetypes.xml"
) )

View File

@ -47,6 +47,7 @@ static const std::array additionalLocalMimeFiles = {
"invalid-magic3.xml", "invalid-magic3.xml",
"magic-and-hierarchy.xml", "magic-and-hierarchy.xml",
"circular-inheritance.xml", "circular-inheritance.xml",
"webm-glob-deleteall.xml",
}; };
static const auto s_resourcePrefix = ":/qt-project.org/qmime/"_L1; static const auto s_resourcePrefix = ":/qt-project.org/qmime/"_L1;
@ -138,9 +139,7 @@ void tst_QMimeDatabase::initTestCase()
const QString globalPackageDir = m_globalXdgDir + QStringLiteral("/mime/packages"); const QString globalPackageDir = m_globalXdgDir + QStringLiteral("/mime/packages");
QVERIFY(here.mkpath(globalPackageDir)); QVERIFY(here.mkpath(globalPackageDir));
QString overrideDir = QFINDTESTDATA("mimetypes-override/"); qputenv("XDG_DATA_DIRS", QFile::encodeName(m_globalXdgDir));
QByteArray env = QFile::encodeName(overrideDir) + ':' + QFile::encodeName(m_globalXdgDir);
qputenv("XDG_DATA_DIRS", env);
qDebug() << "\nGlobal XDG_DATA_DIRS: " << m_globalXdgDir; qDebug() << "\nGlobal XDG_DATA_DIRS: " << m_globalXdgDir;
const QString freeDesktopXml = QStringLiteral("freedesktop.org.xml"); const QString freeDesktopXml = QStringLiteral("freedesktop.org.xml");
@ -322,24 +321,6 @@ void tst_QMimeDatabase::mimeTypesForFileName()
QCOMPARE(mimeNames, expectedMimeTypes); 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() void tst_QMimeDatabase::inheritance()
{ {
QMimeDatabase db; QMimeDatabase db;
@ -1165,11 +1146,26 @@ void tst_QMimeDatabase::installNewGlobalMimeType()
#endif // QT_CONFIG(process) #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() void tst_QMimeDatabase::installNewLocalMimeType()
{ {
#if !QT_CONFIG(process) QFETCH(bool, useLocalBinaryCache);
QSKIP("This test requires QProcess support");
#else
qmime_secondsBetweenChecks = 0; qmime_secondsBetweenChecks = 0;
QMimeDatabase db; QMimeDatabase db;
@ -1183,13 +1179,13 @@ void tst_QMimeDatabase::installNewLocalMimeType()
copyFiles(additionalLocalMimeFiles, destDir); copyFiles(additionalLocalMimeFiles, destDir);
QVERIFY(!QTest::currentTestFailed()); QVERIFY(!QTest::currentTestFailed());
if (m_isUsingCacheProvider && !waitAndRunUpdateMimeDatabase(m_localMimeDir)) { if (useLocalBinaryCache && !waitAndRunUpdateMimeDatabase(m_localMimeDir)) {
const QString skipWarning = QStringLiteral("shared-mime-info not found, skipping mime.cache test (") const QString skipWarning = QStringLiteral("shared-mime-info not found, skipping mime.cache test (")
+ QDir::toNativeSeparators(m_localMimeDir) + QLatin1Char(')'); + QDir::toNativeSeparators(m_localMimeDir) + QLatin1Char(')');
QSKIP(qPrintable(skipWarning)); QSKIP(qPrintable(skipWarning));
} }
if (!m_isUsingCacheProvider) if (!useLocalBinaryCache)
ignoreInvalidMimetypeWarnings(m_localMimeDir); ignoreInvalidMimetypeWarnings(m_localMimeDir);
QVERIFY(db.mimeTypeForName(QLatin1String("text/x-suse-ymp")).isValid()); QVERIFY(db.mimeTypeForName(QLatin1String("text/x-suse-ymp")).isValid());
@ -1221,6 +1217,21 @@ void tst_QMimeDatabase::installNewLocalMimeType()
QCOMPARE(db.mimeTypeForFile(qmlTestFile).name(), QCOMPARE(db.mimeTypeForFile(qmlTestFile).name(),
QString::fromLatin1("text/x-qml")); QString::fromLatin1("text/x-qml"));
{ // QTBUG-101755
QList<QMimeType> mimes = db.mimeTypesForFileName(u"foo.webm"_s);
// "*.webm" glob pattern is deleted with "glob-deleteall"
if (m_isUsingCacheProvider && useLocalBinaryCache)
QEXPECT_FAIL("with_binary_cache",
"BUG, glob-deleteall isn't handled correctly between binary providers",
Continue);
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");
}
// Now that we have two directories with mime definitions, check that everything still works // Now that we have two directories with mime definitions, check that everything still works
inheritance(); inheritance();
if (QTest::currentTestFailed()) if (QTest::currentTestFailed())
@ -1249,7 +1260,7 @@ void tst_QMimeDatabase::installNewLocalMimeType()
// Now test removing local mimetypes // Now test removing local mimetypes
for (int i = 1 ; i <= 3 ; ++i) for (int i = 1 ; i <= 3 ; ++i)
QFile::remove(destDir + QStringLiteral("invalid-magic%1.xml").arg(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"); QSKIP("shared-mime-info not found, skipping mime.cache test");
QVERIFY(!db.mimeTypeForName(QLatin1String("text/invalid-magic1")).isValid()); // deleted QVERIFY(!db.mimeTypeForName(QLatin1String("text/invalid-magic1")).isValid()); // deleted
QVERIFY(db.mimeTypeForName(QLatin1String("text/x-suse-ymp")).isValid()); // still present QVERIFY(db.mimeTypeForName(QLatin1String("text/x-suse-ymp")).isValid()); // still present
@ -1264,7 +1275,6 @@ void tst_QMimeDatabase::installNewLocalMimeType()
QCOMPARE(db.mimeTypeForFile(QLatin1String("foo.ymu"), QMimeDatabase::MatchExtension).name(), QCOMPARE(db.mimeTypeForFile(QLatin1String("foo.ymu"), QMimeDatabase::MatchExtension).name(),
QString::fromLatin1("application/octet-stream")); QString::fromLatin1("application/octet-stream"));
QVERIFY(!db.mimeTypeForName(QLatin1String("text/x-suse-ymp")).isValid()); QVERIFY(!db.mimeTypeForName(QLatin1String("text/x-suse-ymp")).isValid());
#endif // QT_CONFIG(process)
} }
QTEST_GUILESS_MAIN(tst_QMimeDatabase) QTEST_GUILESS_MAIN(tst_QMimeDatabase)

View File

@ -25,7 +25,6 @@ private slots:
void mimeTypeForFileName(); void mimeTypeForFileName();
void mimeTypesForFileName_data(); void mimeTypesForFileName_data();
void mimeTypesForFileName(); void mimeTypesForFileName();
void mimeTypesForFileName_glob_deleteall();
void inheritance(); void inheritance();
void aliases(); void aliases();
void listAliases_data(); void listAliases_data();
@ -63,6 +62,7 @@ private slots:
// //
void installNewGlobalMimeType(); void installNewGlobalMimeType();
void installNewLocalMimeType_data();
void installNewLocalMimeType(); void installNewLocalMimeType();
private: private: