summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/auto/corelib/io/largefile/largefile.pro2
-rw-r--r--tests/auto/corelib/io/largefile/tst_largefile.cpp6
-rw-r--r--tests/shared/emulationdetector.h119
3 files changed, 127 insertions, 0 deletions
diff --git a/tests/auto/corelib/io/largefile/largefile.pro b/tests/auto/corelib/io/largefile/largefile.pro
index 6c1bb8d7ea..e96d1398ca 100644
--- a/tests/auto/corelib/io/largefile/largefile.pro
+++ b/tests/auto/corelib/io/largefile/largefile.pro
@@ -2,3 +2,5 @@ CONFIG += testcase
TARGET = tst_largefile
QT = core testlib
SOURCES = tst_largefile.cpp
+INCLUDEPATH += ../../../../shared/
+HEADERS += ../../../../shared/emulationdetector.h
diff --git a/tests/auto/corelib/io/largefile/tst_largefile.cpp b/tests/auto/corelib/io/largefile/tst_largefile.cpp
index a19a5ce58d..4e7877253f 100644
--- a/tests/auto/corelib/io/largefile/tst_largefile.cpp
+++ b/tests/auto/corelib/io/largefile/tst_largefile.cpp
@@ -47,6 +47,8 @@
# endif
#endif // Q_OS_WIN
+#include "emulationdetector.h"
+
class tst_LargeFile
: public QObject
{
@@ -68,6 +70,10 @@ public:
#else
maxSizeBits = 24; // 16 MiB
#endif
+
+ // QEMU only supports < 4GB files
+ if (EmulationDetector::isRunningArmOnX86())
+ maxSizeBits = qMin(maxSizeBits, 28);
}
private:
diff --git a/tests/shared/emulationdetector.h b/tests/shared/emulationdetector.h
new file mode 100644
index 0000000000..bf1192a0b2
--- /dev/null
+++ b/tests/shared/emulationdetector.h
@@ -0,0 +1,119 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef EMULATIONDETECTOR_H
+#define EMULATIONDETECTOR_H
+
+#if defined(Q_OS_LINUX) && defined(Q_PROCESSOR_ARM)
+#define SHOULD_CHECK_ARM_ON_X86
+
+#if QT_CONFIG(process) && !defined(QT_NO_REGULAREXPRESSION)
+#include <QProcess>
+#include <QRegularExpression>
+#endif
+
+#endif
+
+QT_BEGIN_NAMESPACE
+
+// Helper functions for detecting if running emulated
+namespace EmulationDetector {
+
+#ifdef SHOULD_CHECK_ARM_ON_X86
+static bool isX86SpecificFileAvailable(void);
+static bool isReportedArchitectureX86(void);
+#endif
+
+/*
+ * Check if we are running Arm binary on x86 machine.
+ *
+ * Currently this is only able to check on Linux. If not able to
+ * detect, return false.
+ */
+static bool isRunningArmOnX86()
+{
+#ifdef SHOULD_CHECK_ARM_ON_X86
+ if (isX86SpecificFileAvailable())
+ return true;
+
+ if (isReportedArchitectureX86())
+ return true;
+#endif
+ return false;
+}
+
+#ifdef SHOULD_CHECK_ARM_ON_X86
+/*
+ * Check if we can find a file that's only available on x86
+ */
+static bool isX86SpecificFileAvailable()
+{
+ // MTRR (Memory Type Range Registers) are a feature of the x86 architecture
+ // and /proc/mtrr is only present (on Linux) for that family.
+ // However, it's an optional kernel feature, so the absence of the file is
+ // not sufficient to conclude we're on real hardware.
+ QFileInfo mtrr("/proc/mtrr");
+ if (mtrr.exists())
+ return true;
+ return false;
+}
+
+/*
+ * Check if architecture reported by the OS is x86
+ */
+static bool isReportedArchitectureX86(void)
+{
+#if QT_CONFIG(process) && !defined(QT_NO_REGULAREXPRESSION)
+ QProcess unamer;
+ QString machineString;
+
+ // Using syscall "uname" is not possible since that would be captured by
+ // QEMU and result would be the architecture being emulated (e.g. armv7l).
+ // By using QProcess we get the architecture used by the host.
+ unamer.start("uname -a");
+ if (!unamer.waitForFinished()) {
+ return false;
+ }
+ machineString = unamer.readAll();
+
+ // Is our current host cpu x86?
+ if (machineString.contains(QRegularExpression("i386|i686|x86"))) {
+ return true;
+ }
+#endif
+
+ return false;
+}
+#endif // SHOULD_CHECK_ARM_ON_X86
+
+} // EmulationDetector namespace
+
+QT_END_NAMESPACE
+
+#endif
+