summaryrefslogtreecommitdiffstats
path: root/tests/auto
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2018-01-11 18:01:13 +0100
committerLiang Qi <liang.qi@qt.io>2018-01-11 18:10:41 +0100
commitf4d8cafc1b034f544ca84b849c23ab99bc1600e7 (patch)
treef1150b5aeaec4753f2ddfcd17643666b3a82dd9d /tests/auto
parente5b422382a512a8267a0eb24e6543a8cf84478d9 (diff)
parentb03133231b99922a72831c4ec23faf55516ef404 (diff)
Merge remote-tracking branch 'origin/5.10' into dev
Conflicts: src/3rdparty/harfbuzz-ng/src/hb-private.hh src/sql/doc/snippets/code/doc_src_sql-driver.cpp src/sql/doc/src/sql-driver.qdoc Change-Id: I38f0e82fcd37926cbf3c1915e009a731040d4598
Diffstat (limited to 'tests/auto')
-rw-r--r--tests/auto/corelib/itemmodels/qsortfilterproxymodel_recursive/tst_qsortfilterproxymodel_recursive.cpp27
-rw-r--r--tests/auto/corelib/tools/qdatetime/BLACKLIST3
-rw-r--r--tests/auto/corelib/tools/qstringview/tst_qstringview.cpp29
-rw-r--r--tests/auto/gui/kernel/qpalette/tst_qpalette.cpp31
-rw-r--r--tests/auto/gui/text/qrawfont/tst_qrawfont.cpp37
-rw-r--r--tests/auto/network/access/qftp/tst_qftp.cpp209
-rw-r--r--tests/auto/network/socket/qudpsocket/BLACKLIST3
-rw-r--r--tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp19
-rw-r--r--tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp25
-rw-r--r--tests/auto/tools/qmake/testdata/rawString/object2.h34
-rw-r--r--tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp29
11 files changed, 389 insertions, 57 deletions
diff --git a/tests/auto/corelib/itemmodels/qsortfilterproxymodel_recursive/tst_qsortfilterproxymodel_recursive.cpp b/tests/auto/corelib/itemmodels/qsortfilterproxymodel_recursive/tst_qsortfilterproxymodel_recursive.cpp
index 9cf005af01..852d9adb46 100644
--- a/tests/auto/corelib/itemmodels/qsortfilterproxymodel_recursive/tst_qsortfilterproxymodel_recursive.cpp
+++ b/tests/auto/corelib/itemmodels/qsortfilterproxymodel_recursive/tst_qsortfilterproxymodel_recursive.cpp
@@ -1,31 +1,26 @@
/****************************************************************************
**
-** Copyright (C) 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, authors Filipe Azevedo <filipe.azevedo@kdab.com> and David Faure <david.faure@kdab.com>
+** Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, authors Filipe Azevedo <filipe.azevedo@kdab.com> and David Faure <david.faure@kdab.com>
** Contact: https://www.qt.io/licensing/
**
** This file is part of the test suite of the Qt Toolkit.
**
-** $QT_BEGIN_LICENSE:LGPL21$
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
diff --git a/tests/auto/corelib/tools/qdatetime/BLACKLIST b/tests/auto/corelib/tools/qdatetime/BLACKLIST
deleted file mode 100644
index e78f5cfd87..0000000000
--- a/tests/auto/corelib/tools/qdatetime/BLACKLIST
+++ /dev/null
@@ -1,3 +0,0 @@
-[operator_eqeq]
-ubuntu-16.04
-b2qt
diff --git a/tests/auto/corelib/tools/qstringview/tst_qstringview.cpp b/tests/auto/corelib/tools/qstringview/tst_qstringview.cpp
index 8a8aa8c6e1..4ae96005d0 100644
--- a/tests/auto/corelib/tools/qstringview/tst_qstringview.cpp
+++ b/tests/auto/corelib/tools/qstringview/tst_qstringview.cpp
@@ -1,31 +1,26 @@
/****************************************************************************
**
-** Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
-** Contact: http://www.qt.io/licensing/
+** Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
**
-** $QT_BEGIN_LICENSE:LGPL21$
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
diff --git a/tests/auto/gui/kernel/qpalette/tst_qpalette.cpp b/tests/auto/gui/kernel/qpalette/tst_qpalette.cpp
index f43e8d8ee6..ca6f677ba6 100644
--- a/tests/auto/gui/kernel/qpalette/tst_qpalette.cpp
+++ b/tests/auto/gui/kernel/qpalette/tst_qpalette.cpp
@@ -39,6 +39,7 @@ private Q_SLOTS:
void roleValues();
void copySemantics();
void moveSemantics();
+ void setBrush();
};
void tst_QPalette::roleValues_data()
@@ -128,5 +129,35 @@ void tst_QPalette::moveSemantics()
#endif
}
+void tst_QPalette::setBrush()
+{
+ QPalette p(Qt::red);
+ const QPalette q = p;
+ QVERIFY(q.isCopyOf(p));
+
+ // Setting a different brush will detach
+ p.setBrush(QPalette::Disabled, QPalette::Button, Qt::green);
+ QVERIFY(!q.isCopyOf(p));
+ QVERIFY(q != p);
+
+ // Check we only changed what we said we would
+ for (int i = 0; i < QPalette::NColorGroups; i++)
+ for (int j = 0; j < QPalette::NColorRoles; j++) {
+ const auto g = QPalette::ColorGroup(i);
+ const auto r = QPalette::ColorRole(j);
+ const auto b = p.brush(g, r);
+ if (g == QPalette::Disabled && r == QPalette::Button)
+ QCOMPARE(b, QBrush(Qt::green));
+ else
+ QCOMPARE(b, q.brush(g, r));
+ }
+
+ const QPalette pp = p;
+ QVERIFY(pp.isCopyOf(p));
+ // Setting the same brush won't detach
+ p.setBrush(QPalette::Disabled, QPalette::Button, Qt::green);
+ QVERIFY(pp.isCopyOf(p));
+}
+
QTEST_MAIN(tst_QPalette)
#include "tst_qpalette.moc"
diff --git a/tests/auto/gui/text/qrawfont/tst_qrawfont.cpp b/tests/auto/gui/text/qrawfont/tst_qrawfont.cpp
index 3cf108ed62..37f94d0278 100644
--- a/tests/auto/gui/text/qrawfont/tst_qrawfont.cpp
+++ b/tests/auto/gui/text/qrawfont/tst_qrawfont.cpp
@@ -90,6 +90,9 @@ private slots:
void rawFontFromInvalidData();
void kernedAdvances();
+
+ void fallbackFontsOrder();
+
private:
QString testFont;
QString testFontBoldItalic;
@@ -887,7 +890,7 @@ void tst_QRawFont::unsupportedWritingSystem()
QCOMPARE(rawFont.familyName(), QString::fromLatin1("QtBidiTestFont"));
QCOMPARE(rawFont.pixelSize(), 12.0);
- QString arabicText = QFontDatabase::writingSystemSample(QFontDatabase::Arabic);
+ QString arabicText = QFontDatabase::writingSystemSample(QFontDatabase::Arabic).simplified().remove(QLatin1Char(' '));
QTextLayout layout;
layout.setFont(font);
@@ -1009,6 +1012,38 @@ void tst_QRawFont::kernedAdvances()
QVERIFY(FUZZY_LTEQ(qAbs(advances.at(0).x() - expectedAdvanceWidth), errorMargin));
}
+void tst_QRawFont::fallbackFontsOrder()
+{
+ QFontDatabase fontDatabase;
+ int id = fontDatabase.addApplicationFont(testFont);
+
+ QFont font("QtBidiTestFont");
+ font.setPixelSize(12.0);
+
+ QString arabicText = QFontDatabase::writingSystemSample(QFontDatabase::Arabic);
+
+ // If this fails, then the writing system sample has changed and we need to create
+ // a new text containing both a space and Arabic characters.
+ QVERIFY(arabicText.contains(QLatin1Char(' ')));
+
+ QTextLayout layout;
+ layout.setFont(font);
+ layout.setText(arabicText);
+ layout.setCacheEnabled(true);
+ layout.beginLayout();
+ layout.createLine();
+ layout.endLayout();
+
+ QList<QGlyphRun> glyphRuns = layout.glyphRuns();
+
+ // Since QtBidiTestFont does not support Arabic nor the space, both should map to
+ // the same font. If this fails, it is an indication that the list of fallbacks fonts
+ // is not sorted by writing system support.
+ QCOMPARE(glyphRuns.size(), 1);
+
+ fontDatabase.removeApplicationFont(id);
+}
+
#endif // QT_NO_RAWFONT
QTEST_MAIN(tst_QRawFont)
diff --git a/tests/auto/network/access/qftp/tst_qftp.cpp b/tests/auto/network/access/qftp/tst_qftp.cpp
index e00459557a..d42702e1de 100644
--- a/tests/auto/network/access/qftp/tst_qftp.cpp
+++ b/tests/auto/network/access/qftp/tst_qftp.cpp
@@ -41,6 +41,8 @@
#include <qnetworkconfigmanager.h>
#include <QNetworkSession>
#include <QtNetwork/private/qnetworksession_p.h>
+#include <QTcpServer>
+#include <QHostInfo>
#include "../../../network-settings.h"
@@ -108,6 +110,9 @@ private slots:
void qtbug7359Crash();
+ void loginURL_data();
+ void loginURL();
+
protected slots:
void stateChanged( int );
void listInfo( const QUrlInfo & );
@@ -397,11 +402,11 @@ void tst_QFtp::login_data()
QTest::addColumn<int>("success");
QTest::newRow( "ok01" ) << QtNetworkSettings::serverName() << (uint)21 << QString() << QString() << 1;
- QTest::newRow( "ok02" ) << QtNetworkSettings::serverName() << (uint)21 << QString("ftp") << QString() << 1;
+ QTest::newRow( "ok02" ) << QtNetworkSettings::serverName() << (uint)21 << QString("ftp") << QString("") << 1;
QTest::newRow( "ok03" ) << QtNetworkSettings::serverName() << (uint)21 << QString("ftp") << QString("foo") << 1;
QTest::newRow( "ok04" ) << QtNetworkSettings::serverName() << (uint)21 << QString("ftptest") << QString("password") << 1;
- QTest::newRow( "error01" ) << QtNetworkSettings::serverName() << (uint)21 << QString("foo") << QString() << 0;
+ QTest::newRow( "error01" ) << QtNetworkSettings::serverName() << (uint)21 << QString("foo") << QString("") << 0;
QTest::newRow( "error02" ) << QtNetworkSettings::serverName() << (uint)21 << QString("foo") << QString("bar") << 0;
}
@@ -2152,6 +2157,206 @@ void tst_QFtp::qtbug7359Crash()
QCoreApplication::processEvents(QEventLoop::AllEvents, 2000 - elapsed);
}
+class FtpLocalServer : public QTcpServer
+{
+ Q_OBJECT
+
+public:
+ explicit FtpLocalServer(QObject *parent = 0) : QTcpServer(parent) {}
+ virtual ~FtpLocalServer() { delete mSocket; }
+ void startServer(qint16 port = 0);
+ void stopServer();
+
+ enum class ReplyCodes {
+ ServiceReady = 220,
+ ServiceClose = 221,
+ NeedPassword = 331,
+ LoginFailed = 530,
+ RequestDeny = 550
+ };
+
+ void sendResponse(ReplyCodes code);
+
+ inline QString getRawUser() { return rawUser; }
+ inline QString getRawPassword() { return rawPass; }
+
+signals:
+ void onStarted();
+ void onStopped();
+
+public slots:
+ void socketReadyRead();
+ void socketDisconnected();
+
+protected:
+ virtual void incomingConnection(qintptr handle);
+
+private:
+ QTcpSocket *mSocket = nullptr;
+ QString rawUser;
+ QString rawPass;
+};
+
+void FtpLocalServer::startServer(qint16 port)
+{
+ if (listen(QHostAddress::Any, port))
+ emit onStarted(); // Notify connected objects
+ else
+ qDebug("Could not start FTP server");
+}
+
+void FtpLocalServer::stopServer()
+{
+ close();
+ emit onStopped(); // Notify connected objects
+}
+
+void FtpLocalServer::sendResponse(ReplyCodes code)
+{
+ if (mSocket)
+ {
+ QString response;
+ switch (code) {
+ case ReplyCodes::ServiceReady:
+ response = QString("220 Service ready for new user.\r\n");
+ break;
+ case ReplyCodes::ServiceClose:
+ response = QString("221 Service closing control connection.\r\n");
+ break;
+ case ReplyCodes::NeedPassword:
+ response = QString("331 User name okay, need password.\r\n");
+ break;
+ case ReplyCodes::LoginFailed:
+ response = QString("530 Not logged in.\r\n");
+ break;
+ case ReplyCodes::RequestDeny:
+ response = QString("550 Requested action not taken.\r\n");
+ break;
+ default:
+ qDebug("Unimplemented response code: %u", static_cast<uint>(code));
+ break;
+ }
+
+ if (!response.isEmpty())
+ mSocket->write(response.toLatin1());
+ }
+}
+
+void FtpLocalServer::incomingConnection(qintptr handle)
+{
+ mSocket = new QTcpSocket(this);
+ if (mSocket == nullptr || !mSocket->setSocketDescriptor(handle))
+ {
+ delete mSocket;
+ mSocket = nullptr;
+ qDebug() << handle << " Error binding socket";
+ return;
+ }
+
+ connect(mSocket, SIGNAL(readyRead()), this, SLOT(socketReadyRead()));
+ connect(mSocket, SIGNAL(disconnected()), this, SLOT(socketDisconnected()));
+
+ // Accept client connection
+ sendResponse(ReplyCodes::ServiceReady);
+}
+
+void FtpLocalServer::socketReadyRead()
+{
+ QString data;
+ if (mSocket)
+ data.append(mSocket->readAll());
+
+ // RFC959 Upper and lower case alphabetic characters are to be treated identically.
+ if (data.startsWith("USER", Qt::CaseInsensitive)) {
+ rawUser = data;
+ sendResponse(ReplyCodes::NeedPassword);
+ } else if (data.startsWith("PASS", Qt::CaseInsensitive)) {
+ rawPass = data;
+ sendResponse(ReplyCodes::LoginFailed);
+ } else {
+ sendResponse(ReplyCodes::RequestDeny);
+ }
+}
+
+void FtpLocalServer::socketDisconnected()
+{
+ // Cleanup
+ if (mSocket)
+ mSocket->deleteLater();
+ deleteLater();
+}
+
+void tst_QFtp::loginURL_data()
+{
+ QTest::addColumn<QString>("user");
+ QTest::addColumn<QString>("password");
+ QTest::addColumn<QString>("rawUser");
+ QTest::addColumn<QString>("rawPass");
+
+ QTest::newRow("no username, no password")
+ << QString() << QString()
+ << QString("USER anonymous\r\n") << QString("PASS anonymous@\r\n");
+
+ QTest::newRow("username, no password")
+ << QString("someone") << QString()
+ << QString("USER someone\r\n") << QString();
+
+ QTest::newRow("username, empty password")
+ << QString("someone") << QString("")
+ << QString("USER someone\r\n") << QString("PASS \r\n");
+
+ QTest::newRow("username, password")
+ << QString("someone") << QString("nonsense")
+ << QString("USER someone\r\n") << QString("PASS nonsense\r\n");
+
+ QTest::newRow("anonymous, no password")
+ << QString("anonymous") << QString()
+ << QString("USER anonymous\r\n") << QString("PASS anonymous@\r\n");
+
+ QTest::newRow("Anonymous, no password")
+ << QString("Anonymous") << QString()
+ << QString("USER Anonymous\r\n") << QString("PASS anonymous@\r\n");
+
+ QTest::newRow("anonymous, empty password")
+ << QString("anonymous") << QString("")
+ << QString("USER anonymous\r\n") << QString("PASS \r\n");
+
+ QTest::newRow("ANONYMOUS, password")
+ << QString("ANONYMOUS") << QString("nonsense")
+ << QString("USER ANONYMOUS\r\n") << QString("PASS nonsense\r\n");
+}
+
+void tst_QFtp::loginURL()
+{
+ QFETCH_GLOBAL(bool, setProxy);
+ if (setProxy)
+ QSKIP("This test should be verified on the local machine without proxies");
+
+ QFETCH(QString, user);
+ QFETCH(QString, password);
+ QFETCH(QString, rawUser);
+ QFETCH(QString, rawPass);
+
+ FtpLocalServer server;
+ server.startServer();
+ uint port = server.serverPort();
+
+ ftp = newFtp();
+ addCommand(QFtp::ConnectToHost,
+ ftp->connectToHost(QHostInfo::localHostName(), port));
+ addCommand(QFtp::Login, ftp->login(user, password));
+
+ QTestEventLoop::instance().enterLoop(5);
+ delete ftp;
+ ftp = nullptr;
+ server.stopServer();
+ if (QTestEventLoop::instance().timeout())
+ QFAIL(msgTimedOut(QHostInfo::localHostName(), port));
+
+ QCOMPARE(server.getRawUser(), rawUser);
+ QCOMPARE(server.getRawPassword(), rawPass);
+}
+
QTEST_MAIN(tst_QFtp)
#include "tst_qftp.moc"
diff --git a/tests/auto/network/socket/qudpsocket/BLACKLIST b/tests/auto/network/socket/qudpsocket/BLACKLIST
index d58a850a1f..a98c4d5c6b 100644
--- a/tests/auto/network/socket/qudpsocket/BLACKLIST
+++ b/tests/auto/network/socket/qudpsocket/BLACKLIST
@@ -18,12 +18,9 @@ osx
osx
[broadcasting]
osx
-ubuntu-16.04
[zeroLengthDatagram]
osx
[linkLocalIPv6]
redhatenterpriselinuxworkstation-6.6
-[pendingDatagramSize]
-ubuntu-16.04
[readyReadForEmptyDatagram]
ubuntu-16.04
diff --git a/tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp b/tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp
index bbac03b708..8165ccbc58 100644
--- a/tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp
+++ b/tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp
@@ -126,12 +126,14 @@ protected slots:
private:
bool shouldSkipIpv6TestsForBrokenSetsockopt();
+ bool shouldWorkaroundLinuxKernelBug();
#ifdef SHOULD_CHECK_SYSCALL_SUPPORT
bool ipv6SetsockoptionMissing(int level, int optname);
#endif
QNetworkInterface interfaceForGroup(const QHostAddress &multicastGroup);
bool m_skipUnsupportedIPv6Tests;
+ bool m_workaroundLinuxKernelBug;
QList<QHostAddress> allAddresses;
QHostAddress multicastGroup4, multicastGroup6;
QVector<QHostAddress> linklocalMulticastGroups;
@@ -207,6 +209,16 @@ QNetworkInterface tst_QUdpSocket::interfaceForGroup(const QHostAddress &multicas
return ipv6if;
}
+bool tst_QUdpSocket::shouldWorkaroundLinuxKernelBug()
+{
+#ifdef Q_OS_LINUX
+ const QVersionNumber version = QVersionNumber::fromString(QSysInfo::kernelVersion());
+ return version.majorVersion() == 4 && version.minorVersion() >= 6 && version.minorVersion() < 13;
+#else
+ return false;
+#endif
+}
+
static QHostAddress makeNonAny(const QHostAddress &address, QHostAddress::SpecialAddress preferForAny = QHostAddress::LocalHost)
{
if (address == QHostAddress::Any)
@@ -276,6 +288,7 @@ void tst_QUdpSocket::initTestCase()
qDebug() << "Will use multicast groups" << multicastGroup4 << multicastGroup6 << linklocalMulticastGroups;
+ m_workaroundLinuxKernelBug = shouldWorkaroundLinuxKernelBug();
if (EmulationDetector::isRunningArmOnX86())
QSKIP("This test is unreliable due to QEMU emulation shortcomings.");
}
@@ -360,6 +373,9 @@ void tst_QUdpSocket::unconnectedServerAndClientTest()
void tst_QUdpSocket::broadcasting()
{
+ if (m_workaroundLinuxKernelBug)
+ QSKIP("This test can fail due to linux kernel bug");
+
QFETCH_GLOBAL(bool, setProxy);
if (setProxy) {
#ifndef QT_NO_NETWORKPROXY
@@ -805,6 +821,9 @@ void tst_QUdpSocket::bindAndConnectToHost()
void tst_QUdpSocket::pendingDatagramSize()
{
+ if (m_workaroundLinuxKernelBug)
+ QSKIP("This test can fail due to linux kernel bug");
+
QUdpSocket server;
QVERIFY2(server.bind(), server.errorString().toLatin1().constData());
diff --git a/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp b/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp
index a4a8a647a3..baf2551dfb 100644
--- a/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp
+++ b/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp
@@ -2253,6 +2253,31 @@ void tst_QSqlQuery::prepare_bind_exec()
QCOMPARE( q.value(1).toString(), QString("name") );
QCOMPARE( q.value(2).toString(), QString("name") );
+ // Test that duplicated named placeholders before the next unique one works correctly - QTBUG-65150
+ QVERIFY(q.prepare("insert into " + qtest_prepare + " (id, name, name2) values (:id, :id, :name)"));
+ for (i = 104; i < 106; ++i) {
+ q.bindValue(":id", i);
+ q.bindValue(":name", "name");
+ QVERIFY(q.exec());
+ }
+ QVERIFY(q.exec("select * from " + qtest_prepare + " where id > 103 order by id"));
+ QVERIFY(q.next());
+ QCOMPARE(q.value(0).toInt(), 104);
+ QCOMPARE(q.value(1).toString(), QString("104"));
+ QCOMPARE(q.value(2).toString(), QString("name"));
+
+ // Test that duplicated named placeholders in any order
+ QVERIFY(q.prepare("insert into " + qtest_prepare + " (id, name, name2) values (:id, :name, :id)"));
+ for (i = 107; i < 109; ++i) {
+ q.bindValue(":id", i);
+ q.bindValue(":name", "name");
+ QVERIFY(q.exec());
+ }
+ QVERIFY(q.exec("select * from " + qtest_prepare + " where id > 106 order by id"));
+ QVERIFY(q.next());
+ QCOMPARE(q.value(0).toInt(), 107);
+ QCOMPARE(q.value(1).toString(), QString("name"));
+ QCOMPARE(q.value(2).toString(), QString("107"));
} // end of SQLite scope
}
diff --git a/tests/auto/tools/qmake/testdata/rawString/object2.h b/tests/auto/tools/qmake/testdata/rawString/object2.h
index 2ab77cd3bd..d29f0c72ec 100644
--- a/tests/auto/tools/qmake/testdata/rawString/object2.h
+++ b/tests/auto/tools/qmake/testdata/rawString/object2.h
@@ -1,31 +1,37 @@
/****************************************************************************
**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the test suite of the Qt Toolkit.
**
-** $QT_BEGIN_LICENSE:LGPL21$
+** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
diff --git a/tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp b/tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp
index 979d5c632e..71efe1d59a 100644
--- a/tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp
+++ b/tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp
@@ -43,6 +43,7 @@
#if defined(Q_OS_WIN)
# include <qt_windows.h> // for SetFileAttributes
#endif
+#include <private/qfilesystemengine_p.h>
#include <algorithm>
@@ -883,6 +884,18 @@ void tst_QFileSystemModel::deleteFile()
QVERIFY(!newFile.exists());
}
+static QString flipCase(QString s)
+{
+ for (int i = 0, size = s.size(); i < size; ++i) {
+ const QChar c = s.at(i);
+ if (c.isUpper())
+ s[i] = c.toLower();
+ else if (c.isLower())
+ s[i] = c.toUpper();
+ }
+ return s;
+}
+
void tst_QFileSystemModel::caseSensitivity()
{
QString tmp = flatDirTestPath;
@@ -890,9 +903,23 @@ void tst_QFileSystemModel::caseSensitivity()
files << "a" << "c" << "C";
QVERIFY(createFiles(tmp, files));
QModelIndex root = model->index(tmp);
+ QStringList paths;
+ QModelIndexList indexes;
QCOMPARE(model->rowCount(root), 0);
for (int i = 0; i < files.count(); ++i) {
- QVERIFY(model->index(tmp + '/' + files.at(i)).isValid());
+ const QString path = tmp + '/' + files.at(i);
+ const QModelIndex index = model->index(path);
+ QVERIFY(index.isValid());
+ paths.append(path);
+ indexes.append(index);
+ }
+
+ if (!QFileSystemEngine::isCaseSensitive()) {
+ // QTBUG-31103, QTBUG-64147: Verify that files can be accessed by paths with fLipPeD case.
+ for (int i = 0; i < paths.count(); ++i) {
+ const QModelIndex flippedCaseIndex = model->index(flipCase(paths.at(i)));
+ QCOMPARE(indexes.at(i), flippedCaseIndex);
+ }
}
}