summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Layt <jlayt@kde.org>2013-11-22 15:03:14 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-12-06 01:36:09 +0100
commit689152e7c1c6b0e851937a20de96c99aa7a7ea2b (patch)
treee2071e45c294ae830eef6e1f63dbebe4161d5419
parentb9c8073230dfd90962188a24f78d4f4157f9eaad (diff)
QTimeZone: Fix isValidId()
Fix isValidId() which was failing valid IDs because it was splitting name parts by \ instead of /. it was also rejecting offset from UTC formats names. Add unit tests. Task-number: QTBUG-35025 Change-Id: I4d23d2e54f4a9fac9afcc4eff0a02d6f4af21385 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
-rw-r--r--src/corelib/tools/qtimezoneprivate.cpp6
-rw-r--r--tests/auto/corelib/tools/qtimezone/tst_qtimezone.cpp31
2 files changed, 35 insertions, 2 deletions
diff --git a/src/corelib/tools/qtimezoneprivate.cpp b/src/corelib/tools/qtimezoneprivate.cpp
index ee34469c03..dffb20b7cf 100644
--- a/src/corelib/tools/qtimezoneprivate.cpp
+++ b/src/corelib/tools/qtimezoneprivate.cpp
@@ -453,9 +453,9 @@ bool QTimeZonePrivate::isValidId(const QByteArray &olsenId)
// Aliases such as "Etc/GMT+7" and "SystemV/EST5EDT" are valid so we need to accept digits
if (olsenId.contains(' '))
return false;
- QList<QByteArray> parts = olsenId.split('\\');
+ QList<QByteArray> parts = olsenId.split('/');
foreach (const QByteArray &part, parts) {
- if (part.size() > 14)
+ if (part.size() > 14 || part.size() < 1)
return false;
if (part.at(0) == '-')
return false;
@@ -466,6 +466,8 @@ bool QTimeZonePrivate::isValidId(const QByteArray &olsenId)
&& !(ch == '_')
&& !(ch >= '0' && ch <= '9')
&& !(ch == '-')
+ && !(ch == '+')
+ && !(ch == ':')
&& !(ch == '.'))
return false;
}
diff --git a/tests/auto/corelib/tools/qtimezone/tst_qtimezone.cpp b/tests/auto/corelib/tools/qtimezone/tst_qtimezone.cpp
index d7643ff55d..b4f13af0a1 100644
--- a/tests/auto/corelib/tools/qtimezone/tst_qtimezone.cpp
+++ b/tests/auto/corelib/tools/qtimezone/tst_qtimezone.cpp
@@ -56,6 +56,7 @@ private slots:
void createTest();
void nullTest();
void dataStreamTest();
+ void isTimeZoneIdAvailable();
void availableTimeZoneIds();
void stressTest();
void windowsId();
@@ -347,6 +348,36 @@ void tst_QTimeZone::dataStreamTest()
QCOMPARE(tz2.id(), tz1.id());
}
+void tst_QTimeZone::isTimeZoneIdAvailable()
+{
+ QList<QByteArray> available = QTimeZone::availableTimeZoneIds();
+ foreach (const QByteArray &id, available)
+ QVERIFY(QTimeZone::isTimeZoneIdAvailable(id));
+
+ // a-z, A-Z, 0-9, '.', '-', '_' are valid chars
+ // Can't start with '-'
+ // Parts separated by '/', each part min 1 and max of 14 chars
+ QCOMPARE(QTimeZonePrivate::isValidId("az"), true);
+ QCOMPARE(QTimeZonePrivate::isValidId("AZ"), true);
+ QCOMPARE(QTimeZonePrivate::isValidId("09"), true);
+ QCOMPARE(QTimeZonePrivate::isValidId("a/z"), true);
+ QCOMPARE(QTimeZonePrivate::isValidId("a.z"), true);
+ QCOMPARE(QTimeZonePrivate::isValidId("a-z"), true);
+ QCOMPARE(QTimeZonePrivate::isValidId("a_z"), true);
+ QCOMPARE(QTimeZonePrivate::isValidId(".z"), true);
+ QCOMPARE(QTimeZonePrivate::isValidId("_z"), true);
+ QCOMPARE(QTimeZonePrivate::isValidId("12345678901234"), true);
+ QCOMPARE(QTimeZonePrivate::isValidId("12345678901234/12345678901234"), true);
+ QCOMPARE(QTimeZonePrivate::isValidId("a z"), false);
+ QCOMPARE(QTimeZonePrivate::isValidId("a\\z"), false);
+ QCOMPARE(QTimeZonePrivate::isValidId("a,z"), false);
+ QCOMPARE(QTimeZonePrivate::isValidId("/z"), false);
+ QCOMPARE(QTimeZonePrivate::isValidId("-z"), false);
+ QCOMPARE(QTimeZonePrivate::isValidId("123456789012345"), false);
+ QCOMPARE(QTimeZonePrivate::isValidId("123456789012345/12345678901234"), false);
+ QCOMPARE(QTimeZonePrivate::isValidId("12345678901234/123456789012345"), false);
+}
+
void tst_QTimeZone::availableTimeZoneIds()
{
if (debug) {