From 84f10312e3eae493ec4beedd54c31b8ba792614c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Han=C3=A7erli?= <burak.hancerli@qt.io> Date: Fri, 28 Feb 2025 09:43:36 +0000 Subject: [PATCH] QDS-14556 Extend tests --- README.md | 2 +- cicd/stages/build.yml | 108 ++++---- cicd/stages/release.yml | 4 +- cicd/stages/test.yml | 50 +++- src/backend/backend.cpp | 8 +- src/backend/dsconnector/ds.cpp | 6 +- src/backend/dsconnector/ds.h | 2 +- src/backend/dsconnector/dsmanager.cpp | 39 ++- src/backend/dsconnector/dsmanager.h | 11 +- src/backend/main.cpp | 3 +- src/backend/projectmanager.cpp | 20 +- src/backend/projectmanager.h | 5 +- src/backend/settings.cpp | 12 + src/backend/settings.h | 2 + tests/CMakeLists.txt | 15 +- tests/android/AndroidManifest.xml | 2 +- .../res/drawable/ic_launcher_background.xml | 26 ++ .../res/drawable/ic_launcher_foreground.xml | 18 ++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + tests/android/res/mipmap-hdpi/app_icon.png | Bin 4461 -> 0 bytes .../android/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 2088 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 3586 bytes tests/android/res/mipmap-ldpi/app_icon.png | Bin 798 -> 0 bytes tests/android/res/mipmap-mdpi/app_icon.png | Bin 1758 -> 0 bytes .../android/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 1430 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 2340 bytes tests/android/res/mipmap-xhdpi/app_icon.png | Bin 6367 -> 0 bytes .../android/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 2686 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 4958 bytes tests/android/res/mipmap-xxhdpi/app_icon.png | Bin 13363 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 3880 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 7174 bytes tests/android/res/mipmap-xxxhdpi/app_icon.png | Bin 30716 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 4762 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 9514 bytes tests/android/res/values/strings.xml | 18 ++ .../test_project/Generated/Quick3DAssets.txt | 1 + tests/data/test_project/qtquickcontrols2.conf | 8 + tests/data/test_project/temp.qrc | 13 + .../data/test_project/test_project.qmlproject | 122 +++++++++ .../test_project/test_project/Constants.qml | 27 ++ .../test_project/EventListModel.qml | 12 + .../test_project/EventListSimulator.qml | 22 ++ .../test_project/designer/plugin.metainfo | 13 + tests/data/test_project/test_project/qmldir | 4 + .../test_project/test_projectContent/App.qml | 16 ++ .../test_projectContent/Screen01.ui.qml | 254 ++++++++++++++++++ .../test_projectContent/fonts/fonts.txt | 1 + .../test_projectContent/images/images.txt | 1 + .../data/test_project/test_project_fail.qmlrc | Bin 0 -> 4129 bytes .../test_project/test_project_success.qmlrc | Bin 0 -> 4128 bytes tests/main.cpp | 33 ++- tests/mock_ds.cpp | 129 +++++++++ tests/mock_ds.h | 43 +++ tests/tst_dsmanager.cpp | 221 +++++++++++++++ tests/tst_dsmanager.h | 54 ++++ tests/tst_projectmanager.cpp | 211 +++++++++++++++ tests/tst_projectmanager.h | 40 +++ tests/tst_settings.cpp | 27 +- tests/tst_settings.h | 7 + 61 files changed, 1497 insertions(+), 123 deletions(-) create mode 100644 tests/android/res/drawable/ic_launcher_background.xml create mode 100644 tests/android/res/drawable/ic_launcher_foreground.xml create mode 100644 tests/android/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 tests/android/res/mipmap-anydpi-v26/ic_launcher_round.xml delete mode 100644 tests/android/res/mipmap-hdpi/app_icon.png create mode 100644 tests/android/res/mipmap-hdpi/ic_launcher.webp create mode 100644 tests/android/res/mipmap-hdpi/ic_launcher_round.webp delete mode 100644 tests/android/res/mipmap-ldpi/app_icon.png delete mode 100644 tests/android/res/mipmap-mdpi/app_icon.png create mode 100644 tests/android/res/mipmap-mdpi/ic_launcher.webp create mode 100644 tests/android/res/mipmap-mdpi/ic_launcher_round.webp delete mode 100644 tests/android/res/mipmap-xhdpi/app_icon.png create mode 100644 tests/android/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 tests/android/res/mipmap-xhdpi/ic_launcher_round.webp delete mode 100644 tests/android/res/mipmap-xxhdpi/app_icon.png create mode 100644 tests/android/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 tests/android/res/mipmap-xxhdpi/ic_launcher_round.webp delete mode 100644 tests/android/res/mipmap-xxxhdpi/app_icon.png create mode 100644 tests/android/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 tests/android/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 tests/android/res/values/strings.xml create mode 100644 tests/data/test_project/Generated/Quick3DAssets.txt create mode 100644 tests/data/test_project/qtquickcontrols2.conf create mode 100644 tests/data/test_project/temp.qrc create mode 100644 tests/data/test_project/test_project.qmlproject create mode 100644 tests/data/test_project/test_project/Constants.qml create mode 100644 tests/data/test_project/test_project/EventListModel.qml create mode 100644 tests/data/test_project/test_project/EventListSimulator.qml create mode 100644 tests/data/test_project/test_project/designer/plugin.metainfo create mode 100644 tests/data/test_project/test_project/qmldir create mode 100644 tests/data/test_project/test_projectContent/App.qml create mode 100644 tests/data/test_project/test_projectContent/Screen01.ui.qml create mode 100644 tests/data/test_project/test_projectContent/fonts/fonts.txt create mode 100644 tests/data/test_project/test_projectContent/images/images.txt create mode 100644 tests/data/test_project/test_project_fail.qmlrc create mode 100644 tests/data/test_project/test_project_success.qmlrc create mode 100644 tests/mock_ds.cpp create mode 100644 tests/mock_ds.h create mode 100644 tests/tst_dsmanager.cpp create mode 100644 tests/tst_dsmanager.h create mode 100644 tests/tst_projectmanager.cpp create mode 100644 tests/tst_projectmanager.h diff --git a/README.md b/README.md index c1ec5ba..48349e9 100644 --- a/README.md +++ b/README.md @@ -110,7 +110,7 @@ Test results can be viewed with any JUnit compatible viewer. For example, you ca ```bash npm i -g xunit-viewer -xunit-viewer -r output.junit.xml +xunit-viewer -r output.junitxml -s -w ``` It'll create a `report.html` file that can be opened in a web browser. For more information about `xunit-viewer` please visit the [GitHub repo][xunit-viewer]. diff --git a/cicd/stages/build.yml b/cicd/stages/build.yml index 74aaa52..86cb904 100644 --- a/cicd/stages/build.yml +++ b/cicd/stages/build.yml @@ -3,23 +3,27 @@ .build-components: &build-components - pushd 3rdparty/qtquickdesigner-components - | - cmake \ - -S . \ - -G Ninja \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_TOOLCHAIN_FILE=${QDS_CI_JOB_QT_PATH}/lib/cmake/Qt6/qt.toolchain.cmake \ - -DANDROID_SDK_ROOT=${DOCKER_ENV_ANDROID_SDK_ROOT} \ - -DANDROID_NDK_ROOT=${DOCKER_ENV_ANDROID_NDK_ROOT} \ - -DQT_HOST_PATH=${DOCKER_ENV_QT_PATH_LINUX_GCC_64} \ - -DFLOWVIEW_AUTO_QMLDIR=ON \ - -DCMAKE_INSTALL_PREFIX=${QDS_CI_JOB_QT_PATH} - - cmake --build . - - cmake --install . + for arch in ${QDS_CI_JOB_ARCHS}; do + QT_DIR_WITH_ARCH=${DOCKER_ENV_QT_PATH_WITH_VERSION}/${arch} + BUILD_PATH=${QDS_CI_JOB_BUILD_PATH}/components/${arch} + cmake \ + -S . \ + -G Ninja \ + -B ${BUILD_PATH} \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_TOOLCHAIN_FILE=${QT_DIR_WITH_ARCH}/lib/cmake/Qt6/qt.toolchain.cmake \ + -DANDROID_SDK_ROOT=${DOCKER_ENV_ANDROID_SDK_ROOT} \ + -DANDROID_NDK_ROOT=${DOCKER_ENV_ANDROID_NDK_ROOT} \ + -DQT_HOST_PATH=${DOCKER_ENV_QT_PATH_LINUX_GCC_64} \ + -DFLOWVIEW_AUTO_QMLDIR=ON \ + -DCMAKE_INSTALL_PREFIX=${QT_DIR_WITH_ARCH} + cmake --build ${BUILD_PATH} --target install + rm -rf ${BUILD_PATH} + done - popd -.build-android-apps: &build-android-apps +.build-app: &build-app - export GOOGLE_PLAY_APP_VERSION=$(( $(git tag --list | wc -l) +11 )) - # where is this magic "$(git tag --list | wc -l) +11" coming from? # "git tag --list | wc -l" counts the number of tags in the repository. # The "+11" is a magic number which is the last GOOGLE_PLAY_APP_VERSION # that was released before starting to add tags to the repository. After @@ -39,9 +43,11 @@ -DCMAKE_INSTALL_PREFIX=${QDS_CI_JOB_QT_PATH} \ -DANDROID_OPENSSL_PATH=${QDS_CI_JOB_OPENSSL_PATH} \ -DGOOGLE_PLAY_APP_VERSION=${GOOGLE_PLAY_APP_VERSION} \ + -DQT_ANDROID_BUILD_ALL_ABIS=ON \ + -DQT_ANDROID_MULTI_ABI_FORWARD_VARS="GOOGLE_PLAY_APP_VERSION;ANDROID_OPENSSL_PATH" \ -DBUILD_EXAMPLES=OFF - cat ${QDS_CI_JOB_BUILD_PATH}/src/dynamic_imports.qml - - cmake --build ${QDS_CI_JOB_BUILD_PATH} --target aab + - cmake --build ${QDS_CI_JOB_BUILD_PATH} --target ${QDS_CI_JOB_CMAKE_BUILD_TARGET} .copy-and-sign-apks: ©-and-sign-apks - QDS_CI_KEYSTORE_PATH=$(pwd)/android_release.keystore @@ -57,68 +63,54 @@ - | if [[ -n ${CI_COMMIT_TAG} ]]; then + QDS_CI_KEYSTORE_PATH=$(pwd)/android_release.keystore + echo ${QDS_VAR_KEYSTORE} | base64 -d > ${QDS_CI_KEYSTORE_PATH} cp -r ${QDS_CI_JOB_BUILD_PATH}/src/android-build/build/outputs/bundle/release/* ${QDS_CI_JOB_ARTIFACTS_PATH_APP} - /usr/bin/jarsigner -keystore ${CI_PROJECT_DIR}/cicd/android/android_release.keystore ${QDS_CI_JOB_ARTIFACTS_PATH_APP}/android-build-release.aab designviewer -storepass ${QDS_VAR_PASS} + /usr/bin/jarsigner -keystore ${QDS_CI_KEYSTORE_PATH} ${QDS_CI_JOB_ARTIFACTS_PATH_APP}/android-build-release.aab ${QDS_VAR_KEYSTORE_ALIAS} -storepass ${QDS_VAR_PASS} fi -build-android: +.build-common: extends: .pipeline_common stage: build - parallel: - matrix: - - QDS_CI_JOB_TARGET_ARCH: "arm64_v8a" - QDS_CI_JOB_OPENSSL_PATH: "/opt/openssl/ssl_3/arm64-v8a" - - QDS_CI_JOB_TARGET_ARCH: "armv7" - QDS_CI_JOB_OPENSSL_PATH: "/opt/openssl/ssl_3/armeabi-v7a" - - QDS_CI_JOB_TARGET_ARCH: "x86" - QDS_CI_JOB_OPENSSL_PATH: "/opt/openssl/ssl_3/x86" - - QDS_CI_JOB_TARGET_ARCH: "x86_64" - QDS_CI_JOB_OPENSSL_PATH: "/opt/openssl/ssl_3/x86_64" - variables: - QDS_CI_JOB_BUILD_PATH: "${QDS_CI_CACHE_PATH}/${QDS_CI_JOB_TARGET_ARCH}/build" - QDS_CI_JOB_ARTIFACTS_PATH: ${QDS_CI_ARTIFACTS_PATH}/${QDS_CI_JOB_TARGET_ARCH} - QDS_CI_JOB_ARTIFACTS_PATH_APP: ${QDS_CI_JOB_ARTIFACTS_PATH}/app - QDS_CI_JOB_ARTIFACTS_PATH_TEST: ${QDS_CI_JOB_ARTIFACTS_PATH}/test artifacts: - name: qt_ui_viewer-${CI_JOB_ID}-qt${QDS_CI_QT_VERSION}-${QDS_CI_JOB_TARGET_ARCH} + name: qt_ui_viewer-${CI_JOB_ID}-qt${QDS_CI_QT_VERSION}-${QDS_CI_JOB_TARGET_PLATFORM} expose_as: "build-artifacts" paths: - ${QDS_CI_ARTIFACTS_PATH} expire_in: 1 week + +build-android: + extends: .build-common + variables: + QDS_CI_JOB_TARGET_PLATFORM: "android" + QDS_CI_JOB_ARCHS: android_arm64_v8a android_armv7 android_x86 android_x86_64 + QDS_CI_JOB_OPENSSL_PATH: "/opt/openssl/ssl_3/arm64-v8a" + QDS_CI_JOB_BUILD_PATH: "${CI_PROJECT_DIR}/${QDS_CI_JOB_TARGET_PLATFORM}/build" + QDS_CI_JOB_ARTIFACTS_PATH: ${QDS_CI_ARTIFACTS_PATH}/${QDS_CI_JOB_TARGET_PLATFORM} + QDS_CI_JOB_ARTIFACTS_PATH_APP: ${QDS_CI_JOB_ARTIFACTS_PATH}/app + QDS_CI_JOB_ARTIFACTS_PATH_TEST: ${QDS_CI_JOB_ARTIFACTS_PATH}/test + QDS_CI_JOB_CMAKE_BUILD_TARGET: "aab" script: - mkdir -p ${QDS_CI_JOB_ARTIFACTS_PATH_APP} ${QDS_CI_JOB_ARTIFACTS_PATH_TEST} - - export QDS_CI_JOB_QT_PATH="${DOCKER_ENV_QT_PATH_WITH_VERSION}/android_${QDS_CI_JOB_TARGET_ARCH}" + - export QDS_CI_JOB_QT_PATH="${DOCKER_ENV_QT_PATH_WITH_VERSION}/android_arm64_v8a" - *build-components - - *build-android-apps + - *build-app - *copy-and-sign-apks - *copy-and-sign-aab build-desktop: - extends: .pipeline_common - stage: build + extends: .build-common variables: - QDS_CI_JOB_TARGET_ARCH: "gcc_64" - QDS_CI_JOB_BUILD_PATH: "${QDS_CI_CACHE_PATH}/${QDS_CI_JOB_TARGET_ARCH}/build" - QDS_CI_JOB_ARTIFACTS_PATH: ${QDS_CI_ARTIFACTS_PATH}/${QDS_CI_JOB_TARGET_ARCH} - artifacts: - name: qt_ui_viewer-${CI_JOB_ID}-qt${QDS_CI_QT_VERSION}-${QDS_CI_JOB_TARGET_ARCH} - expose_as: "build-artifacts" - paths: - - ${QDS_CI_ARTIFACTS_PATH} - expire_in: 1 week + QDS_CI_JOB_TARGET_PLATFORM: "desktop" + QDS_CI_JOB_ARCHS: gcc_64 + QDS_CI_JOB_BUILD_PATH: "${CI_PROJECT_DIR}/${QDS_CI_JOB_TARGET_PLATFORM}/build" + QDS_CI_JOB_ARTIFACTS_PATH: ${QDS_CI_ARTIFACTS_PATH}/${QDS_CI_JOB_TARGET_PLATFORM} + QDS_CI_JOB_CMAKE_BUILD_TARGET: "all" script: - mkdir -p ${QDS_CI_JOB_ARTIFACTS_PATH} - - export QDS_CI_JOB_QT_PATH="${DOCKER_ENV_QT_PATH_WITH_VERSION}/${QDS_CI_JOB_TARGET_ARCH}" - - *build-components + - export QDS_CI_JOB_QT_PATH="${DOCKER_ENV_QT_PATH_LINUX_GCC_64}" - apt-get update - apt-get install -y libpulse-dev - - | - cmake \ - -S . \ - -B ${QDS_CI_JOB_BUILD_PATH} \ - -G Ninja \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_PREFIX_PATH=${QDS_CI_JOB_QT_PATH} \ - -DBUILD_EXAMPLES=OFF - - cat ${QDS_CI_JOB_BUILD_PATH}/src/dynamic_imports.qml - - cmake --build ${QDS_CI_JOB_BUILD_PATH} + - *build-components + - *build-app + - cp -r ${QDS_CI_JOB_BUILD_PATH}/src//qtuiviewer ${QDS_CI_JOB_ARTIFACTS_PATH} diff --git a/cicd/stages/release.yml b/cicd/stages/release.yml index e0deaef..171f8ad 100644 --- a/cicd/stages/release.yml +++ b/cicd/stages/release.yml @@ -5,7 +5,7 @@ create-packages: rules: - if: $CI_COMMIT_TAG needs: - - job: test-x86_64 + - job: test-android optional: false artifacts: true - job: build-android @@ -29,7 +29,7 @@ create-packages: cd "${arch}/app" tar -czf "${arch}.tar.gz" * echo "Uploading ${arch}.tar.gz to GitLab Package Registry" - curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file "${arch}.tar.gz" ${QDS_PACKAGE_URL}/qt-ui-viewer-${CI_COMMIT_TAG}-qt${QDS_CI_QT_VERSION}-${arch}.tar.gz + curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file "${arch}.tar.gz" ${QDS_PACKAGE_URL}/qt-ui-viewer-${CI_COMMIT_TAG}-qt${QDS_CI_QT_VERSION}-multiarch.tar.gz cd ${current_dir} done artifacts: diff --git a/cicd/stages/test.yml b/cicd/stages/test.yml index 1fd1728..f51db76 100644 --- a/cicd/stages/test.yml +++ b/cicd/stages/test.yml @@ -1,7 +1,18 @@ -# todo: run the tests for all architectures -test-x86_64: +.test-common: stage: test extends: .pipeline_common + variables: + GIT_SUBMODULE_STRATEGY: none + QDS_CI_JOB_TEST_RESULTS_PATH: ${CI_PROJECT_DIR}/test + artifacts: + paths: + - ${QDS_CI_JOB_TEST_RESULTS_PATH}/ + reports: + junit: ${QDS_CI_JOB_TEST_RESULTS_PATH}/test.junit.xml + expire_in: 1 week + +test-android: + extends: .test-common tags: - qds-blade-server-shell needs: @@ -11,9 +22,6 @@ test-x86_64: - job: build-desktop optional: false artifacts: true - variables: - GIT_SUBMODULE_STRATEGY: none - QDS_CI_JOB_TEST_RESULTS_PATH: ${CI_PROJECT_DIR}/test script: - | if [[ ${QDS_CI_SKIP_TESTS} == "false" ]]; then @@ -35,7 +43,7 @@ test-x86_64: /opt/android/emulator/emulator -avd test -no-boot-anim -no-window -no-audio -no-snapshot -accel on & 2>&1 > /dev/null sleep 30 fi - - cd ${QDS_CI_ARTIFACTS_PATH}/x86_64/test || exit 1 + - cd ${QDS_CI_ARTIFACTS_PATH}/android/test || exit 1 - mkdir -p ${QDS_CI_JOB_TEST_RESULTS_PATH} - adb install -r -g android-build-release.apk - adb shell pm clear io.qt.qtdesignviewer.test @@ -71,9 +79,27 @@ test-x86_64: - mv output.junit.xml ${QDS_CI_JOB_TEST_RESULTS_PATH}/test.junit.xml - chmod +x ${CI_PROJECT_DIR}/tests/scripts/get_test_result.sh - ${CI_PROJECT_DIR}/tests/scripts/get_test_result.sh ${QDS_CI_JOB_TEST_RESULTS_PATH}/test.junit.xml - artifacts: - paths: - - ${QDS_CI_JOB_TEST_RESULTS_PATH}/ - reports: - junit: ${QDS_CI_JOB_TEST_RESULTS_PATH}/test.junit.xml - expire_in: 1 week + + +# it's not working as of because of the headless mode +# possible bugs: +# - https://bugreports.qt.io/browse/QTBUG-124467 +# - https://bugreports.qt.io/browse/QTBUG-126508 +.test-desktop: + extends: .test-common + needs: + - job: build-desktop + optional: false + artifacts: true + script: + - | + if [[ ${QDS_CI_SKIP_TESTS} == "false" ]]; then + echo "Running tests"; + else + echo "Skipping tests"; + exit 0; + fi + - cd ${QDS_CI_ARTIFACTS_PATH}/gcc_64 || exit 1 + - apt update; apt install -y libxcb-cursor0 + - ./qtuiviewer_test + - cp output.junitxml ${QDS_CI_JOB_TEST_RESULTS_PATH}/test.junit.xml diff --git a/src/backend/backend.cpp b/src/backend/backend.cpp index 78f62a7..fe564c3 100644 --- a/src/backend/backend.cpp +++ b/src/backend/backend.cpp @@ -173,7 +173,7 @@ void Backend::initProjectManager() void Backend::initDsManager() { qDebug() << "Design Studio Manager thread started. Initializing Design Studio Manager"; - m_dsManager.reset(new DesignStudioManager(m_settings.deviceUuid(), this)); + m_dsManager.reset(new DesignStudioManager(m_settings.deviceUuid())); connect(m_dsManager.get(), &DesignStudioManager::projectReceived, this, &Backend::runProject); @@ -259,8 +259,10 @@ void Backend::runProject(const QString &id, const QByteArray &projectData) if (!retVal) QMetaObject::invokeMethod(m_dsManager.get(), "sendProjectStopped", Q_ARG(QString, id)); - else - QMetaObject::invokeMethod(m_dsManager.get(), "sendProjectRunning", Q_ARG(QString, id)); + else { + QMetaObject::invokeMethod(m_projectManager.get(), "showAppWindow"); + QMetaObject::invokeMethod(m_dsManager.get(), "sendProjectStarted", Q_ARG(QString, id)); + } emit popupClose(); }); diff --git a/src/backend/dsconnector/ds.cpp b/src/backend/dsconnector/ds.cpp index ba39bd5..08c2420 100644 --- a/src/backend/dsconnector/ds.cpp +++ b/src/backend/dsconnector/ds.cpp @@ -19,7 +19,7 @@ using namespace Qt::Literals; constexpr auto deviceInfo = "deviceInfo"_L1; constexpr auto projectReceivingProgress = "projectReceivingProgress"_L1; constexpr auto projectStarting = "projectStarting"_L1; -constexpr auto projectRunning = "projectRunning"_L1; +constexpr auto projectStarted = "projectRunning"_L1; constexpr auto projectStopped = "projectStopped"_L1; constexpr auto projectLogs = "projectLogs"_L1; }; // namespace PackageToDesignStudio @@ -247,9 +247,9 @@ void DesignStudio::sendProjectStarting() sendData(PackageToDesignStudio::projectStarting); } -void DesignStudio::sendProjectRunning() +void DesignStudio::sendProjectStarted() { - sendData(PackageToDesignStudio::projectRunning); + sendData(PackageToDesignStudio::projectStarted); } void DesignStudio::sendProjectStopped() diff --git a/src/backend/dsconnector/ds.h b/src/backend/dsconnector/ds.h index 069c988..5034d3c 100644 --- a/src/backend/dsconnector/ds.h +++ b/src/backend/dsconnector/ds.h @@ -23,7 +23,7 @@ public: // Send data void sendDeviceInfo(); void sendProjectStarting(); - void sendProjectRunning(); + void sendProjectStarted(); void sendProjectStopped(); void sendProjectLogs(const QString &logs); diff --git a/src/backend/dsconnector/dsmanager.cpp b/src/backend/dsconnector/dsmanager.cpp index 1c1e602..9ca0224 100644 --- a/src/backend/dsconnector/dsmanager.cpp +++ b/src/backend/dsconnector/dsmanager.cpp @@ -9,26 +9,32 @@ #include <QJsonObject> #include <QUdpSocket> -DesignStudioManager::DesignStudioManager(const QString &deviceUuid, QObject *parent) +DesignStudioManager::DesignStudioManager(const QString &deviceUuid, + const quint16 port, + QObject *parent) : QObject(parent) + , m_port(port) , m_deviceUuid(deviceUuid) , m_webSocketServer("DesignStudio", QWebSocketServer::NonSecureMode) {} -void DesignStudioManager::init() +bool DesignStudioManager::init() { - static bool initialized = false; - if (initialized) { - return; + if (m_webSocketServer.isListening()) { + qWarning() << "TCP server is already running"; + return false; + } + + if (!m_webSocketServer.listen(QHostAddress::Any, m_port)) { + qWarning() << "Failed to start TCP server on port" << m_port; + return false; } - initialized = true; - m_webSocketServer.listen(QHostAddress::Any, 40000); connect(&m_webSocketServer, &QWebSocketServer::newConnection, this, &DesignStudioManager::incomingConnection); - qDebug() << "TCP server listening on port 40000"; + qDebug() << "TCP server listening on port" << m_webSocketServer.serverPort(); m_discoveryTimer.setInterval(10000); connect(&m_discoveryTimer, &QTimer::timeout, [this]() { @@ -51,6 +57,18 @@ void DesignStudioManager::init() udpSocket.writeDatagram(datagram, QHostAddress("10.0.2.2"), port); }); m_discoveryTimer.start(); + + return true; +} + +QString DesignStudioManager::webSocketServerName() const +{ + return m_webSocketServer.serverName(); +} + +int DesignStudioManager::webSocketServerPort() const +{ + return m_webSocketServer.serverPort(); } void DesignStudioManager::incomingConnection() @@ -64,6 +82,7 @@ void DesignStudioManager::incomingConnection() &QObject::deleteLater); connect(designStudio.data(), &DesignStudio::disconnected, this, [this, designStudio]() { m_designStudios.removeOne(designStudio); + emit designStudioDisconnected(designStudio->id(), designStudio->ipv4Addr()); qDebug() << "Remaining Design Studios:" << m_designStudios.size(); if (m_designStudios.isEmpty()) emit allDesignStudiosDisconnected(); @@ -106,11 +125,11 @@ void DesignStudioManager::sendProjectStarting(const QString &id) } } -void DesignStudioManager::sendProjectRunning(const QString &id) +void DesignStudioManager::sendProjectStarted(const QString &id) { for (const auto &designStudio : m_designStudios) { if (designStudio->id() == id) - designStudio->sendProjectRunning(); + designStudio->sendProjectStarted(); } } diff --git a/src/backend/dsconnector/dsmanager.h b/src/backend/dsconnector/dsmanager.h index 661407a..7c8fa08 100644 --- a/src/backend/dsconnector/dsmanager.h +++ b/src/backend/dsconnector/dsmanager.h @@ -11,13 +11,17 @@ class DesignStudioManager : public QObject { Q_OBJECT public: - explicit DesignStudioManager(const QString &deviceUuid, QObject *parent = nullptr); + explicit DesignStudioManager(const QString &deviceUuid, + const quint16 port = 40000, + QObject *parent = nullptr); - void init(); + bool init(); + QString webSocketServerName() const; + int webSocketServerPort() const; public slots: void sendProjectStarting(const QString &id); - void sendProjectRunning(const QString &id); + void sendProjectStarted(const QString &id); void sendProjectStopped(const QString &id); void sendProjectLogs(const QString &id, const QString &logs); QString getDesignStudioIp(const QString &id) const; @@ -28,6 +32,7 @@ private: // Network QWebSocketServer m_webSocketServer; QTimer m_discoveryTimer; + const quint16 m_port; // Connected Design Studios QList<QSharedPointer<DesignStudio>> m_designStudios; diff --git a/src/backend/main.cpp b/src/backend/main.cpp index 237cac5..3c4bc11 100644 --- a/src/backend/main.cpp +++ b/src/backend/main.cpp @@ -33,8 +33,6 @@ int main(int argc, char *argv[]) { Logger::instance(); - - qDebug() << "Starting Qt Design Viewer"; qputenv("QML_COMPAT_RESOLVE_URLS_ON_ASSIGNMENT", "1"); QApplication app(argc, argv); @@ -52,6 +50,7 @@ int main(int argc, char *argv[]) #ifdef Q_OS_ANDROID view.showMaximized(); #else + QApplication::setWindowIcon(QIcon(QStringLiteral(":/images/appicon.svg"))); view.show(); #endif diff --git a/src/backend/projectmanager.cpp b/src/backend/projectmanager.cpp index 016e710..90a1e04 100644 --- a/src/backend/projectmanager.cpp +++ b/src/backend/projectmanager.cpp @@ -287,6 +287,8 @@ bool ProjectManager::runProjectInternal(const QByteArray &project) qDebug() << "Setting up the quickWindow"; m_quickWindow.reset(qobject_cast<QQuickWindow *>(topLevel)); + m_quickWindow->setVisible(false); + if (m_quickWindow) { qDebug() << "Running with incubator controller"; m_qmlEngine->setIncubationController(m_quickWindow->incubationController()); @@ -306,7 +308,7 @@ bool ProjectManager::runProjectInternal(const QByteArray &project) view->setResizeMode(QQuickView::SizeViewToRootObject); m_quickWindow->setBaseSize(QSize(contentItem->width(), contentItem->height())); } - showAppWindow(); + return true; } @@ -344,7 +346,7 @@ void ProjectManager::orientateWindow(Qt::ScreenOrientation orientation) << m_quickWindow->width() << Qt::endl << "-- Child size: " << childItem->height() << " x " << childItem->width() << Qt::endl << "-- Child pos: " << childItem->x() << ", " << childItem->y() << Qt::endl - << "-- Child scale: " << childItem->scale(); + << "-- Child scale: " << childItem->scale() << Qt::endl; const QSizeF newContentSize = childItem->size().scaled(screenGeometry.size().toSizeF(), Qt::AspectRatioMode::KeepAspectRatio); @@ -369,12 +371,15 @@ void ProjectManager::showAppWindow() qDebug("Initializing and showing the QML app window"); QScreen *screen = QGuiApplication::primaryScreen(); - connect(screen, &QScreen::orientationChanged, this, &ProjectManager::orientateWindow); + connect(screen, &QScreen::orientationChanged, this, [this](Qt::ScreenOrientation orientation) { + orientateWindow(orientation); + }); + orientateWindow(screen->orientation()); connect(m_quickWindow.data(), &QQuickWindow::closing, this, [this, screen]() { qDebug() << "QML app window is closing"; - disconnect(screen, &QScreen::orientationChanged, this, &ProjectManager::orientateWindow); + disconnect(screen, &QScreen::orientationChanged, this, nullptr); emit closingProject(m_sessionId); m_sessionId.clear(); }); @@ -385,11 +390,16 @@ void ProjectManager::showAppWindow() void ProjectManager::stopProject() { - if (!m_quickWindow || !m_quickWindow->isVisible()) + if (!m_quickWindow) return; qDebug("Stopping the QML app window"); m_quickWindow->close(); + + m_qmlComponent.reset(); + m_qmlEngine.reset(); + m_quickWindow.reset(); + m_sessionId.clear(); } QString ProjectManager::sessionId() const diff --git a/src/backend/projectmanager.h b/src/backend/projectmanager.h index ae12e3c..269552b 100644 --- a/src/backend/projectmanager.h +++ b/src/backend/projectmanager.h @@ -41,8 +41,11 @@ public slots: const bool autoScaleProject, const QString &sessionId); void stopProject(); + void showAppWindow(); private: + friend class TestProjectManager; + // Member variables QByteArray m_projectData; QString m_projectPath; @@ -67,11 +70,9 @@ private: QString getMainQmlFile(const QString &projectPath, const QString &qmlProjectFileContent); QStringList getImportPaths(const QString &projectPath, const QString &qmlProjectFileContent); bool isQt6Project(const QString &qmlProjectFileContent); - void parseQmlProjectFile(const QString &fileName, QString *mainFile, QStringList *importPaths); // window management void orientateWindow(Qt::ScreenOrientation orientation); - void showAppWindow(); signals: void closingProject(const QString &sessionId); diff --git a/src/backend/settings.cpp b/src/backend/settings.cpp index cb04596..408d0db 100644 --- a/src/backend/settings.cpp +++ b/src/backend/settings.cpp @@ -35,6 +35,18 @@ Settings::Settings() } } +bool Settings::clearSettings() +{ + const auto backup = m_settings; + m_settings = QJsonObject(); + const bool rV = saveSettings(); + if (rV) + applyDefaultSettings(); + else + m_settings = backup; + return rV; +} + void Settings::applyDefaultSettings() { m_settings["autoScale"] = true; diff --git a/src/backend/settings.h b/src/backend/settings.h index eb87bb2..739dfd7 100644 --- a/src/backend/settings.h +++ b/src/backend/settings.h @@ -10,6 +10,8 @@ class Settings public: Settings(); + bool clearSettings(); + void setAutoScaleProject(const bool &enabled); void setDeviceUuid(const QString &deviceUuid); void setKeepScreenOn(const bool &enabled); diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 5c840f4..71d0840 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,10 +1,13 @@ set(TARGET_NAME ${PROJECT_NAME}_test) -find_package(Qt6 REQUIRED COMPONENTS Test Core Quick Gui Multimedia WebSockets) +find_package(Qt6 REQUIRED COMPONENTS Test Core Quick Gui Widgets Multimedia WebSockets) enable_testing(true) qt_add_executable(${TARGET_NAME} tst_settings.cpp tst_settings.h + tst_dsmanager.cpp tst_dsmanager.h + tst_projectmanager.cpp tst_projectmanager.h + mock_ds.cpp mock_ds.h main.cpp ) @@ -12,10 +15,18 @@ add_test(NAME ${TARGET_NAME} COMMAND qtuiviewer_test) target_link_libraries( ${TARGET_NAME} PRIVATE - Qt::Test Qt::Core Qt::Quick Qt::Gui Qt::Multimedia Qt::WebSockets + Qt::Test Qt::Core Qt::Quick Qt::Gui Qt::Multimedia Qt::WebSockets Qt::Widgets qtuiviewerlib ) +qt_add_resources(${TARGET_NAME} "resources" + PREFIX + "/" + FILES + "data/test_project/test_project_success.qmlrc" + "data/test_project/test_project_fail.qmlrc" +) + set_target_properties(${TARGET_NAME} PROPERTIES QT_ANDROID_PACKAGE_NAME "io.qt.qtdesignviewer.test") set_property(TARGET ${TARGET_NAME} APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/android diff --git a/tests/android/AndroidManifest.xml b/tests/android/AndroidManifest.xml index 294377b..440774b 100644 --- a/tests/android/AndroidManifest.xml +++ b/tests/android/AndroidManifest.xml @@ -5,7 +5,7 @@ <!-- %%INSERT_FEATURES --> <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:smallScreens="true" /> - <application android:icon="@mipmap/app_icon" android:debuggable="true" + <application android:icon="@mipmap/ic_launcher" android:debuggable="true" android:name="org.qtproject.qt.android.bindings.QtApplication" android:extractNativeLibs="true" android:hardwareAccelerated="true" android:label="Qt UI Viewer Test" diff --git a/tests/android/res/drawable/ic_launcher_background.xml b/tests/android/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..e3c2454 --- /dev/null +++ b/tests/android/res/drawable/ic_launcher_background.xml @@ -0,0 +1,26 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:aapt="http://schemas.android.com/aapt" + android:width="108dp" + android:height="108dp" + android:viewportWidth="108" + android:viewportHeight="108"> + <group android:scaleX="0.99" + android:scaleY="0.99" + android:translateX="0.54" + android:translateY="0.54"> + <path + android:pathData="M0,13.5V108H94.5L108,94.5V0H13.5L0,13.5Z"> + <aapt:attr name="android:fillColor"> + <gradient + android:startX="104.99" + android:startY="-26.62" + android:endX="11.55" + android:endY="126.08" + android:type="linear"> + <item android:offset="0.14" android:color="#FF014B57"/> + <item android:offset="1" android:color="#FF0F7080"/> + </gradient> + </aapt:attr> + </path> + </group> +</vector> diff --git a/tests/android/res/drawable/ic_launcher_foreground.xml b/tests/android/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..f095325 --- /dev/null +++ b/tests/android/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,18 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="108dp" + android:height="108dp" + android:viewportWidth="108" + android:viewportHeight="108"> + <group android:scaleX="0.66" + android:scaleY="0.66" + android:translateX="17.37" + android:translateY="17.04"> + <group> + <clip-path + android:pathData="M0.25,0.13h107.75v107.75h-107.75z"/> + <path + android:pathData="M28.84,62.54C28.84,67.29 31.25,69.66 36.08,69.66C40.91,69.66 43.33,67.29 43.33,62.54V35.42H51.59V62.36C51.59,67.35 50.29,71.02 47.69,73.37C45.14,75.69 41.27,76.84 36.08,76.84C30.89,76.84 27,75.69 24.41,73.37C21.85,71.02 20.58,67.35 20.58,62.36V35.42H28.84V62.54ZM82.13,35.42H90.81L81.35,76.13H66.09L56.63,35.42H65.31L72.38,68.94H75.07L82.13,35.42Z" + android:fillColor="#2CDE85"/> + </group> + </group> +</vector> diff --git a/tests/android/res/mipmap-anydpi-v26/ic_launcher.xml b/tests/android/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..bbd3e02 --- /dev/null +++ b/tests/android/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> + <background android:drawable="@drawable/ic_launcher_background"/> + <foreground android:drawable="@drawable/ic_launcher_foreground"/> +</adaptive-icon> \ No newline at end of file diff --git a/tests/android/res/mipmap-anydpi-v26/ic_launcher_round.xml b/tests/android/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..bbd3e02 --- /dev/null +++ b/tests/android/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> + <background android:drawable="@drawable/ic_launcher_background"/> + <foreground android:drawable="@drawable/ic_launcher_foreground"/> +</adaptive-icon> \ No newline at end of file diff --git a/tests/android/res/mipmap-hdpi/app_icon.png b/tests/android/res/mipmap-hdpi/app_icon.png deleted file mode 100644 index 74a188d073456264ab840da9314a48447fc95fcf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4461 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 diff --git a/tests/android/res/mipmap-hdpi/ic_launcher.webp b/tests/android/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..45b059ae192f60f60ed2303339c36c294dbbfc3e GIT binary patch literal 2088 zcmV+@2-o*gNk&E>2mk<AMM6+kP&iB!2mk;tN5Byf359LjHi*)#|1VD48zTBY0U7s( zH=tDj70YK6y+msbFsh8W<w8x{NRrDf7sB$V`Q1TK(6)`7GKhPkl1ba9a+axB|0e)I zg8y1zv)Nh!WmC<`%S%(>I2Ld4WZSlC$F^<dHnf<TnVFeg=*GRbcZXnyK#|$*owlEu znVGjSn;^+FM^83J>%9+cc1ms}$&n=UT)y`@{T1aMbYt6gZAD|Aj}|uR{0y+j=f#0d z6j<OBLTl-2-F+9_+O}0I^SqC{H{pa1@gGE12(8ctWbQ7RLlcB<mv<dXvJy6gnLeI* zik4W@Pe8!`-525wx5_`k_+Wv3$%lXBzOB0zDE~#XM$tEv@SBextK+UQtGT$!K>;uV zxU_6U))@d$r8A<DLQxJ^5qzxX8e0qSul>;DZL4Y)MgzbA6aWJTKmh|#>xzLHFa=QS z7$fOIik+<f|G$KC-K}UVP=YsWI<q6GYU_expaqKmC5ILmRI~E$`PrExT6VU#Uw(W) z7uU>cQdmt+tp-M8HcSRao=s~($^bwbT{UmMyq<?Q+*g_(>uyn8QzRmy3?NJ(gQV+< z3YZxb18q<&p{8VN-7TOUj@DKTf!U!eDuAA-OO`EBO_^3ir);<aU~(t}mWUYGi>O!% zYDQP|IxUI-z!XOq1+aIr(IFI^wNOncpkpjZAW#4V#6<3S%y#LWH45lnWCF7eB2pT2 z4yh+100KD`k`ojFK+?K}1o|kY1FdujG?NfHk;W(><~B&(bpb~pP?M0!%r<mYo|#N- znOzhoU6p7=ohoUNflStkG-B>`OaKY##kDAtO%X|0%plxZ@*w~c35l!{?!*GxD;Saz z3+Y=(KvZO-pRR}ibVMPE1Xv344SB{*5owA334o+R3K;^R#0n6AB0vIbQN&VW1!lld zO29c1Qh8vl00U!;sJaA4&jtyZeInu3@v;Hfl+V57bPxy>fjhtE#h=4iHp*vTGU5)r zI0Ep|lUqO_5FmuP0`ESV{D;R+4+w-La=?NZ5-81O@xTIbGR}*<ELXhoz>fhqQHBWY zFL&X5fd}PA0Rl6)Bpwj}IMqP_CIAcRW>wED)HN)&WLqu|fcusJkQqF(0{~!uR54i! zS~WpJm?DkuOZ@KgGytwXATWb4Hwpm!A$D&dKoUtfdNv@0WU}#;Gy&OH0N|qKI!9WU z3mg{-0Q~i`5+MQ!^q*@X0y!>Cjs+M%0#zNB`1`RP7YJM=Hvs0FuaRp30Edt(CeV-H zK$?0ctEDXvlUMl#_QjT52^ivX01yHf<Gcb;;+IDN2oV!l(7=(&-qX<7Iz~A@0N@@( z1OUiA1prPi+X67h0wA!U2a?DNR7IRI0Qva<fa@F~Vgff^0N^(pAdtYK$0)6h5Y-nJ zr~m+@F^*#w0O!W_3nAiyxIh5l2m)E1$VFf#>)oZQy~_WwoCLu6ax(zP?YJfYcH}n; zKmf9uaHrpv$#xMpmv#d?0uZ=pM_?LntpM!cAP9j#1(vXF&@SQ-0YHBB00577A%Vbc z3jpjx+Q$+A7|{1MWDtfxLs$7+F@Kd309RoMLT(2D{1zl4qGHK{jtErsT#zyjlNKb( zY|30Qr?C+L1Fl=(5;;Erc5zIAKn8&Yu>(jYx~shR5`Z)E>F07xATT{r7Xbi988J5; z#<6nifT7%lZyvYcVgPK&Uq*_vXn{wF>M^}SKJgj=`26M&N(f8HdGY8S0I(%#$yRb4 z0D;SdTx!k{fKAydff7)Yi+ZinIZr<M5&+o1ru+eCWQg<R?aOrs0Q_p?F@9A5;9gvg z`OaTI00}^e>KA{3lRPm1c=5Qf0Kmm%Lyj!x$c;w;05;^e$Q5%uR#+==Ek5-C03{9p zAooe;F}pSZfK;OM;-L!wz{PRf0WfF#gD3kJfEgS+4s_gPa)zhJ;U&c+07=ws$n`vn z00ucS#;CK|kgq*_X;hoWmg8hVw$pM*$m~D@frW8Z&oGI0@wLtOAAUV9l1pPJHkJ+9 zho8!Zln^2$fgfM)-DEq0a#%<RlgR)Oj%6U<EMQmm$>*M&gL7pSXJpsR^-%AKzq$ZG z-dqJtAON)p`k+zIIji~rxacGRBFC`6IRb%-giHccgFsG%G<S`fUD(h8fdV4~0*#YW z6OeogSriK()uPoml+lO*fGj%ZBvHR^140lIXe|+w!JdwRAs~Q|Wrq{dxtZyafhFWD zTH+xSP)K9C1sP<Pv~WoK6aq`nORX^)9#O}YPV~B4&{3G=Oc4O1I{r7v>dm6@UScF& z2owVVi|8;#5-0#L7$|@aV4(MoGPPBpYb*nh*#Ve><s=kz$Shh@?pY`rF~C2G41~;V zAS4t$lg|NJRL~(?uS!i&lOdCi6rAbbpPrri|I<y0kkl4nD)3JjQ%r0@VC6rjpI>g_ zlpmsH>u&$ZpZWD}|Kr~;H!r?3I*^PU7Xuk|$fjt8)`G;~syVTrAHMqc{W|jZy-h7c ze%~AT`o^C>m!ElmvT|u>=$x=X0kqyTp<u5fU<!8kpOgFP@yGu^E#v(S_kr9FHvLim zC%Vx0>gS{Cr9JFlOG9jBc?9Gb2rz^pFd7&DqZtH%|BV>1LNm(|003c`irxM9efoZS z{?@OLTX^}M&uV)#;wBpZK^t08_s{<?3mLz7z22+$1-YX34w`qUSyBAcZOvVIo=53V SzWTt&vVVF2{`nv9|I-C9wwQGQ literal 0 HcmV?d00001 diff --git a/tests/android/res/mipmap-hdpi/ic_launcher_round.webp b/tests/android/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..6478dcebfebd3dd0c861fa21138c69bc168fffc9 GIT binary patch literal 3586 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 I22Joy0BTV65&!@I literal 0 HcmV?d00001 diff --git a/tests/android/res/mipmap-ldpi/app_icon.png b/tests/android/res/mipmap-ldpi/app_icon.png deleted file mode 100644 index a52520e2630446955333139ca069431c38b75376..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 798 zcmV+(1L6FMP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800009a7bBm000ie z000ie0hKEb8vp<T&`Cr=R9M69mOV^UQ54624+<?UAdpg!PZa`~sNiJ6K%5*+4C?Bl zMnmFGjIjn69bI5>(zqBCb#anJiHSxBjo*9-6tPHKT6jJv@AdUwhmuDhP%Vl&*#GqI zJtsN8oOAAZ2Xe~kf0vTUu<NMb4_y2cLC5d-t+;uAJNR1V{mbA0j`YLMZvSQA{NL;W z8-ThncgkH<tQR<)&hCR9bne~B*mRiwyH6}1Z>fjg6Ndn}cKZ?a)fF7++J}_TJ8++b zDJ<XJja8gH+zG(dTMwCye)}<iVI+Kp5hLGGK#jLVwl~+VYtn*(eA=690dTtti7qT! z=cbxUK2FVAz8x)fv^UohUrrF2*RtyYfTWo~*L4LzBn1d*W=i46=P-tu1fZ?4%4Tb8 zNS)tJ&X5!`dw_JA!Xy$6=f{^cq!jBw%w&?`KnQ@=MxV{rx+4Yfc6=uLSFn+!5Q?U0 z%!R}GOG}IE?C&Omselcu8SrlN;4SrR4S)rLRF>oM)l#kG_06XgK)tUVkE_sD4v`cL z2fl6%z*?#5yrM45i`OI5NC}DpEe$>!!02>@xMBVo003QI&YKE;ArK79RNbp(I>6hN z@@yJF)l#W0b-Qf$rNu?ocT8RFhZi3v6@aGdGR%ZdOPy~8VCL5VCW2uAS{kZ3+_fK% z+euZ$HclTo2tdL#nTgC>{;x&?0PJb1RSvY(<1Q*(X~1CilQ3O_&)?H?EJjUbIelll z>7(0bzxm)PNwGThUJg$IP+3;Om2<}dm<~l59h(%M;u7I<7dey-e!dwq5Z4WQuH4|+ zn=z!6w)^Y%9y4%f(B}Uo6eSe1kJ^{R0VFa{(^N+!Jj>#urb{7aGwuT=U1v5NSFS<_ z+r8z)b%Rh$MP!(2*)1T-Wp$|k!cR+(u4Titdg3>?pG)dczkf@g;pT!5__urx{7&$k ca>@zdJ4T%*rBq*(lmGw#07*qoM6N<$g4j)O-T(jq diff --git a/tests/android/res/mipmap-mdpi/app_icon.png b/tests/android/res/mipmap-mdpi/app_icon.png deleted file mode 100644 index 36a356c0cec907702d1ecd5562586ca8ee72325c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1758 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 At^fc4 diff --git a/tests/android/res/mipmap-mdpi/ic_launcher.webp b/tests/android/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..f023c33ba54629232b36c2efda70367edc74dd99 GIT binary patch literal 1430 zcmV;H1!?+HNk&GF1pok7MM6+kP&iD21pojqFTe{B2?cH2NJ@5pk3Zp&i0J<Wq>liY zsK&GfH~{{FNZY1p`2OwQgrZ1NqZR?=6cGQ)c;-naZIg4<ztBnOe?kMG;Q^DKof{yg zW@ZKmzyLe|_kogZ+oo-+&2#RvZQDioRsn4PYTVlVq>Z#~+t0jwXU02w?X@5C5+g}c zB*~-q?wR$M@D<?gloZ>xYCB`z_ruLpTGYg6A|}3{rz2`m05dZ)<Ca_7wyI_GY~0<+ z=!hoh!c(Usix^bm*)N~m>%ftuxY-@UFkBn6!GA!(HR5;Lo;Yk>7h%8|9f8$t)Fyxi zm+Tnrv+kodsXb`$vo{-K?=AHG=^f@50Ar}zz`y#;{S82?Js){KKku#UxN|(n6f|Z) zf&q{Q40WTm0RY%Y0Hgo#mJe489G$O4J@>8K-a1MDK>`><r9i3M0AM6qdJag|u`}(@ z)Qe94MbL^ji1yv*=bK@U85o2n8J(mNO9qLd$P7Zx`~P+F`Qa4(E7z*A!`20-|9)MI znNoT+Iha6+f}{Z#F{#%w8DOUPy9S4SsIoogM}?&WNfXEcZ4r!%nM9O`ajGIS6@Vnb zXaI?e76C|7wSgogO`7p_l3;X@KnT=40FZ<MC8_OMl5!FNRKZF}U_e?Y)<%m|#Ckmo zLXad)Jd7?8s*@mONI0d1kPwl?s3e8aVjW2!0A?ChF$4q&VI)XM0EiL+1OlYd6%hyl zX!MXMqRt=$(tzuJWcvpaFZ`q-cicRAdHAwW$m2IpUGBYEuti`<Hsa}Lo_^+*n?MKw z2n%nhq9KgsZ`k-gF#8061Xf`aHef~s7Re^rD+@p%5ZJzK#%9beSzt)28X2-QfDnMD z4gmn7{BVFCR!D%5z+wP=cL)%GKpWQsny8B=fDoj0Vn<5`>{>`5Fr(~RAmeZg(F7K# z)a>LS0)zn}0f0b2hz5bck7W|D5dA{POpEyef5mu&D59eoLPUh6m7O6V2mm3+T1*No z#$qD^){OxCStbeu8d6V00wSb+LZpZ&<DY;fSR^E3CjkDJqNjTZ5u!vk0#NMv?Fqn2 zfqshx0QmL<0;Jwk4he*iR>TYdh!Et2ObKjXLgvUufisv0LIMHORkVL<AS4?=iqOTM zakjv`2=vSRfbYvxiGYICETXIf01Jz_fDsuHNSWAzgiOX*1D48aY`zJ=iADyAC^D0s zYDGkpMm#J4hfZD_$7N<Y5Ni%FjR^rDU$%g`Si9^p0KP3D0Wu^6I+_uL1il{U06R_| zI5~w8S#=nZj4v;P2nm6sF+kwPu@i6}{~mw@U`U{jBJvY>`!WVt5&$rezs5TY0E8SV zX9_I9EP+1`A!T-w9_kZ|$d%8xc;@D<%b~-p0>3TajbCIeqJ#h(D=$Ct>|^olBNzOQ z6A=<9NVORt1PK5DBu+nR|3krOUjmRYfRO^E<KO`y<q73rK!r3cQRoH$R0}~uf<W;) zp>~(00S44aGpP!JK%m&BxM=E=N-zXrQNJbw2$X4<XzCml5sZ|Qga}c)#{xhoAX;^z zQ*1XwYDLeghX7JsO%O<Ql9V<9n5Evf-j)pfFKC89xp4KmgjSDH)aR`NP<*E_dhh+^ z!)31rU;9?8$sm{nMxr<i26T(ih|{#5nRJZDeEA3N83p!P_febK#b^I*W+Nnx_6KH2 z+9Fhwpg)sS{yDpEPv8EzI5%n&49f59s7<YQ<Y?mlnwi+o-(Jf^PN!-S00Y{@1^BOE z1A0({Gvl+*FRwrUyYh|+1X_;ie?9*5;lB%y3$}0mJOHKvm*V5T4bJTI9_B`Ef?kPY kpY<3Yn1D-lGriAx`cB)aMuE1%fwt4px@7y_?Z7qS07A)tF#rGn literal 0 HcmV?d00001 diff --git a/tests/android/res/mipmap-mdpi/ic_launcher_round.webp b/tests/android/res/mipmap-mdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..a3cc2d08d9da07471aba193ffefba9328d3299aa GIT binary patch literal 2340 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 K%gGvjo0S5m!iuW^ literal 0 HcmV?d00001 diff --git a/tests/android/res/mipmap-xhdpi/app_icon.png b/tests/android/res/mipmap-xhdpi/app_icon.png deleted file mode 100644 index e1f2e9dc1f2653cdb78f3392df37664615f811aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6367 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 LsHIe?U>){<VW;Fx diff --git a/tests/android/res/mipmap-xhdpi/ic_launcher.webp b/tests/android/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..0c33762a480bca1d329d2b90252297fdb106b8e6 GIT binary patch literal 2686 zcmV-^3W4=fNk&F?3IG6CMM6+kP&iC!3IG5vU%(d-3B_&OMzG?ayZ^#Dx<W+%CqVaX zF7OIJgoLpCyV)u$%lu`n4|H8HiX=%<J{Rv!0{S<(D1mJxNly9!Q|m>9LH=P;m}uHI za?;bQ%JdMf{}X`u`_o(iC@-Kin!Q36B<HHgm1j*Wb0wiQW=+yQnJZa`Z_PUUB&oO8 z2)KLqui=0n05=VQ8^Dib+p2Bbwv|fjeZU%vnVFfHnU}^CmKli^i8YrtwY4P1&CJXb z2J`H_nze#$j4drmb|guPWO>XyMjf6SPyf#+4a06H<=VDY+e#n%em5Wvk|2qn&kv2d z)kxu&aDR5D9NXH{NV>mN*u%^bLpJNEyw}muFf9Q$!4xs`q?1m_%v6>nQIh1kZB|## z)&dJ0K;o!Jz5oJzzxq1hQ~IT!;{O0Q`no|KfLF-?DwO>P6ez#+IezJLF5@xZ^q>R( zqCflg-TJoYgIy18Z-6@~_ygF2#jK~8c(wj?Z~FksVSh!HLwA{P7jM7%a!y>6X}1l` z5E>SW1_eVWz{R2g<0b$MGeI*Bm?`W?3<GFbOm9!7mrMVBaerXf`^DgFA6k)L`0B?U zQ=NycprJvNv<tvEf^p+z1k(UOG6BOR&{)`5A#E2nyX$T}IP9+|@w5H7bmCkPwlw}X zC2<7+4JO<K4C^h383_YQql5oo>PjpAe^;Y3Z_IVJr7?v*1i*ldIB}o}10n($vN%~3 zQ<q)$m*4~Bd{(I6Fl;*$3P}*IwPx}$*aQH8+SK1UUi|&>^HBgP!>c}KDC0M8*UD^Y zB7_8^2>@l$ktU8bQ#SPwRZ-sY`1#oWnuVXQ`k2#y4*D*(k9n<z00D%A&qDwJ;wAuq z06-9Ah}e-t0O8U|UK9xd0HWd4)4W1`fS9@u%@F}W36c@S5yY-IS|AZ8g4hX=o?vaq zeLxg2nI!PLAV_y3O2ZSx?``4*z!3tXxe`RdiRTc3Cq!-n1rx|j!LkKb9KWPiI1s<? zNQ|~JHz658G7|vh@M#gA2ufR+5s<YA1`)*cFSU5$#9=0+P6VEKv38&BjR-(7{CXo% zA~qF8LGchGNLjO8_SqD487hKc&OJ9FB6UI#W=FkPJA`1kXh{`<p4j~3R$r-7)4)S0 zB93CKNKcX_2-21?5${b+ew*=HwZ(~uARtaGm-A$Uok+M!RTn{M0wq(lLL{BQ1u~Eb zj0x$*7PeA(QP4z3!hk*@1YqoV{SsJo0*na}1h@%`u(umxO()!(Czu{fScLC&s+{pX z0Dy+WpR@KBWE2+<DFA?7`TI4x0D-xI&sa`_Zo%mhKQGE563uzx8{WOq6h0dtAAB9V zY4hB-^l0(n*ZJue0P^n1ob*^O@83auH!%+{_b!^k#U<@u74!NfXpvM(LeOM_#d4nX zSXeFuKoFbQ*l~#f-N+TmTL+8L3e%(VyYk5BF%zdExPeFI+(oe%#~?sF87dYkRT3Dm zcufn<<kF>Yx8fP-iekO23J?TEw%mdQV(Bpw&_8r+$^v>^B>-50xqSe|uR{;RU{Qb+ zM03isXYF#?4$xyPC&AT`P8LMb;vW|X&@iN4SA%tnq$Ch^f);-pirKhq0NZ6wF4&=1 z!+HP&F(McgM1JWI5sWM6BGE<q6BMIzMrangz;i<J?>Gj5z>q;A(u>jIPm3*x%*Ph< z5$3WXAz{e*Vlq66X}Du<MWo(BsHs$J<NNGCSQo`b;!5F_4xsqmg*oPd2+Ca&5d>mJ zwq<=N<}mL7pcgxw0>uQ2p~u{bO2808)JWI`fS(LSS8f^RP4Y=`!J_zEtTqDR2tbUf z9>AHx1C*R=B}>Z$n$oE-D_Ou9VXDS<F-!I$QVe_Ptf^9|qGJw@E-TOsE<^`S<7@$n ze*^*m2*j#33xGIc#6gv6$*hUuQglW0zeWsxx42ff`_<?ma3nuDA^~xS@GmE(a-1YU zAn0(Cm{E5dzqNkIdOHY2mt-a)_7MJcF-hDs5CoiobD{XhVXKia{X<hZ0@2^7zSs(a zJGd9uU{3aF5CCLB%%3Gp9qvLRHsfj_h$l%cj9XeL0mT30Ka1jAj0J!*(S_ot1DG?C z?EVll0C5n&h@+yIVi$G~C(ZJrxOmJ405=TKV@Fm@ocjQyfCvx&L?%$2A|1SV)llqU zZR1RT7(kbLstCq%VwjeRn1xu;<ldng5&=Qhun~%DmlF$O#q)3x6kAw2xQleSG*RDG z8{|x!HWdGqi2y-DiVV*oN_-Y0ytte!003|-#>)~~1AySn^6H(lOOMmztrzh}WC5={ zqY3_`9J+Hk-aZI={M`V=e{rEPutkD!Y2CS8GE6S#?)bGiA{cOvTzkiC%LNzL6+IzJ z1TQ_gz}UM?pd<ZZu{k?Y!tBi;vn?4X<IbgU*&ezw7r`lf_;3TFe3r)q!EB~imADgw z1m?44K~kI?XE~yBem0&M5q>%JJ#1Du%Az2C*b63Dj|3ai1tAD3)G2uH$;t3&aZCUL z1SWtJ%jepPz>6)8%FnO-{bIW~Y~g?M<7F|-4eZ3RJaM=j9=q}<L$CzzJP<czwIwF{ zR9}l9T>0qYgPW6add!uraZJ`?8%LK7hX~RKApo`}&S73!<ItK#0U8L{v(NP)Htoc} zi|#zY*b-<+c=@b=2wD(;CD<&aTsNW}jZNW^3CA1wc^*MPIkIc!Om@83YsBhXOuzlr zR!<@k5T1C^6OoEY4E^4QNOm;d>Z&Ofkv-@_5Vn7~!Kn#JOd>h4+uW03V%R??(Vm8v ztdbCd2nKv)jgmz?$?`@Lv!EancFt<Ys6Ec9Dk4ryi2x9TzqcVmbL9>e<ae+jAi+D2 z0mPX@)37_ZvdNBAMM0Kx{SMAnS~Q7NyZCf65tQb%X$<+M04cY4F(882H0ThPK9p9) zim9+2b(8NklpwLG=#{9xAB;uRN*H+-;s}NbP5y`k6AUW00TF>1PZV$vPriDy^`h5q z(&md*_hSd9N%(UM17HAXNPkdi!%ffvBtNJy+yt%uPaI6nf9*Sn^H_TME2l+E8wDi* zauP<g!1#w19{^(lX%0+N6Jq!H@UN!=IR(^1WSIZxyVplWJFzKAKv4LZrJ*b~fGQC) zb!(lq9nuz$cia};>AnvojYIT*$nc7nx6LC>0O%;BGB8a%Nlgu)Od4X7G*h=a-jm~= zjo0SYKe+-6wv==E0I|go7M)xhkCTp%ratua+5t}nn7p?lHb>`5+nrcDUN1g(j9GV< zuNHjbpJ|~Z<i9b3@#1xTT0W2WR_5jUu5Yr_hX&D;I85%2m>(g-)_j3&YgFK=+uHfC zInV!d?<!B5PO=q$@karm@DJoU2H<ahy#MlXck0KFhuw3x{zMG`o`Ai2;Ypao1a_p6 z6WgA*jXhMJwlbR*yk7l3cO672O9+Tf$~*=BtUk`?{r`Uw(1T_3HZ#IucT-5kln(e5 s(1XFr-jAlPek1lfpb4#Gy2@Yp4;?fBsss|m{{Mjn4JtJ7ebNg604-qHg#Z8m literal 0 HcmV?d00001 diff --git a/tests/android/res/mipmap-xhdpi/ic_launcher_round.webp b/tests/android/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..6599d9b307275916df8e1da8a74c6ad9917fbf02 GIT binary patch literal 4958 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 literal 0 HcmV?d00001 diff --git a/tests/android/res/mipmap-xxhdpi/app_icon.png b/tests/android/res/mipmap-xxhdpi/app_icon.png deleted file mode 100644 index 652a8e9b7e4e7ebb31424805025b1a2bce8e708d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13363 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 HM2G$lKY8wd diff --git a/tests/android/res/mipmap-xxhdpi/ic_launcher.webp b/tests/android/res/mipmap-xxhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..bb3c5ea66b3356bf2195068b3dc4a6d8b6466a12 GIT binary patch literal 3880 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 literal 0 HcmV?d00001 diff --git a/tests/android/res/mipmap-xxhdpi/ic_launcher_round.webp b/tests/android/res/mipmap-xxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..001d3b0de54aa94df573dc740f0d45ea2e8f245b GIT binary patch literal 7174 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 IXt_R@C9{2J=l}o! literal 0 HcmV?d00001 diff --git a/tests/android/res/mipmap-xxxhdpi/app_icon.png b/tests/android/res/mipmap-xxxhdpi/app_icon.png deleted file mode 100644 index 7a404f6cbb8e0acc99545092319bea31c384ecca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30716 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 Ow{Gfc<f~ge|9=2ce@%A) diff --git a/tests/android/res/mipmap-xxxhdpi/ic_launcher.webp b/tests/android/res/mipmap-xxxhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..c60e7e17d4c43dfa63500e0bf30802ddfc1fbd46 GIT binary patch literal 4762 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 literal 0 HcmV?d00001 diff --git a/tests/android/res/mipmap-xxxhdpi/ic_launcher_round.webp b/tests/android/res/mipmap-xxxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..a41bd7a2b444bd7108df57d4334afc50bc5ae025 GIT binary patch literal 9514 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 I?fMJ^03%EQF8}}l literal 0 HcmV?d00001 diff --git a/tests/android/res/values/strings.xml b/tests/android/res/values/strings.xml new file mode 100644 index 0000000..004d018 --- /dev/null +++ b/tests/android/res/values/strings.xml @@ -0,0 +1,18 @@ +<!-- + ~ Copyright (C) 2023 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ https://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> +<resources> + <string name="app_name">Qt UI Viewer</string> +</resources> diff --git a/tests/data/test_project/Generated/Quick3DAssets.txt b/tests/data/test_project/Generated/Quick3DAssets.txt new file mode 100644 index 0000000..84c843f --- /dev/null +++ b/tests/data/test_project/Generated/Quick3DAssets.txt @@ -0,0 +1 @@ +Imported 3D assets and components imported from bundles will be created in this folder. diff --git a/tests/data/test_project/qtquickcontrols2.conf b/tests/data/test_project/qtquickcontrols2.conf new file mode 100644 index 0000000..2ed8ad7 --- /dev/null +++ b/tests/data/test_project/qtquickcontrols2.conf @@ -0,0 +1,8 @@ +[Controls] +Style=Basic + +[Material] +Theme=Light + +[Universal] +Theme=System diff --git a/tests/data/test_project/temp.qrc b/tests/data/test_project/temp.qrc new file mode 100644 index 0000000..16e081e --- /dev/null +++ b/tests/data/test_project/temp.qrc @@ -0,0 +1,13 @@ + +<RCC> +<qresource> +<file>qtquickcontrols2.conf</file> +<file>test_project.qmlproject</file> +<file>test_project/Constants.qml</file> +<file>test_project/EventListModel.qml</file> +<file>test_project/EventListSimulator.qml</file> +<file>test_project/qmldir</file> +<file>test_projectContent/App.qml</file> +<file>test_projectContent/Screen01.ui.qml</file> +</qresource> +</RCC> \ No newline at end of file diff --git a/tests/data/test_project/test_project.qmlproject b/tests/data/test_project/test_project.qmlproject new file mode 100644 index 0000000..9d41551 --- /dev/null +++ b/tests/data/test_project/test_project.qmlproject @@ -0,0 +1,122 @@ +import QmlProject + +Project { + mainFile: "test_projectContent/App.qml" + mainUiFile: "test_projectContent/Screen01.ui.qml" + + /* Include .qml, .js, and image files from current directory and subdirectories */ + QmlFiles { + directory: "test_project" + } + + QmlFiles { + directory: "test_projectContent" + } + + QmlFiles { + directory: "Generated" + } + + JavaScriptFiles { + directory: "test_project" + } + + JavaScriptFiles { + directory: "test_projectContent" + } + + ImageFiles { + directory: "test_projectContent" + } + + ImageFiles { + directory: "Generated" + } + + Files { + filter: "*.conf" + files: ["qtquickcontrols2.conf"] + } + + Files { + filter: "qmldir" + directory: "." + } + + Files { + filter: "*.ttf;*.otf" + } + + Files { + filter: "*.wav;*.mp3" + } + + Files { + filter: "*.mp4" + } + + Files { + filter: "*.glsl;*.glslv;*.glslf;*.vsh;*.fsh;*.vert;*.frag" + } + + Files { + filter: "*.qsb" + } + + Files { + filter: "*.json" + } + + Files { + filter: "*.mesh" + directory: "Generated" + } + + Files { + filter: "*.qad" + directory: "Generated" + } + + Environment { + QT_QUICK_CONTROLS_CONF: "qtquickcontrols2.conf" + QML_COMPAT_RESOLVE_URLS_ON_ASSIGNMENT: "1" + QT_LOGGING_RULES: "qt.qml.connections=false" + QT_ENABLE_HIGHDPI_SCALING: "0" + /* Useful for debugging + QSG_VISUALIZE=batches + QSG_VISUALIZE=clip + QSG_VISUALIZE=changes + QSG_VISUALIZE=overdraw + */ + } + + qt6Project: true + + /* List of plugin directories passed to QML runtime */ + importPaths: [ "." ] + + /* Required for deployment */ + targetDirectory: "/opt/UntitledProject49" + + + qdsVersion: "4.7" + + quickVersion: "6.8" + + /* If any modules the project imports require widgets (e.g. QtCharts), widgetApp must be true */ + widgetApp: true + + /* args: Specifies command line arguments for qsb tool to generate shaders. + files: Specifies target files for qsb tool. If path is included, it must be relative to this file. + Wildcard '*' can be used in the file name part of the path. + e.g. files: [ "UntitledProject49Content/shaders/*.vert", "*.frag" ] */ + ShaderTool { + args: "-s --glsl \"100 es,120,150\" --hlsl 50 --msl 12" + files: [ "test_projectContent/shaders/*" ] + } + + multilanguageSupport: true + supportedLanguages: ["en"] + primaryLanguage: "en" + +} diff --git a/tests/data/test_project/test_project/Constants.qml b/tests/data/test_project/test_project/Constants.qml new file mode 100644 index 0000000..e134a56 --- /dev/null +++ b/tests/data/test_project/test_project/Constants.qml @@ -0,0 +1,27 @@ +pragma Singleton +import QtQuick +import QtQuick.Studio.Application + +QtObject { + readonly property int width: 1920 + readonly property int height: 1080 + + property string relativeFontDirectory: "fonts" + + /* Edit this comment to add your custom font */ + readonly property font font: Qt.font({ + family: Qt.application.font.family, + pixelSize: Qt.application.font.pixelSize + }) + readonly property font largeFont: Qt.font({ + family: Qt.application.font.family, + pixelSize: Qt.application.font.pixelSize * 1.6 + }) + + readonly property color backgroundColor: "#EAEAEA" + + + property StudioApplication application: StudioApplication { + fontPath: Qt.resolvedUrl("../UntitledProject49Content/" + relativeFontDirectory) + } +} diff --git a/tests/data/test_project/test_project/EventListModel.qml b/tests/data/test_project/test_project/EventListModel.qml new file mode 100644 index 0000000..00c7065 --- /dev/null +++ b/tests/data/test_project/test_project/EventListModel.qml @@ -0,0 +1,12 @@ +import QtQuick + +ListModel { + id: eventListModel + + ListElement { + eventId: "enterPressed" + eventDescription: "Emitted when pressing the enter button" + shortcut: "Return" + parameters: "Enter" + } +} diff --git a/tests/data/test_project/test_project/EventListSimulator.qml b/tests/data/test_project/test_project/EventListSimulator.qml new file mode 100644 index 0000000..d26ae6d --- /dev/null +++ b/tests/data/test_project/test_project/EventListSimulator.qml @@ -0,0 +1,22 @@ +import QtQuick +import QtQuick.Studio.EventSimulator +import QtQuick.Studio.EventSystem + +QtObject { + id: simulator + property bool active: true + + property Timer __timer: Timer { + id: timer + interval: 100 + onTriggered: { + EventSimulator.show() + } + } + + Component.onCompleted: { + EventSystem.init(Qt.resolvedUrl("EventListModel.qml")) + if (simulator.active) + timer.start() + } +} diff --git a/tests/data/test_project/test_project/designer/plugin.metainfo b/tests/data/test_project/test_project/designer/plugin.metainfo new file mode 100644 index 0000000..cef8690 --- /dev/null +++ b/tests/data/test_project/test_project/designer/plugin.metainfo @@ -0,0 +1,13 @@ +MetaInfo { + Type { + name: "UntitledProject49.EventListSimulator" + icon: ":/qtquickplugin/images/item-icon16.png" + + Hints { + visibleInNavigator: true + canBeDroppedInNavigator: true + canBeDroppedInFormEditor: false + canBeDroppedInView3D: false + } + } +} diff --git a/tests/data/test_project/test_project/qmldir b/tests/data/test_project/test_project/qmldir new file mode 100644 index 0000000..3fc49f8 --- /dev/null +++ b/tests/data/test_project/test_project/qmldir @@ -0,0 +1,4 @@ +module UntitledProject49 +singleton Constants 1.0 Constants.qml +EventListSimulator 1.0 EventListSimulator.qml +EventListModel 1.0 EventListModel.qml diff --git a/tests/data/test_project/test_projectContent/App.qml b/tests/data/test_project/test_projectContent/App.qml new file mode 100644 index 0000000..cadefcd --- /dev/null +++ b/tests/data/test_project/test_projectContent/App.qml @@ -0,0 +1,16 @@ +import QtQuick +import test_project + +Window { + width: mainScreen.width + height: mainScreen.height + + visible: true + title: "test_project" + + Screen01 { + id: mainScreen + } + +} + diff --git a/tests/data/test_project/test_projectContent/Screen01.ui.qml b/tests/data/test_project/test_projectContent/Screen01.ui.qml new file mode 100644 index 0000000..ac24a0f --- /dev/null +++ b/tests/data/test_project/test_projectContent/Screen01.ui.qml @@ -0,0 +1,254 @@ + + +/* +This is a UI file (.ui.qml) that is intended to be edited in Qt Design Studio only. +It is supposed to be strictly declarative and only uses a subset of QML. If you edit +this file manually, you might introduce QML code that is not supported by Qt Design Studio. +Check out https://doc.qt.io/qtcreator/creator-quick-ui-forms.html for details on .ui.qml files. +*/ +import QtQuick +import QtQuick.Controls +import test_project +import QtQuick.Studio.DesignEffects +import QtQuick.Studio.Components +import QtQuick.Studio.Effects +import QtQuick.Studio.LogicHelper +import QtQuick.Studio.MultiText +import QtCharts +import QtGraphs +import QtQuick.Layouts +import QtQuick3D +import QtQuick.Controls.FluentWinUI3 +import QtQuick.Effects +import QtQuick.Studio.Utils +import QtQuick.Studio.Application +import QtQuick.Timeline.BlendTrees +import QtQuick.VectorImage +import QtQuick.Window +import QtQuick3D.AssetUtils +import QtQuick3D.Effects +import QtQuick3D.Helpers +import QtQuick3D.Particles3D +import QtQuick3D.Physics +import QtQuick.Timeline +import QtNetwork +import QtQuick3D.Physics.Helpers +import QtMultimedia +import QtQuick3D.SpatialAudio +import QtQuick3D.Xr +import QtQuickUltralite.Extras +import QtQuickUltralite.Studio.Components +import QtQuickUltralite.Profiling +import QtQuickUltralite.Layers +import FlowView +import test + +Rectangle { + id: rectangle + width: Constants.width + height: Constants.height + + color: Constants.backgroundColor + + Button { + id: button + text: qsTr("Press me") + anchors.verticalCenter: parent.verticalCenter + checkable: true + anchors.horizontalCenter: parent.horizontalCenter + + Connections { + target: button + onClicked: animation.start() + } + + DesignEffect { + backgroundLayer: button + backgroundBlurRadius: 5 + layerBlurRadius: 2 + effects: [ + DesignDropShadow {}, + DesignDropShadow {} + ] + } + } + + Text { + id: label + text: qsTr("Hello UntitledProject49") + anchors.top: button.bottom + font.family: Constants.font.family + anchors.topMargin: 45 + anchors.horizontalCenter: parent.horizontalCenter + + SequentialAnimation { + id: animation + + ColorAnimation { + id: colorAnimation1 + target: rectangle + property: "color" + to: "#2294c6" + from: Constants.backgroundColor + } + + ColorAnimation { + id: colorAnimation2 + target: rectangle + property: "color" + to: Constants.backgroundColor + from: "#2294c6" + } + } + } + + Button { + id: button1 + x: 930 + y: 466 + text: qsTr("Button") + } + + CheckBox { + id: checkBox + x: 918 + y: 417 + text: qsTr("Check Box") + } + + ComboBox { + id: comboBox + x: 900 + y: 563 + } + + RadioButton { + id: radioButton + x: 897 + y: 632 + text: qsTr("Radio Button") + } + + RadioDelegate { + id: radioDelegate + x: 881 + y: 677 + text: qsTr("Radio Delegate") + } + + RoundButton { + id: roundButton + x: 864 + y: 490 + text: "+" + } + + Slider { + id: slider + x: 859 + y: 375 + value: 0.5 + } + + RangeSlider { + id: rangeSlider + x: 859 + y: 333 + second.value: 0.75 + first.value: 0.25 + } + + Switch { + id: _switch + x: 845 + y: 438 + text: qsTr("Switch") + } + + Button { + id: button2 + x: 1090 + y: 473 + text: qsTr("Button") + } + + ArcItem { + id: arc + x: 1090 + y: 333 + fillColor: "#00000000" + } + + EllipseItem { + id: ellipse + x: 628 + y: 333 + } + + BorderItem { + id: _border + x: 628 + y: 508 + adjustBorderRadius: true + } + + FlipableItem { + id: flipable + x: 1066 + y: 532 + } + + TriangleItem { + id: triangle + x: 669 + y: 677 + } + + Item { + id: __materialLibrary__ + } + + ChartView { + id: bar + x: 1257 + y: 340 + width: 300 + height: 300 + BarSeries { + name: "BarSeries" + BarSet { + values: [2, 2, 3] + label: "Set1" + } + + BarSet { + values: [5, 1, 2] + label: "Set2" + } + + BarSet { + values: [3, 5, 8] + label: "Set3" + } + } + } + + DesignEffect { + visible: true + effects: [ + DesignInnerShadow {}, + DesignDropShadow {} + ] + } + states: [ + State { + name: "clicked" + when: button.checked + + PropertyChanges { + target: label + text: qsTr("Button Checked") + } + } + ] +} diff --git a/tests/data/test_project/test_projectContent/fonts/fonts.txt b/tests/data/test_project/test_projectContent/fonts/fonts.txt new file mode 100644 index 0000000..ab96122 --- /dev/null +++ b/tests/data/test_project/test_projectContent/fonts/fonts.txt @@ -0,0 +1 @@ +Fonts in this folder are loaded automatically. diff --git a/tests/data/test_project/test_projectContent/images/images.txt b/tests/data/test_project/test_projectContent/images/images.txt new file mode 100644 index 0000000..f8b9996 --- /dev/null +++ b/tests/data/test_project/test_projectContent/images/images.txt @@ -0,0 +1 @@ +Default folder for image assets. diff --git a/tests/data/test_project/test_project_fail.qmlrc b/tests/data/test_project/test_project_fail.qmlrc new file mode 100644 index 0000000000000000000000000000000000000000..ff815586b54fb2e038e38fb1965bac390af59b65 GIT binary patch literal 4129 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 literal 0 HcmV?d00001 diff --git a/tests/data/test_project/test_project_success.qmlrc b/tests/data/test_project/test_project_success.qmlrc new file mode 100644 index 0000000000000000000000000000000000000000..1b124cb3c43f3d6c054af130f5a5286e8da78273 GIT binary patch literal 4128 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 literal 0 HcmV?d00001 diff --git a/tests/main.cpp b/tests/main.cpp index 7076f50..dad1510 100644 --- a/tests/main.cpp +++ b/tests/main.cpp @@ -1,17 +1,20 @@ // 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 <QGuiApplication> +#include <QApplication> #include <QTemporaryFile> #include <QTest> +#include "tst_dsmanager.h" +#include "tst_projectmanager.h" #include "tst_settings.h" -#define DEBUG_LINE qDebug() << "Debugline:" << __LINE__ +#define DEBUG_LINE qDebug() << "Debug (" << __LINE__ << "):" int main(int argc, char *argv[]) { - QGuiApplication app(argc, argv); + qputenv("QML_COMPAT_RESOLVE_URLS_ON_ASSIGNMENT", "1"); + QApplication app(argc, argv); QStringList initialArgs = app.arguments(); DEBUG_LINE << "Arguments:" << initialArgs; @@ -33,14 +36,14 @@ int main(int argc, char *argv[]) } if (outputFileName.isEmpty()) { - qDebug() << "Output file name not provided. Using the default name: output.junitxml"; + DEBUG_LINE << "Output file name not provided. Using the default name: output.junitxml"; outputFileName = "output.junitxml"; } QFile outputFile{outputFileName}; - if (!outputFile.open(QIODevice::Append)) { + if (!outputFile.open(QIODevice::Truncate | QIODevice::WriteOnly)) { DEBUG_LINE << "Failed to open the output file"; - return 1; + return -1; } int status = 0; @@ -48,8 +51,11 @@ int main(int argc, char *argv[]) // temporary file to store the individual test results. // we'll append the results to the output file. QTemporaryFile file; - file.open(); - DEBUG_LINE << "Temporary file:" << file.fileName(); + if (!file.open()) { + DEBUG_LINE << "Failed to open the temporary file"; + status = -1; + return; + } QStringList args{"-o", QString(file.fileName()).append(",junitxml")}; args.prepend(appName); @@ -60,15 +66,24 @@ int main(int argc, char *argv[]) // append the test results to the output file file.readLine(); // skip the first line because it's the xml header - outputFile.write(file.readAll()); + const int rV = outputFile.write(file.readAll()); + if (rV == -1) { + DEBUG_LINE << "Failed to write the test results to the output file"; + status = -1; + return; + } }; outputFile.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); outputFile.write("<testsuites>\n"); runTest(new TestSettings); + runTest(new TestDesignStudioManager); + runTest(new TestProjectManager); outputFile.write("</testsuites>\n"); + outputFile.flush(); + outputFile.close(); DEBUG_LINE << "Test suite finished with status:" << status; return status; diff --git a/tests/mock_ds.cpp b/tests/mock_ds.cpp new file mode 100644 index 0000000..1495595 --- /dev/null +++ b/tests/mock_ds.cpp @@ -0,0 +1,129 @@ +// 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 "mock_ds.h" + +#include <QJsonParseError> +#include <QJsonObject> +#include <QJsonDocument> + +namespace PackageToDevice { +using namespace Qt::Literals; +constexpr auto designStudioReady = "designStudioReady"_L1; +constexpr auto projectData = "projectData"_L1; +constexpr auto stopRunningProject = "stopRunningProject"_L1; +}; // namespace PackageToDevice + +namespace PackageFromDevice { +using namespace Qt::Literals; +constexpr auto deviceInfo = "deviceInfo"_L1; +constexpr auto projectReceivingProgress = "projectReceivingProgress"_L1; +constexpr auto projectStarting = "projectStarting"_L1; +constexpr auto projectStarted = "projectRunning"_L1; +constexpr auto projectStopped = "projectStopped"_L1; +constexpr auto projectLogs = "projectLogs"_L1; +}; // namespace PackageFromDevice + +MockDS::MockDS(const QString dsID, + const QString &serverAddr, + const QString &serverName, + QObject *parent) + : QObject(parent) + , m_dsID(dsID) + , m_serverAddr(serverAddr) +{ + m_socket.reset(new QWebSocket(serverName, QWebSocketProtocol::VersionLatest, this)); + QObject::connect(m_socket.data(), + &QWebSocket::textMessageReceived, + this, + &MockDS::textMessageReceived); + connect(); +} + +MockDS::~MockDS() +{ + m_socket->close(); +} + +void MockDS::connect() +{ + m_socket->open(QUrl(m_serverAddr)); +} + +void MockDS::disconnect() +{ + m_socket->close(); + m_socket->abort(); +} + +bool MockDS::isConnected() const +{ + return m_socket->isValid(); +} + +bool MockDS::sendTextMessage(const QLatin1String &dataType, const QJsonValue &data) +{ + if (!isConnected()) + return false; + + QJsonObject message; + message["dataType"] = dataType; + message["data"] = data; + const QString jsonMessage = QString::fromLatin1( + QJsonDocument(message).toJson(QJsonDocument::Compact)); + m_socket->sendTextMessage(jsonMessage); + + return true; +} + +bool MockDS::sendDesignStudioReady() +{ + QJsonObject data; + data["designStudioID"] = m_dsID; + data["commVersion"] = 1; + return sendTextMessage(PackageToDevice::designStudioReady, data); +} + +bool MockDS::sendProjectData(const QByteArray &data, const QString &qtVersion) +{ + QJsonObject projectInfo; + projectInfo["projectSize"] = data.size(); + projectInfo["qtVersion"] = qtVersion; + + const bool rV = sendTextMessage(PackageToDevice::projectData, projectInfo); + if (!rV) + return false; + + const int dataSent = m_socket->sendBinaryMessage(data); + return dataSent == data.size(); +} + +bool MockDS::sendProjectStopped() +{ + return sendTextMessage(PackageToDevice::stopRunningProject, {}); +} + +void MockDS::textMessageReceived(const QString &message){ + qDebug () << "Message received: " << message; + QJsonParseError jsonError; + const QJsonDocument jsonDoc = QJsonDocument::fromJson(message.toLatin1(), &jsonError); + + const QJsonObject jsonObj = jsonDoc.object(); + const QString dataType = jsonObj.value("dataType").toString(); + if (dataType == PackageFromDevice::deviceInfo) { + QJsonObject deviceInfo = jsonObj.value("data").toObject(); + emit deviceInfoReady(); + } else if (dataType == PackageFromDevice::projectStarted) { + emit projectStarted(); + } else if (dataType == PackageFromDevice::projectStopped) { + emit projectStopped(); + } else if (dataType == PackageFromDevice::projectLogs) { + const QString logs = jsonObj.value("data").toString(); + emit projectLogsReceived(logs); + } else if (dataType == PackageFromDevice::projectStarting) { + emit projectStarting(); + } else if (dataType == PackageFromDevice::projectReceivingProgress) { + const int progress = jsonObj.value("data").toInt(); + emit projectSendingProgress(progress); + } +} diff --git a/tests/mock_ds.h b/tests/mock_ds.h new file mode 100644 index 0000000..1214acc --- /dev/null +++ b/tests/mock_ds.h @@ -0,0 +1,43 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#pragma once + +#include <QWebSocket> + +/** + * @brief This is a mock class to simulate the Design Studio connection. + * This one acts like a client and the DesignStudioManager acts like a server. + * This can be used to test the data coming from the Design Studio or the vice versa. + */ +class MockDS : public QObject +{ + Q_OBJECT +public: + MockDS(const QString dsID, const QString &serverAddr, const QString &serverName, QObject *parent = nullptr); + ~MockDS(); + + void connect(); + void disconnect(); + bool isConnected() const; + bool sendDesignStudioReady(); + bool sendProjectData(const QByteArray &data, const QString &qtVersion); + bool sendProjectStopped(); + +private: + QScopedPointer<QWebSocket> m_socket; + const QString m_dsID; + const QString m_serverAddr; + +private: + void textMessageReceived(const QString &message); + bool sendTextMessage(const QLatin1String &dataType, const QJsonValue &data); + +signals: + void projectStarted(); + void projectStarting(); + void projectStopped(); + void projectLogsReceived(const QString &logs); + void deviceInfoReady(); + void projectSendingProgress(const int percentage); +}; diff --git a/tests/tst_dsmanager.cpp b/tests/tst_dsmanager.cpp new file mode 100644 index 0000000..d84669a --- /dev/null +++ b/tests/tst_dsmanager.cpp @@ -0,0 +1,221 @@ +// 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 "tst_dsmanager.h" + +#include <QTest> +#include <QSignalSpy> + +#define DEVICE_ID "1234567890" +#define DS_ID "0987654321" +#define CONNECTION_TIMEOUT 1000 + +TestObjects::TestObjects(const quint16 port, QObject *parent) + : QObject(parent) +{ + m_dsManager.reset(new DesignStudioManager(DEVICE_ID, port)); + m_dsManager->init(); + + m_mockDS.reset(new MockDS(DS_ID, QString("ws://localhost:%1").arg(port), "DesignStudio")); + + const bool rV = QTest::qWaitFor([&]() { return m_mockDS->isConnected(); }, CONNECTION_TIMEOUT); + QVERIFY(rV == true); + + QSignalSpy spy(m_mockDS.data(), &MockDS::deviceInfoReady); + QVERIFY(m_mockDS->sendDesignStudioReady() == true); + QTRY_COMPARE_WITH_TIMEOUT(spy.count(), 1, 1000); + + m_mockDS2.reset(new MockDS(DS_ID "2", QString("ws://localhost:%1").arg(port), "DesignStudio")); + const bool rV2 = QTest::qWaitFor([&]() { return m_mockDS2->isConnected(); }, CONNECTION_TIMEOUT); + QVERIFY(rV2 == true); + + QSignalSpy spy2(m_mockDS2.data(), &MockDS::deviceInfoReady); + QVERIFY(m_mockDS2->sendDesignStudioReady() == true); + QTRY_COMPARE_WITH_TIMEOUT(spy.count(), 1, 1000); +} + +DesignStudioManager *TestObjects::designStudioManager() +{ + return m_dsManager.data(); +} + +MockDS *TestObjects::mockDS() +{ + return m_mockDS.data(); +} + +MockDS *TestObjects::mockDS2() +{ + return m_mockDS2.data(); +} + +void TestDesignStudioManager::initTestCase() +{ + QFile file(":/data/test_project/test_project_success.qmlrc"); + qDebug() << "Reading file:" << file.fileName(); + QVERIFY(file.open(QIODevice::ReadOnly)); + + m_projectData = file.readAll(); + QVERIFY(m_projectData.size() > 0); + + m_dsManager.reset(new DesignStudioManager(DEVICE_ID)); + m_dsManager->init(); + + const QString serverName = m_dsManager->webSocketServerName(); + const int serverPort = m_dsManager->webSocketServerPort(); + // Important note: + // If the following 2 parameters change by a design decision, + // they have to be updated on Qt Design Studio side as well. + QVERIFY2(serverName == "DesignStudio", + "Default server name is not correct. Update the test and Design Studio side."); + QVERIFY2(serverPort == 40000, + "Default server port is not correct. Update the test and Design Studio side."); + + const QString serverAddr = QString("ws://localhost:%1").arg(serverPort); + + m_mockDS.reset(new MockDS(DS_ID, serverAddr, serverName)); + const bool rV = QTest::qWaitFor([&]() { return m_mockDS->isConnected(); }, CONNECTION_TIMEOUT); + QVERIFY(rV == true); + + QSignalSpy spy(m_mockDS.data(), &MockDS::deviceInfoReady); + QVERIFY(m_mockDS->sendDesignStudioReady() == true); + QTRY_COMPARE_WITH_TIMEOUT(spy.count(), 1, 1000); +} + +void TestDesignStudioManager::testSendProjectStarting() +{ + QSignalSpy spy(m_mockDS.data(), &MockDS::projectStarting); + m_dsManager->sendProjectStarting(DS_ID); + QTRY_COMPARE_WITH_TIMEOUT(spy.count(), 1, 1000); +} + +void TestDesignStudioManager::testSendProjectStarted() +{ + QSignalSpy spy(m_mockDS.data(), &MockDS::projectStarted); + m_dsManager->sendProjectStarted(DS_ID); + QTRY_COMPARE_WITH_TIMEOUT(spy.count(), 1, 1000); +} + +void TestDesignStudioManager::testSendProjectStopped() +{ + QSignalSpy spy(m_mockDS.data(), &MockDS::projectStopped); + m_dsManager->sendProjectStopped(DS_ID); + QTRY_COMPARE_WITH_TIMEOUT(spy.count(), 1, 1000); +} + +void TestDesignStudioManager::testSendProjectLogs() +{ + QSignalSpy spy(m_mockDS.data(), &MockDS::projectLogsReceived); + m_dsManager->sendProjectLogs(DS_ID, "Test logs"); + QTRY_COMPARE_WITH_TIMEOUT(spy.count(), 1, 1000); +} + +void TestDesignStudioManager::testProjectReceivingProgress() +{ + TestObjects testObjects(40001); + const QString qtVersion = "6.8.0"; + + QSignalSpy spy(testObjects.mockDS(), &MockDS::projectSendingProgress); + QVERIFY(testObjects.mockDS()->sendProjectData(m_projectData, qtVersion) == true); + QTRY_COMPARE_WITH_TIMEOUT(spy.count(), 1, 1000); +} + +void TestDesignStudioManager::testGetDesignStudioIp() +{ + TestObjects testObjects(40001); + const QString ipAddr = testObjects.designStudioManager()->getDesignStudioIp(DS_ID); + const QString failMessage = QString("Design Studio IP is not correct. Expected: %1, Got: %2") + .arg("::1 or ::ffff:127.0.0.1") + .arg(ipAddr); + + if (ipAddr != "::1" && ipAddr != "::ffff:127.0.0.1") + QFAIL(qPrintable(failMessage)); + + QVERIFY(testObjects.designStudioManager()->getDesignStudioIp("non-existing-id").isEmpty()); +} + +void TestDesignStudioManager::testProjectVersionMismatch() +{ + TestObjects testObjects(40002); + const QString qtVersion = "5.0.0"; + + QSignalSpy spy(testObjects.designStudioManager(), &DesignStudioManager::projectVersionMismatch); + QVERIFY(testObjects.mockDS()->sendProjectData(m_projectData, qtVersion) == true); + QTRY_COMPARE_WITH_TIMEOUT(spy.count(), 1, 1000); +} + +void TestDesignStudioManager::testProjectIncoming() +{ + TestObjects testObjects(40003); + const QString qtVersion = "6.8.0"; + + QSignalSpy spy(testObjects.designStudioManager(), &DesignStudioManager::projectIncoming); + QVERIFY(testObjects.mockDS()->sendProjectData(m_projectData, qtVersion) == true); + QTRY_COMPARE_WITH_TIMEOUT(spy.count(), 1, 1000); +} + +void TestDesignStudioManager::testProjectIncomingProgress() +{ + TestObjects testObjects(40004); + + const QString qtVersion = "6.8.0"; + QByteArray bigProjectdata; + bigProjectdata.fill('a', 1024 * 1024 * 10); + + QSignalSpy spy(testObjects.designStudioManager(), &DesignStudioManager::projectIncomingProgress); + QVERIFY(testObjects.mockDS()->sendProjectData(bigProjectdata, qtVersion) == true); + QTRY_COMPARE_WITH_TIMEOUT(spy.count(), 1, 1000); +} + +void TestDesignStudioManager::testProjectReceived() +{ + TestObjects testObjects(40005); + const QString qtVersion = "6.8.0"; + + QSignalSpy spy(testObjects.designStudioManager(), &DesignStudioManager::projectReceived); + QVERIFY(testObjects.mockDS()->sendProjectData(m_projectData, qtVersion) == true); + QTRY_COMPARE_WITH_TIMEOUT(spy.count(), 1, 1000); +} + +void TestDesignStudioManager::testDesignStudioConnected() +{ + TestObjects testObjects(40006); + + QSignalSpy spy(testObjects.designStudioManager(), &DesignStudioManager::designStudioConnected); + testObjects.mockDS()->disconnect(); + testObjects.mockDS()->connect(); + QTRY_COMPARE_WITH_TIMEOUT(spy.count(), 1, 1000); +} + +void TestDesignStudioManager::testDesignStudioDisconnected() +{ + TestObjects testObjects(40007); + + QSignalSpy spy(testObjects.designStudioManager(), + &DesignStudioManager::designStudioDisconnected); + testObjects.mockDS()->disconnect(); + QTRY_COMPARE_WITH_TIMEOUT(spy.count(), 1, 1000); +} + +void TestDesignStudioManager::testAllDesignStudiosDisconnected() +{ + TestObjects testObjects(40008); + + QSignalSpy spy(testObjects.designStudioManager(), + &DesignStudioManager::designStudioDisconnected); + QSignalSpy spy2(testObjects.designStudioManager(), + &DesignStudioManager::allDesignStudiosDisconnected); + testObjects.mockDS()->disconnect(); + testObjects.mockDS2()->disconnect(); + spy.wait(1000); + QCOMPARE(spy.count(), 2); + QCOMPARE(spy2.count(), 1); +} + +void TestDesignStudioManager::testProjectStopRequested() +{ + TestObjects testObjects(40009); + + QSignalSpy spy(testObjects.designStudioManager(), &DesignStudioManager::projectStopRequested); + testObjects.mockDS()->sendProjectStopped(); + QTRY_COMPARE_WITH_TIMEOUT(spy.count(), 1, 1000); +} diff --git a/tests/tst_dsmanager.h b/tests/tst_dsmanager.h new file mode 100644 index 0000000..e573518 --- /dev/null +++ b/tests/tst_dsmanager.h @@ -0,0 +1,54 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#pragma once + +#include <QObject> + +#include "backend/dsconnector/dsmanager.h" +#include "mock_ds.h" + +class TestObjects : public QObject +{ + Q_OBJECT +public: + TestObjects(const quint16 port = 40000, QObject *parent = nullptr); + DesignStudioManager *designStudioManager(); + MockDS *mockDS(); + MockDS *mockDS2(); + +private: + QScopedPointer<DesignStudioManager> m_dsManager; + QScopedPointer<MockDS> m_mockDS; + QScopedPointer<MockDS> m_mockDS2; +}; + +class TestDesignStudioManager : public QObject +{ + Q_OBJECT +private slots: + void initTestCase(); + + // to DesignStudio + void testSendProjectStarted(); + void testSendProjectStarting(); + void testSendProjectStopped(); + void testSendProjectLogs(); + void testProjectReceivingProgress(); + void testGetDesignStudioIp(); + + // to Android + void testProjectVersionMismatch(); + void testProjectIncoming(); + void testProjectIncomingProgress(); + void testProjectReceived(); + void testDesignStudioConnected(); + void testDesignStudioDisconnected(); + void testAllDesignStudiosDisconnected(); + void testProjectStopRequested(); + +private: + QScopedPointer<DesignStudioManager> m_dsManager; + QScopedPointer<MockDS> m_mockDS; + QByteArray m_projectData; +}; diff --git a/tests/tst_projectmanager.cpp b/tests/tst_projectmanager.cpp new file mode 100644 index 0000000..1be6c91 --- /dev/null +++ b/tests/tst_projectmanager.cpp @@ -0,0 +1,211 @@ +// 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 "tst_projectmanager.h" + +#include <QQuickItem> +#include <QSignalSpy> +#include <QTest> + +void TestProjectManager::initTestCase() +{ + QFile file(":/data/test_project/test_project_success.qmlrc"); + QVERIFY(file.open(QIODevice::ReadOnly)); + + m_projectThatCanRun = file.readAll(); + QVERIFY(m_projectThatCanRun.size() > 0); + + file.setFileName(":/data/test_project/test_project_fail.qmlrc"); + QVERIFY(file.open(QIODevice::ReadOnly)); + + m_projectThatCannotRun = file.readAll(); + QVERIFY(m_projectThatCannotRun.size() > 0); +} + +void TestProjectManager::testRunProject() +{ + ProjectManager projectManager; + bool result = projectManager.runProject(m_projectThatCanRun, true, "sessionId"); + + QVERIFY(projectManager.sessionId() == "sessionId"); + QVERIFY(result); + + result = projectManager.runProject(m_projectThatCannotRun, true, "sessionId"); + QVERIFY(!result); + QVERIFY(projectManager.sessionId().isEmpty()); +} + +void TestProjectManager::testStopProject() +{ + ProjectManager projectManager; + const bool result = projectManager.runProject(m_projectThatCanRun, true, "sessionId"); + QVERIFY(result); + + projectManager.stopProject(); + QVERIFY(projectManager.sessionId().isEmpty()); + QVERIFY(projectManager.m_quickWindow.isNull()); + QVERIFY(projectManager.m_qmlEngine.isNull()); + QVERIFY(projectManager.m_qmlComponent.isNull()); +} + +void TestProjectManager::testRegisterResource() +{ + ProjectManager projectManager; + const QString resourcePath = ":/data/test_project_register"; + bool result = projectManager.registerResource(m_projectThatCanRun, resourcePath); + QVERIFY(result); + + QFile file(resourcePath + "/test_project.qmlproject"); + QVERIFY(file.open(QIODevice::ReadOnly)); + QByteArray data = file.readAll(); + QVERIFY(data.size() > 0); + QVERIFY(data.contains("import QmlProject")); + QVERIFY(data.contains("mainFile: \"test_projectContent/App.qml\"")); + + file.close(); + file.setFileName(resourcePath + "/qtquickcontrols2.conf"); + QVERIFY(file.open(QIODevice::ReadOnly)); + data = file.readAll(); + QVERIFY(data.size() > 0); + QVERIFY(data.contains("Style=Basic")); +} + +void TestProjectManager::testUnregisterResource() +{ + ProjectManager projectManager; + const QString resourcePath = ":/data/test_project_unregister"; + bool result = projectManager.registerResource(m_projectThatCanRun, resourcePath); + QVERIFY(result); + + result = projectManager.unregisterResource(m_projectThatCanRun, resourcePath); + QVERIFY(result); + + const QFile file(resourcePath + "/test_project.qmlproject"); + QVERIFY(!file.exists()); +} + +void TestProjectManager::testCopyResourceToFs() +{ + ProjectManager projectManager; + const QString resourcePath = ":/data/test_project_copy"; + bool result = projectManager.registerResource(m_projectThatCanRun, resourcePath); + QVERIFY(result); + + const QString destinationPath = QDir::tempPath() + "/test_project_copy"; + result = projectManager.copyResourceToFs(resourcePath, destinationPath); + QVERIFY(result); + + const QStringList sourceFiles = QDir(resourcePath).entryList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot); + const QStringList destFiles = QDir(destinationPath).entryList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot); + + QVERIFY(sourceFiles.size() == destFiles.size()); + QCOMPARE(sourceFiles, destFiles); +} + +void TestProjectManager::testUnpackProject() +{ + ProjectManager projectManager; + const QString projectPath = projectManager.unpackProject(m_projectThatCanRun); + QVERIFY(!projectPath.isEmpty()); + QVERIFY(QFile::exists(projectPath + "/test_project.qmlproject")); + QVERIFY(QFile::exists(projectPath + "/qtquickcontrols2.conf")); +} + +void TestProjectManager::testRunProjectInternal() +{ + ProjectManager projectManager; + + const bool result = projectManager.runProjectInternal(m_projectThatCanRun); + + QVERIFY(result); + QVERIFY(projectManager.m_qmlEngine); + QVERIFY(projectManager.m_qmlComponent); + QVERIFY(projectManager.m_quickWindow); + QVERIFY(projectManager.m_quickWindow->isVisible() == false); +} + +void TestProjectManager::testFindFile() +{ + ProjectManager projectManager; + const QString projectPath = projectManager.unpackProject(m_projectThatCanRun); + QVERIFY(!projectPath.isEmpty()); + + const QString qmlProjectFile = projectManager.findFile(projectPath, "*.qmlproject", false); + QVERIFY(!qmlProjectFile.isEmpty()); + QVERIFY(qmlProjectFile.contains("test_project.qmlproject")); +} + +void TestProjectManager::testReadQmlProjectFile() +{ + ProjectManager projectManager; + const QString projectPath = projectManager.unpackProject(m_projectThatCanRun); + QVERIFY(!projectPath.isEmpty()); + + const QString qmlProjectFile = projectManager.findFile(projectPath, "*.qmlproject", false); + QVERIFY(!qmlProjectFile.isEmpty()); + + const QString qmlProjectFileContent = projectManager.readQmlProjectFile(qmlProjectFile); + QVERIFY(!qmlProjectFileContent.isEmpty()); + QVERIFY(qmlProjectFileContent.contains("mainFile: \"test_projectContent/App.qml\"")); +} + +void TestProjectManager::testGetMainQmlFile() +{ + ProjectManager projectManager; + const QString projectPath = projectManager.unpackProject(m_projectThatCanRun); + QVERIFY(!projectPath.isEmpty()); + + const QString qmlProjectFile = projectManager.findFile(projectPath, "*.qmlproject", false); + QVERIFY(!qmlProjectFile.isEmpty()); + + const QString qmlProjectFileContent = projectManager.readQmlProjectFile(qmlProjectFile); + QVERIFY(!qmlProjectFileContent.isEmpty()); + + const QString mainQmlFile = projectManager.getMainQmlFile(projectPath, qmlProjectFileContent); + QVERIFY(!mainQmlFile.isEmpty()); + QCOMPARE(mainQmlFile, projectPath + "/test_projectContent/App.qml"); +} + +void TestProjectManager::testGetImportPaths() +{ + ProjectManager projectManager; + const QString projectPath = projectManager.unpackProject(m_projectThatCanRun); + QVERIFY(!projectPath.isEmpty()); + + const QString qmlProjectFile = projectManager.findFile(projectPath, "*.qmlproject", false); + QVERIFY(!qmlProjectFile.isEmpty()); + + const QString qmlProjectFileContent = projectManager.readQmlProjectFile(qmlProjectFile); + QVERIFY(!qmlProjectFileContent.isEmpty()); + + const QStringList importPaths = projectManager.getImportPaths(projectPath, qmlProjectFileContent); + QVERIFY(importPaths.size() == 1); + QCOMPARE(importPaths.at(0), projectPath + "/."); +} + +void TestProjectManager::testIsQt6Project() +{ + ProjectManager projectManager; + const QString projectPath = projectManager.unpackProject(m_projectThatCanRun); + QVERIFY(!projectPath.isEmpty()); + + const QString qmlProjectFile = projectManager.findFile(projectPath, "*.qmlproject", false); + QVERIFY(!qmlProjectFile.isEmpty()); + + const QString qmlProjectFileContent = projectManager.readQmlProjectFile(qmlProjectFile); + QVERIFY(!qmlProjectFileContent.isEmpty()); + + const bool result = projectManager.isQt6Project(qmlProjectFileContent); + QVERIFY(result); +} + +void TestProjectManager::testShowAppWindow() +{ + ProjectManager projectManager; + + projectManager.runProject(m_projectThatCanRun, true, "sessionId"); + QVERIFY(projectManager.m_quickWindow->isVisible() == false); + + projectManager.showAppWindow(); + QVERIFY(projectManager.m_quickWindow->isVisible()); +} diff --git a/tests/tst_projectmanager.h b/tests/tst_projectmanager.h new file mode 100644 index 0000000..a9c5b60 --- /dev/null +++ b/tests/tst_projectmanager.h @@ -0,0 +1,40 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#pragma once + +#include <QObject> + +#include "backend/projectmanager.h" + +class TestProjectManager : public QObject +{ + Q_OBJECT +private slots: + void initTestCase(); + + // public methods + void testRunProject(); + void testStopProject(); + + // protected methods - resource management + void testRegisterResource(); + void testUnregisterResource(); + void testCopyResourceToFs(); + void testUnpackProject(); + + // protected methods - project management + void testRunProjectInternal(); + void testFindFile(); + void testReadQmlProjectFile(); + void testGetMainQmlFile(); + void testGetImportPaths(); + void testIsQt6Project(); + + // protected methods - window management + void testShowAppWindow(); + +private: + QByteArray m_projectThatCanRun; + QByteArray m_projectThatCannotRun; +}; diff --git a/tests/tst_settings.cpp b/tests/tst_settings.cpp index a8922db..f860d33 100644 --- a/tests/tst_settings.cpp +++ b/tests/tst_settings.cpp @@ -5,22 +5,31 @@ #include <QTest> -#include "backend/settings.h" +void TestSettings::initTestCase() +{ + QVERIFY(m_settings.clearSettings()); +} void TestSettings::testAutoScaleProject() { - Settings settings; - QVERIFY(settings.autoScaleProject()); + QVERIFY(m_settings.autoScaleProject()); - settings.setAutoScaleProject(false); - QVERIFY(!settings.autoScaleProject()); + m_settings.setAutoScaleProject(false); + QVERIFY(!m_settings.autoScaleProject()); } void TestSettings::testDeviceUuid() { - Settings settings; - QVERIFY(settings.deviceUuid().isEmpty()); + QVERIFY(m_settings.deviceUuid().isEmpty()); + + m_settings.setDeviceUuid("1234567890"); + QCOMPARE(m_settings.deviceUuid(), QString("1234567890")); +} + +void TestSettings::testKeepScreenOn() +{ + QVERIFY(!m_settings.keepScreenOn()); - settings.setDeviceUuid("1234567890"); - QCOMPARE(settings.deviceUuid(), QString("1234567890")); + m_settings.setKeepScreenOn(true); + QVERIFY(m_settings.keepScreenOn()); } diff --git a/tests/tst_settings.h b/tests/tst_settings.h index 6c70c64..92cfed7 100644 --- a/tests/tst_settings.h +++ b/tests/tst_settings.h @@ -5,11 +5,18 @@ #include <QObject> +#include "backend/settings.h" + class TestSettings : public QObject { Q_OBJECT private slots: + void initTestCase(); void testAutoScaleProject(); void testDeviceUuid(); + void testKeepScreenOn(); + +private: + Settings m_settings; }; -- GitLab