From 6ee13db700eecd8dfed54a9ec2d1081b39511562 Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Fri, 8 Jan 2021 13:48:51 +0100 Subject: [PATCH] Correct string comparison in Android's IANA ID matching code It used QString.compare() and assumed it was returning a bool true on equality, when it actually returns an int that compares to 0 as the given strings compare. So it should use compare() == 0. This fixes several of QTimeZone's blacklisted tests on Android and a crasher, which we dodged with a QSKIP. Added an id-comparison to a test. Gave two local variables more informative names, made an early return into a QSKIP so it explains itself. Fixes: QTBUG-89905 Fixes: QTBUG-69122 Fixes: QTBUG-69132 Fixes: QTBUG-87435 Pick-to: 6.0 5.15 Change-Id: Icf18ed5a810143d6e65d36e34a70e82faac10b8e Reviewed-by: Qt CI Bot Reviewed-by: Thiago Macieira Reviewed-by: Andrei Golubev --- src/corelib/time/qtimezoneprivate_android.cpp | 2 +- tests/auto/corelib/time/qtimezone/BLACKLIST | 15 ----------- .../corelib/time/qtimezone/tst_qtimezone.cpp | 27 ++++++++----------- 3 files changed, 12 insertions(+), 32 deletions(-) diff --git a/src/corelib/time/qtimezoneprivate_android.cpp b/src/corelib/time/qtimezoneprivate_android.cpp index ba87cf79fe..e182ac27ec 100644 --- a/src/corelib/time/qtimezoneprivate_android.cpp +++ b/src/corelib/time/qtimezoneprivate_android.cpp @@ -108,7 +108,7 @@ void QAndroidTimeZonePrivate::init(const QByteArray &ianaId) // The ID or display name of the zone we've got, if it looks like what we asked for: const auto match = [iana](const QJNIObjectPrivate &jname) -> QByteArray { const QString name = jname.toString(); - if (iana.compare(name, Qt::CaseInsensitive)) + if (iana.compare(name, Qt::CaseInsensitive) == 0) return name.toUtf8(); return QByteArray(); diff --git a/tests/auto/corelib/time/qtimezone/BLACKLIST b/tests/auto/corelib/time/qtimezone/BLACKLIST index ddc9a107c0..1f4811d4b8 100644 --- a/tests/auto/corelib/time/qtimezone/BLACKLIST +++ b/tests/auto/corelib/time/qtimezone/BLACKLIST @@ -1,7 +1,3 @@ -# QTBUG-69122 -[dataStreamTest] -android - # QTBUG-69129 [specificTransition] android @@ -173,14 +169,3 @@ android android [transitionEachZone:America/Danmarkshavn@1970] android -# QTBUG-87435 -[createTest] -android -[systemZone] -android -[utcOffsetId] -android -[stressTest] -android -[serialize] -android diff --git a/tests/auto/corelib/time/qtimezone/tst_qtimezone.cpp b/tests/auto/corelib/time/qtimezone/tst_qtimezone.cpp index b587ec38ef..d3428f8f88 100644 --- a/tests/auto/corelib/time/qtimezone/tst_qtimezone.cpp +++ b/tests/auto/corelib/time/qtimezone/tst_qtimezone.cpp @@ -159,25 +159,23 @@ void tst_QTimeZone::printTimeZone(const QTimeZone &tz) void tst_QTimeZone::createTest() { - QTimeZone tz("Pacific/Auckland"); + const QTimeZone tz("Pacific/Auckland"); if (debug) printTimeZone(tz); // If the tz is not valid then skip as is probably using the UTC backend which is tested later if (!tz.isValid()) - return; + QSKIP("System lacks zone used for test"); // This returns. - // Validity tests - QCOMPARE(tz.isValid(), true); - - // Comparison tests - QTimeZone tz2("Pacific/Auckland"); - QTimeZone tz3("Australia/Sydney"); - QCOMPARE((tz == tz2), true); - QCOMPARE((tz != tz2), false); - QCOMPARE((tz == tz3), false); - QCOMPARE((tz != tz3), true); + QCOMPARE(tz.id(), "Pacific/Auckland"); + // Comparison tests: + const QTimeZone same("Pacific/Auckland"); + QCOMPARE((tz == same), true); + QCOMPARE((tz != same), false); + const QTimeZone other("Australia/Sydney"); + QCOMPARE((tz == other), false); + QCOMPARE((tz != other), true); QCOMPARE(tz.country(), QLocale::NewZealand); @@ -451,6 +449,7 @@ void tst_QTimeZone::utcOffsetId_data() ROW("UTC+12:00", true, 43200); ROW("UTC+13:00", true, 46800); ROW("UTC+14:00", true, 50400); + // Windows IDs known to CLDR v35.1: ROW("UTC-11", true, -39600); ROW("UTC-09", true, -32400); @@ -613,10 +612,6 @@ void tst_QTimeZone::transitionEachZone() if (zone == "Europe/Samara" && i == -3) { continue; } -#endif -#ifdef Q_OS_ANDROID - if (zone == "America/Mazatlan" || zone == "Mexico/BajaSur") - QSKIP("Crashes on Android, see QTBUG-69132"); #endif qint64 here = secs + i * 3600; QDateTime when = QDateTime::fromMSecsSinceEpoch(here * 1000, named);