summaryrefslogtreecommitdiffstats
path: root/tests/auto
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2020-03-04 09:54:35 +0100
committerShawn Rutledge <shawn.rutledge@qt.io>2020-03-04 14:39:18 +0000
commit2a4b95778993b00499eb94f61a87330fdbadf947 (patch)
tree168147adcc2854cb6723335b5abffe9d7585c7f4 /tests/auto
parentb4e17a48646a1d2156b7d56ab6003db46af79cec (diff)
parent048f0a00fa7b46f531fbe3ed6d1babae9858e8c2 (diff)
Merge remote-tracking branch 'origin/5.15' into dev
Diffstat (limited to 'tests/auto')
-rw-r--r--tests/auto/corelib/kernel/qdeadlinetimer/tst_qdeadlinetimer.cpp50
-rw-r--r--tests/auto/corelib/kernel/qelapsedtimer/tst_qelapsedtimer.cpp47
-rw-r--r--tests/auto/corelib/text/qstring/tst_qstring.cpp3
-rw-r--r--tests/auto/corelib/tools/qhash/tst_qhash.cpp6
-rw-r--r--tests/auto/corelib/tools/qmap/tst_qmap.cpp6
-rw-r--r--tests/auto/gui/rhi/qshader/tst_qshader.cpp4
-rw-r--r--tests/auto/gui/text/qtextmarkdownimporter/data/fuzz20450.md5
-rw-r--r--tests/auto/gui/text/qtextmarkdownimporter/data/fuzz20580.md1
-rw-r--r--tests/auto/gui/text/qtextmarkdownimporter/qtextmarkdownimporter.pro2
-rw-r--r--tests/auto/gui/text/qtextmarkdownimporter/tst_qtextmarkdownimporter.cpp24
-rw-r--r--tests/auto/network/access/http2/tst_http2.cpp2
-rw-r--r--tests/auto/network/access/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp6
-rw-r--r--tests/auto/network/access/qnetworkaccessmanager/tst_qnetworkaccessmanager.cpp2
-rw-r--r--tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp42
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp4
-rw-r--r--tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp79
16 files changed, 220 insertions, 63 deletions
diff --git a/tests/auto/corelib/kernel/qdeadlinetimer/tst_qdeadlinetimer.cpp b/tests/auto/corelib/kernel/qdeadlinetimer/tst_qdeadlinetimer.cpp
index 35c5e7cb75..db53c3f20c 100644
--- a/tests/auto/corelib/kernel/qdeadlinetimer/tst_qdeadlinetimer.cpp
+++ b/tests/auto/corelib/kernel/qdeadlinetimer/tst_qdeadlinetimer.cpp
@@ -573,12 +573,32 @@ void tst_QDeadlineTimer::stdchrono()
QCOMPARE(deadline.remainingTimeAsDuration(), nanoseconds::zero());
+ /*
+ Call QTest::qSleep, and return true if the time actually slept is
+ within \a deviationPercent percent of the requested sleep time.
+ Otherwise, return false, in which case the test should to abort.
+ */
+ auto sleepHelper = [](int ms, int deviationPercent = 10) -> bool {
+ auto before = steady_clock::now();
+ QTest::qSleep(ms);
+ auto after = steady_clock::now();
+ auto diff = duration_cast<milliseconds>(after - before).count();
+ bool inRange = qAbs(diff - ms) < ms * deviationPercent/100.0;
+ if (!inRange)
+ qWarning() << "sleeping" << diff << "instead of" << ms << inRange;
+ return inRange;
+ };
+
auto steady_before = steady_clock::now();
auto system_before = system_clock::now();
- QTest::qSleep(minResolution);
+ if (!sleepHelper(minResolution))
+ QSKIP("Slept too long");
auto now = QDeadlineTimer::current(timerType);
- QTest::qSleep(minResolution);
+ auto steady_reference = steady_clock::now();
+ auto system_reference = system_clock::now();
+ if (!sleepHelper(minResolution))
+ QSKIP("Slept too long");
auto sampling_start = steady_clock::now();
auto steady_deadline = now.deadline<steady_clock>();
@@ -599,35 +619,33 @@ void tst_QDeadlineTimer::stdchrono()
}
{
- auto diff = duration_cast<milliseconds>(steady_after - steady_deadline);
- QVERIFY2(diff.count() > minResolution/2, QByteArray::number(qint64(diff.count())));
- QVERIFY2(diff.count() < 3*minResolution/2, QByteArray::number(qint64(diff.count())));
+ auto reference = duration_cast<milliseconds>(steady_after - steady_reference).count();
+ auto diff = duration_cast<milliseconds>(steady_after - steady_deadline).count();
+ QVERIFY2(diff > reference * 0.9 && diff < reference*1.1, QByteArray::number(qint64(diff)));
QDeadlineTimer dt_after(steady_after, timerType);
QVERIFY2(now < dt_after,
("now = " + QLocale().toString(now.deadlineNSecs()) +
"; after = " + QLocale().toString(dt_after.deadlineNSecs())).toLatin1());
- diff = duration_cast<milliseconds>(steady_deadline - steady_before);
- QVERIFY2(diff.count() > minResolution/2, QByteArray::number(qint64(diff.count())));
- QVERIFY2(diff.count() < 3*minResolution/2, QByteArray::number(qint64(diff.count())));
+ reference = duration_cast<milliseconds>(steady_reference - steady_before).count();
+ diff = duration_cast<milliseconds>(steady_deadline - steady_before).count();
+ QVERIFY2(diff > reference * 0.9 && diff < reference*1.1, QByteArray::number(qint64(diff)));
QDeadlineTimer dt_before(steady_before, timerType);
QVERIFY2(now > dt_before,
("now = " + QLocale().toString(now.deadlineNSecs()) +
"; before = " + QLocale().toString(dt_before.deadlineNSecs())).toLatin1());
}
{
- auto diff = duration_cast<milliseconds>(system_after - system_deadline);
- QVERIFY2(diff.count() > minResolution/2, QByteArray::number(qint64(diff.count())));
- QVERIFY2(diff.count() < 3*minResolution/2, QByteArray::number(qint64(diff.count())));
- QDeadlineTimer dt_after(system_after, timerType);
+ auto reference = duration_cast<milliseconds>(system_after - system_reference).count();
+ auto diff = duration_cast<milliseconds>(system_after - system_deadline).count();
+ QVERIFY2(diff > reference * 0.9 && diff < reference*1.1, QByteArray::number(qint64(diff))); QDeadlineTimer dt_after(system_after, timerType);
QVERIFY2(now < dt_after,
("now = " + QLocale().toString(now.deadlineNSecs()) +
"; after = " + QLocale().toString(dt_after.deadlineNSecs())).toLatin1());
- diff = duration_cast<milliseconds>(system_deadline - system_before);
- QVERIFY2(diff.count() > minResolution/2, QByteArray::number(qint64(diff.count())));
- QVERIFY2(diff.count() < 3*minResolution/2, QByteArray::number(qint64(diff.count())));
- QDeadlineTimer dt_before(system_before, timerType);
+ reference = duration_cast<milliseconds>(system_reference - system_before).count();
+ diff = duration_cast<milliseconds>(steady_deadline - steady_before).count();
+ QVERIFY2(diff > reference * 0.9 && diff < reference*1.1, QByteArray::number(qint64(diff))); QDeadlineTimer dt_before(system_before, timerType);
QVERIFY2(now > dt_before,
("now = " + QLocale().toString(now.deadlineNSecs()) +
"; before = " + QLocale().toString(dt_before.deadlineNSecs())).toLatin1());
diff --git a/tests/auto/corelib/kernel/qelapsedtimer/tst_qelapsedtimer.cpp b/tests/auto/corelib/kernel/qelapsedtimer/tst_qelapsedtimer.cpp
index 4ee3ca361f..bfc4f2ca36 100644
--- a/tests/auto/corelib/kernel/qelapsedtimer/tst_qelapsedtimer.cpp
+++ b/tests/auto/corelib/kernel/qelapsedtimer/tst_qelapsedtimer.cpp
@@ -48,6 +48,7 @@ private Q_SLOTS:
void validity();
void basics();
void elapsed();
+ void msecsTo();
};
void tst_QElapsedTimer::statics()
@@ -108,30 +109,42 @@ void tst_QElapsedTimer::elapsed()
t1.start();
QTest::qSleep(2*minResolution);
- QElapsedTimer t2;
- t2.start();
-
- QVERIFY(t1 != t2);
- QVERIFY(!(t1 == t2));
- QVERIFY(t1 < t2);
- QVERIFY(t1.msecsTo(t2) > 0);
- QVERIFY(t1.nsecsElapsed() > 0);
- QVERIFY(t1.elapsed() > 0);
+ auto nsecs = t1.nsecsElapsed();
+ auto msecs = t1.elapsed();
+ QVERIFY(nsecs > 0);
+ QVERIFY(msecs > 0);
// the number of elapsed nanoseconds and milliseconds should match
- QVERIFY(t1.nsecsElapsed() - t1.elapsed() * 1000000 < 1000000);
+ QVERIFY(nsecs - msecs * 1000000 < 1000000);
+
+ if (msecs > 8 * minResolution)
+ QSKIP("Sampling timer took too long, aborting test");
+
QVERIFY(t1.hasExpired(minResolution));
QVERIFY(!t1.hasExpired(8*minResolution));
- QVERIFY(!t2.hasExpired(minResolution));
-
QVERIFY(!t1.hasExpired(-1));
- QVERIFY(!t2.hasExpired(-1));
qint64 elapsed = t1.restart();
- QVERIFY(elapsed > minResolution);
- QVERIFY(elapsed < 3*minResolution);
- qint64 diff = t2.msecsTo(t1);
- QVERIFY(diff < minResolution);
+ QVERIFY(elapsed >= msecs);
+ QVERIFY(elapsed < msecs + 3*minResolution);
+}
+
+void tst_QElapsedTimer::msecsTo()
+{
+ QElapsedTimer t1;
+ t1.start();
+ QTest::qSleep(minResolution);
+ QElapsedTimer t2;
+ t2.start();
+
+ QVERIFY(t1 != t2);
+ QVERIFY(!(t1 == t2));
+ QVERIFY(t1 < t2);
+
+ auto diff = t1.msecsTo(t2);
+ QVERIFY2(diff > 0, QString("difference t1 and t2 is %1").arg(diff).toLatin1());
+ diff = t2.msecsTo(t1);
+ QVERIFY2(diff < 0, QString("difference t2 and t1 is %1").arg(diff).toLatin1());
}
QTEST_MAIN(tst_QElapsedTimer);
diff --git a/tests/auto/corelib/text/qstring/tst_qstring.cpp b/tests/auto/corelib/text/qstring/tst_qstring.cpp
index 2c02fb2264..65f88c0e4d 100644
--- a/tests/auto/corelib/text/qstring/tst_qstring.cpp
+++ b/tests/auto/corelib/text/qstring/tst_qstring.cpp
@@ -5803,6 +5803,8 @@ void tst_QString::split(const QString &string, const QString &sep, QStringList r
QVERIFY(list == result);
}
+QT_WARNING_PUSH
+QT_WARNING_DISABLE_DEPRECATED
list = str.split(sep, QString::KeepEmptyParts);
QVERIFY(list == result);
list = str.split(rx, QString::KeepEmptyParts);
@@ -5825,6 +5827,7 @@ void tst_QString::split(const QString &string, const QString &sep, QStringList r
list = str.split(sep.at(0), QString::SkipEmptyParts);
QVERIFY(list == result);
}
+QT_WARNING_POP
}
void tst_QString::split()
diff --git a/tests/auto/corelib/tools/qhash/tst_qhash.cpp b/tests/auto/corelib/tools/qhash/tst_qhash.cpp
index 4052eff0ae..2a18f8d3e6 100644
--- a/tests/auto/corelib/tools/qhash/tst_qhash.cpp
+++ b/tests/auto/corelib/tools/qhash/tst_qhash.cpp
@@ -1115,6 +1115,12 @@ void tst_QHash::keyValueIterator()
entry_type pair(it.key(), it.value());
QCOMPARE(*key_value_it, pair);
+ QCOMPARE(key_value_it->first, pair.first);
+ QCOMPARE(key_value_it->second, pair.second);
+ QCOMPARE(&(*key_value_it).first, &it.key());
+ QCOMPARE(&key_value_it->first, &it.key());
+ QCOMPARE(&(*key_value_it).second, &it.value());
+ QCOMPARE(&key_value_it->second, &it.value());
++key_value_it;
++it;
}
diff --git a/tests/auto/corelib/tools/qmap/tst_qmap.cpp b/tests/auto/corelib/tools/qmap/tst_qmap.cpp
index 1638ebc992..9f0524c9e0 100644
--- a/tests/auto/corelib/tools/qmap/tst_qmap.cpp
+++ b/tests/auto/corelib/tools/qmap/tst_qmap.cpp
@@ -881,6 +881,12 @@ void tst_QMap::keyValueIterator()
entry_type pair(it.key(), it.value());
QCOMPARE(*key_value_it, pair);
+ QCOMPARE(key_value_it->first, pair.first);
+ QCOMPARE(key_value_it->second, pair.second);
+ QCOMPARE(&(*key_value_it).first, &it.key());
+ QCOMPARE(&key_value_it->first, &it.key());
+ QCOMPARE(&(*key_value_it).second, &it.value());
+ QCOMPARE(&key_value_it->second, &it.value());
++key_value_it;
++it;
}
diff --git a/tests/auto/gui/rhi/qshader/tst_qshader.cpp b/tests/auto/gui/rhi/qshader/tst_qshader.cpp
index ab7115b74a..378d1e85e7 100644
--- a/tests/auto/gui/rhi/qshader/tst_qshader.cpp
+++ b/tests/auto/gui/rhi/qshader/tst_qshader.cpp
@@ -368,7 +368,7 @@ void tst_QShader::serializeShaderDesc()
QBuffer buf(&data);
QDataStream ds(&buf);
QVERIFY(buf.open(QIODevice::ReadOnly));
- QShaderDescription desc2 = QShaderDescription::deserialize(&ds);
+ QShaderDescription desc2 = QShaderDescription::deserialize(&ds, QShaderPrivate::QSB_VERSION);
QVERIFY(!desc2.isValid());
}
}
@@ -400,7 +400,7 @@ void tst_QShader::serializeShaderDesc()
QBuffer buf(&data);
QDataStream ds(&buf);
QVERIFY(buf.open(QIODevice::ReadOnly));
- QShaderDescription desc2 = QShaderDescription::deserialize(&ds);
+ QShaderDescription desc2 = QShaderDescription::deserialize(&ds, QShaderPrivate::QSB_VERSION);
QVERIFY(desc2.isValid());
QCOMPARE(desc, desc2);
}
diff --git a/tests/auto/gui/text/qtextmarkdownimporter/data/fuzz20450.md b/tests/auto/gui/text/qtextmarkdownimporter/data/fuzz20450.md
new file mode 100644
index 0000000000..d7005cb01e
--- /dev/null
+++ b/tests/auto/gui/text/qtextmarkdownimporter/data/fuzz20450.md
@@ -0,0 +1,5 @@
+<t>ÿ
+* ÿ
+
+ ÿ
+* ÿ \ No newline at end of file
diff --git a/tests/auto/gui/text/qtextmarkdownimporter/data/fuzz20580.md b/tests/auto/gui/text/qtextmarkdownimporter/data/fuzz20580.md
new file mode 100644
index 0000000000..22006f5876
--- /dev/null
+++ b/tests/auto/gui/text/qtextmarkdownimporter/data/fuzz20580.md
@@ -0,0 +1 @@
+| --:| <?`?><?|` \ No newline at end of file
diff --git a/tests/auto/gui/text/qtextmarkdownimporter/qtextmarkdownimporter.pro b/tests/auto/gui/text/qtextmarkdownimporter/qtextmarkdownimporter.pro
index 7b7fb61244..f3818efbf7 100644
--- a/tests/auto/gui/text/qtextmarkdownimporter/qtextmarkdownimporter.pro
+++ b/tests/auto/gui/text/qtextmarkdownimporter/qtextmarkdownimporter.pro
@@ -5,5 +5,7 @@ SOURCES += tst_qtextmarkdownimporter.cpp
TESTDATA += \
data/thematicBreaks.md \
data/headingBulletsContinuations.md \
+ data/fuzz20450.md \
+ data/fuzz20580.md \
DEFINES += SRCDIR=\\\"$$PWD\\\"
diff --git a/tests/auto/gui/text/qtextmarkdownimporter/tst_qtextmarkdownimporter.cpp b/tests/auto/gui/text/qtextmarkdownimporter/tst_qtextmarkdownimporter.cpp
index 39a1370f6f..5eb04af696 100644
--- a/tests/auto/gui/text/qtextmarkdownimporter/tst_qtextmarkdownimporter.cpp
+++ b/tests/auto/gui/text/qtextmarkdownimporter/tst_qtextmarkdownimporter.cpp
@@ -57,6 +57,8 @@ private slots:
void lists();
void avoidBlankLineAtBeginning_data();
void avoidBlankLineAtBeginning();
+ void pathological_data();
+ void pathological();
};
void tst_QTextMarkdownImporter::headingBulletsContinuations()
@@ -256,5 +258,27 @@ void tst_QTextMarkdownImporter::avoidBlankLineAtBeginning() // QTBUG-81060
QCOMPARE(i, expectedNumberOfParagraphs);
}
+void tst_QTextMarkdownImporter::pathological_data()
+{
+ QTest::addColumn<QString>("warning");
+ QTest::newRow("fuzz20450") << "attempted to insert into a list that no longer exists";
+ QTest::newRow("fuzz20580") << "";
+}
+
+void tst_QTextMarkdownImporter::pathological() // avoid crashing on crazy input
+{
+ QFETCH(QString, warning);
+ QString filename = QLatin1String("data/") + QTest::currentDataTag() + QLatin1String(".md");
+ QFile f(QFINDTESTDATA(filename));
+ QVERIFY(f.open(QFile::ReadOnly));
+#ifdef QT_NO_DEBUG
+ Q_UNUSED(warning)
+#else
+ if (!warning.isEmpty())
+ QTest::ignoreMessage(QtWarningMsg, warning.toLatin1());
+#endif
+ QTextDocument().setMarkdown(f.readAll());
+}
+
QTEST_MAIN(tst_QTextMarkdownImporter)
#include "tst_qtextmarkdownimporter.moc"
diff --git a/tests/auto/network/access/http2/tst_http2.cpp b/tests/auto/network/access/http2/tst_http2.cpp
index 904cfd52b0..1ca60655a6 100644
--- a/tests/auto/network/access/http2/tst_http2.cpp
+++ b/tests/auto/network/access/http2/tst_http2.cpp
@@ -513,7 +513,7 @@ void tst_Http2::goaway()
replies[i] = manager->get(request);
QCOMPARE(replies[i]->error(), QNetworkReply::NoError);
void (QNetworkReply::*errorSignal)(QNetworkReply::NetworkError) =
- &QNetworkReply::error;
+ &QNetworkReply::errorOccurred;
connect(replies[i], errorSignal, this, &tst_Http2::replyFinishedWithError);
// Since we're using self-signed certificates, ignore SSL errors:
replies[i]->ignoreSslErrors();
diff --git a/tests/auto/network/access/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp b/tests/auto/network/access/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp
index 57fa5a613c..e8d4c773f0 100644
--- a/tests/auto/network/access/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp
+++ b/tests/auto/network/access/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp
@@ -1005,10 +1005,8 @@ void tst_QHttpNetworkConnection::overlappingCloseAndWrite()
for (int i = 0; i < 10; ++i) {
QNetworkRequest request(url);
QNetworkReply *reply = accessManager.get(request);
- // Not using Qt5 connection syntax here because of overly baroque syntax to discern between
- // different error() methods.
- QObject::connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
- &server, SLOT(onReply(QNetworkReply::NetworkError)));
+ QObject::connect(reply, &QNetworkReply::errorOccurred,
+ &server, &TestTcpServer::onReply);
}
QTRY_COMPARE(server.errorCodeReports, 10);
diff --git a/tests/auto/network/access/qnetworkaccessmanager/tst_qnetworkaccessmanager.cpp b/tests/auto/network/access/qnetworkaccessmanager/tst_qnetworkaccessmanager.cpp
index 752655ee94..b5ded86d58 100644
--- a/tests/auto/network/access/qnetworkaccessmanager/tst_qnetworkaccessmanager.cpp
+++ b/tests/auto/network/access/qnetworkaccessmanager/tst_qnetworkaccessmanager.cpp
@@ -87,7 +87,7 @@ void tst_QNetworkAccessManager::networkAccessible()
// When network is not accessible, all requests fail
QNetworkReply *reply = manager.get(QNetworkRequest(QUrl("http://www.example.org")));
QSignalSpy finishedSpy(reply, &QNetworkReply::finished);
- QSignalSpy errorSpy(reply, QOverload<QNetworkReply::NetworkError>::of(&QNetworkReply::error));
+ QSignalSpy errorSpy(reply, &QNetworkReply::errorOccurred);
QVERIFY(finishedSpy.wait());
QCOMPARE(reply->isFinished(), true);
QCOMPARE(reply->errorString(), QStringLiteral("Network access is disabled."));
diff --git a/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
index 5d46002a7c..430f9b7575 100644
--- a/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
+++ b/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
@@ -1381,7 +1381,7 @@ QString tst_QNetworkReply::runMultipartRequest(const QNetworkRequest &request,
// the code below is copied from tst_QNetworkReply::runSimpleRequest, see below
reply->setParent(this);
connect(reply, SIGNAL(finished()), SLOT(finished()));
- connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(gotError()));
+ connect(reply, SIGNAL(errorOccurred(QNetworkReply::NetworkError)), SLOT(gotError()));
multiPart->setParent(reply.data());
returnCode = Timeout;
@@ -1441,7 +1441,7 @@ QString tst_QNetworkReply::runSimpleRequest(QNetworkAccessManager::Operation op,
code = Failure;
} else {
connect(reply, SIGNAL(finished()), SLOT(finished()));
- connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(gotError()));
+ connect(reply, SIGNAL(errorOccurred(QNetworkReply::NetworkError)), SLOT(gotError()));
int count = 0;
loop = new QEventLoop;
@@ -1476,7 +1476,7 @@ QString tst_QNetworkReply::runCustomRequest(const QNetworkRequest &request,
reply.reset(manager.sendCustomRequest(request, verb, data));
reply->setParent(this);
connect(reply, SIGNAL(finished()), SLOT(finished()));
- connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(gotError()));
+ connect(reply, SIGNAL(errorOccurred(QNetworkReply::NetworkError)), SLOT(gotError()));
returnCode = Timeout;
loop = new QEventLoop;
@@ -1513,7 +1513,7 @@ int tst_QNetworkReply::waitForFinish(QNetworkReplyPtr &reply)
int count = 0;
connect(reply, SIGNAL(finished()), SLOT(finished()));
- connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(gotError()));
+ connect(reply, SIGNAL(errorOccurred(QNetworkReply::NetworkError)), SLOT(gotError()));
returnCode = Success;
loop = new QEventLoop;
QSignalSpy spy(reply.data(), SIGNAL(downloadProgress(qint64,qint64)));
@@ -1901,7 +1901,7 @@ void tst_QNetworkReply::getFromFtpAfterError()
QNetworkRequest invalidRequest(QUrl("ftp://" + QtNetworkSettings::ftpServerName() + "/qtest/invalid.txt"));
QNetworkReplyPtr invalidReply;
invalidReply.reset(manager.get(invalidRequest));
- QSignalSpy spy(invalidReply.data(), SIGNAL(error(QNetworkReply::NetworkError)));
+ QSignalSpy spy(invalidReply.data(), SIGNAL(errorOccurred(QNetworkReply::NetworkError)));
QVERIFY(spy.wait());
QCOMPARE(invalidReply->error(), QNetworkReply::ContentNotFoundError);
@@ -3927,7 +3927,7 @@ void tst_QNetworkReply::ioGetFromHttpBrokenServer()
QNetworkRequest request(QUrl("http://localhost:" + QString::number(server.serverPort())));
QNetworkReplyPtr reply(manager.get(request));
- QSignalSpy spy(reply.data(), SIGNAL(error(QNetworkReply::NetworkError)));
+ QSignalSpy spy(reply.data(), SIGNAL(errorOccurred(QNetworkReply::NetworkError)));
QCOMPARE(waitForFinish(reply), int(Failure));
@@ -5475,7 +5475,7 @@ void tst_QNetworkReply::rateControl()
QNetworkRequest request("debugpipe://localhost:" + QString::number(sender.serverPort()));
QNetworkReplyPtr reply(manager.get(request));
reply->setReadBufferSize(32768);
- QSignalSpy errorSpy(reply.data(), SIGNAL(error(QNetworkReply::NetworkError)));
+ QSignalSpy errorSpy(reply.data(), SIGNAL(errorOccurred(QNetworkReply::NetworkError)));
RateControlledReader reader(sender, reply.data(), rate, 20);
@@ -5889,7 +5889,7 @@ void tst_QNetworkReply::nestedEventLoops()
QNetworkReplyPtr reply(manager.get(request));
QSignalSpy finishedspy(reply.data(), SIGNAL(finished()));
- QSignalSpy errorspy(reply.data(), SIGNAL(error(QNetworkReply::NetworkError)));
+ QSignalSpy errorspy(reply.data(), SIGNAL(errorOccurred(QNetworkReply::NetworkError)));
connect(reply, SIGNAL(finished()), SLOT(nestedEventLoops_slot()));
QTestEventLoop::instance().enterLoop(20);
@@ -6122,7 +6122,7 @@ void tst_QNetworkReply::authorizationError()
QCOMPARE(reply->error(), QNetworkReply::NoError);
- QSignalSpy errorSpy(reply.data(), SIGNAL(error(QNetworkReply::NetworkError)));
+ QSignalSpy errorSpy(reply.data(), SIGNAL(errorOccurred(QNetworkReply::NetworkError)));
QSignalSpy finishedSpy(reply.data(), SIGNAL(finished()));
// now run the request:
QCOMPARE(waitForFinish(reply), int(Failure));
@@ -7078,7 +7078,7 @@ void tst_QNetworkReply::qtbug4121unknownAuthentication()
QSignalSpy authSpy(&manager, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)));
QSignalSpy finishedSpy(&manager, SIGNAL(finished(QNetworkReply*)));
- QSignalSpy errorSpy(reply.data(), SIGNAL(error(QNetworkReply::NetworkError)));
+ QSignalSpy errorSpy(reply.data(), SIGNAL(errorOccurred(QNetworkReply::NetworkError)));
connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()), Qt::QueuedConnection);
QTestEventLoop::instance().enterLoop(10);
@@ -7399,7 +7399,7 @@ void tst_QNetworkReply::httpWithNoCredentialUsage()
request.setAttribute(QNetworkRequest::AuthenticationReuseAttribute, QNetworkRequest::Manual);
QNetworkReplyPtr reply(manager.get(request));
- QSignalSpy errorSpy(reply.data(), SIGNAL(error(QNetworkReply::NetworkError)));
+ QSignalSpy errorSpy(reply.data(), SIGNAL(errorOccurred(QNetworkReply::NetworkError)));
connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()), Qt::QueuedConnection);
QTestEventLoop::instance().enterLoop(10);
@@ -8115,7 +8115,7 @@ void tst_QNetworkReply::emitErrorForAllReplies() // QTBUG-36890
QNetworkRequest request(urls.at(a));
QNetworkReply *reply = manager.get(request);
replies.append(reply);
- QSignalSpy *errorSpy = new QSignalSpy(reply, SIGNAL(error(QNetworkReply::NetworkError)));
+ QSignalSpy *errorSpy = new QSignalSpy(reply, SIGNAL(errorOccurred(QNetworkReply::NetworkError)));
errorSpies.append(errorSpy);
QSignalSpy *finishedSpy = new QSignalSpy(reply, SIGNAL(finished()));
finishedSpies.append(finishedSpy);
@@ -8517,7 +8517,7 @@ void tst_QNetworkReply::ioHttpChangeMaxRedirects()
QNetworkReplyPtr reply(manager.get(request));
QSignalSpy redSpy(reply.data(), SIGNAL(redirected(QUrl)));
- QSignalSpy spy(reply.data(), SIGNAL(error(QNetworkReply::NetworkError)));
+ QSignalSpy spy(reply.data(), SIGNAL(errorOccurred(QNetworkReply::NetworkError)));
QCOMPARE(waitForFinish(reply), int(Failure));
@@ -8581,7 +8581,7 @@ void tst_QNetworkReply::ioHttpRedirectErrors()
QTimer watchDog;
watchDog.setSingleShot(true);
- reply->connect(reply.data(), QOverload<QNetworkReply::NetworkError>().of(&QNetworkReply::error),
+ reply->connect(reply.data(), &QNetworkReply::errorOccurred,
[&eventLoop](QNetworkReply::NetworkError){
eventLoop.exit(Failure);
});
@@ -8747,7 +8747,7 @@ void tst_QNetworkReply::ioHttpRedirectPolicyErrors()
if (ssl)
reply->ignoreSslErrors();
- QSignalSpy spy(reply.data(), SIGNAL(error(QNetworkReply::NetworkError)));
+ QSignalSpy spy(reply.data(), SIGNAL(errorOccurred(QNetworkReply::NetworkError)));
QCOMPARE(waitForFinish(reply), int(Failure));
QCOMPARE(spy.count(), 1);
@@ -9397,7 +9397,7 @@ void tst_QNetworkReply::getWithTimeout()
QNetworkRequest request(QUrl("http://localhost:" + QString::number(server.serverPort())));
QNetworkReplyPtr reply(manager.get(request));
- QSignalSpy spy(reply.data(), SIGNAL(error(QNetworkReply::NetworkError)));
+ QSignalSpy spy(reply.data(), SIGNAL(errorOccurred(QNetworkReply::NetworkError)));
QCOMPARE(waitForFinish(reply), int(Success));
@@ -9408,7 +9408,7 @@ void tst_QNetworkReply::getWithTimeout()
server.stopTransfer = true;
QNetworkReplyPtr reply2(manager.get(request));
- QSignalSpy spy2(reply2.data(), SIGNAL(error(QNetworkReply::NetworkError)));
+ QSignalSpy spy2(reply2.data(), SIGNAL(errorOccurred(QNetworkReply::NetworkError)));
QCOMPARE(waitForFinish(reply2), int(Failure));
@@ -9419,7 +9419,7 @@ void tst_QNetworkReply::getWithTimeout()
manager.setTransferTimeout(1000);
QNetworkReplyPtr reply3(manager.get(request));
- QSignalSpy spy3(reply3.data(), SIGNAL(error(QNetworkReply::NetworkError)));
+ QSignalSpy spy3(reply3.data(), SIGNAL(errorOccurred(QNetworkReply::NetworkError)));
QCOMPARE(waitForFinish(reply3), int(Failure));
@@ -9437,7 +9437,7 @@ void tst_QNetworkReply::postWithTimeout()
request.setRawHeader("Content-Type", "application/octet-stream");
QByteArray postData("Just some nonsense");
QNetworkReplyPtr reply(manager.post(request, postData));
- QSignalSpy spy(reply.data(), SIGNAL(error(QNetworkReply::NetworkError)));
+ QSignalSpy spy(reply.data(), SIGNAL(errorOccurred(QNetworkReply::NetworkError)));
QCOMPARE(waitForFinish(reply), int(Success));
@@ -9448,7 +9448,7 @@ void tst_QNetworkReply::postWithTimeout()
server.stopTransfer = true;
QNetworkReplyPtr reply2(manager.post(request, postData));
- QSignalSpy spy2(reply2.data(), SIGNAL(error(QNetworkReply::NetworkError)));
+ QSignalSpy spy2(reply2.data(), SIGNAL(errorOccurred(QNetworkReply::NetworkError)));
QCOMPARE(waitForFinish(reply2), int(Failure));
@@ -9459,7 +9459,7 @@ void tst_QNetworkReply::postWithTimeout()
manager.setTransferTimeout(1000);
QNetworkReplyPtr reply3(manager.post(request, postData));
- QSignalSpy spy3(reply3.data(), SIGNAL(error(QNetworkReply::NetworkError)));
+ QSignalSpy spy3(reply3.data(), SIGNAL(errorOccurred(QNetworkReply::NetworkError)));
QCOMPARE(waitForFinish(reply3), int(Failure));
diff --git a/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp b/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp
index 769836ff62..157c07f922 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp
@@ -4568,7 +4568,9 @@ void tst_QGraphicsView::task255529_transformationAnchorMouseAndViewportMargins()
view.show();
qApp->setActiveWindow(&view);
QVERIFY(QTest::qWaitForWindowExposed(&view));
- QVERIFY(QTest::qWaitForWindowActive(&view));
+ const bool isActiveWindow = QTest::qWaitForWindowActive(&view);
+ if (!isActiveWindow)
+ QSKIP("Window activation failed, skipping test", Abort);
// This is highly unstable (observed to pass on Windows and some Linux configurations).
#ifndef Q_OS_MAC
for (int i = 0; i < 4; ++i) {
diff --git a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp
index 8ad4324c9e..a89b3231ad 100644
--- a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp
+++ b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp
@@ -116,6 +116,7 @@ private slots:
void QTBUG20403_nested_popup_on_shortcut_trigger();
void QTBUG47515_widgetActionEnterLeave();
void QTBUG8122_widgetActionCrashOnClose();
+ void widgetActionTriggerClosesMenu();
void QTBUG_10735_crashWithDialog();
#ifdef Q_OS_MAC
@@ -1407,6 +1408,84 @@ void tst_QMenu::QTBUG8122_widgetActionCrashOnClose()
QTRY_VERIFY(menu->isHidden());
}
+/*!
+ Test that a QWidgetAction that fires closes the menus that it is in.
+*/
+void tst_QMenu::widgetActionTriggerClosesMenu()
+{
+ class ButtonAction : public QWidgetAction
+ {
+ public:
+ ButtonAction()
+ : QWidgetAction(nullptr)
+ {}
+
+ void click()
+ {
+ if (pushButton)
+ pushButton->click();
+ }
+
+ protected:
+ QWidget *createWidget(QWidget *parent)
+ {
+ QPushButton *button = new QPushButton(QLatin1String("Button"), parent);
+ connect(button, &QPushButton::clicked, this, &QAction::trigger);
+
+ if (!pushButton)
+ pushButton = button;
+ return button;
+ }
+
+ private:
+ QPointer<QPushButton> pushButton;
+ };
+
+ QMenu menu;
+ QMenu submenu;
+
+ int menuTriggeredCount = 0;
+ int menuAboutToHideCount = 0;
+ QAction *actionTriggered = nullptr;
+
+ connect(&menu, &QMenu::triggered, this, [&](QAction *action){
+ ++menuTriggeredCount;
+ actionTriggered = action;
+ });
+ connect (&menu, &QMenu::aboutToHide, this, [&](){
+ ++menuAboutToHideCount;
+ });
+
+ QAction regularAction(QLatin1String("Action"));
+ ButtonAction widgetAction;
+
+ submenu.addAction(&regularAction);
+ submenu.addAction(&widgetAction);
+
+ menu.addMenu(&submenu);
+ menu.addAction(&regularAction);
+ menu.addAction(&widgetAction);
+
+ menu.popup(QPoint(200,200));
+ submenu.popup(QPoint(250,250));
+ if (!QTest::qWaitForWindowExposed(&menu) || !QTest::qWaitForWindowExposed(&submenu))
+ QSKIP("Failed to show menus, aborting test");
+
+ regularAction.trigger();
+ QVERIFY(menu.isVisible());
+ QVERIFY(submenu.isVisible());
+ QCOMPARE(menuTriggeredCount, 1);
+ QCOMPARE(actionTriggered, &regularAction);
+ menuTriggeredCount = 0;
+ actionTriggered = nullptr;
+
+ widgetAction.click();
+ QVERIFY(!menu.isVisible());
+ QVERIFY(!submenu.isVisible());
+ QCOMPARE(menuTriggeredCount, 1);
+ QCOMPARE(menuAboutToHideCount, 1);
+ QCOMPARE(actionTriggered, &widgetAction);
+}
class MyMenu : public QMenu
{