mirror of
https://github.com/amnezia-vpn/amnezia-client.git
synced 2026-10-29 08:08:20 +09:00
Compare commits
3
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c226265e33 | ||
|
|
35b65484e7 | ||
|
|
c60b04ca46 |
No files matched your search
@@ -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
|
||||
|
||||
@@ -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()
|
||||
@@ -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()
|
||||
@@ -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
|
||||
|
||||
Reference in new issue
Block a user