Move QEMU emulation detector to QTest

The emulation detection has been usable only on qtbase tests, move it to
QTest so that it can be used in other modules as well.

Change-Id: I4b2321b7856414d7b1cfd5e6b1405a633c6bb878
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
(cherry picked from commit 0ce443691fac1188103e5eaa66be40278d5d5e97)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Samuli Piippo 2021-02-11 10:51:55 +02:00 committed by Qt Cherry-pick Bot
parent 1c0073ba72
commit 83dcbf75ad
26 changed files with 58 additions and 67 deletions

View File

@ -22,6 +22,7 @@ qt_internal_add_module(Test
qbenchmarkperfevents.cpp qbenchmarkperfevents_p.h qbenchmarkperfevents.cpp qbenchmarkperfevents_p.h
qbenchmarktimemeasurers_p.h qbenchmarktimemeasurers_p.h
qcsvbenchmarklogger.cpp qcsvbenchmarklogger_p.h qcsvbenchmarklogger.cpp qcsvbenchmarklogger_p.h
qemulationdetector_p.h
qjunittestlogger.cpp qjunittestlogger_p.h qjunittestlogger.cpp qjunittestlogger_p.h
qplaintestlogger.cpp qplaintestlogger_p.h qplaintestlogger.cpp qplaintestlogger_p.h
qsignaldumper.cpp qsignaldumper_p.h qsignaldumper.cpp qsignaldumper_p.h

View File

@ -1,9 +1,9 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2017 The Qt Company Ltd. ** Copyright (C) 2021 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the test suite of the Qt Toolkit. ** This file is part of the QtTest module of the Qt Toolkit.
** **
** $QT_BEGIN_LICENSE:GPL-EXCEPT$ ** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** Commercial License Usage ** Commercial License Usage
@ -26,8 +26,19 @@
** **
****************************************************************************/ ****************************************************************************/
#ifndef EMULATIONDETECTOR_H #ifndef QEMULATIONDETECTOR_P_H
#define EMULATIONDETECTOR_H #define QEMULATIONDETECTOR_P_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists purely as an
// implementation detail. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
#include <QtCore/qglobal.h> #include <QtCore/qglobal.h>
@ -46,7 +57,7 @@
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
// Helper functions for detecting if running emulated // Helper functions for detecting if running emulated
namespace EmulationDetector { namespace QTestPrivate {
#ifdef SHOULD_CHECK_ARM_ON_X86 #ifdef SHOULD_CHECK_ARM_ON_X86
static bool isX86SpecificFileAvailable(void); static bool isX86SpecificFileAvailable(void);
@ -115,7 +126,7 @@ static bool isReportedArchitectureX86(void)
} }
#endif // SHOULD_CHECK_ARM_ON_X86 #endif // SHOULD_CHECK_ARM_ON_X86
} // EmulationDetector namespace } // QTestPrivate namespace
QT_END_NAMESPACE QT_END_NAMESPACE

View File

@ -6,8 +6,7 @@
qt_internal_add_test(tst_largefile qt_internal_add_test(tst_largefile
SOURCES SOURCES
../../../../shared/emulationdetector.h
tst_largefile.cpp tst_largefile.cpp
INCLUDE_DIRECTORIES PUBLIC_LIBRARIES
../../../../shared Qt::TestPrivate
) )

View File

@ -48,7 +48,7 @@
# endif # endif
#endif // Q_OS_WIN #endif // Q_OS_WIN
#include "emulationdetector.h" #include <QtTest/private/qemulationdetector_p.h>
class tst_LargeFile class tst_LargeFile
: public QObject : public QObject
@ -73,7 +73,7 @@ public:
#endif #endif
// QEMU only supports < 4GB files // QEMU only supports < 4GB files
if (EmulationDetector::isRunningArmOnX86()) if (QTestPrivate::isRunningArmOnX86())
maxSizeBits = qMin(maxSizeBits, 28); maxSizeBits = qMin(maxSizeBits, 28);
} }

View File

@ -19,12 +19,10 @@ list(APPEND test_data "resources/file1.ext1")
qt_internal_add_test(tst_qfile qt_internal_add_test(tst_qfile
SOURCES SOURCES
../../../../shared/emulationdetector.h
tst_qfile.cpp tst_qfile.cpp
INCLUDE_DIRECTORIES
../../../../shared
PUBLIC_LIBRARIES PUBLIC_LIBRARIES
Qt::CorePrivate Qt::CorePrivate
Qt::TestPrivate
TESTDATA ${test_data} TESTDATA ${test_data}
) )

