Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Misc android and canary updates #1182

Merged
merged 8 commits into from
Dec 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions Uno.Gallery.UITests/Given_Card_01.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,12 @@ public class Given_Card_01 : TestBase
[Test]
public void When_01_OutlinedCardClick()
{
if (AppInitializer.GetLocalPlatform() == Platform.Browser)
{
// The entered text fails to show more than one character
Assert.Ignore("Randomly not passing on Wasm");
}

//Navigation to Card control
NavigateToSample("Card", "Material");

Expand Down
6 changes: 6 additions & 0 deletions Uno.Gallery.UITests/Given_RadioButton_02_Fluent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,12 @@ public class Given_RadioButton_02_Fluent : TestBase
[Ignore("Failing in CI")]
public void WhenRadioButtonFluentClick_01_Unchecked()
{
if (AppInitializer.GetLocalPlatform() == Platform.Browser)
{
// The entered text fails to show more than one character
Assert.Ignore("Randomly not passing on Wasm");
}

NavigateToSample("RadioButton", "Fluent");

var fluentUncheckRadioButton = new QueryEx(x => x.All().Marked("RadioButton_Fluent_Unchecked"));
Expand Down
4 changes: 4 additions & 0 deletions Uno.Gallery/App.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,10 @@ public App()
InitializeLogging();
ConfigureXamlDisplay();

#if HAS_UNO
global::Uno.UI.FeatureConfiguration.Font.DefaultTextFontFamily = "ms-appx:///Uno.Fonts.OpenSans/Fonts/OpenSans.ttf";
#endif

this.InitializeComponent();

#if !WINDOWS
Expand Down
1 change: 0 additions & 1 deletion Uno.Gallery/Uno.Gallery.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,6 @@
<ItemGroup>
<PackageReference Include="Uno.ShowMeTheXAML" />
<PackageReference Include="Uno.ShowMeTheXAML.MSBuild" />
<PackageReference Include="Microsoft.Extensions.Logging" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" />
<PackageReference Include="Uno.Core.Extensions.Disposables" />
<PackageReference Include="Uno.Core.Extensions.Compatibility" />
Expand Down
2 changes: 1 addition & 1 deletion azure-pipelines.yml
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ stages:
displayName: 'WebAssembly'
dependsOn: []
jobs:
- job: Linux
- job: WebAssembly
timeoutInMinutes: 60
pool:
vmImage: ubuntu-latest
Expand Down
49 changes: 39 additions & 10 deletions build/scripts/android-uitest-run.sh
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,11 @@ export UNO_UITEST_ANDROID_PROJECT=$BUILD_SOURCESDIRECTORY/Uno.Gallery
export UNO_UITEST_BINARY=$BUILD_SOURCESDIRECTORY/Uno.Gallery.UITests/bin/Release/net47/Uno.Gallery.UITests.dll
export UNO_EMULATOR_INSTALLED=$BUILD_SOURCESDIRECTORY/build/.emulator_started
export UITEST_TEST_TIMEOUT=60m
export UNO_UITEST_ANDROIDAPK_PATH=$UNO_UITEST_ANDROIDAPK_BASEPATH/com.nventive.uno.ui.demo-Signed.apk
export ANDROID_SIMULATOR_APILEVEL=28

AVD_NAME=xamarin_android_emulator
AVD_CONFIG_FILE=~/.android/avd/$AVD_NAME.avd/config.ini

# Override Android SDK tooling
export ANDROID_HOME=$BUILD_SOURCESDIRECTORY/build/android-sdk
Expand All @@ -29,28 +34,47 @@ then
mv $ANDROID_HOME/platform-tools/platform-tools/* $ANDROID_HOME/platform-tools
fi

AVD_NAME=xamarin_android_emulator
AVD_CONFIG_FILE=~/.android/avd/$AVD_NAME.avd/config.ini

# Install Android SDK emulators and SDKs
if [ ! -f "$UNO_EMULATOR_INSTALLED" ];
then
echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --sdk_root=${ANDROID_HOME} --install 'tools'| tr '\r' '\n' | uniq
echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --sdk_root=${ANDROID_HOME} --install 'platform-tools' | tr '\r' '\n' | uniq
echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --sdk_root=${ANDROID_HOME} --install 'build-tools;35.0.0' | tr '\r' '\n' | uniq
echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --sdk_root=${ANDROID_HOME} --install 'platforms;android-28' | tr '\r' '\n' | uniq
echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --sdk_root=${ANDROID_HOME} --install 'platforms;android-34' | tr '\r' '\n' | uniq
echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --sdk_root=${ANDROID_HOME} --install 'extras;android;m2repository' | tr '\r' '\n' | uniq
echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --sdk_root=${ANDROID_HOME} --install "tools"| tr '\r' '\n' | uniq
echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --sdk_root=${ANDROID_HOME} --install "platform-tools" | tr '\r' '\n' | uniq
echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --sdk_root=${ANDROID_HOME} --install "build-tools;35.0.0" | tr '\r' '\n' | uniq
echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --sdk_root=${ANDROID_HOME} --install "platforms;android-$ANDROID_SIMULATOR_APILEVEL" | tr '\r' '\n' | uniq
echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --sdk_root=${ANDROID_HOME} --install "extras;android;m2repository" | tr '\r' '\n' | uniq

# Install AVD files
echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --sdk_root=${ANDROID_HOME} --install 'system-images;android-28;google_apis_playstore;x86_64'
echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --sdk_root=${ANDROID_HOME} --install "system-images;android-$ANDROID_SIMULATOR_APILEVEL;google_apis_playstore;x86_64"

# Create emulator
echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n xamarin_android_emulator --abi "x86_64" -k 'system-images;android-28;google_apis_playstore;x86_64' --force
echo "no" | $ANDROID_HOME/cmdline-tools/latest/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

echo $ANDROID_HOME/emulator/emulator -list-avds

echo "Starting emulator"

# Start emulator in background
nohup $ANDROID_HOME/emulator/emulator -avd xamarin_android_emulator -skin 1280x800 -memory 4096 -no-window -gpu swiftshader_indirect -no-snapshot -noaudio -no-boot-anim > /dev/null 2>&1 &
nohup $ANDROID_HOME/emulator/emulator \
-avd $AVD_NAME \
-skin 1280x800 \
-memory 4096 \
-no-window \
-gpu swiftshader_indirect \
-no-snapshot \
-noaudio \
-no-boot-anim \
-prop ro.debuggable=1 \
> $BUILD_ARTIFACTSTAGINGDIRECTORY/android-emulator-log.txt 2>&1 &

touch "$UNO_EMULATOR_INSTALLED"
fi
Expand All @@ -60,7 +84,7 @@ mkdir -p $UNO_UITEST_SCREENSHOT_PATH
cp $UNO_UITEST_ANDROIDAPK_PATH $UNO_UITEST_SCREENSHOT_PATH

# Wait for the emulator to finish booting
$ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 1; done; input keyevent 82'
source $BUILD_SOURCESDIRECTORY/build/scripts/android-uitest-wait-systemui.sh 500

$ANDROID_HOME/platform-tools/adb devices

Expand All @@ -75,3 +99,8 @@ dotnet test \
--blame-hang-timeout $UITEST_TEST_TIMEOUT \
-v m \
|| true

## Dump the emulator's system log
$ANDROID_HOME/platform-tools/adb shell logcat -d > $BUILD_ARTIFACTSTAGINGDIRECTORY/android-device-log.txt

$ANDROID_HOME/platform-tools/adb exec-out screencap -p > $BUILD_ARTIFACTSTAGINGDIRECTORY/android-end-run.png
102 changes: 102 additions & 0 deletions build/scripts/android-uitest-wait-systemui.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
#!/usr/bin/env bash
BOOT_TIMEOUT=$1
retry() {
local -r -i max_attempts="$1";shift 1
local -i attempt_num=1
local -a COMMANDS=( timeout $BOOT_TIMEOUT )

while (( "$#" )); do
local arg="$1";
if [[ "$arg" = *" "* ]]; then
COMMANDS+=( $( printf "\''%s'\'" "$arg" ) )
else
COMMANDS+=( "$arg" )
fi
shift
done

until "${COMMANDS[@]}"
do
if ((attempt_num==max_attempts))
then
echo "Last attempt $attempt_num failed, exiting."
return 1
else
echo "Attempt $attempt_num failed! Waiting $attempt_num seconds..."
sleep $((attempt_num++))
fi
done
}

echo ""
echo "[Waiting for device to boot] timeout $BOOT_TIMEOUT sec"

if [ $ANDROID_SIMULATOR_APILEVEL -gt 25 ];
then
retry 3 "$ANDROID_HOME/platform-tools/adb" wait-for-device shell 'echo "emulator is attached, wait for boot completion"; while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]] && [[ "$SECONDS" -lt 300 ]]; do sleep 1; done; input keyevent 82; echo "boot is complete."'
else
retry 3 "$ANDROID_HOME/platform-tools/adb" wait-for-device shell 'echo "emulator is attached, wait for boot completion"; while [[ -z $(getprop sys.boot_completed) ]] && [[ "$SECONDS" -lt 300 ]]; do sleep 1; done; input keyevent 82; echo "boot is complete."'
fi

# Wait for com.android.systemui to become available,
# as the CPU of the build machine may be slow
# See: https://stackoverflow.com/questions/52410440/error-system-ui-isnt-responding-while-running-aosp-build-on-emulator
#

echo "boot_completed after $SECONDS"
echo "[Waiting for launcher to start]"
LAUNCHER_READY=
MAX_START_TIME=300
START_TIME=$SECONDS
while [[ -z ${LAUNCHER_READY} ]]; do

if [ $ANDROID_SIMULATOR_APILEVEL -ge 29 ];
then
UI_FOCUS=`$ANDROID_HOME/platform-tools/adb shell dumpsys window 2>/dev/null | grep -E 'mCurrentFocus|mFocusedApp' || true`
else
UI_FOCUS=`$ANDROID_HOME/platform-tools/adb shell dumpsys window windows 2>/dev/null | grep -i mCurrentFocus || true`
fi

ELAPSED_TIME=$(( SECONDS - START_TIME ))
if [ ${ELAPSED_TIME} -gt ${MAX_START_TIME} ];
then
echo "(FAIL) Emulator failed to start properly after $MAX_START_TIME"
exit 1
fi

echo "(DEBUG $SECONDS) Current focus: ${UI_FOCUS}"

case $UI_FOCUS in
*"Not Responding"*)
echo "Detected an ANR! Dismissing..."
$ANDROID_HOME/platform-tools/adb shell input keyevent KEYCODE_DPAD_RIGHT
$ANDROID_HOME/platform-tools/adb shell input keyevent KEYCODE_ENTER
;;
*"Launcher"*)
LAUNCHER_READY=true
;;
"")
echo "Waiting for window service..."
sleep 3
;;
*)
echo "Waiting for launcher..."
sleep 3

# For some reason the messaging app can be brought up in front
# (DEBUG) Current focus: mCurrentFocus=Window{1170051 u0 com.google.android.apps.messaging/com.google.android.apps.messaging.ui.ConversationListActivity}
# Try bringing back the home screen to check on the launcher.
$ANDROID_HOME/platform-tools/adb shell input keyevent KEYCODE_HOME
;;
esac
done

# Force terminate system UI to restart clean
"$ANDROID_HOME/platform-tools/adb" shell am force-stop com.android.systemui

"$ANDROID_HOME/platform-tools/adb" shell settings put global animator_duration_scale 0
"$ANDROID_HOME/platform-tools/adb" shell settings put global transition_animation_scale 0
"$ANDROID_HOME/platform-tools/adb" shell settings put global window_animation_scale 0

echo "Launcher is ready!"

25 changes: 19 additions & 6 deletions build/stage-uitests-android.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
jobs:
- job: Android_Tests_Build
displayName: 'Android UI Tests'
timeoutInMinutes: 60
timeoutInMinutes: 90
variables:
CI_Build: true
SourceLinkEnabled: false
Expand All @@ -14,8 +14,18 @@
clean: true

- template: templates/dotnet-install-mac.yml
parameters:
UnoCheckParameters: '--tfm net9.0-android'

- template: templates/canary-updater.yml

- task: PowerShell@2
displayName: 'Install coreutils'
inputs:
targetType: inline
script: |
brew install coreutils

- bash: |
chmod +x $(build.sourcesdirectory)/build/scripts/android-uitest-build.sh
$(build.sourcesdirectory)/build/scripts/android-uitest-build.sh
Expand Down Expand Up @@ -52,14 +62,17 @@
- download: current
artifact: Android_UITest

- template: templates/dotnet-install-mac.yml
parameters:
UnoCheckParameters: '--tfm net9.0-android'

- template: templates/canary-updater.yml

- task: PowerShell@2
displayName: 'Install coreutils'
inputs:
targetType: inline
script: |
brew install coreutils

- bash: |
export UNO_UITEST_ANDROIDAPK_PATH=$(Pipeline.Workspace)/Android_UITest/com.nventive.uno.ui.demo-Signed.apk
export UNO_UITEST_ANDROIDAPK_BASEPATH=$(Pipeline.Workspace)/Android_UITest
chmod +x $(build.sourcesdirectory)/build/scripts/android-uitest-run.sh
$(build.sourcesdirectory)/build/scripts/android-uitest-run.sh
displayName: Run Android Tests
Expand Down
12 changes: 6 additions & 6 deletions build/templates/canary-updater.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ steps:
packageType: 'sdk'
version: '9.0.100'

- task: nventiveCanaryUpdater@5
- task: unoplatformCanaryUpdater@1
displayName: 'Canary Update (dev)'
condition: startsWith(variables['Build.SourceBranch'], 'refs/heads/canaries/dev')
inputs:
Expand All @@ -15,11 +15,11 @@ steps:
usePrivateFeed: false
mergeBranch: true
branchToMerge: master
nugetUpdaterVersion: '2.3.0-alpha.65'
nugetUpdaterVersion: '1.1.0'
packageAuthor: 'nventive,uno platform'
summaryFile: '$(Build.ArtifactStagingDirectory)/Canary.md'

- task: nventiveCanaryUpdater@5
- task: unoplatformCanaryUpdater@1
displayName: 'Canary Update (5x)'
condition: startsWith(variables['Build.SourceBranch'], 'refs/heads/canaries/5x')
inputs:
Expand All @@ -28,7 +28,7 @@ steps:
useNuGetOrg: true
mergeBranch: true
branchToMerge: master
nugetUpdaterVersion: '2.3.0-alpha.65'
nugetUpdaterVersion: '1.1.0'
nugetVersion: feature.5x,dev
packageAuthor: 'nventive,unoplatform,uno platform'
summaryFile: '$(Build.ArtifactStagingDirectory)/Summary.md'
Expand All @@ -43,7 +43,7 @@ steps:


- powershell: |
dotnet tool uninstall nventive.nuget.updater.tool --tool-path $(Agent.TempDirectory)
dotnet tool uninstall uno.nuget.updater.tool --tool-path $(Agent.TempDirectory)
condition: startsWith(variables['Build.SourceBranch'], 'refs/heads/canaries')

- pwsh: |
Expand All @@ -56,7 +56,7 @@ steps:
condition: startsWith(variables['Build.SourceBranch'], 'refs/heads/canaries')

- pwsh: |
gci -r -include AndroidManifest.xml,android-uitest-run.sh |
gci -r -include AndroidManifest.xml,android-uitest-*.sh |
foreach-object {
$a = $_.fullname; ( get-content $a ) |
foreach-object { $_ -replace "com.nventive.uno.ui.demo","com.nventive.uno.ui.demo.canary" } |
Expand Down
Loading