Compare commits

...
Author SHA1 Message Date
MrMirDan c226265e33 search and check test apk 2026-10-23 15:35:04 +03:00
MrMirDan 35b65484e7 proper script 2026-10-23 14:52:45 +03:00
MrMirDan c60b04ca46 run some api tests on android 2026-10-23 14:20:56 +03:00
4 changed files with 80 additions and 148 deletions

No files matched your search

+5 -87
View File
@@ -1535,98 +1535,16 @@ jobs:
# KEYSTORE_BASE64: ${{ secrets.ANDROID_RELEASE_KEYSTORE_BASE64 }}
# run: echo $KEYSTORE_BASE64 | base64 --decode > android.keystore
- name: 'Configure (Android x86_64)'
env:
QT_ANDROID: ${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/android_x86_64
QT_HOST: ${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/gcc_64
CMAKE_ANDROID_NDK: ${{ env.ANDROID_HOME }}/ndk/${{ env.NDK_VERSION }}
run: |
cmake -S . -B build -G Ninja \
-DCMAKE_BUILD_TYPE=Debug \
-DCMAKE_TOOLCHAIN_FILE=$QT_ANDROID/lib/cmake/Qt6/qt.toolchain.cmake \
-DANDROID_PLATFORM=${{ env.ANDROID_PLATFORM }} \
-DCMAKE_ANDROID_NDK=$CMAKE_ANDROID_NDK \
-DQT_HOST_PATH=$QT_HOST \
-DANDROID_SDK_ROOT=$ANDROID_HOME \
-DAMNEZIA_BUILD_TESTS=ON
- name: 'Build Android tests'
# env:
# QT_ANDROID_KEYSTORE_PATH: ${{ github.workspace }}/android.keystore
# QT_ANDROID_KEYSTORE_ALIAS: ${{ secrets.ANDROID_RELEASE_KEYSTORE_KEY_ALIAS }}
# QT_ANDROID_KEYSTORE_STORE_PASS: ${{ secrets.ANDROID_RELEASE_KEYSTORE_KEY_PASS }}
run: |
cmake --build build --target test_android_openssl_make_apk
cmake --build build --target test_android_restore_backup_make_apk
- name: 'Write Android test runner script'
run: |
cat > ci_run_android_tests.sh << 'EOF'
#!/usr/bin/env bash
set -euo pipefail
ADB=$(which adb)
echo ">>> Waiting for package manager to be ready..."
"$ADB" shell 'while ! pm list packages > /dev/null 2>&1; do sleep 2; done'
echo ">>> Package manager ready."
run_test() {
local target="$1"
local apk="build/client/tests/android-build/${target}.apk"
local pkg_name="org.qtproject.example.${target}"
local activity="${pkg_name}/org.qtproject.qt.android.bindings.QtActivity"
echo ">>> Installing ${target} APK..."
timeout 120 "$ADB" install -r "$apk"
"$ADB" shell "run-as $pkg_name sh -c 'mkdir -p files && : > files/stdout.txt'" 2>/dev/null || true
"$ADB" shell "run-as $pkg_name sh -c 'rm -f files/qtest_last_exit_code'" 2>/dev/null || true
echo ">>> Launching ${target}..."
"$ADB" shell am start -n "$activity"
echo ">>> Waiting for test to finish (up to 120s)..."
local elapsed=0 exit_code=""
while [[ $elapsed -lt 120 ]]; do
sleep 2
elapsed=$((elapsed + 2))
exit_code=$("$ADB" shell \
"run-as $pkg_name cat files/qtest_last_exit_code 2>/dev/null" \
| tr -d '[:space:]' || true)
[[ -n "$exit_code" ]] && break
done
local stdout_content
stdout_content=$("$ADB" shell \
"run-as $pkg_name cat files/stdout.txt 2>/dev/null" || true)
if [[ -n "$stdout_content" ]]; then
echo ">>> Test output:"
echo "$stdout_content"
fi
if [[ -z "$exit_code" ]]; then
echo ">>> TIMEOUT: ${target} did not complete within 120s."
exit 1
elif [[ "$exit_code" != "0" ]]; then
echo ">>> ${target} FAILED (exit code: $exit_code)"
exit 1
else
echo ">>> ${target} PASSED"
fi
}
run_test test_android_openssl
run_test test_android_restore_backup
EOF
chmod +x ci_run_android_tests.sh
- name: 'Run Android tests on emulator'
uses: reactivecircus/android-emulator-runner@v2
env:
QT_ROOT: ${{ runner.temp }}/Qt/${{ env.QT_VERSION }}
NDK_VERSION: ${{ env.NDK_VERSION }}
ANDROID_PLATFORM: ${{ env.ANDROID_PLATFORM }}
with:
api-level: 28
arch: x86_64
emulator-options: -no-snapshot -no-window -no-audio -no-boot-anim -accel on
disable-animations: true
script: bash ci_run_android_tests.sh
script: bash client/tests/run_android_tests.sh --wait-boot
+2 -2
View File
@@ -416,8 +416,8 @@ endif()
if(NOT ANDROID)
add_subdirectory(selfHostedAdmin)
add_subdirectory(api)
endif()
add_subdirectory(api)
enable_testing()
@@ -443,7 +443,7 @@ if(NOT ANDROID)
add_test(NAME LogsControllerTest COMMAND test_logs_controller)
endif()
# Android tests are executed on-device via androidtestrunner in CI (see .github/workflows/tests.yml).
# Android tests are executed on-device via androidtestrunner in CI (see .github/workflows/deploy.yml).
# CTest cannot run Android binaries on the host machine, so no add_test() entries are registered here.
amnezia_copy_runtime_dlls()
+38 -54
View File
@@ -1,85 +1,68 @@
add_executable(test_ui_news_model_and_controller
function(add_new_test target source)
if(ANDROID)
qt_add_executable(${target}
${source}
${ARGN}
)
else()
add_executable(${target}
${source}
${ARGN}
)
endif()
target_link_libraries(${target} PRIVATE
Qt6::Test
test_common
)
# These tests are selected for execution on the Android emulator.
if(ANDROID AND "${target}" MATCHES
"^(test_ui_api_account_info_model|test_ui_subscription_controller|test_ui_services_model_and_controller)$")
set_target_properties(${target} PROPERTIES
QT_ANDROID_PACKAGE_SOURCE_DIR "${ANDROID_TEST_PACKAGE_DIR}"
)
endif()
endfunction()
add_new_test(test_ui_news_model_and_controller
testUiNewsModelAndController.cpp
)
target_link_libraries(test_ui_news_model_and_controller PRIVATE
Qt6::Test
test_common
)
add_executable(test_gateway_service_import
add_new_test(test_gateway_service_import
testGatewayServiceImport.cpp
)
target_link_libraries(test_gateway_service_import PRIVATE
Qt6::Test
test_common
)
add_executable(test_ui_services_model_and_controller
add_new_test(test_ui_services_model_and_controller
testUiServicesModelAndController.cpp
)
target_link_libraries(test_ui_services_model_and_controller PRIVATE
Qt6::Test
test_common
)
add_executable(test_ui_subscription_controller
add_new_test(test_ui_subscription_controller
testSubscriptionUiController.cpp
)
target_link_libraries(test_ui_subscription_controller PRIVATE
Qt6::Test
test_common
)
add_executable(test_ui_api_account_info_model
add_new_test(test_ui_api_account_info_model
testUiApiAccountInfoModel.cpp
)
target_link_libraries(test_ui_api_account_info_model PRIVATE
Qt6::Test
test_common
)
add_executable(test_api_benefits_model
add_new_test(test_api_benefits_model
testApiBenefitsModel.cpp
)
target_link_libraries(test_api_benefits_model PRIVATE
Qt6::Test
test_common
)
add_executable(test_api_country_model
add_new_test(test_api_country_model
testApiCountryModel.cpp
)
target_link_libraries(test_api_country_model PRIVATE
Qt6::Test
test_common
)
add_executable(test_api_country_list_model
add_new_test(test_api_country_list_model
testApiCountryListModel.cpp
${CLIENT_ROOT_DIR}/resources/countries.qrc
)
target_link_libraries(test_api_country_list_model PRIVATE
Qt6::Test
test_common
)
add_executable(test_api_devices_model
add_new_test(test_api_devices_model
testApiDevicesModel.cpp
)
target_link_libraries(test_api_devices_model PRIVATE
Qt6::Test
test_common
)
if(NOT ANDROID)
add_test(NAME UiNewsModelAndControllerTest COMMAND test_ui_news_model_and_controller)
add_test(NAME GatewayServiceImportTest COMMAND test_gateway_service_import)
add_test(NAME UiServicesModelAndControllerTest COMMAND test_ui_services_model_and_controller)
@@ -89,5 +72,6 @@ add_test(NAME ApiBenefitsModelTest COMMAND test_api_benefits_model)
add_test(NAME ApiCountryModelTest COMMAND test_api_country_model)
add_test(NAME ApiCountryListModelTest COMMAND test_api_country_list_model)
add_test(NAME ApiDevicesModelTest COMMAND test_api_devices_model)
endif()
amnezia_copy_runtime_dlls()
+35 -5
View File
@@ -19,6 +19,10 @@
# bash client/tests/run_android_tests.sh --abi arm64-v8a # physical ARM device
# bash client/tests/run_android_tests.sh --test openssl # only openssl test
# bash client/tests/run_android_tests.sh --test restore_backup # only restore-backup test
# bash client/tests/run_android_tests.sh --test api # selected API tests
# bash client/tests/run_android_tests.sh --test account_info # account info model test
# bash client/tests/run_android_tests.sh --test subscription_controller
# bash client/tests/run_android_tests.sh --test services_model_and_controller
# bash client/tests/run_android_tests.sh --wait-boot # wait for emulator to boot first
set -euo pipefail
@@ -33,7 +37,7 @@ ANDROID_PLATFORM="${ANDROID_PLATFORM:-android-28}"
ABI="${ABI:-x86_64}"
ABI_DIR="${ABI//-/_}"
BUILD_DIR="${BUILD_DIR:-build/android_${ABI_DIR}}"
TEST_FILTER="all" # "all" | "openssl" | "restore_backup"
TEST_FILTER="all"
WAIT_BOOT=false # set to true or pass --wait-boot to wait for emulator startup
DEVICE_SERIAL="" # specific device serial; empty = use ANDROID_SERIAL or first device
# ──────────────────────────────────────────────────────────────────────────────
@@ -204,8 +208,6 @@ ADB_BIN=$(which adb)
run_test() {
local target="$1"
local apk_dir="$BUILD_DIR/client/tests/android-build"
local apk="$apk_dir/${target}.apk"
local pkg_name="org.qtproject.example.${target}"
local activity="${pkg_name}/org.qtproject.qt.android.bindings.QtActivity"
@@ -213,7 +215,27 @@ run_test() {
echo ">>> Building $target APK..."
cmake --build "$BUILD_DIR" --target "${target}_make_apk"
echo ">>> Installing $target APK on device..."
local apk=""
local candidates=(
"$BUILD_DIR/client/tests/android-build/${target}.apk"
"$BUILD_DIR/client/tests/api/android-build/build/outputs/apk/debug/android-build-debug.apk"
)
for candidate in "${candidates[@]}"; do
if [[ -f "$candidate" ]]; then
apk="$candidate"
break
fi
done
if [[ -z "$apk" ]]; then
echo "ERROR: APK not found for $target."
echo "APK files found in build directory:"
find "$BUILD_DIR/client/tests" -type f -name '*.apk' -print
return 1
fi
echo ">>> Installing $target APK on device: $apk"
"$ADB_BIN" install -r "$apk"
# Pre-create files/stdout.txt before launching so the test process finds it
@@ -262,6 +284,9 @@ case "$TEST_FILTER" in
all)
run_test test_android_openssl
run_test test_android_restore_backup
run_test test_ui_api_account_info_model
run_test test_ui_subscription_controller
run_test test_ui_services_model_and_controller
;;
openssl)
run_test test_android_openssl
@@ -269,8 +294,13 @@ case "$TEST_FILTER" in
restore_backup)
run_test test_android_restore_backup
;;
api)
run_test test_ui_api_account_info_model
run_test test_ui_subscription_controller
run_test test_ui_services_model_and_controller
;;
*)
echo "Unknown --test value: $TEST_FILTER (use 'all', 'openssl', or 'restore_backup')"
echo "Unknown --test value: $TEST_FILTER (use 'all', 'openssl', 'restore_backup', or 'api')"
exit 1
;;
esac