View File

@ -46,7 +46,7 @@
#include <private/qfsfileengine_p.h> #include <private/qfsfileengine_p.h>
#include <private/qfilesystemengine_p.h> #include <private/qfilesystemengine_p.h>
#include "emulationdetector.h" #include <QtTest/private/qemulationdetector_p.h>
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
@ -2553,10 +2553,10 @@ void tst_QFile::virtualFile()
// open the file // open the file
QFile f(fname); QFile f(fname);
QVERIFY2(f.open(QIODevice::ReadOnly), msgOpenFailed(f).constData()); QVERIFY2(f.open(QIODevice::ReadOnly), msgOpenFailed(f).constData());
if (EmulationDetector::isRunningArmOnX86()) if (QTestPrivate::isRunningArmOnX86())
QEXPECT_FAIL("","QEMU does not read /proc/self/maps size correctly", Continue); QEXPECT_FAIL("","QEMU does not read /proc/self/maps size correctly", Continue);
QCOMPARE(f.size(), Q_INT64_C(0)); QCOMPARE(f.size(), Q_INT64_C(0));
if (EmulationDetector::isRunningArmOnX86()) if (QTestPrivate::isRunningArmOnX86())
QEXPECT_FAIL("","QEMU does not read /proc/self/maps size correctly", Continue); QEXPECT_FAIL("","QEMU does not read /proc/self/maps size correctly", Continue);
QVERIFY(f.atEnd()); QVERIFY(f.atEnd());

View File

@ -7,13 +7,11 @@
qt_internal_add_test(tst_qprocess qt_internal_add_test(tst_qprocess
OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../" OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../"
SOURCES SOURCES
../../../../../shared/emulationdetector.h
../tst_qprocess.cpp ../tst_qprocess.cpp
INCLUDE_DIRECTORIES
../../../../../shared
PUBLIC_LIBRARIES PUBLIC_LIBRARIES
Qt::CorePrivate Qt::CorePrivate
Qt::Network Qt::Network
Qt::TestPrivate
) )
#### Keys ignored in scope 1:.:.:test.pro:<TRUE>: #### Keys ignored in scope 1:.:.:test.pro:<TRUE>:

View File

