From fb20f9c2da369b07fc50857a90b596ae63f943da Mon Sep 17 00:00:00 2001 From: Giuseppe D'Angelo Date: Sun, 1 Apr 2012 18:53:55 +0100 Subject: Stop relying on QHash ordering MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit tst_rcc and tst_qdom rely on specific QHash orderings inside rcc and QDom respectively (see QTBUG-25078 and QTBUG-25071). A workaround is added to make them succeed: QDom checks for all possible orderings, and rcc initializes the hash seed to 0 if the QT_RCC_TEST environment variable is set. Change-Id: I5ed6b50602fceba731c797aec8dffc9cc1d6a1ce Reviewed-by: João Abecasis Reviewed-by: Robin Burchell --- src/tools/rcc/main.cpp | 9 +++++++++ tests/auto/tools/rcc/tst_rcc.cpp | 10 ++++++++++ tests/auto/xml/dom/qdom/tst_qdom.cpp | 16 ++++++++++++---- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/tools/rcc/main.cpp b/src/tools/rcc/main.cpp index 3873e74ee5..ad20b9e3ac 100644 --- a/src/tools/rcc/main.cpp +++ b/src/tools/rcc/main.cpp @@ -47,6 +47,8 @@ #include #include #include +#include +#include QT_BEGIN_NAMESPACE @@ -254,9 +256,16 @@ int runRcc(int argc, char *argv[]) return library.output(out, errorDevice) ? 0 : 1; } +Q_CORE_EXPORT extern QBasicAtomicInt qt_qhash_seed; // from qhash.cpp + QT_END_NAMESPACE int main(int argc, char *argv[]) { + // rcc uses a QHash to store files in the resource system. + // we must force a certain hash order when testing or tst_rcc will fail, see QTBUG-25078 + if (!qgetenv("QT_RCC_TEST").isEmpty() && !qt_qhash_seed.testAndSetRelaxed(-1, 0)) + qFatal("Cannot force QHash seed for testing as requested"); + return QT_PREPEND_NAMESPACE(runRcc)(argc, argv); } diff --git a/tests/auto/tools/rcc/tst_rcc.cpp b/tests/auto/tools/rcc/tst_rcc.cpp index dbf5cebd9d..8af85a6d09 100644 --- a/tests/auto/tools/rcc/tst_rcc.cpp +++ b/tests/auto/tools/rcc/tst_rcc.cpp @@ -52,6 +52,7 @@ #include #include #include +#include typedef QMap QStringMap; Q_DECLARE_METATYPE(QStringMap) @@ -61,6 +62,8 @@ class tst_rcc : public QObject Q_OBJECT private slots: + void initTestCase(); + void rcc_data(); void rcc(); void binary_data(); @@ -69,6 +72,13 @@ private slots: void cleanupTestCase(); }; +void tst_rcc::initTestCase() +{ + // rcc uses a QHash to store files in the resource system. + // we must force a certain hash order when testing or tst_rcc will fail, see QTBUG-25078 + QVERIFY(qputenv("QT_RCC_TEST", "1")); +} + QString findExpectedFile(const QString &base) { QString expectedrccfile = base; diff --git a/tests/auto/xml/dom/qdom/tst_qdom.cpp b/tests/auto/xml/dom/qdom/tst_qdom.cpp index 1533e6a139..1155cd0547 100644 --- a/tests/auto/xml/dom/qdom/tst_qdom.cpp +++ b/tests/auto/xml/dom/qdom/tst_qdom.cpp @@ -1792,8 +1792,15 @@ void tst_QDom::doubleNamespaceDeclarations() const QXmlInputSource source(&file); QVERIFY(doc.setContent(&source, &reader)); - QVERIFY(doc.toString(0) == QString::fromLatin1("\n\n\n") || - doc.toString(0) == QString::fromLatin1("\n\n\n")); + // tst_QDom relies on a specific QHash ordering, see QTBUG-25071 + QString docAsString = doc.toString(0); + QVERIFY(docAsString == QString::fromLatin1("\n\n\n") || + docAsString == QString::fromLatin1("\n\n\n") || + docAsString == QString::fromLatin1("\n\n\n") || + docAsString == QString::fromLatin1("\n\n\n") || + docAsString == QString::fromLatin1("\n\n\n") || + docAsString == QString::fromLatin1("\n\n\n") + ); } void tst_QDom::setContentQXmlReaderOverload() const @@ -1922,7 +1929,7 @@ void tst_QDom::cloneDTD_QTBUG8398() const QVERIFY(domDocument.setContent(dtd)); QDomDocument domDocument2 = domDocument.cloneNode(true).toDocument(); - // for some reason, our DOM implementation reverts the order of entities + // this string is relying on a specific QHash ordering, QTBUG-25071 QString expected("\n" "\n" @@ -1932,7 +1939,8 @@ void tst_QDom::cloneDTD_QTBUG8398() const QString output; QTextStream stream(&output); domDocument2.save(stream, 0); - QCOMPARE(output, expected); + // check against the original string and the expected one, QTBUG-25071 + QVERIFY(output == dtd || output == expected); } void tst_QDom::DTDNotationDecl() -- cgit v1.2.3