diff options
author | Tony Sarajärvi <tony.sarajarvi@qt.io> | 2017-11-12 15:35:48 +0000 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2017-11-12 15:35:48 +0000 |
commit | 212f92182ad468ec93472ed93ae3839f7122cb68 (patch) | |
tree | 3e1d272570eb6caa022545828f80c24b656bad6e /tests/auto | |
parent | 3bbeb1e9dce958ddba54f6b102bb409a63c9f889 (diff) | |
parent | 88cf04458002d863750e9121af7dcd9bcbfaa169 (diff) |
Merge "Merge remote-tracking branch 'origin/5.9' into 5.10" into refs/staging/5.10
Diffstat (limited to 'tests/auto')
70 files changed, 478 insertions, 382 deletions
diff --git a/tests/auto/auto.pro b/tests/auto/auto.pro index 3caa6a3b65..a1ffe5b3ce 100644 --- a/tests/auto/auto.pro +++ b/tests/auto/auto.pro @@ -46,5 +46,5 @@ else:!qtConfig(process): SUBDIRS -= tools # QTBUG-63915 boot2qt: { - contains(QT_ARCH, arm64): SUBDIRS -= dbus + SUBDIRS -= dbus } diff --git a/tests/auto/corelib/animation/qsequentialanimationgroup/BLACKLIST b/tests/auto/corelib/animation/qsequentialanimationgroup/BLACKLIST index 391e3f67af..2a31afd735 100644 --- a/tests/auto/corelib/animation/qsequentialanimationgroup/BLACKLIST +++ b/tests/auto/corelib/animation/qsequentialanimationgroup/BLACKLIST @@ -3,3 +3,5 @@ windows [finishWithUncontrolledAnimation] windows osx-10.12 +[groupWithZeroDurationAnimations] +osx diff --git a/tests/auto/corelib/io/qfile/tst_qfile.cpp b/tests/auto/corelib/io/qfile/tst_qfile.cpp index 9026864b12..c173a87a41 100644 --- a/tests/auto/corelib/io/qfile/tst_qfile.cpp +++ b/tests/auto/corelib/io/qfile/tst_qfile.cpp @@ -405,6 +405,8 @@ void tst_QFile::cleanup() QDir remainingDir(absoluteFilePath); QVERIFY2(remainingDir.removeRecursively(), qPrintable(absoluteFilePath)); } else { + if (!(QFile::permissions(absoluteFilePath) & QFile::WriteUser)) + QVERIFY2(QFile::setPermissions(absoluteFilePath, QFile::WriteUser), qPrintable(absoluteFilePath)); QVERIFY2(QFile::remove(absoluteFilePath), qPrintable(absoluteFilePath)); } } @@ -443,8 +445,6 @@ void tst_QFile::initTestCase() m_stdinProcessDir = QFINDTESTDATA("stdinprocess"); QVERIFY(!m_stdinProcessDir.isEmpty()); #endif - m_testSourceFile = QFINDTESTDATA("tst_qfile.cpp"); - QVERIFY(!m_testSourceFile.isEmpty()); m_testLogFile = QFINDTESTDATA("testlog.txt"); QVERIFY(!m_testLogFile.isEmpty()); m_dosFile = QFINDTESTDATA("dosfile.txt"); @@ -457,15 +457,19 @@ void tst_QFile::initTestCase() QVERIFY(!m_twoDotsFile.isEmpty()); #ifndef BUILTIN_TESTDATA + m_testSourceFile = QFINDTESTDATA("tst_qfile.cpp"); + QVERIFY(!m_testSourceFile.isEmpty()); m_testFile = QFINDTESTDATA("testfile.txt"); QVERIFY(!m_testFile.isEmpty()); + m_resourcesDir = QFINDTESTDATA("resources"); + QVERIFY(!m_resourcesDir.isEmpty()); #else m_dataDir = QEXTRACTTESTDATA("/"); QVERIFY2(!m_dataDir.isNull(), qPrintable("Could not extract test data")); m_testFile = m_dataDir->path() + "/testfile.txt"; + m_testSourceFile = m_dataDir->path() + "/tst_qfile.cpp"; + m_resourcesDir = m_dataDir->path() + "/resources"; #endif - m_resourcesDir = QFINDTESTDATA("resources"); - QVERIFY(!m_resourcesDir.isEmpty()); m_noEndOfLineFile = QFINDTESTDATA("noendofline.txt"); QVERIFY(!m_noEndOfLineFile.isEmpty()); @@ -2189,12 +2193,20 @@ public: if (fileName.startsWith(":!")) { QDir dir; - QString realFile = QFINDTESTDATA(fileName.mid(2)); +#ifndef BUILTIN_TESTDATA + const QString realFile = QFINDTESTDATA(fileName.mid(2)); +#else + const QString realFile = m_dataDir->filePath(fileName.mid(2)); +#endif if (dir.exists(realFile)) return new QFSFileEngine(realFile); } return 0; } + +#ifdef BUILTIN_TESTDATA + QSharedPointer<QTemporaryDir> m_dataDir; +#endif }; #endif @@ -2203,6 +2215,9 @@ void tst_QFile::useQFileInAFileHandler() { // This test should not dead-lock MyRecursiveHandler handler; +#ifdef BUILTIN_TESTDATA + handler.m_dataDir = m_dataDir; +#endif QFile file(":!tst_qfile.cpp"); QVERIFY(file.exists()); } diff --git a/tests/auto/corelib/io/qtemporarydir/qtemporarydir.pro b/tests/auto/corelib/io/qtemporarydir/qtemporarydir.pro index 351e263093..5908648378 100644 --- a/tests/auto/corelib/io/qtemporarydir/qtemporarydir.pro +++ b/tests/auto/corelib/io/qtemporarydir/qtemporarydir.pro @@ -4,4 +4,4 @@ SOURCES += tst_qtemporarydir.cpp INCLUDEPATH += ../../../../shared/ HEADERS += ../../../../shared/emulationdetector.h -QT = core testlib +QT = core testlib testlib-private diff --git a/tests/auto/corelib/io/qtemporarydir/tst_qtemporarydir.cpp b/tests/auto/corelib/io/qtemporarydir/tst_qtemporarydir.cpp index fcd9133099..76462be376 100644 --- a/tests/auto/corelib/io/qtemporarydir/tst_qtemporarydir.cpp +++ b/tests/auto/corelib/io/qtemporarydir/tst_qtemporarydir.cpp @@ -35,6 +35,7 @@ #include <qdir.h> #include <qset.h> #include <qtextcodec.h> +#include <QtTest/private/qtesthelpers_p.h> #ifdef Q_OS_WIN # include <windows.h> #endif @@ -112,16 +113,6 @@ void tst_QTemporaryDir::getSetCheck() QCOMPARE(true, obj1.autoRemove()); } -static inline bool canHandleUnicodeFileNames() -{ -#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE) - return true; -#else - // Check for UTF-8 by converting the Euro symbol (see tst_utf8) - return QFile::encodeName(QString(QChar(0x20AC))) == QByteArrayLiteral("\342\202\254"); -#endif -} - static QString hanTestText() { QString text; @@ -159,7 +150,7 @@ void tst_QTemporaryDir::fileTemplate_data() QTest::newRow("4Xsuffix") << "qt_XXXXXX_XXXX" << "qt_" << "_XXXX"; QTest::newRow("4Xprefix") << "qt_XXXX" << "qt_XXXX" << ""; QTest::newRow("5Xprefix") << "qt_XXXXX" << "qt_XXXXX" << ""; - if (canHandleUnicodeFileNames()) { + if (QTestPrivate::canHandleUnicodeFileNames()) { // Test Umlauts (contained in Latin1) QString prefix = "qt_" + umlautTestText(); QTest::newRow("Umlauts") << (prefix + "XXXXXX") << prefix << ""; diff --git a/tests/auto/corelib/io/qtemporaryfile/qtemporaryfile.pro b/tests/auto/corelib/io/qtemporaryfile/qtemporaryfile.pro index a89e5c66ff..e17cb05cd8 100644 --- a/tests/auto/corelib/io/qtemporaryfile/qtemporaryfile.pro +++ b/tests/auto/corelib/io/qtemporaryfile/qtemporaryfile.pro @@ -1,6 +1,6 @@ CONFIG += testcase TARGET = tst_qtemporaryfile -QT = core testlib +QT = core testlib testlib-private SOURCES = tst_qtemporaryfile.cpp TESTDATA += tst_qtemporaryfile.cpp RESOURCES += qtemporaryfile.qrc diff --git a/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp b/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp index 11c24ca86f..f3ce902bbd 100644 --- a/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp +++ b/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp @@ -38,6 +38,8 @@ #include <qset.h> #include <qtextcodec.h> +#include <QtTest/private/qtesthelpers_p.h> + #if defined(Q_OS_WIN) # include <windows.h> #endif @@ -143,16 +145,6 @@ void tst_QTemporaryFile::getSetCheck() QCOMPARE(true, obj1.autoRemove()); } -static inline bool canHandleUnicodeFileNames() -{ -#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE) - return true; -#else - // Check for UTF-8 by converting the Euro symbol (see tst_utf8) - return QFile::encodeName(QString(QChar(0x20AC))) == QByteArrayLiteral("\342\202\254"); -#endif -} - static QString hanTestText() { QString text; @@ -201,7 +193,7 @@ void tst_QTemporaryFile::fileTemplate_data() QTest::newRow("set template, with xxx") << "" << "qt_" << ".xxx" << "qt_XXXXXX.xxx"; QTest::newRow("set template, with >6 X's") << "" << "qt_" << ".xxx" << "qt_XXXXXXXXXXXXXX.xxx"; QTest::newRow("set template, with >6 X's, no suffix") << "" << "qt_" << "" << "qt_XXXXXXXXXXXXXX"; - if (canHandleUnicodeFileNames()) { + if (QTestPrivate::canHandleUnicodeFileNames()) { // Test Umlauts (contained in Latin1) QString prefix = "qt_" + umlautTestText(); QTest::newRow("Umlauts") << (prefix + "XXXXXX") << prefix << QString() << QString(); @@ -824,7 +816,7 @@ void tst_QTemporaryFile::QTBUG_4796_data() QTest::newRow("XXXXXXbla") << QString() << QString("bla") << true; QTest::newRow("does-not-exist/qt_temp.XXXXXX") << QString("does-not-exist/qt_temp") << QString() << false; - if (canHandleUnicodeFileNames()) { + if (QTestPrivate::canHandleUnicodeFileNames()) { QTest::newRow("XXXXXX<unicode>") << QString() << unicode << true; QTest::newRow("<unicode>XXXXXX") << unicode << QString() << true; QTest::newRow("<unicode>XXXXXX<unicode>") << unicode << unicode << true; diff --git a/tests/auto/network/access/qnetworkreply/BLACKLIST b/tests/auto/network/access/qnetworkreply/BLACKLIST index 1d56c78bbc..acea0a5aad 100644 --- a/tests/auto/network/access/qnetworkreply/BLACKLIST +++ b/tests/auto/network/access/qnetworkreply/BLACKLIST @@ -1,5 +1,7 @@ # See qtbase/src/testlib/qtestblacklist.cpp for format osx +[authenticationCacheAfterCancel] +windows [ioGetFromBuiltinHttp:http+limited] ubuntu-14.04 [ioGetFromBuiltinHttp:https+limited] @@ -8,3 +10,29 @@ ubuntu-14.04 * [backgroundRequestInterruption:ftp, bg, nobg] * +[getErrors:ftp-host] +linux +[getFromHttpIntoBuffer] +windows +[getFromHttpIntoBuffer2] +windows +[headFromHttp] +windows +[ioGetFromHttpWithSocksProxy] +windows +[ioPostToHttpFromSocket] +windows +[ioHttpRedirectMultipartPost] +linux +[ioHttpRedirectPolicy] +b2qt 64bit +linux +[ioHttpRedirectPostPut] +linux +windows +[putWithServerClosingConnectionImmediately] +windows +[qtbug28035browserDoesNotLoadQtProjectOrgCorrectly] +windows +[getFromUnreachableIp] +windows msvc-2017 diff --git a/tests/auto/network/access/qnetworkreply/test/test.pro b/tests/auto/network/access/qnetworkreply/test/test.pro index 0dcf5a250c..1f45ac0c49 100644 --- a/tests/auto/network/access/qnetworkreply/test/test.pro +++ b/tests/auto/network/access/qnetworkreply/test/test.pro @@ -13,7 +13,4 @@ RESOURCES += ../qnetworkreply.qrc TESTDATA += ../empty ../rfc3252.txt ../resource ../bigfile ../*.jpg ../certs \ ../index.html ../smb-file.txt -qtConfig(xcb): CONFIG+=insignificant_test # unstable, QTBUG-21102 -win32:CONFIG += insignificant_test # QTBUG-24226 - !winrt: TEST_HELPER_INSTALLS = ../echo/echo diff --git a/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp index b6b5f5ae70..5baf4c0870 100644 --- a/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp +++ b/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp @@ -1994,6 +1994,16 @@ void tst_QNetworkReply::getErrors_data() << int(QNetworkReply::AuthenticationRequiredError) << 401 << false; } +static QByteArray msgGetErrors(int waitResult, const QNetworkReplyPtr &reply) +{ + QByteArray result ="waitResult=" + QByteArray::number(waitResult); + if (reply->isFinished()) + result += ", finished"; + if (reply->error() != QNetworkReply::NoError) + result += ", error: " + QByteArray::number(int(reply->error())); + return result; +} + void tst_QNetworkReply::getErrors() { QFETCH(QString, url); @@ -2023,7 +2033,8 @@ void tst_QNetworkReply::getErrors() QCOMPARE(reply->error(), QNetworkReply::NoError); // now run the request: - QVERIFY(waitForFinish(reply) != Timeout); + const int waitResult = waitForFinish(reply); + QVERIFY2(waitResult != Timeout, msgGetErrors(waitResult, reply)); QFETCH(int, error); QEXPECT_FAIL("ftp-is-dir", "QFtp cannot provide enough detail", Abort); @@ -6755,6 +6766,48 @@ void tst_QNetworkReply::getFromUnreachableIp() { QNetworkAccessManager manager; +#ifdef Q_OS_WIN32 + // This test assumes that attempt to connect to 255.255.255.255 fails more + // or less fast/immediately. This is not what we observe on Windows x86: + // WSAConnect on non-blocking socket returns SOCKET_ERROR, WSAGetLastError + // returns WSAEWOULDBLOCK (expected) and getsockopt most of the time returns + // NOERROR; so socket engine starts a timer (30 s.) and waits for a timeout/ + // error/success. Unfortunately, the test itself is waiting only for 5 s. + // So we have to adjust the connection timeout or skip the test completely + // if the 'bearermanagement' feature is not available. +#if QT_CONFIG(bearermanagement) + class ConfigurationGuard + { + public: + explicit ConfigurationGuard(QNetworkAccessManager *m) + : manager(m) + { + Q_ASSERT(m); + auto conf = manager->configuration(); + previousTimeout = conf.connectTimeout(); + conf.setConnectTimeout(1500); + manager->setConfiguration(conf); + } + ~ConfigurationGuard() + { + Q_ASSERT(manager); + auto conf = manager->configuration(); + conf.setConnectTimeout(previousTimeout); + manager->setConfiguration(conf); + } + private: + QNetworkAccessManager *manager = nullptr; + int previousTimeout = 0; + + Q_DISABLE_COPY(ConfigurationGuard) + }; + + const ConfigurationGuard restorer(&manager); +#else // bearermanagement + QSKIP("This test is non-deterministic on Windows x86"); +#endif // !bearermanagement +#endif // Q_OS_WIN32 + QNetworkRequest request(QUrl("http://255.255.255.255/42/23/narf/narf/narf")); QNetworkReplyPtr reply(manager.get(request)); diff --git a/tests/auto/network/socket/qtcpsocket/qtcpsocket.pro b/tests/auto/network/socket/qtcpsocket/qtcpsocket.pro index 1183b23556..1f13a396dd 100644 --- a/tests/auto/network/socket/qtcpsocket/qtcpsocket.pro +++ b/tests/auto/network/socket/qtcpsocket/qtcpsocket.pro @@ -1,6 +1,8 @@ TEMPLATE = subdirs SUBDIRS = test -!vxworks: SUBDIRS += stressTest - +!vxworks{ +SUBDIRS += stressTest +test.depends = stressTest +} requires(qtConfig(private_tests)) diff --git a/tests/auto/network/socket/qudpsocket/qudpsocket.pro b/tests/auto/network/socket/qudpsocket/qudpsocket.pro index 4ddb7178a4..b267d5f249 100644 --- a/tests/auto/network/socket/qudpsocket/qudpsocket.pro +++ b/tests/auto/network/socket/qudpsocket/qudpsocket.pro @@ -1,4 +1,3 @@ TEMPLATE = subdirs SUBDIRS = test clientserver - - +test.depends = clientserver diff --git a/tests/auto/network/socket/qudpsocket/test/test.pro b/tests/auto/network/socket/qudpsocket/test/test.pro index 73486a2bc3..e856776ddc 100644 --- a/tests/auto/network/socket/qudpsocket/test/test.pro +++ b/tests/auto/network/socket/qudpsocket/test/test.pro @@ -1,6 +1,7 @@ CONFIG += testcase testcase.timeout = 800 # this test is slow SOURCES += ../tst_qudpsocket.cpp +INCLUDEPATH += ../../../../../shared/ QT = core network testlib MOC_DIR=tmp diff --git a/tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp b/tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp index aeb6e61cd2..0f46caa7c2 100644 --- a/tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp +++ b/tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. -** Copyright (C) 2016 Intel Corporation. +** Copyright (C) 2017 Intel Corporation. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. @@ -45,6 +45,7 @@ #include <qstringlist.h> #include "../../../network-settings.h" +#include "emulationdetector.h" #ifndef QT_NO_BEARERMANAGEMENT #include <QtNetwork/qnetworkconfigmanager.h> @@ -227,6 +228,9 @@ void tst_QUdpSocket::initTestCase() QSKIP("No network test server available"); allAddresses = QNetworkInterface::allAddresses(); m_skipUnsupportedIPv6Tests = shouldSkipIpv6TestsForBrokenSetsockopt(); + + if (EmulationDetector::isRunningArmOnX86()) + QSKIP("This test is unreliable due to QEMU emulation shortcomings."); } void tst_QUdpSocket::init() @@ -445,31 +449,58 @@ void tst_QUdpSocket::loop() paul.setProperty("_q_networksession", QVariant::fromValue(networkSession)); #endif - QVERIFY2(peter.bind(), peter.errorString().toLatin1().constData()); - QVERIFY2(paul.bind(), paul.errorString().toLatin1().constData()); + // make sure we bind to IPv4 + QHostAddress localhost = QHostAddress::LocalHost; + QVERIFY2(peter.bind(localhost), peter.errorString().toLatin1().constData()); + QVERIFY2(paul.bind(localhost), paul.errorString().toLatin1().constData()); QHostAddress peterAddress = makeNonAny(peter.localAddress()); - QHostAddress pualAddress = makeNonAny(paul.localAddress()); + QHostAddress paulAddress = makeNonAny(paul.localAddress()); QCOMPARE(peter.writeDatagram(peterMessage.data(), peterMessage.length(), - pualAddress, paul.localPort()), qint64(peterMessage.length())); + paulAddress, paul.localPort()), qint64(peterMessage.length())); QCOMPARE(paul.writeDatagram(paulMessage.data(), paulMessage.length(), peterAddress, peter.localPort()), qint64(paulMessage.length())); QVERIFY2(peter.waitForReadyRead(9000), QtNetworkSettings::msgSocketError(peter).constData()); QVERIFY2(paul.waitForReadyRead(9000), QtNetworkSettings::msgSocketError(paul).constData()); - char peterBuffer[16*1024]; - char paulBuffer[16*1024]; + + QNetworkDatagram peterDatagram = peter.receiveDatagram(paulMessage.length() * 2); + QNetworkDatagram paulDatagram = paul.receiveDatagram(peterMessage.length() * 2); if (success) { - QCOMPARE(peter.readDatagram(peterBuffer, sizeof(peterBuffer)), qint64(paulMessage.length())); - QCOMPARE(paul.readDatagram(paulBuffer, sizeof(peterBuffer)), qint64(peterMessage.length())); + QCOMPARE(peterDatagram.data().length(), qint64(paulMessage.length())); + QCOMPARE(paulDatagram.data().length(), qint64(peterMessage.length())); } else { - QVERIFY(peter.readDatagram(peterBuffer, sizeof(peterBuffer)) != paulMessage.length()); - QVERIFY(paul.readDatagram(paulBuffer, sizeof(peterBuffer)) != peterMessage.length()); + // this code path seems to never be executed + QVERIFY(peterDatagram.data().length() != paulMessage.length()); + QVERIFY(paulDatagram.data().length() != peterMessage.length()); } - QCOMPARE(QByteArray(peterBuffer, paulMessage.length()), paulMessage); - QCOMPARE(QByteArray(paulBuffer, peterMessage.length()), peterMessage); + QCOMPARE(peterDatagram.data().left(paulMessage.length()), paulMessage); + QCOMPARE(paulDatagram.data().left(peterMessage.length()), peterMessage); + + QCOMPARE(peterDatagram.senderAddress(), paulAddress); + QCOMPARE(paulDatagram.senderAddress(), peterAddress); + QCOMPARE(paulDatagram.senderPort(), int(peter.localPort())); + QCOMPARE(peterDatagram.senderPort(), int(paul.localPort())); + + // Unlike for IPv6 with IPV6_PKTINFO, IPv4 has no standardized way of + // obtaining the packet's destination addresses. The destinationAddress and + // destinationPort calls could fail, so whitelist the OSes for which we + // know we have an implementation. +#if defined(Q_OS_LINUX) || defined(Q_OS_BSD4) || defined(Q_OS_WIN) + QVERIFY(peterDatagram.destinationPort() != -1); + QVERIFY(paulDatagram.destinationPort() != -1); +#endif + if (peterDatagram.destinationPort() == -1) { + QCOMPARE(peterDatagram.destinationAddress().protocol(), QAbstractSocket::UnknownNetworkLayerProtocol); + QCOMPARE(paulDatagram.destinationAddress().protocol(), QAbstractSocket::UnknownNetworkLayerProtocol); + } else { + QCOMPARE(peterDatagram.destinationAddress(), makeNonAny(peter.localAddress())); + QCOMPARE(paulDatagram.destinationAddress(), makeNonAny(paul.localAddress())); + QVERIFY(peterDatagram.destinationAddress().isEqual(makeNonAny(peter.localAddress()))); + QVERIFY(paulDatagram.destinationAddress().isEqual(makeNonAny(paul.localAddress()))); + } } //---------------------------------------------------------------------------------- @@ -492,8 +523,8 @@ void tst_QUdpSocket::ipv6Loop() paul.setProperty("_q_networksession", QVariant::fromValue(networkSession)); #endif - quint16 peterPort; - quint16 paulPort; + int peterPort; + int paulPort; if (!peter.bind(QHostAddress(QHostAddress::LocalHostIPv6), 0)) { QCOMPARE(peter.error(), QUdpSocket::UnsupportedSocketOperationError); @@ -502,6 +533,8 @@ void tst_QUdpSocket::ipv6Loop() QVERIFY(paul.bind(QHostAddress(QHostAddress::LocalHostIPv6), 0)); + QHostAddress peterAddress = makeNonAny(peter.localAddress()); + QHostAddress paulAddress = makeNonAny(paul.localAddress()); peterPort = peter.localPort(); paulPort = paul.localPort(); @@ -510,20 +543,33 @@ void tst_QUdpSocket::ipv6Loop() QCOMPARE(paul.writeDatagram(paulMessage.data(), paulMessage.length(), QHostAddress("::1"), peterPort), qint64(paulMessage.length())); - char peterBuffer[16*1024]; - char paulBuffer[16*1024]; QVERIFY(peter.waitForReadyRead(5000)); QVERIFY(paul.waitForReadyRead(5000)); + QNetworkDatagram peterDatagram = peter.receiveDatagram(paulMessage.length() * 2); + QNetworkDatagram paulDatagram = paul.receiveDatagram(peterMessage.length() * 2); + if (success) { - QCOMPARE(peter.readDatagram(peterBuffer, sizeof(peterBuffer)), qint64(paulMessage.length())); - QCOMPARE(paul.readDatagram(paulBuffer, sizeof(peterBuffer)), qint64(peterMessage.length())); + QCOMPARE(peterDatagram.data().length(), qint64(paulMessage.length())); + QCOMPARE(paulDatagram.data().length(), qint64(peterMessage.length())); } else { - QVERIFY(peter.readDatagram(peterBuffer, sizeof(peterBuffer)) != paulMessage.length()); - QVERIFY(paul.readDatagram(paulBuffer, sizeof(peterBuffer)) != peterMessage.length()); + // this code path seems to never be executed + QVERIFY(peterDatagram.data().length() != paulMessage.length()); + QVERIFY(paulDatagram.data().length() != peterMessage.length()); } - QCOMPARE(QByteArray(peterBuffer, paulMessage.length()), paulMessage); - QCOMPARE(QByteArray(paulBuffer, peterMessage.length()), peterMessage); + QCOMPARE(peterDatagram.data().left(paulMessage.length()), paulMessage); + QCOMPARE(paulDatagram.data().left(peterMessage.length()), peterMessage); + + QCOMPARE(peterDatagram.senderAddress(), paulAddress); + QCOMPARE(paulDatagram.senderAddress(), peterAddress); + QCOMPARE(paulDatagram.senderPort(), peterPort); + QCOMPARE(peterDatagram.senderPort(), paulPort); + + // For IPv6, IPV6_PKTINFO is a mandatory feature (RFC 3542). + QCOMPARE(peterDatagram.destinationAddress(), makeNonAny(peter.localAddress())); + QCOMPARE(paulDatagram.destinationAddress(), makeNonAny(paul.localAddress())); + QCOMPARE(peterDatagram.destinationPort(), peterPort); + QCOMPARE(paulDatagram.destinationPort(), paulPort); } void tst_QUdpSocket::dualStack() @@ -539,17 +585,23 @@ void tst_QUdpSocket::dualStack() QByteArray v4Data("v4"); QVERIFY(v4Sock.bind(QHostAddress(QHostAddress::AnyIPv4), 0)); - QHostAddress from; - quint16 port; - QByteArray buffer; //test v4 -> dual QCOMPARE((int)v4Sock.writeDatagram(v4Data.constData(), v4Data.length(), QHostAddress(QHostAddress::LocalHost), dualSock.localPort()), v4Data.length()); QVERIFY2(dualSock.waitForReadyRead(5000), QtNetworkSettings::msgSocketError(dualSock).constData()); - buffer.reserve(100); - qint64 size = dualSock.readDatagram(buffer.data(), 100, &from, &port); - QCOMPARE((int)size, v4Data.length()); - buffer.resize(size); - QCOMPARE(buffer, v4Data); + QNetworkDatagram dgram = dualSock.receiveDatagram(100); + QVERIFY(dgram.isValid()); + QCOMPARE(dgram.data(), v4Data); + QCOMPARE(dgram.senderPort(), int(v4Sock.localPort())); + // receiving v4 on dual stack will receive as IPv6, so use isEqual() + QVERIFY(dgram.senderAddress().isEqual(makeNonAny(v4Sock.localAddress(), QHostAddress::Null))); + if (dualSock.localAddress().protocol() == QAbstractSocket::IPv4Protocol) + QCOMPARE(dgram.senderAddress(), makeNonAny(v4Sock.localAddress(), QHostAddress::Null)); + if (dgram.destinationPort() != -1) { + QCOMPARE(dgram.destinationPort(), int(dualSock.localPort())); + QVERIFY(dgram.destinationAddress().isEqual(dualSock.localAddress())); + } else { + qInfo("Getting IPv4 destination address failed."); + } if (QtNetworkSettings::hasIPv6()) { QUdpSocket v6Sock; @@ -559,30 +611,41 @@ void tst_QUdpSocket::dualStack() //test v6 -> dual QCOMPARE((int)v6Sock.writeDatagram(v6Data.constData(), v6Data.length(), QHostAddress(QHostAddress::LocalHostIPv6), dualSock.localPort()), v6Data.length()); QVERIFY2(dualSock.waitForReadyRead(5000), QtNetworkSettings::msgSocketError(dualSock).constData()); - buffer.reserve(100); - size = dualSock.readDatagram(buffer.data(), 100, &from, &port); - QCOMPARE((int)size, v6Data.length()); - buffer.resize(size); - QCOMPARE(buffer, v6Data); + dgram = dualSock.receiveDatagram(100); + QVERIFY(dgram.isValid()); + QCOMPARE(dgram.data(), v6Data); + QCOMPARE(dgram.senderPort(), int(v6Sock.localPort())); + QCOMPARE(dgram.senderAddress(), makeNonAny(v6Sock.localAddress(), QHostAddress::LocalHostIPv6)); + QCOMPARE(dgram.destinationPort(), int(dualSock.localPort())); + QCOMPARE(dgram.destinationAddress(), makeNonAny(dualSock.localAddress(), QHostAddress::LocalHostIPv6)); //test dual -> v6 QCOMPARE((int)dualSock.writeDatagram(dualData.constData(), dualData.length(), QHostAddress(QHostAddress::LocalHostIPv6), v6Sock.localPort()), dualData.length()); QVERIFY2(v6Sock.waitForReadyRead(5000), QtNetworkSettings::msgSocketError(v6Sock).constData()); - buffer.reserve(100); - size = v6Sock.readDatagram(buffer.data(), 100, &from, &port); - QCOMPARE((int)size, dualData.length()); - buffer.resize(size); - QCOMPARE(buffer, dualData); + dgram = v6Sock.receiveDatagram(100); + QVERIFY(dgram.isValid()); + QCOMPARE(dgram.data(), dualData); + QCOMPARE(dgram.senderPort(), int(dualSock.localPort())); + QCOMPARE(dgram.senderAddress(), makeNonAny(dualSock.localAddress(), QHostAddress::LocalHostIPv6)); + QCOMPARE(dgram.destinationPort(), int(v6Sock.localPort())); + QCOMPARE(dgram.destinationAddress(), makeNonAny(v6Sock.localAddress(), QHostAddress::LocalHostIPv6)); } //test dual -> v4 QCOMPARE((int)dualSock.writeDatagram(dualData.constData(), dualData.length(), QHostAddress(QHostAddress::LocalHost), v4Sock.localPort()), dualData.length()); QVERIFY2(v4Sock.waitForReadyRead(5000), QtNetworkSettings::msgSocketError(v4Sock).constData()); - buffer.reserve(100); - size = v4Sock.readDatagram(buffer.data(), 100, &from, &port); - QCOMPARE((int)size, dualData.length()); - buffer.resize(size); - QCOMPARE(buffer, dualData); + dgram = v4Sock.receiveDatagram(100); + QVERIFY(dgram.isValid()); + QCOMPARE(dgram.data(), dualData); + QCOMPARE(dgram.senderPort(), int(dualSock.localPort())); + QCOMPARE(dgram.senderAddress(), makeNonAny(dualSock.localAddress(), QHostAddress::LocalHost)); +#if defined(Q_OS_LINUX) || defined(Q_OS_BSD4) || defined(Q_OS_WIN) + QVERIFY(dgram.destinationPort() != -1); +#endif + if (dgram.destinationPort() != -1) { + QCOMPARE(dgram.destinationPort(), int(v4Sock.localPort())); + QCOMPARE(dgram.destinationAddress(), makeNonAny(v4Sock.localAddress(), QHostAddress::LocalHost)); + } } void tst_QUdpSocket::dualStackAutoBinding() @@ -1603,6 +1666,8 @@ void tst_QUdpSocket::linkLocalIPv6() QVERIFY(dgram.isValid()); QCOMPARE(dgram.senderAddress(), s->localAddress()); QCOMPARE(dgram.senderPort(), int(s->localPort())); + QCOMPARE(dgram.destinationAddress(), s->localAddress()); + QCOMPARE(dgram.destinationPort(), int(neutral.localPort())); QCOMPARE(dgram.data().length(), testData.length()); QCOMPARE(dgram.data(), testData); @@ -1684,6 +1749,20 @@ void tst_QUdpSocket::linkLocalIPv4() QCOMPARE(dgram.data().length(), testData.length()); QCOMPARE(dgram.data(), testData); + // Unlike for IPv6 with IPV6_PKTINFO, IPv4 has no standardized way of + // obtaining the packet's destination addresses. The destinationAddress + // and destinationPort calls could fail, so whitelist the OSes we know + // we have an implementation. +#if defined(Q_OS_LINUX) || defined(Q_OS_BSD4) || defined(Q_OS_WIN) + QVERIFY(dgram.destinationPort() != -1); +#endif + if (dgram.destinationPort() == -1) { + QCOMPARE(dgram.destinationAddress().protocol(), QAbstractSocket::UnknownNetworkLayerProtocol); + } else { + QCOMPARE(dgram.destinationAddress(), s->localAddress()); + QCOMPARE(dgram.destinationPort(), int(neutral.localPort())); + } + QVERIFY(neutral.writeDatagram(dgram.makeReply(testData))); dgram = s->receiveDatagram(testData.length() * 2); diff --git a/tests/auto/other/qaccessibility/qaccessibility.pro b/tests/auto/other/qaccessibility/qaccessibility.pro index 727d5fe0d7..bfe652d25a 100644 --- a/tests/auto/other/qaccessibility/qaccessibility.pro +++ b/tests/auto/other/qaccessibility/qaccessibility.pro @@ -1,7 +1,7 @@ CONFIG += testcase TARGET = tst_qaccessibility requires(qtConfig(accessibility)) -QT += testlib core-private gui-private widgets-private +QT += testlib core-private gui-private widgets-private testlib-private SOURCES += tst_qaccessibility.cpp HEADERS += accessiblewidgets.h diff --git a/tests/auto/other/qaccessibility/tst_qaccessibility.cpp b/tests/auto/other/qaccessibility/tst_qaccessibility.cpp index dc8de72b2a..29fbffa541 100644 --- a/tests/auto/other/qaccessibility/tst_qaccessibility.cpp +++ b/tests/auto/other/qaccessibility/tst_qaccessibility.cpp @@ -59,15 +59,9 @@ #include "accessiblewidgets.h" -// Make a widget frameless to prevent size constraints of title bars -// from interfering (Windows). -static inline void setFrameless(QWidget *w) -{ - Qt::WindowFlags flags = w->windowFlags(); - flags |= Qt::FramelessWindowHint; - flags &= ~(Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint); - w->setWindowFlags(flags); -} +#include <QtTest/private/qtesthelpers_p.h> + +using namespace QTestPrivate; static inline bool verifyChild(QWidget *child, QAccessibleInterface *interface, int index, const QRect &domain) diff --git a/tests/auto/sql/kernel/qsqldriver/tst_qsqldriver.cpp b/tests/auto/sql/kernel/qsqldriver/tst_qsqldriver.cpp index 8f8cfe009d..81206a5856 100644 --- a/tests/auto/sql/kernel/qsqldriver/tst_qsqldriver.cpp +++ b/tests/auto/sql/kernel/qsqldriver/tst_qsqldriver.cpp @@ -77,6 +77,8 @@ void tst_QSqlDriver::recreateTestTables(QSqlDatabase db) doubleField = "more_data double"; else if (dbType == QSqlDriver::Oracle) doubleField = "more_data number(8,7)"; + else if (dbType == QSqlDriver::PostgreSQL) + doubleField = "more_data double precision"; else doubleField = "more_data double(8,7)"; QVERIFY_SQL( q, exec("create table " + relTEST1 + diff --git a/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp b/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp index 92e4b580e7..3ea13896d8 100644 --- a/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp +++ b/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp @@ -146,7 +146,7 @@ private slots: void batchExec(); void QTBUG_43874_data() { generic_data(); } void QTBUG_43874(); - void oraArrayBind_data() { generic_data(); } + void oraArrayBind_data() { generic_data("QOCI"); } void oraArrayBind(); void lastInsertId_data() { generic_data(); } void lastInsertId(); diff --git a/tests/auto/widgets/graphicsview/qgraphicsitem/qgraphicsitem.pro b/tests/auto/widgets/graphicsview/qgraphicsitem/qgraphicsitem.pro index 88526144fc..ae6de48195 100644 --- a/tests/auto/widgets/graphicsview/qgraphicsitem/qgraphicsitem.pro +++ b/tests/auto/widgets/graphicsview/qgraphicsitem/qgraphicsitem.pro @@ -1,6 +1,6 @@ CONFIG += testcase TARGET = tst_qgraphicsitem -QT += widgets widgets-private testlib +QT += widgets widgets-private testlib testlib-private QT += core-private gui-private SOURCES += tst_qgraphicsitem.cpp DEFINES += QT_NO_CAST_TO_ASCII diff --git a/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp b/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp index da15583d5d..2220ef8d2f 100644 --- a/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp +++ b/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp @@ -28,6 +28,7 @@ #include <QtTest/QtTest> +#include <QtTest/private/qtesthelpers_p.h> #include <private/qgraphicsitem_p.h> #include <private/qgraphicsview_p.h> @@ -128,17 +129,6 @@ static void sendKeyClick(QGraphicsScene *scene, Qt::Key key) sendKeyRelease(scene, key); } -static inline void centerOnScreen(QWidget *w, const QSize &size) -{ - const QPoint offset = QPoint(size.width() / 2, size.height() / 2); - w->move(QGuiApplication::primaryScreen()->availableGeometry().center() - offset); -} - -static inline void centerOnScreen(QWidget *w) -{ - centerOnScreen(w, w->geometry().size()); -} - class EventSpy : public QGraphicsWidget { Q_OBJECT @@ -4212,7 +4202,7 @@ void tst_QGraphicsItem::cursor() QWidget topLevel; topLevel.resize(250, 150); - centerOnScreen(&topLevel); + QTestPrivate::centerOnScreen(&topLevel); QGraphicsView view(&scene,&topLevel); view.setFixedSize(200, 100); topLevel.show(); diff --git a/tests/auto/widgets/graphicsview/qgraphicsview/qgraphicsview.pro b/tests/auto/widgets/graphicsview/qgraphicsview/qgraphicsview.pro index 258b5e0e14..8ed19697a4 100644 --- a/tests/auto/widgets/graphicsview/qgraphicsview/qgraphicsview.pro +++ b/tests/auto/widgets/graphicsview/qgraphicsview/qgraphicsview.pro @@ -3,7 +3,7 @@ testcase.timeout = 500 # this test is slow TARGET = tst_qgraphicsview QT += widgets widgets-private testlib -QT += core-private gui-private +QT += core-private gui-private testlib-private SOURCES += tst_qgraphicsview.cpp tst_qgraphicsview_2.cpp HEADERS += tst_qgraphicsview.h diff --git a/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp b/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp index ac38819385..f624bb6a5f 100644 --- a/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp +++ b/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp @@ -61,6 +61,10 @@ #include "tst_qgraphicsview.h" +#include <QtTest/private/qtesthelpers_p.h> + +using namespace QTestPrivate; + Q_DECLARE_METATYPE(ExpectedValueDescription) Q_DECLARE_METATYPE(QList<int>) Q_DECLARE_METATYPE(QList<QRectF>) @@ -130,14 +134,6 @@ class FriendlyGraphicsScene : public QGraphicsScene }; #endif -static inline void setFrameless(QWidget *w) -{ - Qt::WindowFlags flags = w->windowFlags(); - flags |= Qt::FramelessWindowHint; - flags &= ~(Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint); - w->setWindowFlags(flags); -} - class tst_QGraphicsView : public QObject { Q_OBJECT diff --git a/tests/auto/widgets/itemviews/qabstractitemview/qabstractitemview.pro b/tests/auto/widgets/itemviews/qabstractitemview/qabstractitemview.pro index 2f0ca73265..4ee7f28af6 100644 --- a/tests/auto/widgets/itemviews/qabstractitemview/qabstractitemview.pro +++ b/tests/auto/widgets/itemviews/qabstractitemview/qabstractitemview.pro @@ -1,4 +1,4 @@ CONFIG += testcase TARGET = tst_qabstractitemview -QT += widgets testlib +QT += widgets testlib testlib-private SOURCES += tst_qabstractitemview.cpp diff --git a/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp b/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp index dc488fffc0..1ac66ed5cb 100644 --- a/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp +++ b/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp @@ -28,6 +28,7 @@ #include <QtTest/QtTest> +#include <QtTest/private/qtesthelpers_p.h> #include <qabstractitemview.h> #include <qstandarditemmodel.h> @@ -57,19 +58,7 @@ Q_DECLARE_METATYPE(Qt::ItemFlags); -static inline void setFrameless(QWidget *w) -{ - Qt::WindowFlags flags = w->windowFlags(); - flags |= Qt::FramelessWindowHint; - flags &= ~(Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint); - w->setWindowFlags(flags); -} - -static inline void centerOnScreen(QWidget *w) -{ - const QPoint offset = QPoint(w->width() / 2, w->height() / 2); - w->move(QGuiApplication::primaryScreen()->availableGeometry().center() - offset); -} +using namespace QTestPrivate; // Move cursor out of widget area to avoid undesired interaction on Mac. static inline void moveCursorAway(const QWidget *topLevel) diff --git a/tests/auto/widgets/itemviews/qcolumnview/qcolumnview.pro b/tests/auto/widgets/itemviews/qcolumnview/qcolumnview.pro index 5096cc691a..0b3dcd9e80 100644 --- a/tests/auto/widgets/itemviews/qcolumnview/qcolumnview.pro +++ b/tests/auto/widgets/itemviews/qcolumnview/qcolumnview.pro @@ -1,6 +1,6 @@ CONFIG += testcase QT += widgets widgets-private -QT += gui-private core-private testlib +QT += gui-private core-private testlib testlib-private SOURCES += tst_qcolumnview.cpp HEADERS += ../../../../shared/fakedirmodel.h diff --git a/tests/auto/widgets/itemviews/qcolumnview/tst_qcolumnview.cpp b/tests/auto/widgets/itemviews/qcolumnview/tst_qcolumnview.cpp index 62acf49f4a..38e6d95ba4 100644 --- a/tests/auto/widgets/itemviews/qcolumnview/tst_qcolumnview.cpp +++ b/tests/auto/widgets/itemviews/qcolumnview/tst_qcolumnview.cpp @@ -28,6 +28,7 @@ #include "../../../../shared/fakedirmodel.h" #include <QtTest/QtTest> +#include <QtTest/private/qtesthelpers_p.h> #include <qitemdelegate.h> #include <qcolumnview.h> #include <private/qcolumnviewgrip_p.h> @@ -369,12 +370,6 @@ void tst_QColumnView::scrollTo_data() QTest::newRow("reverse") << true << false; } -static inline void centerOnScreen(QWidget *w) -{ - const QPoint offset = QPoint(w->width() / 2, w->height() / 2); - w->move(QGuiApplication::primaryScreen()->availableGeometry().center() - offset); -} - void tst_QColumnView::scrollTo() { QFETCH(bool, reverse); @@ -386,7 +381,7 @@ void tst_QColumnView::scrollTo() view.resize(200, 200); topLevel.show(); topLevel.activateWindow(); - centerOnScreen(&topLevel); + QTestPrivate::centerOnScreen(&topLevel); QVERIFY(QTest::qWaitForWindowActive(&topLevel)); view.scrollTo(QModelIndex(), QAbstractItemView::EnsureVisible); @@ -1004,7 +999,7 @@ void tst_QColumnView::dynamicModelChanges() ColumnView view; view.setModel(&model); view.setItemDelegate(&delegate); - centerOnScreen(&view); + QTestPrivate::centerOnScreen(&view); view.show(); QStandardItem *item = new QStandardItem(QLatin1String("item")); diff --git a/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp b/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp index b13e7b2f33..fa543ae2c3 100644 --- a/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp +++ b/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp @@ -3006,6 +3006,7 @@ void tst_QHeaderView::stretchAndRestoreLastSection() tv.setModel(&m); tv.showMaximized(); + const int minimumSectionSize = 20; const int defaultSectionSize = 30; const int someOtherSectionSize = 40; const int biggerSizeThanAnySection = 50; @@ -3013,6 +3014,9 @@ void tst_QHeaderView::stretchAndRestoreLastSection() QVERIFY(QTest::qWaitForWindowExposed(&tv)); QHeaderView &header = *tv.horizontalHeader(); + // set minimum size before resizeSections() is called + // which is done inside setStretchLastSection + header.setMinimumSectionSize(minimumSectionSize); header.setDefaultSectionSize(defaultSectionSize); header.resizeSection(9, someOtherSectionSize); header.setStretchLastSection(true); diff --git a/tests/auto/widgets/itemviews/qlistview/qlistview.pro b/tests/auto/widgets/itemviews/qlistview/qlistview.pro index 44e25ded66..e49a0c5fbf 100644 --- a/tests/auto/widgets/itemviews/qlistview/qlistview.pro +++ b/tests/auto/widgets/itemviews/qlistview/qlistview.pro @@ -1,6 +1,6 @@ CONFIG += testcase TARGET = tst_qlistview -QT += widgets gui-private widgets-private core-private testlib +QT += widgets gui-private widgets-private core-private testlib testlib-private SOURCES += tst_qlistview.cpp win32:!winrt: LIBS += -luser32 linux*: CONFIG += insignificant_test # Crashes diff --git a/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp b/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp index 2403eabd04..5e0d99f25e 100644 --- a/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp +++ b/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp @@ -46,6 +46,10 @@ #include <QtWidgets/QStyleFactory> #include <QtWidgets/QVBoxLayout> +#include <QtTest/private/qtesthelpers_p.h> + +using namespace QTestPrivate; + #if defined(Q_OS_WIN) # include <windows.h> # include <QtGui/QGuiApplication> @@ -64,16 +68,6 @@ Q_DECLARE_METATYPE(QAbstractItemView::ScrollMode) Q_DECLARE_METATYPE(QMargins) Q_DECLARE_METATYPE(QSize) -// Make a widget frameless to prevent size constraints of title bars -// from interfering (Windows). -static inline void setFrameless(QWidget *w) -{ - Qt::WindowFlags flags = w->windowFlags(); - flags |= Qt::FramelessWindowHint; - flags &= ~(Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint); - w->setWindowFlags(flags); -} - static QStringList generateList(const QString &prefix, int size) { QStringList result; diff --git a/tests/auto/widgets/itemviews/qtableview/qtableview.pro b/tests/auto/widgets/itemviews/qtableview/qtableview.pro index e02da95ab9..a02f96eb99 100644 --- a/tests/auto/widgets/itemviews/qtableview/qtableview.pro +++ b/tests/auto/widgets/itemviews/qtableview/qtableview.pro @@ -1,6 +1,6 @@ CONFIG += testcase TARGET = tst_qtableview QT += widgets widgets-private testlib -QT += core-private gui-private +QT += core-private gui-private testlib-private SOURCES += tst_qtableview.cpp diff --git a/tests/auto/widgets/itemviews/qtableview/tst_qtableview.cpp b/tests/auto/widgets/itemviews/qtableview/tst_qtableview.cpp index a27e0b6048..4e401ddd86 100644 --- a/tests/auto/widgets/itemviews/qtableview/tst_qtableview.cpp +++ b/tests/auto/widgets/itemviews/qtableview/tst_qtableview.cpp @@ -35,6 +35,10 @@ #include <algorithm> +#include <QtTest/private/qtesthelpers_p.h> + +using namespace QTestPrivate; + #ifdef QT_BUILD_INTERNAL #define VERIFY_SPANS_CONSISTENCY(TEST_VIEW_) \ QVERIFY(static_cast<QTableViewPrivate*>(QObjectPrivate::get(TEST_VIEW_))->spans.checkConsistency()) @@ -46,16 +50,6 @@ typedef QList<int> IntList; typedef QList<bool> BoolList; -// Make a widget frameless to prevent size constraints of title bars -// from interfering (Windows). -static inline void setFrameless(QWidget *w) -{ - Qt::WindowFlags flags = w->windowFlags(); - flags |= Qt::FramelessWindowHint; - flags &= ~(Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint); - w->setWindowFlags(flags); -} - class tst_QTableView : public QObject { Q_OBJECT diff --git a/tests/auto/widgets/itemviews/qtreeview/qtreeview.pro b/tests/auto/widgets/itemviews/qtreeview/qtreeview.pro index 3abd58e73d..2530b44935 100644 --- a/tests/auto/widgets/itemviews/qtreeview/qtreeview.pro +++ b/tests/auto/widgets/itemviews/qtreeview/qtreeview.pro @@ -1,6 +1,6 @@ CONFIG += testcase TARGET = tst_qtreeview QT += widgets testlib -QT += widgets-private gui-private core-private +QT += widgets-private gui-private core-private testlib-private SOURCES += tst_qtreeview.cpp HEADERS += ../../../../shared/fakedirmodel.h diff --git a/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp b/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp index 895b61fc51..929b80ba15 100644 --- a/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp +++ b/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp @@ -33,6 +33,10 @@ #include <QtWidgets/QtWidgets> #include <private/qtreeview_p.h> +#include <QtTest/private/qtesthelpers_p.h> + +using namespace QTestPrivate; + #ifndef QT_NO_DRAGANDDROP Q_DECLARE_METATYPE(QAbstractItemView::DragDropMode) #endif @@ -57,16 +61,6 @@ static void initStandardTreeModel(QStandardItemModel *model) model->insertRow(2, item); } -// Make a widget frameless to prevent size constraints of title bars -// from interfering (Windows). -static inline void setFrameless(QWidget *w) -{ - Qt::WindowFlags flags = w->windowFlags(); - flags |= Qt::FramelessWindowHint; - flags &= ~(Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint); - w->setWindowFlags(flags); -} - class tst_QTreeView : public QObject { Q_OBJECT diff --git a/tests/auto/widgets/kernel/qaction/tst_qaction.cpp b/tests/auto/widgets/kernel/qaction/tst_qaction.cpp index 4b3db6bd9c..ac0174d19a 100644 --- a/tests/auto/widgets/kernel/qaction/tst_qaction.cpp +++ b/tests/auto/widgets/kernel/qaction/tst_qaction.cpp @@ -26,7 +26,8 @@ ** ****************************************************************************/ - +#include <QDialog> +#include <QMainWindow> #include <QtTest/QtTest> #include <qapplication.h> @@ -64,6 +65,8 @@ private slots: void repeat(); void setData(); void keysequence(); // QTBUG-53381 + void disableShortcutsWithBlockedWidgets_data(); + void disableShortcutsWithBlockedWidgets(); private: int m_lastEventType; @@ -459,5 +462,52 @@ void tst_QAction::setData() // QTBUG-62006 QCOMPARE(spy.count(), 1); } +void tst_QAction::disableShortcutsWithBlockedWidgets_data() +{ + QTest::addColumn<Qt::ShortcutContext>("shortcutContext"); + QTest::addColumn<Qt::WindowModality>("windowModality"); + + QTest::newRow("application modal dialog should block window shortcut.") + << Qt::WindowShortcut << Qt::ApplicationModal; + + QTest::newRow("application modal dialog should block application shortcut.") + << Qt::ApplicationShortcut << Qt::ApplicationModal; + + QTest::newRow("window modal dialog should block application shortcut.") + << Qt::ApplicationShortcut << Qt::WindowModal; + + QTest::newRow("window modal dialog should block window shortcut.") + << Qt::WindowShortcut << Qt::WindowModal; +} + + +void tst_QAction::disableShortcutsWithBlockedWidgets() +{ + QMainWindow window; + + QFETCH(Qt::ShortcutContext, shortcutContext); + QAction action(&window); + window.addAction(&action); + action.setShortcut(QKeySequence(Qt::Key_1)); + action.setShortcutContext(shortcutContext); + + window.show(); + QVERIFY(QTest::qWaitForWindowExposed(&window)); + + QDialog dialog(&window); + QFETCH(Qt::WindowModality, windowModality); + dialog.setWindowModality(windowModality); + + dialog.show(); + QVERIFY(QTest::qWaitForWindowExposed(&dialog)); + + QApplication::setActiveWindow(&window); + QVERIFY(QTest::qWaitForWindowActive(&window)); + + QSignalSpy spy(&action, &QAction::triggered); + QTest::keyPress(&window, Qt::Key_1); + QCOMPARE(spy.count(), 0); +} + QTEST_MAIN(tst_QAction) #include "tst_qaction.moc" diff --git a/tests/auto/widgets/kernel/qboxlayout/qboxlayout.pro b/tests/auto/widgets/kernel/qboxlayout/qboxlayout.pro index 90e83f5285..1a2c6d6f66 100644 --- a/tests/auto/widgets/kernel/qboxlayout/qboxlayout.pro +++ b/tests/auto/widgets/kernel/qboxlayout/qboxlayout.pro @@ -1,6 +1,6 @@ CONFIG += testcase TARGET = tst_qboxlayout -QT += widgets testlib +QT += widgets testlib testlib-private SOURCES += tst_qboxlayout.cpp diff --git a/tests/auto/widgets/kernel/qboxlayout/tst_qboxlayout.cpp b/tests/auto/widgets/kernel/qboxlayout/tst_qboxlayout.cpp index bcdd103531..7262817d23 100644 --- a/tests/auto/widgets/kernel/qboxlayout/tst_qboxlayout.cpp +++ b/tests/auto/widgets/kernel/qboxlayout/tst_qboxlayout.cpp @@ -31,13 +31,9 @@ #include <QtGui> #include <QtWidgets> -static inline void setFrameless(QWidget *w) -{ - Qt::WindowFlags flags = w->windowFlags(); - flags |= Qt::FramelessWindowHint; - flags &= ~(Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint); - w->setWindowFlags(flags); -} +#include <QtTest/private/qtesthelpers_p.h> + +using namespace QTestPrivate; class tst_QBoxLayout : public QObject { diff --git a/tests/auto/widgets/kernel/qformlayout/qformlayout.pro b/tests/auto/widgets/kernel/qformlayout/qformlayout.pro index be944605a3..617183fee6 100644 --- a/tests/auto/widgets/kernel/qformlayout/qformlayout.pro +++ b/tests/auto/widgets/kernel/qformlayout/qformlayout.pro @@ -1,4 +1,4 @@ CONFIG += testcase TARGET = tst_qformlayout -QT += widgets testlib +QT += widgets testlib testlib-private SOURCES += tst_qformlayout.cpp diff --git a/tests/auto/widgets/kernel/qformlayout/tst_qformlayout.cpp b/tests/auto/widgets/kernel/qformlayout/tst_qformlayout.cpp index c324a4bd56..1ccda25339 100644 --- a/tests/auto/widgets/kernel/qformlayout/tst_qformlayout.cpp +++ b/tests/auto/widgets/kernel/qformlayout/tst_qformlayout.cpp @@ -41,20 +41,16 @@ #include <QStyleFactory> #include <QSharedPointer> +#include <QtTest/private/qtesthelpers_p.h> + +using namespace QTestPrivate; + #include <qformlayout.h> // ItemRole has enumerators for numerical values 0..2, thus the only // valid numerical values for storing into an ItemRole variable are 0..3: Q_CONSTEXPR QFormLayout::ItemRole invalidRole = QFormLayout::ItemRole(3); -static inline void setFrameless(QWidget *w) -{ - Qt::WindowFlags flags = w->windowFlags(); - flags |= Qt::FramelessWindowHint; - flags &= ~(Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint); - w->setWindowFlags(flags); -} - struct QFormLayoutTakeRowResultHolder { QFormLayoutTakeRowResultHolder(QFormLayout::TakeRowResult result) Q_DECL_NOTHROW : labelItem(result.labelItem), diff --git a/tests/auto/widgets/kernel/qgridlayout/qgridlayout.pro b/tests/auto/widgets/kernel/qgridlayout/qgridlayout.pro index ee64f8538f..8947658e8c 100644 --- a/tests/auto/widgets/kernel/qgridlayout/qgridlayout.pro +++ b/tests/auto/widgets/kernel/qgridlayout/qgridlayout.pro @@ -2,7 +2,7 @@ CONFIG += testcase TARGET = tst_qgridlayout QT += widgets widgets-private testlib -QT += core-private gui-private +QT += core-private gui-private testlib-private SOURCES += tst_qgridlayout.cpp FORMS += sortdialog.ui diff --git a/tests/auto/widgets/kernel/qgridlayout/tst_qgridlayout.cpp b/tests/auto/widgets/kernel/qgridlayout/tst_qgridlayout.cpp index c1ab5f51be..37e2bdb069 100644 --- a/tests/auto/widgets/kernel/qgridlayout/tst_qgridlayout.cpp +++ b/tests/auto/widgets/kernel/qgridlayout/tst_qgridlayout.cpp @@ -41,15 +41,9 @@ #include <QStyleFactory> #include <QSharedPointer> -// Make a widget frameless to prevent size constraints of title bars -// from interfering (Windows). -static inline void setFrameless(QWidget *w) -{ - Qt::WindowFlags flags = w->windowFlags(); - flags |= Qt::FramelessWindowHint; - flags &= ~(Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint); - w->setWindowFlags(flags); -} +#include <QtTest/private/qtesthelpers_p.h> + +using namespace QTestPrivate; class tst_QGridLayout : public QObject { diff --git a/tests/auto/widgets/kernel/qlayout/qlayout.pro b/tests/auto/widgets/kernel/qlayout/qlayout.pro index d460785158..8e0ea1bfdb 100644 --- a/tests/auto/widgets/kernel/qlayout/qlayout.pro +++ b/tests/auto/widgets/kernel/qlayout/qlayout.pro @@ -1,7 +1,7 @@ CONFIG += testcase TARGET = tst_qlayout -QT += widgets widgets-private testlib +QT += widgets widgets-private testlib testlib-private SOURCES += tst_qlayout.cpp TESTDATA += baseline/* diff --git a/tests/auto/widgets/kernel/qlayout/tst_qlayout.cpp b/tests/auto/widgets/kernel/qlayout/tst_qlayout.cpp index 829d0ea098..a55693bb6c 100644 --- a/tests/auto/widgets/kernel/qlayout/tst_qlayout.cpp +++ b/tests/auto/widgets/kernel/qlayout/tst_qlayout.cpp @@ -44,13 +44,9 @@ #include <QRadioButton> #include <private/qlayoutengine_p.h> -static inline void setFrameless(QWidget *w) -{ - Qt::WindowFlags flags = w->windowFlags(); - flags |= Qt::FramelessWindowHint; - flags &= ~(Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint); - w->setWindowFlags(flags); -} +#include <QtTest/private/qtesthelpers_p.h> + +using namespace QTestPrivate; class tst_QLayout : public QObject { diff --git a/tests/auto/widgets/kernel/qwidget/qwidget.pro b/tests/auto/widgets/kernel/qwidget/qwidget.pro index 0e95d454cf..c1908af2a2 100644 --- a/tests/auto/widgets/kernel/qwidget/qwidget.pro +++ b/tests/auto/widgets/kernel/qwidget/qwidget.pro @@ -2,7 +2,7 @@ CONFIG += testcase testcase.timeout = 600 # this test is slow TARGET = tst_qwidget -QT += widgets core-private gui-private widgets-private testlib +QT += widgets core-private gui-private widgets-private testlib testlib-private SOURCES += tst_qwidget.cpp RESOURCES = qwidget.qrc diff --git a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp index 7d4024b556..cf2794903e 100644 --- a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp +++ b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp @@ -73,6 +73,9 @@ #endif #include <QtTest/QTest> +#include <QtTest/private/qtesthelpers_p.h> + +using namespace QTestPrivate; #if defined(Q_OS_WIN) && !defined(Q_OS_WINRT) # include <QtCore/qt_windows.h> @@ -109,22 +112,6 @@ bool macHasAccessToWindowsServer() } #endif -// Make a widget frameless to prevent size constraints of title bars -// from interfering (Windows). -static inline void setFrameless(QWidget *w) -{ - Qt::WindowFlags flags = w->windowFlags(); - flags |= Qt::FramelessWindowHint; - flags &= ~(Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint); - w->setWindowFlags(flags); -} - -static inline void centerOnScreen(QWidget *w) -{ - const QPoint offset = QPoint(w->width() / 2, w->height() / 2); - w->move(QGuiApplication::primaryScreen()->availableGeometry().center() - offset); -} - #if defined(Q_OS_WIN) && !defined(Q_OS_WINRT) static inline void setWindowsAnimationsEnabled(bool enabled) { @@ -5397,19 +5384,22 @@ void tst_QWidget::multipleToplevelFocusCheck() TopLevelFocusCheck w1; TopLevelFocusCheck w2; + const QString title = QLatin1String(QTest::currentTestFunction()); + w1.setWindowTitle(title + QLatin1String("_W1")); + w1.move(m_availableTopLeft + QPoint(20, 20)); w1.resize(200, 200); w1.show(); QVERIFY(QTest::qWaitForWindowExposed(&w1)); + w2.setWindowTitle(title + QLatin1String("_W2")); + w2.move(w1.frameGeometry().topRight() + QPoint(20, 0)); w2.resize(200,200); w2.show(); QVERIFY(QTest::qWaitForWindowExposed(&w2)); - QTest::qWait(50); QApplication::setActiveWindow(&w1); w1.activateWindow(); QVERIFY(QTest::qWaitForWindowActive(&w1)); QCOMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&w1)); - QTest::qWait(50); QTest::mouseDClick(&w1, Qt::LeftButton); QTRY_COMPARE(QApplication::focusWidget(), static_cast<QWidget *>(w1.edit)); diff --git a/tests/auto/widgets/kernel/qwidget_window/qwidget_window.pro b/tests/auto/widgets/kernel/qwidget_window/qwidget_window.pro index a6248dfd16..00bf763c35 100644 --- a/tests/auto/widgets/kernel/qwidget_window/qwidget_window.pro +++ b/tests/auto/widgets/kernel/qwidget_window/qwidget_window.pro @@ -1,4 +1,4 @@ CONFIG += testcase TARGET = tst_qwidget_window -QT += widgets testlib core-private gui-private +QT += widgets testlib core-private gui-private testlib-private SOURCES += tst_qwidget_window.cpp diff --git a/tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp b/tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp index f7e1ffc6ba..b76c4d35a8 100644 --- a/tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp +++ b/tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp @@ -45,13 +45,9 @@ #include <qtoolbar.h> #include <private/qwindow_p.h> -static inline void setFrameless(QWidget *w) -{ - Qt::WindowFlags flags = w->windowFlags(); - flags |= Qt::FramelessWindowHint; - flags &= ~(Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint); - w->setWindowFlags(flags); -} +#include <QtTest/private/qtesthelpers_p.h> + +using namespace QTestPrivate; class tst_QWidget_window : public QObject { diff --git a/tests/auto/widgets/kernel/qwidgetaction/qwidgetaction.pro b/tests/auto/widgets/kernel/qwidgetaction/qwidgetaction.pro index e4158559a9..f443758eea 100644 --- a/tests/auto/widgets/kernel/qwidgetaction/qwidgetaction.pro +++ b/tests/auto/widgets/kernel/qwidgetaction/qwidgetaction.pro @@ -1,6 +1,6 @@ CONFIG += testcase TARGET = tst_qwidgetaction -QT += widgets testlib +QT += widgets testlib testlib-private SOURCES += tst_qwidgetaction.cpp diff --git a/tests/auto/widgets/kernel/qwidgetaction/tst_qwidgetaction.cpp b/tests/auto/widgets/kernel/qwidgetaction/tst_qwidgetaction.cpp index 1824285f05..28731223a9 100644 --- a/tests/auto/widgets/kernel/qwidgetaction/tst_qwidgetaction.cpp +++ b/tests/auto/widgets/kernel/qwidgetaction/tst_qwidgetaction.cpp @@ -38,13 +38,9 @@ #include <qmainwindow.h> #include <qmenubar.h> -static inline void setFrameless(QWidget *w) -{ - Qt::WindowFlags flags = w->windowFlags(); - flags |= Qt::FramelessWindowHint; - flags &= ~(Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint); - w->setWindowFlags(flags); -} +#include <QtTest/private/qtesthelpers_p.h> + +using namespace QTestPrivate; class tst_QWidgetAction : public QObject { diff --git a/tests/auto/widgets/styles/qstyle/qstyle.pro b/tests/auto/widgets/styles/qstyle/qstyle.pro index a1e5a70a08..0fb7499946 100644 --- a/tests/auto/widgets/styles/qstyle/qstyle.pro +++ b/tests/auto/widgets/styles/qstyle/qstyle.pro @@ -1,6 +1,6 @@ CONFIG += testcase TARGET = tst_qstyle -QT += widgets testlib +QT += widgets testlib testlib-private SOURCES += tst_qstyle.cpp android { diff --git a/tests/auto/widgets/styles/qstyle/tst_qstyle.cpp b/tests/auto/widgets/styles/qstyle/tst_qstyle.cpp index d5ef2fe94b..cd8ba95b06 100644 --- a/tests/auto/widgets/styles/qstyle/tst_qstyle.cpp +++ b/tests/auto/widgets/styles/qstyle/tst_qstyle.cpp @@ -60,15 +60,9 @@ #include <algorithm> -// Make a widget frameless to prevent size constraints of title bars -// from interfering (Windows). -static inline void setFrameless(QWidget *w) -{ - Qt::WindowFlags flags = w->windowFlags(); - flags |= Qt::FramelessWindowHint; - flags &= ~(Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint); - w->setWindowFlags(flags); -} +#include <QtTest/private/qtesthelpers_p.h> + +using namespace QTestPrivate; class tst_QStyle : public QObject { diff --git a/tests/auto/widgets/styles/qstylesheetstyle/qstylesheetstyle.pro b/tests/auto/widgets/styles/qstylesheetstyle/qstylesheetstyle.pro index 7d9a8576d3..3bf1b94050 100644 --- a/tests/auto/widgets/styles/qstylesheetstyle/qstylesheetstyle.pro +++ b/tests/auto/widgets/styles/qstylesheetstyle/qstylesheetstyle.pro @@ -1,6 +1,6 @@ CONFIG += testcase TARGET = tst_qstylesheetstyle -QT += widgets widgets-private gui-private testlib +QT += widgets widgets-private gui-private testlib testlib-private SOURCES += tst_qstylesheetstyle.cpp RESOURCES += resources.qrc diff --git a/tests/auto/widgets/styles/qstylesheetstyle/tst_qstylesheetstyle.cpp b/tests/auto/widgets/styles/qstylesheetstyle/tst_qstylesheetstyle.cpp index 693b0b8aee..7953077152 100644 --- a/tests/auto/widgets/styles/qstylesheetstyle/tst_qstylesheetstyle.cpp +++ b/tests/auto/widgets/styles/qstylesheetstyle/tst_qstylesheetstyle.cpp @@ -33,12 +33,9 @@ #include <QMetaObject> #include <private/qstylesheetstyle_p.h> +#include <QtTest/private/qtesthelpers_p.h> -static inline void centerOnScreen(QWidget *w) -{ - const QPoint offset = QPoint(w->width() / 2, w->height() / 2); - w->move(QGuiApplication::primaryScreen()->availableGeometry().center() - offset); -} +using namespace QTestPrivate; class tst_QStyleSheetStyle : public QObject { diff --git a/tests/auto/widgets/util/qcompleter/qcompleter.pro b/tests/auto/widgets/util/qcompleter/qcompleter.pro index 19d8d500b8..fcdce93079 100644 --- a/tests/auto/widgets/util/qcompleter/qcompleter.pro +++ b/tests/auto/widgets/util/qcompleter/qcompleter.pro @@ -1,6 +1,6 @@ CONFIG += testcase TEMPLATE = app TARGET = tst_qcompleter -QT += widgets testlib +QT += widgets testlib testlib-private SOURCES += tst_qcompleter.cpp diff --git a/tests/auto/widgets/util/qcompleter/tst_qcompleter.cpp b/tests/auto/widgets/util/qcompleter/tst_qcompleter.cpp index 3818b83584..92bcd5c350 100644 --- a/tests/auto/widgets/util/qcompleter/tst_qcompleter.cpp +++ b/tests/auto/widgets/util/qcompleter/tst_qcompleter.cpp @@ -34,15 +34,11 @@ #include <QList> #include <QPointer> +#include <QtTest/private/qtesthelpers_p.h> + #include "../../../../shared/filesystem.h" -static inline void setFrameless(QWidget *w) -{ - Qt::WindowFlags flags = w->windowFlags(); - flags |= Qt::FramelessWindowHint; - flags &= ~(Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint); - w->setWindowFlags(flags); -} +using namespace QTestPrivate; class CsvCompleter : public QCompleter { diff --git a/tests/auto/widgets/widgets/qabstractslider/qabstractslider.pro b/tests/auto/widgets/widgets/qabstractslider/qabstractslider.pro index 6453999786..95385e2172 100644 --- a/tests/auto/widgets/widgets/qabstractslider/qabstractslider.pro +++ b/tests/auto/widgets/widgets/qabstractslider/qabstractslider.pro @@ -1,6 +1,6 @@ CONFIG += testcase TARGET = tst_qabstractslider -QT += widgets testlib +QT += widgets testlib testlib-private SOURCES += tst_qabstractslider.cpp diff --git a/tests/auto/widgets/widgets/qabstractslider/tst_qabstractslider.cpp b/tests/auto/widgets/widgets/qabstractslider/tst_qabstractslider.cpp index f0d74e7797..70ae453896 100644 --- a/tests/auto/widgets/widgets/qabstractslider/tst_qabstractslider.cpp +++ b/tests/auto/widgets/widgets/qabstractslider/tst_qabstractslider.cpp @@ -36,17 +36,13 @@ #include <QTime> #include <QDebug> +#include <QtTest/private/qtesthelpers_p.h> + +using namespace QTestPrivate; + // defined to be 120 by the wheel mouse vendors according to the docs #define WHEEL_DELTA 120 -static inline void setFrameless(QWidget *w) -{ - Qt::WindowFlags flags = w->windowFlags(); - flags |= Qt::FramelessWindowHint; - flags &= ~(Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint); - w->setWindowFlags(flags); -} - class Slider : public QAbstractSlider { public: diff --git a/tests/auto/widgets/widgets/qabstractspinbox/qabstractspinbox.pro b/tests/auto/widgets/widgets/qabstractspinbox/qabstractspinbox.pro index be758a8bdd..a4a6f84ee4 100644 --- a/tests/auto/widgets/widgets/qabstractspinbox/qabstractspinbox.pro +++ b/tests/auto/widgets/widgets/qabstractspinbox/qabstractspinbox.pro @@ -4,7 +4,7 @@ CONFIG += testcase TARGET = tst_qabstractspinbox -QT += widgets gui-private core-private testlib +QT += widgets gui-private core-private testlib testlib-private SOURCES += tst_qabstractspinbox.cpp diff --git a/tests/auto/widgets/widgets/qabstractspinbox/tst_qabstractspinbox.cpp b/tests/auto/widgets/widgets/qabstractspinbox/tst_qabstractspinbox.cpp index 3fb4863b0e..0ce3b4cefe 100644 --- a/tests/auto/widgets/widgets/qabstractspinbox/tst_qabstractspinbox.cpp +++ b/tests/auto/widgets/widgets/qabstractspinbox/tst_qabstractspinbox.cpp @@ -28,6 +28,7 @@ #include <QtTest/QtTest> +#include <QtTest/private/qtesthelpers_p.h> #include <qcoreapplication.h> #include <qdebug.h> @@ -38,16 +39,6 @@ #include "../../../shared/platforminputcontext.h" #include <private/qinputmethod_p.h> -static inline void centerOnScreen(QWidget *w, const QSize &size) -{ - const QPoint offset = QPoint(size.width() / 2, size.height() / 2); - w->move(QGuiApplication::primaryScreen()->availableGeometry().center() - offset); -} - -static inline void centerOnScreen(QWidget *w) -{ - centerOnScreen(w, w->geometry().size()); -} class tst_QAbstractSpinBox : public QObject { @@ -182,7 +173,7 @@ void tst_QAbstractSpinBox::inputMethodUpdate() QSpinBox *testWidget = &box; testWidget->setRange(0, 1); - centerOnScreen(testWidget); + QTestPrivate::centerOnScreen(testWidget); testWidget->clear(); testWidget->show(); QVERIFY(QTest::qWaitForWindowExposed(testWidget)); diff --git a/tests/auto/widgets/widgets/qcombobox/qcombobox.pro b/tests/auto/widgets/widgets/qcombobox/qcombobox.pro index 88b9d08557..939153dc88 100644 --- a/tests/auto/widgets/widgets/qcombobox/qcombobox.pro +++ b/tests/auto/widgets/widgets/qcombobox/qcombobox.pro @@ -1,4 +1,4 @@ CONFIG += testcase TARGET = tst_qcombobox -QT += widgets widgets-private gui-private core-private testlib +QT += widgets widgets-private gui-private core-private testlib testlib-private SOURCES += tst_qcombobox.cpp diff --git a/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp b/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp index 7c63497291..b6007482ae 100644 --- a/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp +++ b/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp @@ -67,13 +67,9 @@ #include "../../../shared/platforminputcontext.h" #include <private/qinputmethod_p.h> -static inline void setFrameless(QWidget *w) -{ - Qt::WindowFlags flags = w->windowFlags(); - flags |= Qt::FramelessWindowHint; - flags &= ~(Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint); - w->setWindowFlags(flags); -} +#include <QtTest/private/qtesthelpers_p.h> + +using namespace QTestPrivate; class tst_QComboBox : public QObject { diff --git a/tests/auto/widgets/widgets/qlineedit/qlineedit.pro b/tests/auto/widgets/widgets/qlineedit/qlineedit.pro index 636208d67a..cb24a80afd 100644 --- a/tests/auto/widgets/widgets/qlineedit/qlineedit.pro +++ b/tests/auto/widgets/widgets/qlineedit/qlineedit.pro @@ -1,6 +1,6 @@ CONFIG += testcase TARGET = tst_qlineedit -QT += gui-private core-private widgets widgets-private testlib +QT += gui-private core-private widgets widgets-private testlib testlib-private SOURCES += tst_qlineedit.cpp osx: LIBS += -framework AppKit diff --git a/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp b/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp index 3d9620e75a..21669e42cd 100644 --- a/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp +++ b/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp @@ -28,6 +28,7 @@ #include <QtTest/QtTest> +#include <QtTest/private/qtesthelpers_p.h> #include "qlineedit.h" #include "qapplication.h" #include "qstringlist.h" @@ -70,16 +71,7 @@ QT_BEGIN_NAMESPACE class QPainter; QT_END_NAMESPACE -static inline void centerOnScreen(QWidget *w, const QSize &size) -{ - const QPoint offset = QPoint(size.width() / 2, size.height() / 2); - w->move(QGuiApplication::primaryScreen()->availableGeometry().center() - offset); -} - -static inline void centerOnScreen(QWidget *w) -{ - centerOnScreen(w, w->geometry().size()); -} +using namespace QTestPrivate; class StyleOptionTestStyle : public QCommonStyle { diff --git a/tests/auto/widgets/widgets/qmenu/qmenu.pro b/tests/auto/widgets/widgets/qmenu/qmenu.pro index 55fff01138..84b6530184 100644 --- a/tests/auto/widgets/widgets/qmenu/qmenu.pro +++ b/tests/auto/widgets/widgets/qmenu/qmenu.pro @@ -1,6 +1,6 @@ CONFIG += testcase TARGET = tst_qmenu -QT += gui-private widgets testlib +QT += gui-private widgets testlib testlib-private SOURCES += tst_qmenu.cpp macx:{ OBJECTIVE_SOURCES += tst_qmenu_mac.mm diff --git a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp index 5247d02427..91c12e292d 100644 --- a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp +++ b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp @@ -27,6 +27,7 @@ ****************************************************************************/ #include <QtTest/QtTest> +#include <QtTest/private/qtesthelpers_p.h> #include <qapplication.h> #include <QPushButton> #include <QMainWindow> @@ -48,15 +49,11 @@ #include <qpa/qplatformtheme.h> +using namespace QTestPrivate; + Q_DECLARE_METATYPE(Qt::Key); Q_DECLARE_METATYPE(Qt::KeyboardModifiers); -static inline void centerOnScreen(QWidget *w, const QSize &size) -{ - const QPoint offset = QPoint(size.width() / 2, size.height() / 2); - w->move(QGuiApplication::primaryScreen()->availableGeometry().center() - offset); -} - struct MenuMetrics { int fw; int hmargin; @@ -71,11 +68,6 @@ struct MenuMetrics { } }; -static inline void centerOnScreen(QWidget *w) -{ - centerOnScreen(w, w->geometry().size()); -} - class tst_QMenu : public QObject { Q_OBJECT diff --git a/tests/auto/widgets/widgets/qmenubar/BLACKLIST b/tests/auto/widgets/widgets/qmenubar/BLACKLIST index ee08086e83..e2194e69ca 100644 --- a/tests/auto/widgets/widgets/qmenubar/BLACKLIST +++ b/tests/auto/widgets/widgets/qmenubar/BLACKLIST @@ -1,5 +1,3 @@ [check_menuPosition] ubuntu-14.04 ubuntu-16.04 -[task256322_highlight] -osx diff --git a/tests/auto/widgets/widgets/qmenubar/qmenubar.pro b/tests/auto/widgets/widgets/qmenubar/qmenubar.pro index e680cf4d7d..bde0026517 100644 --- a/tests/auto/widgets/widgets/qmenubar/qmenubar.pro +++ b/tests/auto/widgets/widgets/qmenubar/qmenubar.pro @@ -1,6 +1,6 @@ CONFIG += testcase TARGET = tst_qmenubar -QT += widgets testlib +QT += widgets testlib testlib-private SOURCES += tst_qmenubar.cpp macos: { diff --git a/tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp b/tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp index bc50e4f1d8..417fa9befa 100644 --- a/tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp +++ b/tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp @@ -48,6 +48,22 @@ QT_FORWARD_DECLARE_CLASS(QMainWindow) #include <qmenubar.h> +#include <QtTest/private/qtesthelpers_p.h> + +using namespace QTestPrivate; + +// Helper to calculate the action position in window coordinates +static inline QPoint widgetToWindowPos(const QWidget *w, const QPoint &pos) +{ + const QWindow *window = w->window()->windowHandle(); + Q_ASSERT(window); + return window->mapFromGlobal(w->mapToGlobal(pos)); +} + +static QPoint menuBarActionWindowPos(const QMenuBar *mb, QAction *a) +{ + return widgetToWindowPos(mb, mb->actionGeometry(a).center()); +} class Menu : public QMenu { @@ -61,12 +77,6 @@ class Menu : public QMenu } }; -static inline void centerOnScreen(QWidget *w) -{ - const QPoint offset = QPoint(w->width() / 2, w->height() / 2); - w->move(QGuiApplication::primaryScreen()->availableGeometry().center() - offset); -} - struct TestMenu { QList<QMenu *> menus; @@ -621,6 +631,9 @@ void tst_QMenuBar::check_accelKeys() #if !defined(Q_OS_DARWIN) void tst_QMenuBar::check_cursorKeys1() { + if (qgetenv("XDG_CURRENT_DESKTOP") == "Unity") + QSKIP("This test is flaky on Ubuntu/Unity due to regression introduced by QTBUG-39362"); + QMainWindow w; initWindowWithComplexMenuBar(w); w.show(); @@ -655,6 +668,9 @@ void tst_QMenuBar::check_cursorKeys1() #if !defined(Q_OS_DARWIN) void tst_QMenuBar::check_cursorKeys2() { + if (qgetenv("XDG_CURRENT_DESKTOP") == "Unity") + QSKIP("This test is flaky on Ubuntu/Unity due to regression introduced by QTBUG-39362"); + QMainWindow w; initWindowWithComplexMenuBar(w); w.show(); @@ -688,6 +704,9 @@ void tst_QMenuBar::check_cursorKeys2() #if !defined(Q_OS_DARWIN) void tst_QMenuBar::check_cursorKeys3() { + if (qgetenv("XDG_CURRENT_DESKTOP") == "Unity") + QSKIP("This test is flaky on Ubuntu/Unity due to regression introduced by QTBUG-39362"); + QMainWindow w; initWindowWithComplexMenuBar(w); w.show(); @@ -1194,21 +1213,19 @@ void tst_QMenuBar::check_menuPosition() menu.close(); } -# ifndef QT_NO_CURSOR // QTBUG-28031: Click at bottom-right corner. { w.move(400, 200); LayoutDirectionSaver directionSaver(Qt::RightToLeft); QMenuBar *mb = w.menuBar(); - const QPoint localPos = mb->actionGeometry(menu.menuAction()).bottomRight() - QPoint(1, 1); - const QPoint globalPos = mb->mapToGlobal(localPos); - QCursor::setPos(globalPos); - QTest::mouseClick(mb, Qt::LeftButton, 0, localPos); + const QPoint bottomRight = mb->actionGeometry(menu.menuAction()).bottomRight() - QPoint(1, 1); + const QPoint localPos = widgetToWindowPos(mb, bottomRight); + const QPoint globalPos = w.mapToGlobal(localPos); + QTest::mouseClick(w.windowHandle(), Qt::LeftButton, 0, localPos); QTRY_VERIFY(menu.isActiveWindow()); QCOMPARE(menu.geometry().right() - 1, globalPos.x()); menu.close(); } -# endif // QT_NO_CURSOR } #endif @@ -1246,10 +1263,8 @@ void tst_QMenuBar::task223138_triggered() void tst_QMenuBar::task256322_highlight() { - if (!QGuiApplication::platformName().compare(QLatin1String("minimal"), Qt::CaseInsensitive) - || !QGuiApplication::platformName().compare(QLatin1String("offscreen"), Qt::CaseInsensitive)) { - QSKIP("Highlighting does not work correctly for minimal/offscreen platforms"); - } + if (!QGuiApplication::platformName().compare(QLatin1String("minimal"), Qt::CaseInsensitive)) + QSKIP("Highlighting does not work correctly for minimal platform"); QMainWindow win; win.menuBar()->setNativeMenuBar(false); //we can't check the geometry of native menubars @@ -1266,31 +1281,26 @@ void tst_QMenuBar::task256322_highlight() QApplication::setActiveWindow(&win); QVERIFY(QTest::qWaitForWindowActive(&win)); - QTest::mousePress(win.menuBar(), Qt::LeftButton, 0, win.menuBar()->actionGeometry(file).center()); - QTest::mouseMove(win.menuBar(), win.menuBar()->actionGeometry(file).center()); - QTest::mouseRelease(win.menuBar(), Qt::LeftButton, 0, win.menuBar()->actionGeometry(file).center()); + const QPoint filePos = menuBarActionWindowPos(win.menuBar(), file); + QWindow *window = win.windowHandle(); + QTest::mousePress(window, Qt::LeftButton, 0, filePos); + QTest::mouseMove(window, filePos); + QTest::mouseRelease(window, Qt::LeftButton, 0, filePos); QTRY_VERIFY(menu.isVisible()); QVERIFY(!menu2.isVisible()); QCOMPARE(win.menuBar()->activeAction(), file); - QTest::mousePress(win.menuBar(), Qt::LeftButton, 0, win.menuBar()->actionGeometry(file2).center()); - QTest::mouseMove(win.menuBar(), win.menuBar()->actionGeometry(file2).center()); + const QPoint file2Pos = menuBarActionWindowPos(win.menuBar(), file2); + QTest::mouseMove(window, file2Pos); QTRY_VERIFY(!menu.isVisible()); - QVERIFY(menu2.isVisible()); + QTRY_VERIFY(menu2.isVisible()); QCOMPARE(win.menuBar()->activeAction(), file2); - QTest::mouseRelease(win.menuBar(), Qt::LeftButton, 0, win.menuBar()->actionGeometry(file2).center()); - QPoint nothingCenter = win.menuBar()->actionGeometry(nothing).center(); - QTest::mousePress(win.menuBar(), Qt::LeftButton, 0, nothingCenter); - QTest::mouseMove(win.menuBar(), nothingCenter); + QPoint nothingCenter = menuBarActionWindowPos(win.menuBar(), nothing); + QTest::mouseMove(window, nothingCenter); QTRY_VERIFY(!menu2.isVisible()); QVERIFY(!menu.isVisible()); -#ifdef Q_OS_MAC - if (win.menuBar()->activeAction() != nothing) - QEXPECT_FAIL("", "QTBUG-30565: Unstable test", Continue); -#endif QTRY_COMPARE(win.menuBar()->activeAction(), nothing); - QTest::mouseRelease(win.menuBar(), Qt::LeftButton, 0, nothingCenter); } void tst_QMenuBar::menubarSizeHint() @@ -1427,9 +1437,6 @@ void tst_QMenuBar::closeOnSecondClickAndOpenOnThirdClick() // QTBUG-32807, menu QMainWindow mainWindow; mainWindow.resize(300, 200); centerOnScreen(&mainWindow); -#ifndef QT_NO_CURSOR - QCursor::setPos(mainWindow.geometry().topLeft() - QPoint(100, 0)); -#endif QMenuBar *menuBar = mainWindow.menuBar(); menuBar->setNativeMenuBar(false); QMenu *fileMenu = menuBar->addMenu(QStringLiteral("OpenCloseOpen")); @@ -1437,14 +1444,17 @@ void tst_QMenuBar::closeOnSecondClickAndOpenOnThirdClick() // QTBUG-32807, menu mainWindow.show(); QApplication::setActiveWindow(&mainWindow); QVERIFY(QTest::qWaitForWindowActive(&mainWindow)); - const QPoint center = menuBar->actionGeometry(fileMenu->menuAction()).center(); - const QPoint globalPos = menuBar->mapToGlobal(center); - QTest::mouseMove(menuBar, center); - QTest::mouseClick(menuBar, Qt::LeftButton, 0, center); + + const QPoint center = menuBarActionWindowPos(mainWindow.menuBar(), fileMenu->menuAction()); + const QPoint globalPos = mainWindow.mapToGlobal(center); + + QWindow *window = mainWindow.windowHandle(); + QTest::mouseMove(window, center); + QTest::mouseClick(window, Qt::LeftButton, 0, center); QTRY_VERIFY(fileMenu->isVisible()); - QTest::mouseClick(fileMenu, Qt::LeftButton, 0, fileMenu->mapFromGlobal(globalPos)); + QTest::mouseClick(window, Qt::LeftButton, 0, fileMenu->mapFromGlobal(globalPos)); QTRY_VERIFY(!fileMenu->isVisible()); - QTest::mouseClick(menuBar, Qt::LeftButton, 0, center); + QTest::mouseClick(window, Qt::LeftButton, 0, center); QTRY_VERIFY(fileMenu->isVisible()); } diff --git a/tests/auto/widgets/widgets/qscrollbar/qscrollbar.pro b/tests/auto/widgets/widgets/qscrollbar/qscrollbar.pro index 2863dd2034..51f955200b 100644 --- a/tests/auto/widgets/widgets/qscrollbar/qscrollbar.pro +++ b/tests/auto/widgets/widgets/qscrollbar/qscrollbar.pro @@ -1,4 +1,4 @@ CONFIG += testcase TARGET = tst_qscrollbar -QT += widgets testlib +QT += widgets testlib testlib-private SOURCES += tst_qscrollbar.cpp diff --git a/tests/auto/widgets/widgets/qscrollbar/tst_qscrollbar.cpp b/tests/auto/widgets/widgets/qscrollbar/tst_qscrollbar.cpp index 5ef2c7bc50..278f5cdd68 100644 --- a/tests/auto/widgets/widgets/qscrollbar/tst_qscrollbar.cpp +++ b/tests/auto/widgets/widgets/qscrollbar/tst_qscrollbar.cpp @@ -33,16 +33,9 @@ #include <QScrollArea> #include <QScreen> -static inline void centerOnScreen(QWidget *w, const QSize &size) -{ - const QPoint offset = QPoint(size.width() / 2, size.height() / 2); - w->move(QGuiApplication::primaryScreen()->availableGeometry().center() - offset); -} +#include <QtTest/private/qtesthelpers_p.h> -static inline void centerOnScreen(QWidget *w) -{ - centerOnScreen(w, w->geometry().size()); -} +using namespace QTestPrivate; class tst_QScrollBar : public QObject { diff --git a/tests/auto/xml/sax/qxmlsimplereader/tst_qxmlsimplereader.cpp b/tests/auto/xml/sax/qxmlsimplereader/tst_qxmlsimplereader.cpp index f77fd2ebab..8c4c6c7179 100644 --- a/tests/auto/xml/sax/qxmlsimplereader/tst_qxmlsimplereader.cpp +++ b/tests/auto/xml/sax/qxmlsimplereader/tst_qxmlsimplereader.cpp @@ -32,6 +32,8 @@ #include <qtcpserver.h> #include <qtcpsocket.h> #include <QtTest/QtTest> +#include <QtCore/qatomic.h> +#include <QtCore/qsemaphore.h> #include <qfile.h> #include <qstring.h> #include <qdir.h> @@ -47,10 +49,11 @@ class XmlServer : public QThread { Q_OBJECT public: - XmlServer(QObject *parent = 0) : QThread(parent), quit_soon(false), listening(false) {} + XmlServer(QObject *parent = 0) : QThread(parent) {} - bool quit_soon; - bool listening; + QSemaphore threadStarted; + bool listening = false; + QAtomicInt quitSoon; protected: virtual void run(); @@ -63,6 +66,8 @@ void XmlServer::run() QTcpServer srv; listening = srv.listen(QHostAddress::Any, TEST_PORT); + threadStarted.release(); + if (!listening) { qWarning() << "Failed to listen on" << TEST_PORT << srv.errorString(); return; @@ -95,14 +100,13 @@ void XmlServer::run() QByteArray data = file.readAll(); for (int i = 0; i < data.size();) { -// sock->putChar(data.at(i)); int cnt = qMin(CHUNK_SIZE, data.size() - i); sock->write(data.constData() + i, cnt); i += cnt; sock->flush(); QTest::qSleep(1); - if (quit_soon) { + if (quitSoon.loadAcquire()) { sock->abort(); break; } @@ -112,7 +116,7 @@ void XmlServer::run() delete sock; } - if (quit_soon) + if (quitSoon.loadAcquire()) break; } @@ -162,7 +166,7 @@ tst_QXmlSimpleReader::tst_QXmlSimpleReader() : server(new XmlServer(this)) tst_QXmlSimpleReader::~tst_QXmlSimpleReader() { - server->quit_soon = true; + server->quitSoon.storeRelease(1); server->wait(); } @@ -562,7 +566,19 @@ void tst_QXmlSimpleReader::inputFromSocket() QSKIP("WinRT does not support connecting to localhost"); #endif - QTRY_VERIFY_WITH_TIMEOUT(server->listening, 15000); + if (!server->threadStarted.tryAcquire(1, 15000)) { + // If something is wrong with QThreads, it's not a reason to fail + // XML-test, we are not testing QThread here after all! + QSKIP("XmlServer/thread has not started yet"); + } + + // Subsequent runs should be able to acquire the semaphore. + server->threadStarted.release(1); + + if (!server->listening) { + // Again, QTcpServer is not the subject of this test! + QSKIP("QTcpServer::listen failed, bailing out"); + } QTcpSocket sock; sock.connectToHost(QHostAddress::LocalHost, TEST_PORT); |