@ -27,11 +27,10 @@
** **
****************************************************************************/ ****************************************************************************/
#include <emulationdetector.h>
#include <QTest> #include <QTest>
#include <QTestEventLoop> #include <QTestEventLoop>
#include <QSignalSpy> #include <QSignalSpy>
#include <QtTest/private/qemulationdetector_p.h>
#include <QtCore/QProcess> #include <QtCore/QProcess>
#include <QtCore/QDir> #include <QtCore/QDir>
@ -1237,7 +1236,7 @@ void tst_QProcess::processInAThread()
void tst_QProcess::processesInMultipleThreads() void tst_QProcess::processesInMultipleThreads()
{ {
if (EmulationDetector::isRunningArmOnX86()) if (QTestPrivate::isRunningArmOnX86())
QSKIP("Flakily hangs in QEMU. QTBUG-67760"); QSKIP("Flakily hangs in QEMU. QTBUG-67760");
for (int i = 0; i < 10; ++i) { for (int i = 0; i < 10; ++i) {
// run from 1 to 10 threads, but run at least some tests // run from 1 to 10 threads, but run at least some tests

View File

@ -15,12 +15,10 @@ list(APPEND test_data "../BLACKLIST")
qt_internal_add_test(tst_qtextstream qt_internal_add_test(tst_qtextstream
OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../" OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../"
SOURCES SOURCES
../../../../../shared/emulationdetector.h
../tst_qtextstream.cpp ../tst_qtextstream.cpp
INCLUDE_DIRECTORIES
../../../../../shared
PUBLIC_LIBRARIES PUBLIC_LIBRARIES
Qt::Network Qt::Network
Qt::TestPrivate
TESTDATA ${test_data} TESTDATA ${test_data}
) )

View File

@ -45,7 +45,7 @@
# include <QProcess> # include <QProcess>
#endif #endif
#include "../../../network-settings.h" #include "../../../network-settings.h"
#include "emulationdetector.h" #include <QtTest/private/qemulationdetector_p.h>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
template<> struct QMetaTypeId<QIODevice::OpenModeFlag> template<> struct QMetaTypeId<QIODevice::OpenModeFlag>
@ -1417,7 +1417,7 @@ void tst_QTextStream::pos2()
// ------------------------------------------------------------------------------ // ------------------------------------------------------------------------------
void tst_QTextStream::pos3LargeFile() void tst_QTextStream::pos3LargeFile()
{ {
if (EmulationDetector::isRunningArmOnX86()) if (QTestPrivate::isRunningArmOnX86())
QSKIP("Running QTextStream::pos() in tight loop is too slow on emulator"); QSKIP("Running QTextStream::pos() in tight loop is too slow on emulator");
{ {

View File

@ -6,10 +6,9 @@
qt_internal_add_test(tst_qthread qt_internal_add_test(tst_qthread
SOURCES SOURCES
../../../../shared/emulationdetector.h
tst_qthread.cpp tst_qthread.cpp
INCLUDE_DIRECTORIES PUBLIC_LIBRARIES
../../../../shared Qt::TestPrivate
) )
## Scopes: ## Scopes:

View File

@ -55,7 +55,7 @@
#include <exception> #include <exception>
#endif #endif
#include "emulationdetector.h" #include <QtTest/private/qemulationdetector_p.h>
class tst_QThread : public QObject class tst_QThread : public QObject
{ {
@ -951,7 +951,7 @@ void tst_QThread::adoptMultipleThreadsOverlap()
// Disconnects on WinCE // Disconnects on WinCE
void tst_QThread::stressTest() void tst_QThread::stressTest()
{ {
if (EmulationDetector::isRunningArmOnX86()) if (QTestPrivate::isRunningArmOnX86())
QSKIP("Qemu uses too much memory for each thread. Test would run out of memory."); QSKIP("Qemu uses too much memory for each thread. Test would run out of memory.");
QElapsedTimer timer; QElapsedTimer timer;

View File

@ -6,15 +6,13 @@
qt_internal_add_test(tst_qfilesystemmodel qt_internal_add_test(tst_qfilesystemmodel
SOURCES SOURCES
../../../../shared/emulationdetector.h
tst_qfilesystemmodel.cpp tst_qfilesystemmodel.cpp
INCLUDE_DIRECTORIES
../../../../shared
PUBLIC_LIBRARIES PUBLIC_LIBRARIES
Qt::CorePrivate Qt::CorePrivate
Qt::Gui Qt::Gui
Qt::Widgets Qt::Widgets
Qt::WidgetsPrivate Qt::WidgetsPrivate
Qt::TestPrivate
) )
## Scopes: ## Scopes:

View File

@ -27,11 +27,11 @@
****************************************************************************/ ****************************************************************************/
#include <emulationdetector.h>
#include <QTest> #include <QTest>
#include <QSignalSpy> #include <QSignalSpy>
#include <QTemporaryFile> #include <QTemporaryFile>
#include <QLoggingCategory> #include <QLoggingCategory>
#include <QtTest/private/qemulationdetector_p.h>
#ifdef QT_BUILD_INTERNAL #ifdef QT_BUILD_INTERNAL
#include <private/qfilesystemmodel_p.h> #include <private/qfilesystemmodel_p.h>
@ -792,7 +792,7 @@ void tst_QFileSystemModel::sort()
QTreeView tree; QTreeView tree;
tree.setWindowTitle(QTest::currentTestFunction()); tree.setWindowTitle(QTest::currentTestFunction());
if (fileDialogMode && EmulationDetector::isRunningArmOnX86()) if (fileDialogMode && QTestPrivate::isRunningArmOnX86())
QSKIP("Crashes in QEMU. QTBUG-70572"); QSKIP("Crashes in QEMU. QTBUG-70572");
#ifdef QT_BUILD_INTERNAL #ifdef QT_BUILD_INTERNAL

View File

@ -11,8 +11,7 @@ qt_internal_add_test(tst_qfont
Qt::CorePrivate Qt::CorePrivate
Qt::Gui Qt::Gui
Qt::GuiPrivate Qt::GuiPrivate
INCLUDE_DIRECTORIES Qt::TestPrivate
../../../../shared
) )
# Resources: # Resources:

View File

@ -41,7 +41,7 @@
#include <qwidget.h> #include <qwidget.h>
#endif #endif
#include <qlist.h> #include <qlist.h>
#include "emulationdetector.h" #include <QtTest/private/qemulationdetector_p.h>
class tst_QFont : public QObject class tst_QFont : public QObject
{ {
@ -578,7 +578,7 @@ void tst_QFont::defaultFamily()
} }
} }
#ifdef Q_PROCESSOR_ARM_32 #ifdef Q_PROCESSOR_ARM_32
if (EmulationDetector::isRunningArmOnX86()) if (QTestPrivate::isRunningArmOnX86())
QEXPECT_FAIL("", "Fails on ARMv7 QEMU (QTQAINFRA-4127)", Continue); QEXPECT_FAIL("", "Fails on ARMv7 QEMU (QTQAINFRA-4127)", Continue);
#endif #endif

View File

@ -6,15 +6,13 @@
qt_internal_add_test(tst_http2 qt_internal_add_test(tst_http2
SOURCES SOURCES
../../../../shared/emulationdetector.h
http2srv.cpp http2srv.h http2srv.cpp http2srv.h
tst_http2.cpp tst_http2.cpp
DEFINES DEFINES
SRCDIR=\\\"${CMAKE_CURRENT_SOURCE_DIR}/\\\" SRCDIR=\\\"${CMAKE_CURRENT_SOURCE_DIR}/\\\"
INCLUDE_DIRECTORIES
../../../../shared
PUBLIC_LIBRARIES PUBLIC_LIBRARIES
Qt::CorePrivate Qt::CorePrivate
Qt::Network Qt::Network
Qt::NetworkPrivate Qt::NetworkPrivate
Qt::TestPrivate
) )

View File

@ -55,7 +55,7 @@
#include <memory> #include <memory>
#include <string> #include <string>
#include "emulationdetector.h" #include <QtTest/private/qemulationdetector_p.h>
#if (!defined(QT_NO_OPENSSL) && OPENSSL_VERSION_NUMBER >= 0x10002000L && !defined(OPENSSL_NO_TLSEXT)) \ #if (!defined(QT_NO_OPENSSL) && OPENSSL_VERSION_NUMBER >= 0x10002000L && !defined(OPENSSL_NO_TLSEXT)) \
|| QT_CONFIG(schannel) || QT_CONFIG(schannel)
@ -379,7 +379,7 @@ void tst_Http2::flowControlServerSide()
// to let all replies finish without any error. // to let all replies finish without any error.
using namespace Http2; using namespace Http2;
if (EmulationDetector::isRunningArmOnX86()) if (QTestPrivate::isRunningArmOnX86())
QSKIP("Test is too slow to run on emulator"); QSKIP("Test is too slow to run on emulator");
clearHTTP2State(); clearHTTP2State();

View File

@ -8,10 +8,9 @@ qt_internal_add_test(tst_qudpsocket
OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../" # special case OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../" # special case
SOURCES SOURCES
../tst_qudpsocket.cpp ../tst_qudpsocket.cpp
INCLUDE_DIRECTORIES
../../../../../shared
PUBLIC_LIBRARIES PUBLIC_LIBRARIES
Qt::Network Qt::Network
Qt::TestPrivate
QT_TEST_SERVER_LIST "danted" "echo" # special case QT_TEST_SERVER_LIST "danted" "echo" # special case
) )

View File

@ -52,7 +52,7 @@
#include <qstringlist.h> #include <qstringlist.h>
#include "../../../network-settings.h" #include "../../../network-settings.h"
#include "emulationdetector.h" #include <QtTest/private/qemulationdetector_p.h>
#if defined(Q_OS_LINUX) #if defined(Q_OS_LINUX)
#define SHOULD_CHECK_SYSCALL_SUPPORT #define SHOULD_CHECK_SYSCALL_SUPPORT
@ -302,7 +302,7 @@ void tst_QUdpSocket::initTestCase()
qDebug() << "Will use multicast groups" << multicastGroup4 << multicastGroup6 << linklocalMulticastGroups; qDebug() << "Will use multicast groups" << multicastGroup4 << multicastGroup6 << linklocalMulticastGroups;
m_workaroundLinuxKernelBug = shouldWorkaroundLinuxKernelBug(); m_workaroundLinuxKernelBug = shouldWorkaroundLinuxKernelBug();
if (EmulationDetector::isRunningArmOnX86()) if (QTestPrivate::isRunningArmOnX86())
QSKIP("This test is unreliable due to QEMU emulation shortcomings."); QSKIP("This test is unreliable due to QEMU emulation shortcomings.");
} }

View File

@ -6,8 +6,7 @@
qt_internal_add_test(qobjectrace qt_internal_add_test(qobjectrace
SOURCES SOURCES
../../../shared/emulationdetector.h
tst_qobjectrace.cpp tst_qobjectrace.cpp
INCLUDE_DIRECTORIES PUBLIC_LIBRARIES
../../../shared Qt::TestPrivate
) )

View File

@ -30,7 +30,7 @@
#include <QtCore> #include <QtCore>
#include <QTest> #include <QTest>
#include "emulationdetector.h" #include <QtTest/private/qemulationdetector_p.h>
enum { OneMinute = 60 * 1000, enum { OneMinute = 60 * 1000,
TwoMinutes = OneMinute * 2 }; TwoMinutes = OneMinute * 2 };
@ -260,7 +260,7 @@ public:
void tst_QObjectRace::destroyRace() void tst_QObjectRace::destroyRace()
{ {
if (EmulationDetector::isRunningArmOnX86()) if (QTestPrivate::isRunningArmOnX86())
QSKIP("Test is too slow to run on emulator"); QSKIP("Test is too slow to run on emulator");
enum { ThreadCount = 10, ObjectCountPerThread = 2777, enum { ThreadCount = 10, ObjectCountPerThread = 2777,

View File

@ -10,11 +10,8 @@ qt_internal_add_test(tst_selftests
EXCEPTIONS EXCEPTIONS
CATCH CATCH
SOURCES SOURCES
../../../shared/emulationdetector.h
tst_selftests.cpp tst_selftests.cpp
catch.cpp catch.cpp
INCLUDE_DIRECTORIES
../../../shared
PUBLIC_LIBRARIES PUBLIC_LIBRARIES
Qt::TestPrivate Qt::TestPrivate
# special case begin # special case begin

View File

@ -8,12 +8,10 @@ qt_internal_add_executable(float
NO_INSTALL # special case NO_INSTALL # special case
OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} # special case OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} # special case
SOURCES SOURCES
../../../../shared/emulationdetector.h
tst_float.cpp tst_float.cpp
INCLUDE_DIRECTORIES
../../../../shared
PUBLIC_LIBRARIES PUBLIC_LIBRARIES
Qt::Test Qt::Test
Qt::TestPrivate
) )
## Scopes: ## Scopes:

View File

@ -31,7 +31,7 @@
#include <QTest> #include <QTest>
#include <QDebug> #include <QDebug>
#include "emulationdetector.h" #include <QtTest/private/qemulationdetector_p.h>
// Test proper handling of floating-point types // Test proper handling of floating-point types
class tst_float: public QObject class tst_float: public QObject
@ -182,7 +182,7 @@ void tst_float::float16Comparisons_data() const
QTest::addColumn<qfloat16>("operandLeft"); QTest::addColumn<qfloat16>("operandLeft");
QTest::addColumn<qfloat16>("operandRight"); QTest::addColumn<qfloat16>("operandRight");
const qfloat16 zero(0), one(1); const qfloat16 zero(0), one(1);
const qfloat16 tiny(EmulationDetector::isRunningArmOnX86() ? 0.00099f : 0.001f); const qfloat16 tiny(QTestPrivate::isRunningArmOnX86() ? 0.00099f : 0.001f);
QTest::newRow("should FAIL 1") << one << qfloat16(3); QTest::newRow("should FAIL 1") << one << qfloat16(3);
QTest::newRow("should PASS 1") << zero << zero; QTest::newRow("should PASS 1") << zero << zero;

View File

@ -48,7 +48,7 @@
#include <private/cycle_p.h> #include <private/cycle_p.h>
#include "emulationdetector.h" #include <QtTest/private/qemulationdetector_p.h>
struct BenchmarkResult struct BenchmarkResult
{ {
@ -345,7 +345,7 @@ bool compareLine(const QString &logger, const QString &subdir,
return true; return true;
} }
if (EmulationDetector::isRunningArmOnX86() && subdir == QLatin1String("float")) { if (QTestPrivate::isRunningArmOnX86() && subdir == QLatin1String("float")) {
// QEMU cheats at qfloat16, so outputs it as if it were a float. // QEMU cheats at qfloat16, so outputs it as if it were a float.
if (actualLine.endsWith(QLatin1String("Actual (operandLeft) : 0.001")) if (actualLine.endsWith(QLatin1String("Actual (operandLeft) : 0.001"))
&& expectedLine.endsWith(QLatin1String("Actual (operandLeft) : 0.000999"))) { && expectedLine.endsWith(QLatin1String("Actual (operandLeft) : 0.000999"))) {
@ -787,7 +787,7 @@ void checkErrorOutput(const QString &test, const QByteArray &errorOutput)
#ifdef Q_OS_LINUX #ifdef Q_OS_LINUX
// QEMU outputs to stderr about uncaught signals // QEMU outputs to stderr about uncaught signals
if (EmulationDetector::isRunningArmOnX86() && if (QTestPrivate::isRunningArmOnX86() &&
(test == "assert" (test == "assert"
|| test == "blacklisted" || test == "blacklisted"
|| test == "crashes" || test == "crashes"