-
Notifications
You must be signed in to change notification settings - Fork 14
Expand file tree
/
Copy pathandroid-uitest-run.sh
More file actions
205 lines (159 loc) · 7.48 KB
/
android-uitest-run.sh
File metadata and controls
205 lines (159 loc) · 7.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
# echo commands
set -x
if [[ "$VARIANT_NAME" == "Native" ]]; then
export APK_NAME="uno.platform.chefs"
else
export APK_NAME="uno.platform.chefs.skia"
fi
export BUILDCONFIGURATION=Release
export UNO_UITEST_PLATFORM=Android
export ANDROID_SIMULATOR_APILEVEL=34
export UNO_UITEST_ANDROID_PROJECT_PATH=$BUILD_SOURCESDIRECTORY/Chefs
export BASE_ARTIFACTS_PATH=$BUILD_ARTIFACTSTAGINGDIRECTORY/android/
export UNO_UITEST_SCREENSHOT_PATH=$BASE_ARTIFACTS_PATH/screenshots
export UNO_UITEST_PROJECT_PATH=$BUILD_SOURCESDIRECTORY/Chefs.UITests
export UNO_UITEST_PROJECT=$UNO_UITEST_PROJECT_PATH/Chefs.UITests.csproj
export UNO_UITEST_LOGFILE=$UNO_UITEST_SCREENSHOT_PATH/nunit-log.txt
export UNO_UITEST_NUNIT_VERSION=3.12.0
export UNO_UITEST_NUGET_URL=https://dist.nuget.org/win-x86-commandline/v5.7.0/nuget.exe
export UNO_ORIGINAL_TEST_RESULTS=$BUILD_SOURCESDIRECTORY/build/android-uitest-results-$VARIANT_NAME.xml
export UNO_UITEST_RUNTIMETESTS_RESULTS_FILE_PATH=$UNO_ORIGINAL_TEST_RESULTS
# Prefer the signed APK from build artifacts (Windows job) when available,
# otherwise fall back to the unsigned APK published locally by the UITest job (macOS agent).
APK_FROM_ARTIFACT="$(ls "$BUILD_SOURCESDIRECTORY/build/Android_UITest_${VARIANT_NAME}/android-uitest/"*-Signed.apk 2>/dev/null | head -n 1 || true)"
APK_FROM_LOCAL="$(ls $BUILD_SOURCESDIRECTORY/Chefs/bin/Release/net10.0-android/android-x64/publish/*.apk 2>/dev/null | head -n 1 || true)"
if [ -f "$APK_FROM_ARTIFACT" ]; then
export UNO_UITEST_ANDROIDAPK_PATH="$APK_FROM_ARTIFACT"
elif [ -f "$APK_FROM_LOCAL" ]; then
export UNO_UITEST_ANDROIDAPK_PATH="$APK_FROM_LOCAL"
else
echo "ERROR: APK not found (neither $APK_FROM_ARTIFACT nor a local publish APK)."
exit 1
fi
echo "Using APK: $UNO_UITEST_ANDROIDAPK_PATH"
# .NET 9 UITest workaround (maui#31072): ensure assemblies.blob exists inside the APK
# UITest sometimes refuses to run if no assemblies store is present.
# Related issue: https://github.com/dotnet/maui/issues/31072
command -v zip >/dev/null || { echo "ERROR: 'zip' not found on PATH"; exit 1; }
(
set -e
tmpdir="$(mktemp -d)"
touch "$tmpdir/assemblies.blob"
(cd "$tmpdir" && zip -q "$UNO_UITEST_ANDROIDAPK_PATH" assemblies.blob)
rm -rf "$tmpdir"
)
export UNO_EMULATOR_INSTALLED=$BUILD_SOURCESDIRECTORY/build/.emulator_started
export UNO_TESTS_RESPONSE_FILE=$BUILD_SOURCESDIRECTORY/build/nunit.response
export UITEST_TEST_TIMEOUT=60m
export UNO_UITEST_BINARY=$BUILD_SOURCESDIRECTORY/Chefs.UITests/bin/Release/net10.0/Chefs.UITests.dll
mkdir -p $UNO_UITEST_SCREENSHOT_PATH
cd $BUILD_SOURCESDIRECTORY/build
export ANDROID_HOME=$BUILD_SOURCESDIRECTORY/build/android-sdk
export ANDROID_SDK_ROOT=$BUILD_SOURCESDIRECTORY/build/android-sdk
export LATEST_CMDLINE_TOOLS_PATH=$ANDROID_SDK_ROOT/cmdline-tools/latest
export CMDLINETOOLS=commandlinetools-mac-8512546_latest.zip
mkdir -p $ANDROID_HOME
if [ -d $LATEST_CMDLINE_TOOLS_PATH ];
then
rm -rf $LATEST_CMDLINE_TOOLS_PATH
fi
wget https://dl.google.com/android/repository/$CMDLINETOOLS
unzip -o $CMDLINETOOLS -d $ANDROID_HOME/cmdline-tools
rm $CMDLINETOOLS
mv $ANDROID_SDK_ROOT/cmdline-tools/cmdline-tools $LATEST_CMDLINE_TOOLS_PATH
TEST_FAILED_FLAG=.tests-failed
AVD_NAME=xamarin_android_emulator
AVD_CONFIG_FILE=~/.android/avd/$AVD_NAME.avd/config.ini
EMU_UPDATE_FILE=~/.android/emu-update-last-check.ini
SDK_MGR_TOOLS_FLAG=.sdk_toolkit_installed
install_android_sdk() {
SIMULATOR_APILEVEL=$1
if [[ ! -f $SDK_MGR_TOOLS_FLAG ]];
then
touch $SDK_MGR_TOOLS_FLAG
echo "y" | $LATEST_CMDLINE_TOOLS_PATH/bin/sdkmanager --sdk_root=${ANDROID_HOME} --install 'tools'| tr '\r' '\n' | uniq
echo "y" | $LATEST_CMDLINE_TOOLS_PATH/bin/sdkmanager --sdk_root=${ANDROID_HOME} --install 'platform-tools' | tr '\r' '\n' | uniq
echo "y" | $LATEST_CMDLINE_TOOLS_PATH/bin/sdkmanager --sdk_root=${ANDROID_HOME} --install 'build-tools;35.0.0' | tr '\r' '\n' | uniq
echo "y" | $LATEST_CMDLINE_TOOLS_PATH/bin/sdkmanager --sdk_root=${ANDROID_HOME} --install 'extras;android;m2repository' | tr '\r' '\n' | uniq
fi
echo "y" | $LATEST_CMDLINE_TOOLS_PATH/bin/sdkmanager --sdk_root=${ANDROID_HOME} --install "platforms;android-$SIMULATOR_APILEVEL" | tr '\r' '\n' | uniq
echo "y" | $LATEST_CMDLINE_TOOLS_PATH/bin/sdkmanager --sdk_root=${ANDROID_HOME} --install "system-images;android-$SIMULATOR_APILEVEL;google_apis_playstore;x86_64" | tr '\r' '\n' | uniq
}
if [[ ! -f $EMU_UPDATE_FILE ]];
then
touch $EMU_UPDATE_FILE
fi
if [[ ! -f $AVD_CONFIG_FILE ]];
then
# Install AVD files
install_android_sdk $ANDROID_SIMULATOR_APILEVEL
install_android_sdk 35
if [[ -f $ANDROID_HOME/platform-tools/platform-tools/adb ]]
then
# It appears that the platform-tools 29.0.6 are extracting into an incorrect path
mv $ANDROID_HOME/platform-tools/platform-tools/* $ANDROID_HOME/platform-tools
fi
# Create emulator
echo "no" | $LATEST_CMDLINE_TOOLS_PATH/bin/avdmanager create avd -n "$AVD_NAME" --abi "x86_64" -k "system-images;android-$ANDROID_SIMULATOR_APILEVEL;google_apis_playstore;x86_64" --sdcard 128M --force
# based on https://docs.microsoft.com/en-us/azure/devops/pipelines/agents/hosted?view=azure-devops&tabs=yaml#hardware
# >> Agents that run macOS images are provisioned on Mac pros with a 3 core CPU, 14 GB of RAM, and 14 GB of SSD disk space.
echo "hw.cpu.ncore=3" >> $AVD_CONFIG_FILE
# Bump the heap size as the tests are stressing the application
echo "vm.heapSize=256M" >> $AVD_CONFIG_FILE
$ANDROID_HOME/emulator/emulator -list-avds
echo "Checking for hardware acceleration"
$ANDROID_HOME/emulator/emulator -accel-check
echo "Starting emulator"
# kickstart ADB
$ANDROID_HOME/platform-tools/adb devices
# Start emulator in background
nohup $ANDROID_HOME/emulator/emulator -avd "$AVD_NAME" -skin 1280x800 -no-window -gpu swiftshader_indirect -no-snapshot -noaudio -no-boot-anim > $UNO_UITEST_SCREENSHOT_PATH/android-emulator-log.txt 2>&1 &
# Wait for the emulator to finish booting
source $BUILD_SOURCESDIRECTORY/build/scripts/android-uitest-wait-systemui.sh 500
else
# Restart the emulator to avoid running first-time tasks
$ANDROID_HOME/platform-tools/adb reboot
# Wait for the emulator to finish booting
source $BUILD_SOURCESDIRECTORY/build/scripts/android-uitest-wait-systemui.sh 500
fi
# list active devices
$ANDROID_HOME/platform-tools/adb devices
# Workaround for https://github.com/microsoft/appcenter/issues/1451
$ANDROID_HOME/platform-tools/adb shell settings put global hidden_api_policy 1
echo "Emulator started"
cp $UNO_UITEST_ANDROIDAPK_PATH $BASE_ARTIFACTS_PATH
cd $UNO_UITEST_PROJECT_PATH
dotnet build /r /p:TargetFrameworkOverride=net10.0-android "/p:UseSkiaRendering=$USE_SKIA_RENDERING" /p:Configuration=Release
## Run tests
if dotnet test $UNO_UITEST_BINARY \
-l:"console;verbosity=normal" \
--logger "nunit;LogFileName=$UNO_UITEST_RUNTIMETESTS_RESULTS_FILE_PATH" \
--blame-hang-timeout $UITEST_TEST_TIMEOUT \
-v m;
then
echo "Tests passed"
rm -f $TEST_FAILED_FLAG
else
echo "Tests failed"
if [[ ! -f $TEST_FAILED_FLAG ]];
then
touch $TEST_FAILED_FLAG
fi
fi
## Copy the results file to the results folder
cp $UNO_UITEST_RUNTIMETESTS_RESULTS_FILE_PATH $BASE_ARTIFACTS_PATH
## Dump the emulator's system log
$ANDROID_HOME/platform-tools/adb shell logcat -d > $UNO_UITEST_SCREENSHOT_PATH/android-device-log.txt
if [[ ! -f $UNO_ORIGINAL_TEST_RESULTS ]]; then
echo "ERROR: The test results file $UNO_ORIGINAL_TEST_RESULTS does not exist (did nunit crash ?)"
# Cleanly fails the job
exit 1
fi
if [[ -f $TEST_FAILED_FLAG ]]; then
echo "ERROR: The tests failed"
# Cleanly fails the job
exit 1
fi