From 6ea1e4d528e6ab6ced1674f2d9fe50489d8f2e0c Mon Sep 17 00:00:00 2001 From: Robert Griebl Date: Wed, 21 Feb 2024 04:46:48 +0100 Subject: tests: add a test for Architecture detection The test binaries are compressed because you cannot make them as small as possible. Especially macOS enforces the minimum size to be the page size (16KB). The README.md has all the details on how to generate and compress test binaries. Change-Id: I8636772f2f94ac35e8d4fa51b6b76b0c84ad3d7b Pick-to: 6.7 Reviewed-by: Bernd Weimer Reviewed-by: Qt CI Bot --- .gitattributes | 1 + tests/auto/CMakeLists.txt | 2 +- tests/auto/architecture/CMakeLists.txt | 10 ++++ tests/auto/architecture/tst_architecture.cpp | 69 +++++++++++++++++++++++++++ tests/auto/utilities/CMakeLists.txt | 16 ------- tests/auto/utilities/tst_utilities.cpp | 29 ----------- tests/data/CMakeLists.txt | 1 + tests/data/binaries/README.md | 52 ++++++++++++++++++++ tests/data/binaries/android-elf.so.zz | Bin 0 -> 2040 bytes tests/data/binaries/macos-macho.zz | Bin 0 -> 696 bytes tests/data/binaries/macos-universal.zz | Bin 0 -> 1262 bytes tests/data/binaries/windows-pe.exe.zz | Bin 0 -> 619 bytes 12 files changed, 134 insertions(+), 46 deletions(-) create mode 100644 tests/auto/architecture/CMakeLists.txt create mode 100644 tests/auto/architecture/tst_architecture.cpp delete mode 100644 tests/auto/utilities/CMakeLists.txt delete mode 100644 tests/auto/utilities/tst_utilities.cpp create mode 100644 tests/data/binaries/README.md create mode 100644 tests/data/binaries/android-elf.so.zz create mode 100644 tests/data/binaries/macos-macho.zz create mode 100644 tests/data/binaries/macos-universal.zz create mode 100644 tests/data/binaries/windows-pe.exe.zz diff --git a/.gitattributes b/.gitattributes index 98e17a15..723cab5b 100644 --- a/.gitattributes +++ b/.gitattributes @@ -6,6 +6,7 @@ *.crt binary *.bin binary +*.zz binary .tag export-subst .gitignore export-ignore diff --git a/tests/auto/CMakeLists.txt b/tests/auto/CMakeLists.txt index f4b5442a..c507b4b5 100644 --- a/tests/auto/CMakeLists.txt +++ b/tests/auto/CMakeLists.txt @@ -22,7 +22,7 @@ if (NOT ANDROID) endif() add_subdirectory(runtime) add_subdirectory(signature) -add_subdirectory(utilities) +add_subdirectory(architecture) add_subdirectory(yaml) if (LINUX) diff --git a/tests/auto/architecture/CMakeLists.txt b/tests/auto/architecture/CMakeLists.txt new file mode 100644 index 00000000..92eea7a6 --- /dev/null +++ b/tests/auto/architecture/CMakeLists.txt @@ -0,0 +1,10 @@ + +qt_internal_add_test(tst_architecture + SOURCES + ../error-checking.h + tst_architecture.cpp + DEFINES + AM_TESTDATA_DIR="${CMAKE_CURRENT_BINARY_DIR}/../../data/" + LIBRARIES + Qt::AppManCommonPrivate +) diff --git a/tests/auto/architecture/tst_architecture.cpp b/tests/auto/architecture/tst_architecture.cpp new file mode 100644 index 00000000..db8d4055 --- /dev/null +++ b/tests/auto/architecture/tst_architecture.cpp @@ -0,0 +1,69 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#include +#include +#include +#include + +#include "architecture.h" + +QT_USE_NAMESPACE_AM +using namespace Qt::StringLiterals; + +class tst_Architecture : public QObject +{ + Q_OBJECT + +public: + tst_Architecture() = default; + +private slots: + void initTestCase(); + void architecture_data(); + void architecture(); +}; + + +void tst_Architecture::initTestCase() +{ + if (!QDir(QString::fromLatin1(AM_TESTDATA_DIR "/binaries")).exists()) + QSKIP("No test binaries available in the data/ directory"); +} + +void tst_Architecture::architecture_data() +{ + QTest::addColumn("path"); + QTest::addColumn("archId"); + + QTest::newRow("android-elf") << "android-elf.so.zz" << "android_arm_32"; + QTest::newRow("windows-pe") << "windows-pe.exe.zz" << "windows_x86_64"; + QTest::newRow("macos-macho") << "macos-macho.zz" << "macos_arm_64"; + QTest::newRow("macos-universal") << "macos-universal.zz" << "macos_universal_arm_64+x86_64"; +} + +void tst_Architecture::architecture() +{ + QFETCH(QString, path); + QFETCH(QString, archId); + + QString fullPath = QString::fromLatin1(AM_TESTDATA_DIR) + u"/binaries/"_s + path; + QFile src(fullPath); + QVERIFY(src.open(QIODevice::ReadOnly)); + auto content = src.readAll(); + quint32 contentLen = content.size(); + QVERIFY(contentLen > 0); + content = qUncompress(content); + QVERIFY(content.size() > 0); + QTemporaryFile dst; + QVERIFY(dst.open()); + QVERIFY(dst.write(content) == content.size()); + dst.close(); + QString id = Architecture::identify(dst.fileName()); + + QCOMPARE(id, archId); +} + +QTEST_APPLESS_MAIN(tst_Architecture) + +#include "tst_architecture.moc" diff --git a/tests/auto/utilities/CMakeLists.txt b/tests/auto/utilities/CMakeLists.txt deleted file mode 100644 index 7e202ebe..00000000 --- a/tests/auto/utilities/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ - -qt_internal_add_test(tst_utilities - SOURCES - ../error-checking.h - tst_utilities.cpp - DEFINES - AM_TESTDATA_DIR="${CMAKE_CURRENT_BINARY_DIR}/../../data/" - LIBRARIES - Qt::Network - Qt::AppManCommonPrivate -) - -qt_internal_extend_target(tst_utilities CONDITION TARGET Qt::DBus - LIBRARIES - Qt::DBus -) diff --git a/tests/auto/utilities/tst_utilities.cpp b/tests/auto/utilities/tst_utilities.cpp deleted file mode 100644 index 3c9b05e4..00000000 --- a/tests/auto/utilities/tst_utilities.cpp +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (C) 2021 The Qt Company Ltd. -// Copyright (C) 2019 Luxoft Sweden AB -// Copyright (C) 2018 Pelagicore AG -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#include -#include - -#include "utilities.h" - -QT_USE_NAMESPACE_AM - -class tst_Utilities : public QObject -{ - Q_OBJECT - -public: - tst_Utilities(); - -private slots: -}; - - -tst_Utilities::tst_Utilities() -{ } - -QTEST_APPLESS_MAIN(tst_Utilities) - -#include "tst_utilities.moc" diff --git a/tests/data/CMakeLists.txt b/tests/data/CMakeLists.txt index 31b64799..79f03770 100644 --- a/tests/data/CMakeLists.txt +++ b/tests/data/CMakeLists.txt @@ -15,6 +15,7 @@ file(GLOB_RECURSE TEST_DATA_FILES info.yaml testfile utilities.sh + binaries/*.zz ) add_custom_target(Test-Data-Files SOURCES diff --git a/tests/data/binaries/README.md b/tests/data/binaries/README.md new file mode 100644 index 00000000..199c55c7 --- /dev/null +++ b/tests/data/binaries/README.md @@ -0,0 +1,52 @@ +## Generation + +Here's how to (re)generate the test binaries in this directory: + +- `android-elf.so`: + + This is a copy of `Qt/6.7.0/android_armv7/lib/libQt6QuickParticles_armeabi-v7a.so` + +- `windows-pe.exe`: + + This is a minimal C program, compiled with cmake + MSVC: + - `main.c`: + ``` + int __stdcall WinMainCRTStartup() { return 0; } + ``` + + - `CMakeLists.txt`: + ``` + cmake_minimum_required(VERSION 3.5) + project(windows-pe LANGUAGES C) + add_executable(windows-pe WIN32 main.c) + set_target_properties(windows-pe PROPERTIES LINK_FLAGS "/NODEFAULTLIB") + ``` + +- `macos-macho` and `macos-macho-universal`: + + This is a minimal C program, compiled on the command line: + - `main.c`: + ``` + int main() { return 0; } + ``` + + - Compile with: + ``` + clang main.c -o macos-macho + clang main.c -arch x86_64 -arch arm64 -o macos-macho-universal + ``` + + +## Compression + +The .zz files here are in Qt's `qCompress` format. + +- compress `${file}` on the command line: + ``` + $ printf "0: %08x" `stat -c "%s" $file` | xxd -r > $file.zz ; pigz -z <$file >>$file.zz + ``` + +- decompress `${file}.zz` on the command line: + ``` + $ dd if=${file}.zz bs=4 skip=1 | pigz -d >${file} + ``` diff --git a/tests/data/binaries/android-elf.so.zz b/tests/data/binaries/android-elf.so.zz new file mode 100644 index 00000000..a06f8341 Binary files /dev/null and b/tests/data/binaries/android-elf.so.zz differ diff --git a/tests/data/binaries/macos-macho.zz b/tests/data/binaries/macos-macho.zz new file mode 100644 index 00000000..db91c82a Binary files /dev/null and b/tests/data/binaries/macos-macho.zz differ diff --git a/tests/data/binaries/macos-universal.zz b/tests/data/binaries/macos-universal.zz new file mode 100644 index 00000000..b91409f2 Binary files /dev/null and b/tests/data/binaries/macos-universal.zz differ diff --git a/tests/data/binaries/windows-pe.exe.zz b/tests/data/binaries/windows-pe.exe.zz new file mode 100644 index 00000000..c3fd3454 Binary files /dev/null and b/tests/data/binaries/windows-pe.exe.zz differ -- cgit v1.2.3