From 94003c37c1ffcb833cd763a31c28ddad1685033d Mon Sep 17 00:00:00 2001 From: Steve Bilogan Date: Wed, 1 Feb 2023 16:40:01 -0500 Subject: [PATCH 1/2] fix: Ensure NavBar closes Popup regardless of being within a Packages --- build/workflow/pipeline.yml | 5 +- build/workflow/scripts/android-uitest-run.sh | 77 ++++--- build/workflow/scripts/ios-uitest-run.sh | 56 ++--- build/workflow/scripts/wasm-uitest-run.sh | 49 +++-- build/workflow/stage-uitests-android.yml | 118 ++++++++-- build/workflow/stage-uitests-build.yml | 38 ++++ build/workflow/stage-uitests-ios.yml | 126 +++++++++-- build/workflow/stage-uitests-wasm.yml | 119 ++++++++-- build/workflow/templates/dotnet-install.yml | 15 ++ .../templates/dotnet6-install-windows.yml | 54 ----- ...nstall-mac.yml => dotnet7-install-mac.yml} | 22 +- .../templates/dotnet7-install-windows.yml | 34 +++ samples/Directory.Packages.props | 20 +- .../Properties/AndroidManifest.xml | 2 +- .../Uno.Toolkit.Samples.Droid.csproj | 4 +- .../Properties/AndroidManifest.xml | 2 +- .../Uno.Toolkit.WinUI.Samples.Droid.csproj | 4 +- src/Directory.Packages.props | 11 +- .../Tests/AutoLayoutTest.cs | 3 + .../Tests/NavigationBarTests.cs | 204 ++++++++++++++++++ .../Tests/TestPages/NavBarFirstPage.xaml | 14 ++ .../Tests/TestPages/NavBarFirstPage.xaml.cs | 44 ++++ .../Tests/TestPages/NavBarSecondPage.xaml | 14 ++ .../Tests/TestPages/NavBarSecondPage.xaml.cs | 43 ++++ .../Controls/NavigationBar/NavigationBar.cs | 33 +-- src/Uno.Toolkit.UITest/Constants.cs | 2 +- .../RuntimeTests/RuntimeTestRunner.cs | 190 ++++++++++++++++ src/Uno.Toolkit.UITest/TestBase.cs | 1 - .../Uno.Toolkit.UITest.csproj | 2 +- 29 files changed, 1083 insertions(+), 223 deletions(-) create mode 100644 build/workflow/stage-uitests-build.yml create mode 100644 build/workflow/templates/dotnet-install.yml delete mode 100644 build/workflow/templates/dotnet6-install-windows.yml rename build/workflow/templates/{dotnet6-install-mac.yml => dotnet7-install-mac.yml} (65%) create mode 100644 build/workflow/templates/dotnet7-install-windows.yml create mode 100644 src/Uno.Toolkit.RuntimeTests/Tests/NavigationBarTests.cs create mode 100644 src/Uno.Toolkit.RuntimeTests/Tests/TestPages/NavBarFirstPage.xaml create mode 100644 src/Uno.Toolkit.RuntimeTests/Tests/TestPages/NavBarFirstPage.xaml.cs create mode 100644 src/Uno.Toolkit.RuntimeTests/Tests/TestPages/NavBarSecondPage.xaml create mode 100644 src/Uno.Toolkit.RuntimeTests/Tests/TestPages/NavBarSecondPage.xaml.cs create mode 100644 src/Uno.Toolkit.UITest/RuntimeTests/RuntimeTestRunner.cs diff --git a/build/workflow/pipeline.yml b/build/workflow/pipeline.yml index ac8a22db2..fc343fa09 100644 --- a/build/workflow/pipeline.yml +++ b/build/workflow/pipeline.yml @@ -75,7 +75,7 @@ jobs: steps: - template: templates/gitversion.yml - - template: templates/dotnet6-install-windows.yml + - template: templates/dotnet7-install-windows.yml # This SDK version is needed as long as `uap10.0` will be supported in Uno.Core - powershell: .\build\Install-WindowsSdkISO.ps1 18362 @@ -126,7 +126,7 @@ jobs: provProfileSecureFile: Uno_Toolkit_iOS.mobileprovision - template: templates/gitversion.yml - - template: templates/dotnet6-install-mac.yml + - template: templates/dotnet7-install-mac.yml - bash: /bin/bash -c "sudo $AGENT_HOMEDIRECTORY/scripts/select-xamarin-sdk.sh $(XamarinSDKVersion)" displayName: Select Xamarin Version @@ -156,6 +156,7 @@ jobs: BUILD_SOLUTION: "src/Uno.Toolkit.sln" BUILD_BINLOG: "$(build.artifactstagingdirectory)/toolkit-build-$(ApplicationPlatform).binlog" +- template: stage-uitests-build.yml - template: stage-uitests-wasm.yml - template: stage-uitests-ios.yml - template: stage-uitests-android.yml diff --git a/build/workflow/scripts/android-uitest-run.sh b/build/workflow/scripts/android-uitest-run.sh index 76aa6b355..805d88697 100644 --- a/build/workflow/scripts/android-uitest-run.sh +++ b/build/workflow/scripts/android-uitest-run.sh @@ -5,25 +5,50 @@ IFS=$'\n\t' # echo commands set -x -export UNO_UITEST_SCREENSHOT_PATH=$BUILD_ARTIFACTSTAGINGDIRECTORY/screenshots/android +export BUILDCONFIGURATION=Release +export NUNIT_VERSION=3.12.0 + +if [ "$UITEST_TEST_MODE_NAME" == 'Automated' ]; +then + export TEST_FILTERS="namespace != 'Uno.Toolkit.UITest.RuntimeTests'"; +elif [ "$UITEST_TEST_MODE_NAME" == 'RuntimeTests' ]; +then + export TEST_FILTERS="class == 'Uno.Toolkit.UITest.RuntimeTests.RuntimeTestRunner'"; +fi export UNO_UITEST_PLATFORM=Android -export UNO_UITEST_ANDROIDAPK_PATH=$BUILD_SOURCESDIRECTORY/samples/$SAMPLE_PROJECT_NAME/$SAMPLE_PROJECT_NAME.Droid/bin/Release/$SAMPLE_PROJECT_NAME-Signed.apk +export BASE_ARTIFACTS_PATH=$BUILD_ARTIFACTSTAGINGDIRECTORY/android/$XAML_FLAVOR_BUILD/$UITEST_TEST_MODE_NAME +export UNO_UITEST_SCREENSHOT_PATH=$BASE_ARTIFACTS_PATH/screenshots +export UNO_UITEST_ANDROIDAPK_PATH=$BUILD_SOURCESDIRECTORY/build/$SAMPLEAPP_ARTIFACT_NAME/$SAMPLE_PROJECT_NAME-Signed.apk export UNO_UITEST_PROJECT=$BUILD_SOURCESDIRECTORY/src/Uno.Toolkit.UITest/Uno.Toolkit.UITest.csproj export UNO_UITEST_ANDROID_PROJECT=$BUILD_SOURCESDIRECTORY/samples/$SAMPLE_PROJECT_NAME/$SAMPLE_PROJECT_NAME.Droid/$SAMPLE_PROJECT_NAME.Droid.csproj -export UNO_UITEST_BINARY=$BUILD_SOURCESDIRECTORY/src/Uno.Toolkit.UITest/bin/Uno.Toolkit.UITest/Release/Uno.Toolkit.UITest.dll -export UNO_UITEST_NUNIT_VERSION=3.12.0 +export UNO_UITEST_BINARY=$BUILD_SOURCESDIRECTORY/build/toolkit-uitest-binaries/Uno.Toolkit.UITest.dll +export UNO_UITEST_NUNIT_VERSION=$NUNIT_VERSION export UNO_UITEST_NUGET_URL=https://dist.nuget.org/win-x86-commandline/v5.7.0/nuget.exe export UNO_EMULATOR_INSTALLED=$BUILD_SOURCESDIRECTORY/build/.emulator_started -export UNO_ORIGINAL_TEST_RESULTS=$BUILD_SOURCESDIRECTORY/build/TestResult-original.xml +export UNO_ORIGINAL_TEST_RESULTS=$BUILD_SOURCESDIRECTORY/build/$UNO_TEST_RESULTS_FILE_NAME +export UNO_UITEST_RUNTIMETESTS_RESULTS_FILE_PATH=$UNO_ORIGINAL_TEST_RESULTS export UNO_TESTS_RESPONSE_FILE=$BUILD_SOURCESDIRECTORY/build/nunit.response -export ANDROID_SIMULATOR_APILEVEL=28 -export CMDLINETOOLS=commandlinetools-mac-8512546_latest.zip -export ANDROID_SDK_ROOT=$ANDROID_HOME 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 + AVD_NAME=xamarin_android_emulator AVD_CONFIG_FILE=~/.android/avd/$AVD_NAME.avd/config.ini EMU_UPDATE_FILE=~/.android/emu-update-last-check.ini @@ -36,13 +61,13 @@ fi if [[ ! -f $AVD_CONFIG_FILE ]]; then # Install AVD files - 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;33.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 'extras;android;m2repository' | tr '\r' '\n' | uniq - echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --sdk_root=${ANDROID_HOME} --install 'system-images;android-28;google_apis_playstore;x86_64' | tr '\r' '\n' | uniq - 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" | tr '\r' '\n' | uniq + 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;33.0.0' | tr '\r' '\n' | uniq + echo "y" | $LATEST_CMDLINE_TOOLS_PATH/bin/sdkmanager --sdk_root=${ANDROID_HOME} --install 'platforms;android-28' | tr '\r' '\n' | uniq + echo "y" | $LATEST_CMDLINE_TOOLS_PATH/bin/sdkmanager --sdk_root=${ANDROID_HOME} --install 'extras;android;m2repository' | tr '\r' '\n' | uniq + echo "y" | $LATEST_CMDLINE_TOOLS_PATH/bin/sdkmanager --sdk_root=${ANDROID_HOME} --install 'system-images;android-28;google_apis_playstore;x86_64' | tr '\r' '\n' | uniq + echo "y" | $LATEST_CMDLINE_TOOLS_PATH/bin/sdkmanager --sdk_root=${ANDROID_HOME} --install "system-images;android-$ANDROID_SIMULATOR_APILEVEL;google_apis_playstore;x86_64" | tr '\r' '\n' | uniq if [[ -f $ANDROID_HOME/platform-tools/platform-tools/adb ]] then @@ -51,7 +76,7 @@ then fi # Create emulator - 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 + 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. @@ -68,7 +93,7 @@ then $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 > $BUILD_ARTIFACTSTAGINGDIRECTORY/screenshots/android/android-emulator-log.txt 2>&1 & + 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/workflow/scripts/android-uitest-wait-systemui.sh 500 @@ -89,11 +114,7 @@ $ANDROID_HOME/platform-tools/adb shell settings put global hidden_api_policy 1 echo "Emulator started" -cd $BUILD_SOURCESDIRECTORY - -# build the sample, while the emulator is starting -mono '/Applications/Visual Studio.app/Contents/MonoBundle/MSBuild/Current/bin/MSBuild.dll' /m /r /p:Configuration=Release $UNO_UITEST_PROJECT -mono '/Applications/Visual Studio.app/Contents/MonoBundle/MSBuild/Current/bin/MSBuild.dll' /m /r /p:Configuration=Release /p:IsUiAutomationMappingEnabled=True /p:DisableNet6MobileTargets=True /p:UnoUIUseRoslynSourceGenerators=False /p:AndroidBuildApplicationPackage=True $UNO_UITEST_ANDROID_PROJECT +cp $UNO_UITEST_ANDROIDAPK_PATH $BUILD_ARTIFACTSTAGINGDIRECTORY cd $BUILD_SOURCESDIRECTORY/build @@ -111,18 +132,26 @@ echo "--inprocess" >> $UNO_TESTS_RESPONSE_FILE echo "--agents=1" >> $UNO_TESTS_RESPONSE_FILE echo "--workers=1" >> $UNO_TESTS_RESPONSE_FILE echo "--result=$UNO_ORIGINAL_TEST_RESULTS" >> $UNO_TESTS_RESPONSE_FILE +echo "--where \"$TEST_FILTERS\"" >> $UNO_TESTS_RESPONSE_FILE echo "$UNO_UITEST_BINARY" >> $UNO_TESTS_RESPONSE_FILE echo Response file: cat $UNO_TESTS_RESPONSE_FILE +## Show the tests list +mono $BUILD_SOURCESDIRECTORY/build/NUnit.ConsoleRunner.$UNO_UITEST_NUNIT_VERSION/tools/nunit3-console.exe \ + @$UNO_TESTS_RESPONSE_FILE --explore || true + mono $BUILD_SOURCESDIRECTORY/build/NUnit.ConsoleRunner.$UNO_UITEST_NUNIT_VERSION/tools/nunit3-console.exe \ @$UNO_TESTS_RESPONSE_FILE || true +## Copy the results file to the results folder +cp $UNO_ORIGINAL_TEST_RESULTS $BASE_ARTIFACTS_PATH + ## Dump the emulator's system log -$ANDROID_HOME/platform-tools/adb shell logcat -d > $BUILD_ARTIFACTSTAGINGDIRECTORY/screenshots/android/android-device-log.txt +$ANDROID_HOME/platform-tools/adb shell logcat -d > $UNO_UITEST_SCREENSHOT_PATH/android-device-log.txt -if [ ! -f "$UNO_ORIGINAL_TEST_RESULTS" ]; then +if [[ ! -f $UNO_ORIGINAL_TEST_RESULTS ]]; then echo "ERROR: The test results file $UNO_ORIGINAL_TEST_RESULTS does not exist (did nunit crash ?)" return 1 fi diff --git a/build/workflow/scripts/ios-uitest-run.sh b/build/workflow/scripts/ios-uitest-run.sh index 306c318e1..7c289eaa4 100644 --- a/build/workflow/scripts/ios-uitest-run.sh +++ b/build/workflow/scripts/ios-uitest-run.sh @@ -2,16 +2,28 @@ set -euo pipefail IFS=$'\n\t' -export UNO_UITEST_SCREENSHOT_PATH=$BUILD_ARTIFACTSTAGINGDIRECTORY/screenshots/ios + +if [ "$UITEST_TEST_MODE_NAME" == 'Automated' ]; +then + export TEST_FILTERS="namespace != 'Uno.Toolkit.UITest.RuntimeTests'"; + export UITEST_RUNTIMETESTS_RESULTS_FILE_PATH=$BUILD_SOURCESDIRECTORY/build/UITestResults-ios-automated.xml +elif [ "$UITEST_TEST_MODE_NAME" == 'RuntimeTests' ]; +then + export TEST_FILTERS="class == 'Uno.Toolkit.UITest.RuntimeTests.RuntimeTestRunner'"; + export UITEST_RUNTIMETESTS_RESULTS_FILE_PATH=$BUILD_SOURCESDIRECTORY/build/UITestResults-ios-runtime.xml +fi export UNO_UITEST_PLATFORM=iOS -export UNO_UITEST_IOSBUNDLE_PATH=$BUILD_SOURCESDIRECTORY/samples/$SAMPLE_PROJECT_NAME/$SAMPLE_PROJECT_NAME.iOS/bin/iPhoneSimulator/Release/$SAMPLE_PROJECT_NAME.app +export BASE_ARTIFACTS_PATH=$BUILD_ARTIFACTSTAGINGDIRECTORY/ios/$XAML_FLAVOR_BUILD/$UITEST_TEST_MODE_NAME +export UNO_UITEST_IOSBUNDLE_PATH=$BUILD_SOURCESDIRECTORY/build/$SAMPLEAPP_ARTIFACT_NAME/$SAMPLE_PROJECT_NAME.app +export UNO_UITEST_SCREENSHOT_PATH=$BASE_ARTIFACTS_PATH/screenshots export UNO_UITEST_PROJECT=$BUILD_SOURCESDIRECTORY/src/Uno.Toolkit.UITest/Uno.Toolkit.UITest.csproj -export UNO_UITEST_LOGFILE=$BUILD_ARTIFACTSTAGINGDIRECTORY/screenshots/ios/nunit-log.txt +export UNO_UITEST_LOGFILE=$UNO_UITEST_SCREENSHOT_PATH/nunit-log.txt export UNO_UITEST_IOS_PROJECT=$BUILD_SOURCESDIRECTORY/samples/$SAMPLE_PROJECT_NAME/$SAMPLE_PROJECT_NAME.iOS/$SAMPLE_PROJECT_NAME.iOS.csproj -export UNO_UITEST_BINARY=$BUILD_SOURCESDIRECTORY/src/Uno.Toolkit.UITest/bin/Uno.Toolkit.UITest/Release/Uno.Toolkit.UITest.dll +export UNO_UITEST_BINARY=$BUILD_SOURCESDIRECTORY/build/toolkit-uitest-binaries/Uno.Toolkit.UITest.dll 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/TestResult-original.xml +export UNO_ORIGINAL_TEST_RESULTS=$BUILD_SOURCESDIRECTORY/build/$UNO_TEST_RESULTS_FILE_NAME +export UNO_UITEST_RUNTIMETESTS_RESULTS_FILE_PATH=$UNO_ORIGINAL_TEST_RESULTS export UNO_TESTS_RESPONSE_FILE=$BUILD_SOURCESDIRECTORY/build/nunit.response export UNO_UITEST_SIMULATOR_VERSION="com.apple.CoreSimulator.SimRuntime.iOS-15-2" export UNO_UITEST_SIMULATOR_NAME="iPad Pro (12.9-inch) (4th generation)" @@ -22,28 +34,6 @@ xcrun simctl list devices --json /Applications/Xcode_13.2.1.app/Contents/Developer/Applications/Simulator.app/Contents/MacOS/Simulator & -cd $BUILD_SOURCESDIRECTORY - -mono '/Applications/Visual Studio.app/Contents/MonoBundle/MSBuild/Current/bin/MSBuild.dll' /m /r /p:Configuration=Release $UNO_UITEST_PROJECT -mono '/Applications/Visual Studio.app/Contents/MonoBundle/MSBuild/Current/bin/MSBuild.dll' /m /r /p:Configuration=Release /p:Platform=iPhoneSimulator /p:IsUiAutomationMappingEnabled=True /p:UnoUIUseRoslynSourceGenerators=False /p:DisableNet6MobileTargets=True $UNO_UITEST_IOS_PROJECT - -# echo "Current system date" -# date - -# echo "Listing iOS simulators" -# xcrun simctl list devices --json - -# ## -# ## Pre-install the application to avoid https://github.com/microsoft/appcenter/issues/2389 -# ## -# export SIMULATOR_ID=`xcrun simctl list -j | jq -r --arg sim "$UNO_UITEST_SIMULATOR_VERSION" --arg name "$UNO_UITEST_SIMULATOR_NAME" '.devices[$sim] | .[] | select(.name==$name) | .udid'` - -# echo "Starting simulator: $SIMULATOR_ID ($UNO_UITEST_SIMULATOR_VERSION / $UNO_UITEST_SIMULATOR_NAME)" -# xcrun simctl boot "$SIMULATOR_ID" || true - -# echo "Install app on simulator: $SIMULATOR_ID" -# xcrun simctl install "$SIMULATOR_ID" "$UNO_UITEST_IOSBUNDLE_PATH" || true - cd $BUILD_SOURCESDIRECTORY/build wget $UNO_UITEST_NUGET_URL @@ -51,7 +41,8 @@ mono nuget.exe install NUnit.ConsoleRunner -Version $UNO_UITEST_NUNIT_VERSION mkdir -p $UNO_UITEST_SCREENSHOT_PATH -# chmod -R +x $UNO_UITEST_IOSBUNDLE_PATH +# Imported app bundle from artifacts is not executable +chmod -R +x $UNO_UITEST_IOSBUNDLE_PATH # Move to the screenshot directory so that the output path is the proper one, as # required by Xamarin.UITest @@ -63,17 +54,26 @@ echo "--inprocess" >> $UNO_TESTS_RESPONSE_FILE echo "--agents=1" >> $UNO_TESTS_RESPONSE_FILE echo "--workers=1" >> $UNO_TESTS_RESPONSE_FILE echo "--result=$UNO_ORIGINAL_TEST_RESULTS" >> $UNO_TESTS_RESPONSE_FILE +echo "--where \"$TEST_FILTERS\"" >> $UNO_TESTS_RESPONSE_FILE echo "$UNO_UITEST_BINARY" >> $UNO_TESTS_RESPONSE_FILE echo Response file: cat $UNO_TESTS_RESPONSE_FILE +## Show the tests list +mono $BUILD_SOURCESDIRECTORY/build/NUnit.ConsoleRunner.$UNO_UITEST_NUNIT_VERSION/tools/nunit3-console.exe \ + @$UNO_TESTS_RESPONSE_FILE --explore || true + +## Run NUnit tests mono $BUILD_SOURCESDIRECTORY/build/NUnit.ConsoleRunner.$UNO_UITEST_NUNIT_VERSION/tools/nunit3-console.exe \ @$UNO_TESTS_RESPONSE_FILE || true echo "Current system date" date +## Copy the results file to the results folder +cp $UNO_ORIGINAL_TEST_RESULTS $BASE_ARTIFACTS_PATH + # export the simulator logs export LOG_FILEPATH=$UNO_UITEST_SCREENSHOT_PATH/_logs export TMP_LOG_FILEPATH=/tmp/DeviceLog-`date +"%Y%m%d%H%M%S"`.logarchive diff --git a/build/workflow/scripts/wasm-uitest-run.sh b/build/workflow/scripts/wasm-uitest-run.sh index c06cdce3d..12707bfab 100644 --- a/build/workflow/scripts/wasm-uitest-run.sh +++ b/build/workflow/scripts/wasm-uitest-run.sh @@ -3,46 +3,63 @@ set -x #echo on set -euo pipefail IFS=$'\n\t' +if [ "$UITEST_TEST_MODE_NAME" == 'Automated' ]; +then + export TEST_FILTERS="namespace != 'Uno.Toolkit.UITest.RuntimeTests'"; + export UITEST_RUNTIMETESTS_RESULTS_FILE_PATH=$BUILD_SOURCESDIRECTORY/build/UITestResults-wasm-automated.xml +elif [ "$UITEST_TEST_MODE_NAME" == 'RuntimeTests' ]; +then + export TEST_FILTERS="class == 'Uno.Toolkit.UITest.RuntimeTests.RuntimeTestRunner'"; + export UITEST_RUNTIMETESTS_RESULTS_FILE_PATH=$BUILD_SOURCESDIRECTORY/build/UITestResults-wasm-runtime.xml +fi + +cd $BUILD_SOURCESDIRECTORY/build/$SAMPLEAPP_ARTIFACT_NAME + +npm i chromedriver@86.0.0 +npm i puppeteer@5.3.1 + +# install dotnet serve / Remove as needed +dotnet tool uninstall dotnet-serve -g || true +dotnet tool uninstall dotnet-serve --tool-path $BUILD_SOURCESDIRECTORY/build/tools || true +dotnet tool install dotnet-serve --version 1.10.140 --tool-path $BUILD_SOURCESDIRECTORY/build/tools || true +export PATH="$PATH:$BUILD_SOURCESDIRECTORY/build/tools" + +export BASE_ARTIFACTS_PATH=$BUILD_ARTIFACTSTAGINGDIRECTORY/wasm/$XAML_FLAVOR_BUILD/$UITEST_TEST_MODE_NAME export UNO_UITEST_TARGETURI=http://localhost:5000 -export UNO_UITEST_DRIVERPATH_CHROME=$BUILD_SOURCESDIRECTORY/build/node_modules/chromedriver/lib/chromedriver -export UNO_UITEST_CHROME_BINARY_PATH=$BUILD_SOURCESDIRECTORY/build/node_modules/puppeteer/.local-chromium/linux-800071/chrome-linux/chrome -export UNO_UITEST_SCREENSHOT_PATH=$BUILD_ARTIFACTSTAGINGDIRECTORY/screenshots/wasm +export UNO_UITEST_DRIVERPATH_CHROME=$BUILD_SOURCESDIRECTORY/build/$SAMPLEAPP_ARTIFACT_NAME/node_modules/chromedriver/lib/chromedriver +export UNO_UITEST_CHROME_BINARY_PATH=$BUILD_SOURCESDIRECTORY/build/$SAMPLEAPP_ARTIFACT_NAME/node_modules/puppeteer/.local-chromium/linux-800071/chrome-linux/chrome +export UNO_UITEST_SCREENSHOT_PATH=$BASE_ARTIFACTS_PATH/screenshots export UNO_UITEST_PLATFORM=Browser export UNO_UITEST_CHROME_CONTAINER_MODE=true export UNO_UITEST_PROJECT=$BUILD_SOURCESDIRECTORY/src/Uno.Toolkit.UITest/Uno.Toolkit.UITest.csproj -export UNO_UITEST_BINARY=$BUILD_SOURCESDIRECTORY/src/Uno.Toolkit.UITest/bin/Uno.Toolkit.UITest/Release/Uno.Toolkit.UITest.dll -export UNO_UITEST_LOGFILE=$BUILD_ARTIFACTSTAGINGDIRECTORY/screenshots/wasm/nunit-log.txt +export UNO_UITEST_BINARY=$BUILD_SOURCESDIRECTORY/build/toolkit-uitest-binaries/Uno.Toolkit.UITest.dll +export UNO_UITEST_LOGFILE=$BASE_ARTIFACTS_PATH/nunit-log.txt export UNO_UITEST_WASM_PROJECT=$BUILD_SOURCESDIRECTORY/samples/$SAMPLE_PROJECT_NAME/$SAMPLE_PROJECT_NAME.Wasm/$SAMPLE_PROJECT_NAME.Wasm.csproj export UNO_UITEST_WASM_OUTPUT_PATH=$BUILD_SOURCESDIRECTORY/samples/$SAMPLE_PROJECT_NAME/$SAMPLE_PROJECT_NAME.Wasm/bin/Release/net5.0/dist/ export UNO_UITEST_NUNIT_VERSION=3.11.1 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/TestResult-original.xml +export UNO_ORIGINAL_TEST_RESULTS=$BUILD_SOURCESDIRECTORY/build/$UNO_TEST_RESULTS_FILE_NAME +export UNO_UITEST_RUNTIMETESTS_RESULTS_FILE_PATH=$UNO_ORIGINAL_TEST_RESULTS export UNO_TESTS_RESPONSE_FILE=$BUILD_SOURCESDIRECTORY/build/nunit.response mkdir -p $UNO_UITEST_SCREENSHOT_PATH -cd $BUILD_SOURCESDIRECTORY - -dotnet build /r /p:Configuration=Release $UNO_UITEST_PROJECT -dotnet build /r /p:Configuration=Release $UNO_UITEST_WASM_PROJECT /p:IsUiAutomationMappingEnabled=True /p:DisableNet6MobileTargets=True - -# Start the server -dotnet run --project $UNO_UITEST_WASM_PROJECT -c Release --no-build & +## The python server serves the current working directory, and may be changed by the nunit runner +dotnet-serve -p 5000 -d "$BUILD_SOURCESDIRECTORY/build/$SAMPLEAPP_ARTIFACT_NAME/site" & cd $BUILD_SOURCESDIRECTORY/build -npm i chromedriver@86.0.0 -npm i puppeteer@5.3.1 wget $UNO_UITEST_NUGET_URL mono nuget.exe install NUnit.ConsoleRunner -Version $UNO_UITEST_NUNIT_VERSION ## Build the NUnit configuration file echo "--trace=Verbose" > $UNO_TESTS_RESPONSE_FILE echo "--result=$UNO_ORIGINAL_TEST_RESULTS" >> $UNO_TESTS_RESPONSE_FILE +echo "--where \"$TEST_FILTERS\"" >> $UNO_TESTS_RESPONSE_FILE echo "$UNO_UITEST_BINARY" >> $UNO_TESTS_RESPONSE_FILE mono $BUILD_SOURCESDIRECTORY/build/NUnit.ConsoleRunner.$UNO_UITEST_NUNIT_VERSION/tools/nunit3-console.exe \ @$UNO_TESTS_RESPONSE_FILE || true ## Copy the results file to the results folder -cp --backup=t $UNO_ORIGINAL_TEST_RESULTS $UNO_UITEST_SCREENSHOT_PATH +cp --backup=t $UNO_ORIGINAL_TEST_RESULTS $BASE_ARTIFACTS_PATH \ No newline at end of file diff --git a/build/workflow/stage-uitests-android.yml b/build/workflow/stage-uitests-android.yml index d749703f3..92c03c9d5 100644 --- a/build/workflow/stage-uitests-android.yml +++ b/build/workflow/stage-uitests-android.yml @@ -1,20 +1,101 @@ jobs: + +- job: Android_Build_For_Tests + displayName: 'Build Android Samples App' + + pool: + vmImage: 'macOS-11' + + variables: + CI_Build: true + SourceLinkEnabled: false + VS_MSBUILD: '/Applications/Visual Studio.app/Contents/MonoBundle/MSBuild/Current/bin/MSBuild.dll' + + strategy: + maxParallel: 2 + matrix: + UWP: + SAMPLE_PROJECT_NAME: Uno.Toolkit.Samples + XAML_FLAVOR_BUILD: UWP + WinUI: + SAMPLE_PROJECT_NAME: Uno.Toolkit.WinUI.Samples + XAML_FLAVOR_BUILD: WinUI + + steps: + - checkout: self + clean: true + + - template: templates/dotnet7-install-mac.yml + - template: templates/jdk-setup.yml + + - script: | + mono '$(VS_MSBUILD)' '$(BUILD.SOURCESDIRECTORY)/samples/$(SAMPLE_PROJECT_NAME)/$(SAMPLE_PROJECT_NAME).Droid/$(SAMPLE_PROJECT_NAME).Droid.csproj' /m /r /p:Configuration=Release /p:UnoUIUseRoslynSourceGenerators=False /p:DisableNet6MobileTargets=true /p:IsUiAutomationMappingEnabled=true /p:AndroidBuildApplicationPackage=True /p:AndroidUseLatestPlatformSdk=true /bl:$(build.artifactstagingdirectory)/android-sampleapp.binlog + displayName: Build Android Samples App ($(XAML_FLAVOR_BUILD)) + + + - task: CopyFiles@2 + inputs: + SourceFolder: $(build.sourcesdirectory)/samples/$(SAMPLE_PROJECT_NAME)/$(SAMPLE_PROJECT_NAME).Droid/bin/Release/ + Contents: '$(SAMPLE_PROJECT_NAME)-Signed.apk' + TargetFolder: $(build.artifactstagingdirectory) + CleanTargetFolder: false + OverWrite: false + flattenFolders: false + + - task: PublishBuildArtifacts@1 + condition: always() + retryCountOnTaskFailure: 3 + inputs: + PathtoPublish: $(build.artifactstagingdirectory) + ArtifactName: sampleapp-android-build-$(XAML_FLAVOR_BUILD) + ArtifactType: Container + + - job: Android_UITests - displayName: 'Android UI Tests' + displayName: 'Run Android UI Tests' + dependsOn: + - Android_Build_For_Tests + - Toolkit_UITests_Build + timeoutInMinutes: 90 variables: CI_Build: true SourceLinkEnabled: false XamarinSDKVersion: 6_12_12 strategy: - maxParallel: 2 + maxParallel: 4 matrix: UWP: SAMPLE_PROJECT_NAME: Uno.Toolkit.Samples XAML_FLAVOR_BUILD: UWP + UITEST_TEST_MODE_NAME: Automated + ANDROID_SIMULATOR_APILEVEL: 28 + UNO_TEST_RESULTS_FILE_NAME: TestResult-android-UWP-Automated.xml + SAMPLEAPP_ARTIFACT_NAME: sampleapp-android-build-UWP WinUI: SAMPLE_PROJECT_NAME: Uno.Toolkit.WinUI.Samples XAML_FLAVOR_BUILD: WinUI + UITEST_TEST_MODE_NAME: Automated + ANDROID_SIMULATOR_APILEVEL: 28 + UNO_TEST_RESULTS_FILE_NAME: TestResult-android-WinUI-Automated.xml + SAMPLEAPP_ARTIFACT_NAME: sampleapp-android-build-WinUI + + UWP_Runtime: + SAMPLE_PROJECT_NAME: Uno.Toolkit.Samples + XAML_FLAVOR_BUILD: UWP + UITEST_TEST_MODE_NAME: RuntimeTests + ANDROID_SIMULATOR_APILEVEL: 28 + UNO_TEST_RESULTS_FILE_NAME: TestResult-android-UWP-RuntimeTests.xml + SAMPLEAPP_ARTIFACT_NAME: sampleapp-android-build-UWP + + WinUI_Runtime: + SAMPLE_PROJECT_NAME: Uno.Toolkit.WinUI.Samples + XAML_FLAVOR_BUILD: WinUI + UITEST_TEST_MODE_NAME: RuntimeTests + ANDROID_SIMULATOR_APILEVEL: 28 + UNO_TEST_RESULTS_FILE_NAME: TestResult-android-WinUI-RuntimeTests.xml + SAMPLEAPP_ARTIFACT_NAME: sampleapp-android-build-WinUI + pool: vmImage: 'macOS-11' @@ -23,19 +104,20 @@ - checkout: self clean: true - - task: UseDotNet@2 - displayName: 'Use .NET 5.0.406' - retryCountOnTaskFailure: 3 - inputs: - packageType: runtime - version: 5.0.15 + - task: DownloadBuildArtifacts@0 + displayName: 'Download Android SamplesApp Binaries' + inputs: + artifactName: $(SAMPLEAPP_ARTIFACT_NAME) + downloadPath: '$(build.sourcesdirectory)/build' + + - task: DownloadBuildArtifacts@0 + displayName: 'Download UITest Binaries' + inputs: + artifactName: toolkit-uitest-binaries + downloadPath: '$(build.sourcesdirectory)/build' - - task: UseDotNet@2 - displayName: 'Use .NET runtime 2.2.x' - retryCountOnTaskFailure: 3 - inputs: - packageType: runtime - version: 2.2.x + - template: templates/dotnet7-install-mac.yml + - template: templates/jdk-setup.yml - bash: /bin/bash -c "sudo $AGENT_HOMEDIRECTORY/scripts/select-xamarin-sdk.sh $(XamarinSDKVersion)" displayName: Select Xamarin Version @@ -50,16 +132,16 @@ - bash: | chmod +x $(build.sourcesdirectory)/build/workflow/scripts/android-uitest-run.sh $(build.sourcesdirectory)/build/workflow/scripts/android-uitest-run.sh - displayName: Build and Run Android Tests + displayName: Run Android UITests ($(XAML_FLAVOR_BUILD) / $(UITEST_TEST_MODE_NAME)) retryCountOnTaskFailure: 3 - task: PublishTestResults@2 condition: always() retryCountOnTaskFailure: 3 inputs: - testRunTitle: 'Android UI Test Run ($(XAML_FLAVOR_BUILD))' + testRunTitle: 'Android UITest Run ($(XAML_FLAVOR_BUILD) / $(UITEST_TEST_MODE_NAME))' testResultsFormat: 'NUnit' - testResultsFiles: '$(build.sourcesdirectory)/build/TestResult-original.xml' + testResultsFiles: $(build.sourcesdirectory)/build/$(UNO_TEST_RESULTS_FILE_NAME) failTaskOnFailedTests: true - task: PublishBuildArtifacts@1 @@ -67,5 +149,5 @@ retryCountOnTaskFailure: 3 inputs: PathtoPublish: $(build.artifactstagingdirectory) - ArtifactName: uno-uitest-tests-$(XAML_FLAVOR_BUILD) + ArtifactName: toolkit-uitests ArtifactType: Container diff --git a/build/workflow/stage-uitests-build.yml b/build/workflow/stage-uitests-build.yml new file mode 100644 index 000000000..acd2d00e0 --- /dev/null +++ b/build/workflow/stage-uitests-build.yml @@ -0,0 +1,38 @@ +jobs: +- job: Toolkit_UITests_Build + displayName: 'Build Toolkit UI Tests' + + variables: + CI_Build: true + + pool: + vmImage: windows-2022 + + steps: + - checkout: self + clean: true + + - template: templates/dotnet-install.yml + + - task: MSBuild@1 + displayName: 'Build UI Tests' + inputs: + solution: src/Uno.Toolkit.UITest/Uno.Toolkit.UITest.csproj + msbuildArguments: /r /m /p:Configuration=Release /detailedsummary /m /bl:$(build.artifactstagingdirectory)\build.binlog + + - task: CopyFiles@2 + displayName: 'Publish UITest binaries' + inputs: + SourceFolder: $(BUILD.SOURCESDIRECTORY)/src/Uno.Toolkit.UITest/bin/Uno.Toolkit.UITest/Release + Contents: '**/*.*' + TargetFolder: $(build.artifactstagingdirectory) + CleanTargetFolder: false + OverWrite: false + flattenFolders: false + + - task: PublishBuildArtifacts@1 + retryCountOnTaskFailure: 3 + inputs: + PathtoPublish: $(build.artifactstagingdirectory) + ArtifactName: toolkit-uitest-binaries + ArtifactType: Container diff --git a/build/workflow/stage-uitests-ios.yml b/build/workflow/stage-uitests-ios.yml index 97d66c3de..679b865de 100644 --- a/build/workflow/stage-uitests-ios.yml +++ b/build/workflow/stage-uitests-ios.yml @@ -1,6 +1,76 @@ jobs: +- job: iOS_Build_For_Tests + displayName: 'Build iOS Samples App' + + pool: + vmImage: 'macOS-11' + + variables: + CI_Build: true + SourceLinkEnabled: false + VS_MSBUILD: '/Applications/Visual Studio.app/Contents/MonoBundle/MSBuild/Current/bin/MSBuild.dll' + XCODE_ROOT: '/Applications/Xcode_13.2.1.app' + XamarinSDKVersion: 6_12_12 + + strategy: + maxParallel: 2 + matrix: + UWP: + SAMPLE_PROJECT_NAME: Uno.Toolkit.Samples + XAML_FLAVOR_BUILD: UWP + WinUI: + SAMPLE_PROJECT_NAME: Uno.Toolkit.WinUI.Samples + XAML_FLAVOR_BUILD: WinUI + + steps: + - checkout: self + clean: true + + - template: templates/dotnet7-install-mac.yml + - template: templates/jdk-setup.yml + + - bash: /bin/bash -c "sudo $AGENT_HOMEDIRECTORY/scripts/select-xamarin-sdk.sh $(XamarinSDKVersion)" + displayName: Select Xamarin Version + + - bash: | + echo 'xCode Root to ${XCODE_ROOT}' + echo '##vso[task.setvariable variable=MD_APPLE_SDK_ROOT;]'${XCODE_ROOT} + sudo xcode-select --switch ${XCODE_ROOT}/Contents/Developer + + displayName: Select Xcode + + - bash: | + rm -f ${HOME}/Library/Preferences/Xamarin/Settings.plist + + # https://github.com/actions/virtual-environments/issues/1932 + displayName: Apply workaround for Azure Devops issue 1932 + + - script: | + mono '$(VS_MSBUILD)' '$(BUILD.SOURCESDIRECTORY)/samples/$(SAMPLE_PROJECT_NAME)/$(SAMPLE_PROJECT_NAME).iOS/$(SAMPLE_PROJECT_NAME).iOS.csproj' /m /r /p:Configuration=Release /p:UnoUIUseRoslynSourceGenerators=False /p:DisableNet6MobileTargets=true /p:IsUiAutomationMappingEnabled=true /bl:$(BUILD.ARTIFACTSTAGINGDIRECTORY)/ios-sampleapp.binlog + displayName: Build iOS Samples App ($(XAML_FLAVOR_BUILD)) + + - task: CopyFiles@2 + inputs: + SourceFolder: $(build.sourcesdirectory)/samples/$(SAMPLE_PROJECT_NAME)/$(SAMPLE_PROJECT_NAME).iOS/bin/iPhoneSimulator/Release/$(SAMPLE_PROJECT_NAME).app + Contents: '**' + TargetFolder: $(build.artifactstagingdirectory)/$(SAMPLE_PROJECT_NAME).app + CleanTargetFolder: false + OverWrite: false + flattenFolders: false + + - task: PublishBuildArtifacts@1 + condition: always() + retryCountOnTaskFailure: 3 + inputs: + PathtoPublish: $(build.artifactstagingdirectory) + ArtifactName: sampleapp-ios-build-$(XAML_FLAVOR_BUILD) + ArtifactType: Container + - job: iOS_UITests - displayName: 'iOS UI Tests' + displayName: 'Run iOS UI Tests' + dependsOn: + - iOS_Build_For_Tests + - Toolkit_UITests_Build timeoutInMinutes: 90 variables: CI_Build: true @@ -9,14 +79,32 @@ XamarinSDKVersion: 6_12_12 strategy: - maxParallel: 2 + maxParallel: 4 matrix: UWP: SAMPLE_PROJECT_NAME: Uno.Toolkit.Samples XAML_FLAVOR_BUILD: UWP + UITEST_TEST_MODE_NAME: Automated + UNO_TEST_RESULTS_FILE_NAME: TestResult-ios-UWP-Automated.xml + SAMPLEAPP_ARTIFACT_NAME: sampleapp-ios-build-UWP WinUI: SAMPLE_PROJECT_NAME: Uno.Toolkit.WinUI.Samples XAML_FLAVOR_BUILD: WinUI + UITEST_TEST_MODE_NAME: Automated + UNO_TEST_RESULTS_FILE_NAME: TestResult-ios-WinUI-Automated.xml + SAMPLEAPP_ARTIFACT_NAME: sampleapp-ios-build-WinUI + UWP_Runtime: + SAMPLE_PROJECT_NAME: Uno.Toolkit.Samples + XAML_FLAVOR_BUILD: UWP + UITEST_TEST_MODE_NAME: RuntimeTests + UNO_TEST_RESULTS_FILE_NAME: TestResult-ios-UWP-RuntimeTests.xml + SAMPLEAPP_ARTIFACT_NAME: sampleapp-ios-build-UWP + WinUI_Runtime: + SAMPLE_PROJECT_NAME: Uno.Toolkit.WinUI.Samples + XAML_FLAVOR_BUILD: WinUI + UITEST_TEST_MODE_NAME: RuntimeTests + UNO_TEST_RESULTS_FILE_NAME: TestResult-ios-WinUI-RuntimeTests.xml + SAMPLEAPP_ARTIFACT_NAME: sampleapp-ios-build-WinUI pool: vmImage: 'macOS-11' @@ -25,19 +113,19 @@ - checkout: self clean: true - - task: UseDotNet@2 - displayName: 'Use .NET 5.0.406' - retryCountOnTaskFailure: 3 - inputs: - packageType: runtime - version: 5.0.15 + - task: DownloadBuildArtifacts@0 + displayName: 'Download iOS Samples App' + inputs: + artifactName: $(SAMPLEAPP_ARTIFACT_NAME) + downloadPath: '$(build.sourcesdirectory)/build' - - task: UseDotNet@2 - displayName: 'Use .NET runtime 2.2.x' - retryCountOnTaskFailure: 3 - inputs: - packageType: runtime - version: 2.2.x + - task: DownloadBuildArtifacts@0 + displayName: 'Download UITest Binaries' + inputs: + artifactName: toolkit-uitest-binaries + downloadPath: '$(build.sourcesdirectory)/build' + + - template: templates/dotnet7-install-mac.yml - bash: /bin/bash -c "sudo $AGENT_HOMEDIRECTORY/scripts/select-xamarin-sdk.sh $(XamarinSDKVersion)" displayName: Select Xamarin Version @@ -54,20 +142,20 @@ # https://github.com/actions/virtual-environments/issues/1932 displayName: Apply workaround for Azure Devops issue 1932 - + - bash: | chmod +x $(build.sourcesdirectory)/build/workflow/scripts/ios-uitest-run.sh $(build.sourcesdirectory)/build/workflow/scripts/ios-uitest-run.sh - displayName: Build and Run iOS Test + displayName: Run iOS UITests ($(XAML_FLAVOR_BUILD) / $(UITEST_TEST_MODE_NAME)) retryCountOnTaskFailure: 3 - task: PublishTestResults@2 condition: always() retryCountOnTaskFailure: 3 inputs: - testRunTitle: 'iOS UI Test Run ($(XAML_FLAVOR_BUILD))' + testRunTitle: 'iOS UITest Run ($(XAML_FLAVOR_BUILD) / $(UITEST_TEST_MODE_NAME))' testResultsFormat: 'NUnit' - testResultsFiles: '$(build.sourcesdirectory)/build/TestResult-original.xml' + testResultsFiles: '$(build.sourcesdirectory)/build/$(UNO_TEST_RESULTS_FILE_NAME)' failTaskOnFailedTests: true - task: PublishBuildArtifacts@1 @@ -75,5 +163,5 @@ retryCountOnTaskFailure: 3 inputs: PathtoPublish: $(build.artifactstagingdirectory) - ArtifactName: uno-uitest-tests-$(XAML_FLAVOR_BUILD) + ArtifactName: toolkit-uitests ArtifactType: Container diff --git a/build/workflow/stage-uitests-wasm.yml b/build/workflow/stage-uitests-wasm.yml index cb86eb533..ea4908eba 100644 --- a/build/workflow/stage-uitests-wasm.yml +++ b/build/workflow/stage-uitests-wasm.yml @@ -1,8 +1,11 @@ jobs: -- job: Wasm_UITests - displayName: 'WebAssembly UI Tests' +- job: Wasm_Build_For_Tests + displayName: 'Build WebAssembly Sample App' container: unoplatform/wasm-build:3.0 + pool: + vmImage: 'ubuntu-20.04' + strategy: maxParallel: 2 matrix: @@ -13,6 +16,89 @@ SAMPLE_PROJECT_NAME: Uno.Toolkit.WinUI.Samples XAML_FLAVOR_BUILD: WinUI + steps: + - checkout: self + clean: true + + - task: UseDotNet@2 + displayName: 'Use .NET Core SDK 6.0.300' + retryCountOnTaskFailure: 3 + inputs: + packageType: sdk + version: 6.0.300 + + - task: UseDotNet@2 + displayName: 'Use .NET Core SDK 5.0.400' + retryCountOnTaskFailure: 3 + inputs: + packageType: sdk + version: 5.0.400 + + - task: UseDotNet@2 + displayName: 'Use .NET Core SDK 3.1.406' + retryCountOnTaskFailure: 3 + inputs: + packageType: sdk + version: 3.1.406 + + - bash: | + dotnet build /r /p:Configuration=Release '$(BUILD.SOURCESDIRECTORY)/samples/$(SAMPLE_PROJECT_NAME)/$(SAMPLE_PROJECT_NAME).Wasm/$(SAMPLE_PROJECT_NAME).Wasm.csproj' /p:IsUiAutomationMappingEnabled=True /p:DisableNet6MobileTargets=True /bl:$(build.artifactstagingdirectory)/wasm-sampleapp.binlog + + displayName: Build WASM Samples App ($(XAML_FLAVOR_BUILD)) + + - task: CopyFiles@2 + displayName: 'Publish Wasm Site (net5.0)' + inputs: + SourceFolder: $(build.sourcesdirectory)/samples/$(SAMPLE_PROJECT_NAME)/$(SAMPLE_PROJECT_NAME).Wasm/bin/Release/net5.0/dist + Contents: '**/*.*' + TargetFolder: $(build.artifactstagingdirectory)/site + CleanTargetFolder: false + OverWrite: false + flattenFolders: false + + - task: PublishBuildArtifacts@1 + condition: always() + retryCountOnTaskFailure: 3 + inputs: + PathtoPublish: $(build.artifactstagingdirectory) + ArtifactName: sampleapp-wasm-build-$(XAML_FLAVOR_BUILD) + ArtifactType: Container + +- job: Wasm_UITests + displayName: 'Run WebAssembly UI Tests' + container: unoplatform/wasm-build:3.0 + timeoutInMinutes: 90 + dependsOn: + - Wasm_Build_For_Tests + - Toolkit_UITests_Build + strategy: + maxParallel: 4 + matrix: + UWP: + SAMPLE_PROJECT_NAME: Uno.Toolkit.Samples + XAML_FLAVOR_BUILD: UWP + UITEST_TEST_MODE_NAME: Automated + UNO_TEST_RESULTS_FILE_NAME: TestResult-wasm-UWP-Automated.xml + SAMPLEAPP_ARTIFACT_NAME: sampleapp-wasm-build-UWP + WinUI: + SAMPLE_PROJECT_NAME: Uno.Toolkit.WinUI.Samples + XAML_FLAVOR_BUILD: WinUI + UITEST_TEST_MODE_NAME: Automated + UNO_TEST_RESULTS_FILE_NAME: TestResult-wasm-WinUI-Automated.xml + SAMPLEAPP_ARTIFACT_NAME: sampleapp-wasm-build-WinUI + UWP_Runtime: + SAMPLE_PROJECT_NAME: Uno.Toolkit.Samples + XAML_FLAVOR_BUILD: UWP + UITEST_TEST_MODE_NAME: RuntimeTests + UNO_TEST_RESULTS_FILE_NAME: TestResult-wasm-UWP-RuntimeTests.xml + SAMPLEAPP_ARTIFACT_NAME: sampleapp-wasm-build-UWP + WinUI_Runtime: + SAMPLE_PROJECT_NAME: Uno.Toolkit.WinUI.Samples + XAML_FLAVOR_BUILD: WinUI + UITEST_TEST_MODE_NAME: RuntimeTests + UNO_TEST_RESULTS_FILE_NAME: TestResult-wasm-WinUI-RuntimeTests.xml + SAMPLEAPP_ARTIFACT_NAME: sampleapp-wasm-build-WinUI + pool: vmImage: 'ubuntu-20.04' @@ -22,6 +108,18 @@ steps: - checkout: self clean: true + + - task: DownloadBuildArtifacts@0 + displayName: 'Download WASM Samples App' + inputs: + artifactName: $(SAMPLEAPP_ARTIFACT_NAME) + downloadPath: '$(build.sourcesdirectory)/build' + + - task: DownloadBuildArtifacts@0 + displayName: 'Download UITest Binaries' + inputs: + artifactName: toolkit-uitest-binaries + downloadPath: '$(build.sourcesdirectory)/build' - task: UseDotNet@2 displayName: 'Use .NET Core SDK 6.0.300' @@ -48,7 +146,7 @@ chmod +x build/workflow/scripts/wasm-uitest-run.sh build/workflow/scripts/wasm-uitest-run.sh retryCountOnTaskFailure: 3 - displayName: 'Running build' + displayName: Run WASM UITests ($(XAML_FLAVOR_BUILD) / $(UITEST_TEST_MODE_NAME)) - task: PublishTestResults@2 condition: always() @@ -56,24 +154,13 @@ inputs: testRunTitle: 'WebAssembly UI Test Run ($(XAML_FLAVOR_BUILD))' testResultsFormat: 'NUnit' - testResultsFiles: '$(build.sourcesdirectory)/build/TestResult-original.xml' + testResultsFiles: '$(build.sourcesdirectory)/build/$(UNO_TEST_RESULTS_FILE_NAME)' failTaskOnFailedTests: true - searchFolder: '$(build.artifactstagingdirectory)/screenshots/wasm' - - - task: CopyFiles@2 - displayName: Copy Wasm output - inputs: - SourceFolder: $(build.sourcesdirectory)/samples/$(SAMPLE_PROJECT_NAME)/$(SAMPLE_PROJECT_NAME).Wasm/bin/Release/net5.0/dist - Contents: '**/*.*' - TargetFolder: $(Build.ArtifactStagingDirectory)/screenshots/wasm - CleanTargetFolder: false - OverWrite: false - flattenFolders: false - task: PublishBuildArtifacts@1 retryCountOnTaskFailure: 3 condition: always() inputs: PathtoPublish: $(build.artifactstagingdirectory) - ArtifactName: uno-uitest-tests-$(XAML_FLAVOR_BUILD) + ArtifactName: toolkit-uitests ArtifactType: Container diff --git a/build/workflow/templates/dotnet-install.yml b/build/workflow/templates/dotnet-install.yml new file mode 100644 index 000000000..d6119af8d --- /dev/null +++ b/build/workflow/templates/dotnet-install.yml @@ -0,0 +1,15 @@ +steps: + + - task: UseDotNet@2 + displayName: 'Use .NET 5.0.406' + retryCountOnTaskFailure: 3 + inputs: + packageType: runtime + version: 5.0.15 + + - task: UseDotNet@2 + displayName: 'Use .NET runtime 2.2.x' + retryCountOnTaskFailure: 3 + inputs: + packageType: runtime + version: 2.2.x \ No newline at end of file diff --git a/build/workflow/templates/dotnet6-install-windows.yml b/build/workflow/templates/dotnet6-install-windows.yml deleted file mode 100644 index c02d6fb3c..000000000 --- a/build/workflow/templates/dotnet6-install-windows.yml +++ /dev/null @@ -1,54 +0,0 @@ -parameters: - DotNetVersion: '6.0.401' - UnoCheck_Version: '1.5.4' - UnoCheck_Manifest: 'https://raw.githubusercontent.com/unoplatform/uno.check/34b1a60f5c1c51604b47362781969dde46979fd5/manifests/uno.ui.manifest.json' - -steps: - - # Required until .NET 6 installs properly on Windows using UseDotnet - # using preview builds - # - powershell: | - # $ProgressPreference = 'SilentlyContinue' - # Invoke-WebRequest -Uri "https://dot.net/v1/dotnet-install.ps1" -OutFile dotnet-install.ps1 - # & .\dotnet-install.ps1 -Version ${{ parameters.DotNetVersion }} -InstallDir "$env:ProgramFiles\dotnet\" -Verbose - # & dotnet --list-sdks - # displayName: Install .NET ${{ parameters.DotNetVersion }} - # errorActionPreference: stop - # retryCountOnTaskFailure: 3 - - task: UseDotNet@2 - displayName: 'Use .NET Core SDK ${{ parameters.DotNetVersion }}' - retryCountOnTaskFailure: 3 - inputs: - packageType: sdk - version: ${{ parameters.DotNetVersion }} - includePreviewVersions: true - - - template: jdk-setup.yml - - - powershell: | - & dotnet tool update --global uno.check --version ${{ parameters.UnoCheck_Version }} --add-source https://api.nuget.org/v3/index.json - & uno-check -v --ci --non-interactive --fix --skip xcode --skip gtk3 --skip vswin --skip vsmac --manifest ${{ parameters.UnoCheck_Manifest }} - displayName: Install .NET Workloads - errorActionPreference: continue - ignoreLASTEXITCODE: true - retryCountOnTaskFailure: 3 - - # https://github.com/actions/runner-images/issues/6082#issuecomment-1215100175 - - powershell: | - Set-Location "C:\Program Files (x86)\Microsoft Visual Studio\Installer\" - $InstallPath = "C:\Program Files\Microsoft Visual Studio\2022\Enterprise" - $componentsToAdd = @( - "Component.Xamarin" - ) - [string]$workloadArgs = $componentsToAdd | ForEach-Object {" --add " + $_} - $Arguments = ('/c', "vs_installer.exe", 'modify', '--installPath', "`"$InstallPath`"",$workloadArgs, '--quiet', '--norestart', '--nocache') - $process = Start-Process -FilePath cmd.exe -ArgumentList $Arguments -Wait -PassThru -WindowStyle Hidden - if ($process.ExitCode -eq 0) - { - Write-Host "components have been successfully added" - } - else - { - Write-Host "components were not installed" - exit 1 - } diff --git a/build/workflow/templates/dotnet6-install-mac.yml b/build/workflow/templates/dotnet7-install-mac.yml similarity index 65% rename from build/workflow/templates/dotnet6-install-mac.yml rename to build/workflow/templates/dotnet7-install-mac.yml index a3b44a088..252f35802 100644 --- a/build/workflow/templates/dotnet6-install-mac.yml +++ b/build/workflow/templates/dotnet7-install-mac.yml @@ -1,7 +1,7 @@ parameters: - DotNetVersion: '6.0.401' - UnoCheck_Version: '1.5.4' - UnoCheck_Manifest: 'https://raw.githubusercontent.com/unoplatform/uno.check/34b1a60f5c1c51604b47362781969dde46979fd5/manifests/uno.ui.manifest.json' + DotNetVersion: '7.0.102' + UnoCheck_Version: '1.11.0-dev.2' + UnoCheck_Manifest: 'https://raw.githubusercontent.com/unoplatform/uno.check/146b0b4b23d866bef455494a12ad7ffd2f6f2d20/manifests/uno.ui.manifest.json' Dotnet_Root: '/usr/local/share/dotnet/' Dotnet_Tools: '~/.dotnet/tools' @@ -22,14 +22,14 @@ steps: # Required until .NET 6 installs properly using UseDotnet # using preview builds - # - bash: | - # export PATH="${{ parameters.Dotnet_Root }}:${{ parameters.Dotnet_Tools }}:$PATH" - # curl -L https://raw.githubusercontent.com/dotnet/install-scripts/11b4eebe23d871c074364940d301c3eb53e7c7ec/src/dotnet-install.sh > dotnet-install.sh - # sh dotnet-install.sh --version ${{ parameters.DotNetVersion }} --install-dir $DOTNET_ROOT --verbose - # dotnet --list-sdks - # echo "##vso[task.setvariable variable=PATH]$PATH" - # displayName: install .NET ${{ parameters.DotNetVersion }} - # retryCountOnTaskFailure: 3 + #- bash: | + # export PATH="${{ parameters.Dotnet_Root }}:${{ parameters.Dotnet_Tools }}:$PATH" + # curl -L https://raw.githubusercontent.com/dotnet/install-scripts/11b4eebe23d871c074364940d301c3eb53e7c7ec/src/dotnet-install.sh > dotnet-install.sh + # sh dotnet-install.sh --version ${{ parameters.DotNetVersion }} --install-dir $DOTNET_ROOT --verbose + # dotnet --list-sdks + # echo "##vso[task.setvariable variable=PATH]$PATH" + # displayName: install .NET ${{ parameters.DotNetVersion }} + # retryCountOnTaskFailure: 3 - task: UseDotNet@2 displayName: 'Use .NET Core SDK ${{ parameters.DotNetVersion }}' diff --git a/build/workflow/templates/dotnet7-install-windows.yml b/build/workflow/templates/dotnet7-install-windows.yml new file mode 100644 index 000000000..bdf325af4 --- /dev/null +++ b/build/workflow/templates/dotnet7-install-windows.yml @@ -0,0 +1,34 @@ +parameters: + DotNetVersion: '7.0.102' + UnoCheck_Version: '1.11.0-dev.2' + UnoCheck_Manifest: 'https://raw.githubusercontent.com/unoplatform/uno.check/146b0b4b23d866bef455494a12ad7ffd2f6f2d20/manifests/uno.ui.manifest.json' + +steps: + + # Required until .NET 6 installs properly on Windows using UseDotnet + # using preview builds + #- powershell: | + # $ProgressPreference = 'SilentlyContinue' + # Invoke-WebRequest -Uri "https://dot.net/v1/dotnet-install.ps1" -OutFile dotnet-install.ps1 + # & .\dotnet-install.ps1 -Version ${{ parameters.DotNetVersion }} -InstallDir "$env:ProgramFiles\dotnet\" -Verbose + # & dotnet --list-sdks + # displayName: Install .NET ${{ parameters.DotNetVersion }} + # errorActionPreference: stop + # retryCountOnTaskFailure: 3 + - task: UseDotNet@2 + displayName: 'Use .NET Core SDK ${{ parameters.DotNetVersion }}' + retryCountOnTaskFailure: 3 + inputs: + packageType: sdk + version: ${{ parameters.DotNetVersion }} + includePreviewVersions: true + + - template: jdk-setup.yml + + - powershell: | + & dotnet tool update --global uno.check --version ${{ parameters.UnoCheck_Version }} --add-source https://api.nuget.org/v3/index.json + & uno-check -v --ci --non-interactive --fix --skip xcode --skip gtk3 --skip vswin --skip vsmac --manifest ${{ parameters.UnoCheck_Manifest }} + displayName: Install .NET Workloads + errorActionPreference: continue + ignoreLASTEXITCODE: true + retryCountOnTaskFailure: 3 diff --git a/samples/Directory.Packages.props b/samples/Directory.Packages.props index 3292ce3c0..4fc3c1dda 100644 --- a/samples/Directory.Packages.props +++ b/samples/Directory.Packages.props @@ -25,20 +25,20 @@ - + - - - - - + + + + + - - - - + + + + diff --git a/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Droid/Properties/AndroidManifest.xml b/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Droid/Properties/AndroidManifest.xml index 0bbc060a8..6e596781d 100644 --- a/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Droid/Properties/AndroidManifest.xml +++ b/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Droid/Properties/AndroidManifest.xml @@ -3,4 +3,4 @@ - \ No newline at end of file + diff --git a/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Droid/Uno.Toolkit.Samples.Droid.csproj b/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Droid/Uno.Toolkit.Samples.Droid.csproj index 52ead77d9..8c6642776 100644 --- a/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Droid/Uno.Toolkit.Samples.Droid.csproj +++ b/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Droid/Uno.Toolkit.Samples.Droid.csproj @@ -32,6 +32,7 @@ 4 True None + armeabi-v7a;x86;x86_64;arm64-v8a portable @@ -49,6 +50,7 @@ false true true + armeabi-v7a;x86;x86_64;arm64-v8a True @@ -142,4 +144,4 @@ - + \ No newline at end of file diff --git a/samples/Uno.Toolkit.WinUI.Samples/Uno.Toolkit.WinUI.Samples.Droid/Properties/AndroidManifest.xml b/samples/Uno.Toolkit.WinUI.Samples/Uno.Toolkit.WinUI.Samples.Droid/Properties/AndroidManifest.xml index 3e7567289..74d30eb9b 100644 --- a/samples/Uno.Toolkit.WinUI.Samples/Uno.Toolkit.WinUI.Samples.Droid/Properties/AndroidManifest.xml +++ b/samples/Uno.Toolkit.WinUI.Samples/Uno.Toolkit.WinUI.Samples.Droid/Properties/AndroidManifest.xml @@ -1,6 +1,6 @@  - + diff --git a/samples/Uno.Toolkit.WinUI.Samples/Uno.Toolkit.WinUI.Samples.Droid/Uno.Toolkit.WinUI.Samples.Droid.csproj b/samples/Uno.Toolkit.WinUI.Samples/Uno.Toolkit.WinUI.Samples.Droid/Uno.Toolkit.WinUI.Samples.Droid.csproj index 99419bb5a..78b3519e0 100644 --- a/samples/Uno.Toolkit.WinUI.Samples/Uno.Toolkit.WinUI.Samples.Droid/Uno.Toolkit.WinUI.Samples.Droid.csproj +++ b/samples/Uno.Toolkit.WinUI.Samples/Uno.Toolkit.WinUI.Samples.Droid/Uno.Toolkit.WinUI.Samples.Droid.csproj @@ -36,6 +36,7 @@ false false false + armeabi-v7a;x86;x86_64;arm64-v8a portable @@ -55,6 +56,7 @@ true false false + armeabi-v7a;x86;x86_64;arm64-v8a $(DefineConstants);IS_WINUI @@ -153,4 +155,4 @@ - + \ No newline at end of file diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props index f7de4a225..fa5b455be 100644 --- a/src/Directory.Packages.props +++ b/src/Directory.Packages.props @@ -9,6 +9,7 @@ + @@ -16,18 +17,18 @@ - + - + - + - + - + \ No newline at end of file diff --git a/src/Uno.Toolkit.RuntimeTests/Tests/AutoLayoutTest.cs b/src/Uno.Toolkit.RuntimeTests/Tests/AutoLayoutTest.cs index e70cfe87e..a804e7a83 100644 --- a/src/Uno.Toolkit.RuntimeTests/Tests/AutoLayoutTest.cs +++ b/src/Uno.Toolkit.RuntimeTests/Tests/AutoLayoutTest.cs @@ -87,6 +87,9 @@ public async Task When_SpaceBetween_with_spacing(Orientation orientation, double [DataRow(false, Orientation.Horizontal, VerticalAlignment.Top, HorizontalAlignment.Left, new[] { 10, 10, 10, 10 }, new[] { 108, 10, 0, 0 }, 10, 12, 110, 78, 138)] [DataRow(false, Orientation.Vertical, VerticalAlignment.Top, HorizontalAlignment.Left, new[] { 10, 10, 10, 10 }, new[] { 108, 10, 0, 0 }, -20, 12, 110, 168, 248)] [DataRow(false, Orientation.Horizontal, VerticalAlignment.Top, HorizontalAlignment.Left, new[] { 10, 10, 10, 10 }, new[] { 108, 10, 0, 0 }, -20, 12, 110, 108, 138)] +#if !__ANDROID__ && !__IOS__ + [Ignore("Currently fails on wasm")] +#endif public async Task When_AbsolutePosition_WithPadding(bool isStretch, Orientation orientation, VerticalAlignment vAlign, HorizontalAlignment hAlign, int[] padding, int[] margin, int spacing, double expectedY, double expectedX, double rec1expected, double rec2expected) { var SUT = new AutoLayout() diff --git a/src/Uno.Toolkit.RuntimeTests/Tests/NavigationBarTests.cs b/src/Uno.Toolkit.RuntimeTests/Tests/NavigationBarTests.cs new file mode 100644 index 000000000..9aa598fe5 --- /dev/null +++ b/src/Uno.Toolkit.RuntimeTests/Tests/NavigationBarTests.cs @@ -0,0 +1,204 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Uno.Disposables; +using Uno.Toolkit.RuntimeTests.Extensions; +using Uno.Toolkit.RuntimeTests.Helpers; +using Uno.Toolkit.RuntimeTests.Tests.TestPages; +using Uno.Toolkit.UI; +using Uno.UI.RuntimeTests; +using Windows.System; + +#if IS_WINUI +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Controls.Primitives; +using Microsoft.UI.Xaml.Media; +using Microsoft.UI.Xaml.Navigation; +#else +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Controls.Primitives; +using Windows.UI.Xaml.Markup; +using Windows.UI.Xaml.Media; +using Windows.UI.Xaml.Navigation; +#endif + + +namespace Uno.Toolkit.RuntimeTests.Tests +{ + [TestClass] + [RunsOnUIThread] + internal partial class NavigationBarTests + { + [TestMethod] + [DataRow(MainCommandMode.Back, DisplayName = nameof(MainCommandMode.Back))] + [DataRow(MainCommandMode.Action, DisplayName = nameof(MainCommandMode.Action))] + public async Task MainCommand_In_Popup_Without_Page(MainCommandMode mainCommandMode) + { + var shouldGoBack = mainCommandMode == MainCommandMode.Back; + var navigationBar = new NavigationBar { Content = "Title", MainCommandMode = mainCommandMode }; + var popup = new Popup { Width = 100, Height = 100, HorizontalOffset = 100, VerticalOffset = 100, Child = new StackPanel { Children = { navigationBar } } }; + var content = new StackPanel { Children = { popup } }; + + try + { + await UnitTestUIContentHelperEx.SetContentAndWait(content); + + popup.IsOpen = true; + + await UnitTestsUIContentHelper.WaitForIdle(); + await UnitTestsUIContentHelper.WaitForLoaded(popup); + + Assert.IsTrue(navigationBar.TryPerformMainCommand() == shouldGoBack, "Unexpected result from TryPerformMainCommand"); + + await UnitTestsUIContentHelper.WaitForIdle(); + + Assert.IsTrue(popup.IsOpen == !shouldGoBack, "Popup is in an incorrect state"); + } + finally + { + popup.IsOpen = false; + } + } + + [TestMethod] + [DataRow(MainCommandMode.Back, DisplayName = nameof(MainCommandMode.Back))] + [DataRow(MainCommandMode.Action, DisplayName = nameof(MainCommandMode.Action))] + public async Task MainCommand_In_Popup_With_Page(MainCommandMode mainCommandMode) + { + NavigationBar? firstPageNavBar = null; + var shouldGoBack = mainCommandMode == MainCommandMode.Back; + var popup = new Popup { Width = 100, Height = 100, HorizontalOffset = 100, VerticalOffset = 100 }; + var content = new Border { Width = 100, Height = 100, Child = popup }; + var frame = new Frame() { Width = 400, Height = 400 }; + + popup.Child = frame; + try + { + await UnitTestUIContentHelperEx.SetContentAndWait(content); + + popup.IsOpen = true; + + await UnitTestsUIContentHelper.WaitForIdle(); + + frame.Navigate(typeof(NavBarFirstPage)); + + await UnitTestsUIContentHelper.WaitForIdle(); + + var firstPage = frame.Content as NavBarFirstPage; + if (firstPage?.FindChild() is { } firstNavBar) + { + firstPageNavBar = firstNavBar; + firstNavBar.MainCommandMode = mainCommandMode; + } + + await UnitTestsUIContentHelper.WaitForLoaded(firstPageNavBar!); + + Assert.IsTrue(firstPageNavBar!.TryPerformMainCommand() == shouldGoBack, "Unexpected result from TryPerformMainCommand"); + + await UnitTestsUIContentHelper.WaitForIdle(); + + Assert.IsTrue(popup.IsOpen == !shouldGoBack, "Popup is in an incorrect state"); + } + finally + { + popup.IsOpen = false; + } + } + + [TestMethod] + [DataRow(MainCommandMode.Back, DisplayName = nameof(MainCommandMode.Back))] + [DataRow(MainCommandMode.Action, DisplayName = nameof(MainCommandMode.Action))] + public async Task MainCommand_In_Popup_With_Page_With_BackStack(MainCommandMode mainCommandMode) + { + NavigationBar? firstPageNavBar = null; + NavigationBar? secondPageNavBar = null; + + var shouldGoBack = mainCommandMode == MainCommandMode.Back; + var popup = new Popup { Width = 100, Height = 100, HorizontalOffset = 100, VerticalOffset = 100 }; + + var content = new Border { Width = 100, Height = 100, Child = popup }; + var frame = new Frame() { Width = 400, Height = 400 }; + + popup.Child = frame; + + try + { + await UnitTestUIContentHelperEx.SetContentAndWait(content); + + popup.IsOpen = true; + + await UnitTestsUIContentHelper.WaitForIdle(); + + frame.Navigate(typeof(NavBarFirstPage)); + + await UnitTestsUIContentHelper.WaitForIdle(); + + var firstPage = frame.Content as NavBarFirstPage; + if (firstPage?.FindChild() is { } firstNavBar) + { + firstPageNavBar = firstNavBar; + firstNavBar.MainCommandMode = mainCommandMode; + } + + frame.Navigate(typeof(NavBarSecondPage)); + + await UnitTestsUIContentHelper.WaitForIdle(); + + var secondPage = frame.Content as NavBarSecondPage; + if (secondPage?.FindChild() is { } secondNavBar) + { + secondPageNavBar = secondNavBar; + secondNavBar.MainCommandMode = mainCommandMode; + } + + await UnitTestsUIContentHelper.WaitForLoaded(secondPageNavBar!); + + //Assert that the back was handled by the NavBar + Assert.IsTrue(secondPageNavBar!.TryPerformMainCommand() == shouldGoBack, "Unexpected result from TryPerformMainCommand"); + + if (mainCommandMode == MainCommandMode.Back) + { + await UnitTestsUIContentHelper.WaitForLoaded(firstPageNavBar!); + Assert.IsTrue(frame.CurrentSourcePageType == typeof(NavBarFirstPage), "Expected to navigate back to NavBarFirstPage"); + } + else + { + await UnitTestsUIContentHelper.WaitForIdle(); + Assert.IsTrue(frame.CurrentSourcePageType == typeof(NavBarSecondPage), "Expected to stay on NavBarSecondPage"); + } + + Assert.IsTrue(popup.IsOpen, "Expected Popup to remain open"); + + // Now we try to GoBack again + if (mainCommandMode == MainCommandMode.Back) + { + Assert.IsTrue(firstPageNavBar!.TryPerformMainCommand(), "Expected Back to be handled by NavigationBar"); + } + else + { + Assert.IsFalse(secondPageNavBar!.TryPerformMainCommand(), "Expected Back to not be handled by NavigationBar"); + } + await UnitTestsUIContentHelper.WaitForIdle(); + + + if (mainCommandMode == MainCommandMode.Back) + { + Assert.IsFalse(popup.IsOpen, "Expected Popup to be closed"); + } + else + { + Assert.IsTrue(frame.CurrentSourcePageType == typeof(NavBarSecondPage), "Expected to stay on NavBarSecondPage"); + } + + } + finally + { + popup.IsOpen = false; + } + } + } +} + diff --git a/src/Uno.Toolkit.RuntimeTests/Tests/TestPages/NavBarFirstPage.xaml b/src/Uno.Toolkit.RuntimeTests/Tests/TestPages/NavBarFirstPage.xaml new file mode 100644 index 000000000..ec24a60a1 --- /dev/null +++ b/src/Uno.Toolkit.RuntimeTests/Tests/TestPages/NavBarFirstPage.xaml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/src/Uno.Toolkit.RuntimeTests/Tests/TestPages/NavBarFirstPage.xaml.cs b/src/Uno.Toolkit.RuntimeTests/Tests/TestPages/NavBarFirstPage.xaml.cs new file mode 100644 index 000000000..12cfe491b --- /dev/null +++ b/src/Uno.Toolkit.RuntimeTests/Tests/TestPages/NavBarFirstPage.xaml.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices.WindowsRuntime; +using Windows.Foundation; +using Windows.Foundation.Collections; +using Uno.Toolkit.UI; + +#if IS_WINUI +using Microsoft.UI; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Controls.Primitives; +using Microsoft.UI.Xaml.Data; +using Microsoft.UI.Xaml.Input; +using Microsoft.UI.Xaml.Media; +using Microsoft.UI.Xaml.Navigation; +#else +using Windows.UI; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Controls.Primitives; +using Windows.UI.Xaml.Data; +using Windows.UI.Xaml.Input; +using Windows.UI.Xaml.Media; +using Windows.UI.Xaml.Navigation; +#endif + +// The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=234238 + +namespace Uno.Toolkit.RuntimeTests.Tests.TestPages +{ + /// + /// An empty page that can be used on its own or navigated to within a Frame. + /// + public sealed partial class NavBarFirstPage : Page + { + public NavBarFirstPage() + { + this.InitializeComponent(); + } + } +} diff --git a/src/Uno.Toolkit.RuntimeTests/Tests/TestPages/NavBarSecondPage.xaml b/src/Uno.Toolkit.RuntimeTests/Tests/TestPages/NavBarSecondPage.xaml new file mode 100644 index 000000000..ddef3171a --- /dev/null +++ b/src/Uno.Toolkit.RuntimeTests/Tests/TestPages/NavBarSecondPage.xaml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/src/Uno.Toolkit.RuntimeTests/Tests/TestPages/NavBarSecondPage.xaml.cs b/src/Uno.Toolkit.RuntimeTests/Tests/TestPages/NavBarSecondPage.xaml.cs new file mode 100644 index 000000000..748254ef6 --- /dev/null +++ b/src/Uno.Toolkit.RuntimeTests/Tests/TestPages/NavBarSecondPage.xaml.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices.WindowsRuntime; +using Windows.Foundation; +using Windows.Foundation.Collections; +using Uno.Toolkit.UI; + +#if IS_WINUI +using Microsoft.UI; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Controls.Primitives; +using Microsoft.UI.Xaml.Data; +using Microsoft.UI.Xaml.Input; +using Microsoft.UI.Xaml.Media; +using Microsoft.UI.Xaml.Navigation; +#else +using Windows.UI; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Controls.Primitives; +using Windows.UI.Xaml.Data; +using Windows.UI.Xaml.Input; +using Windows.UI.Xaml.Media; +using Windows.UI.Xaml.Navigation; +#endif +// The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=234238 + +namespace Uno.Toolkit.RuntimeTests.Tests.TestPages +{ + /// + /// An empty page that can be used on its own or navigated to within a Frame. + /// + public sealed partial class NavBarSecondPage : Page + { + public NavBarSecondPage() + { + this.InitializeComponent(); + } + } +} diff --git a/src/Uno.Toolkit.UI/Controls/NavigationBar/NavigationBar.cs b/src/Uno.Toolkit.UI/Controls/NavigationBar/NavigationBar.cs index 46c00f614..f23be55bb 100644 --- a/src/Uno.Toolkit.UI/Controls/NavigationBar/NavigationBar.cs +++ b/src/Uno.Toolkit.UI/Controls/NavigationBar/NavigationBar.cs @@ -97,7 +97,7 @@ protected override void OnApplyTemplate() internal bool TryPerformMainCommand() { - if (MainCommandMode == MainCommandMode.Action) + if (MainCommandMode != MainCommandMode.Back) { return false; } @@ -107,22 +107,29 @@ internal bool TryPerformMainCommand() if (page.Frame is { Visibility: Visibility.Visible } frame && frame.CurrentSourcePageType == page.GetType()) { - if (MainCommandMode == MainCommandMode.Back) + + if (frame.CanGoBack == false && _popupHost is { }) + { + // If we are within a Page that is hosted within a Popup and the BackStack is empty: + // close the Popup + _popupHost.IsOpen = false; + return true; + } + else if (frame.CanGoBack) { - if (frame.CanGoBack == false && _popupHost is { }) - { - _popupHost.IsOpen = false; - return true; - } - else if (frame.CanGoBack) - { - frame.GoBack(); - return true; - } - + frame.GoBack(); + return true; } } } + else if (_popupHost is { }) + { + // If we are not hosted within a Page but we are still within a Popup: + // close the Popup + _popupHost.IsOpen = false; + return true; + } + return false; } diff --git a/src/Uno.Toolkit.UITest/Constants.cs b/src/Uno.Toolkit.UITest/Constants.cs index 339d406e1..86cf91e6c 100644 --- a/src/Uno.Toolkit.UITest/Constants.cs +++ b/src/Uno.Toolkit.UITest/Constants.cs @@ -11,7 +11,7 @@ public class Constants { public readonly static string WebAssemblyDefaultUri = "http://localhost:59402/"; public readonly static string iOSAppName = "com.nventive.Uno.Toolkit.Samples"; - public readonly static string AndroidAppName = "Uno.Toolkit.WinUI.Samples"; + public readonly static string AndroidAppName = "Uno.Toolkit.Samples"; public readonly static string iOSDeviceNameOrId = "iPad Pro (12.9-inch) (5th generation)"; public readonly static Platform CurrentPlatform = Platform.Android; diff --git a/src/Uno.Toolkit.UITest/RuntimeTests/RuntimeTestRunner.cs b/src/Uno.Toolkit.UITest/RuntimeTests/RuntimeTestRunner.cs new file mode 100644 index 000000000..c6ad6f902 --- /dev/null +++ b/src/Uno.Toolkit.UITest/RuntimeTests/RuntimeTestRunner.cs @@ -0,0 +1,190 @@ +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading.Tasks; +using Uno.UITest.Helpers.Queries; +using Uno.UITest; +using Uno.UITests.Helpers; +using Uno.Toolkit.UITest.Extensions; + +namespace Uno.Toolkit.UITest.RuntimeTests +{ + [TestFixture] + public partial class RuntimeTestRunner : TestBase + { + private readonly TimeSpan TestRunTimeout = TimeSpan.FromMinutes(2); + private const string TestResultsOutputFilePath = "UITEST_RUNTIMETESTS_RESULTS_FILE_PATH"; + + protected override string SampleName => "RuntimeTest Runner"; + + [Test] + public async Task RunRuntimeTests() + { + IAppQuery AllQuery(IAppQuery query) + // .All() is not yet supported for wasm. + => AppInitializer.GetLocalPlatform() == Platform.Browser ? query : query.All(); + + var runButton = new QueryEx(q => AllQuery(q).Marked("runButton")); + var failedTests = new QueryEx(q => AllQuery(q).Marked("failedTests")); + var failedTestsDetails = new QueryEx(q => AllQuery(q).Marked("failedTestDetails")); + var unitTestsControl = new QueryEx(q => AllQuery(q).Marked("UnitTestsRootControl")); + + async Task IsTestExecutionDone() + { + return await GetWithRetry("IsTestExecutionDone", () => unitTestsControl.GetDependencyPropertyValue("RunningStateForUITest")?.ToString().Equals("Finished", StringComparison.OrdinalIgnoreCase) ?? false); + } + + App.WaitForElement(runButton); + + if (Environment.GetEnvironmentVariable(TestResultsOutputFilePath) is { } path) + { + // Used to disable showing the test output visually + unitTestsControl.SetDependencyPropertyValue("IsRunningOnCI", "true"); + } + + App.FastTap(runButton); + + var lastChange = DateTimeOffset.Now; + var lastValue = ""; + + while (DateTimeOffset.Now - lastChange < TestRunTimeout) + { + var newValue = await GetWithRetry("GetRunTestCount", () => unitTestsControl.GetDependencyPropertyValue("RunTestCountForUITest")?.ToString()); + + if (lastValue != newValue) + { + lastChange = DateTimeOffset.Now; + } + + await Task.Delay(TimeSpan.FromSeconds(.5)); + + if (await IsTestExecutionDone()) + { + break; + } + } + + if (!await IsTestExecutionDone()) + { + Assert.Fail("A test run timed out"); + } + + TestContext.AddTestAttachment(await ArchiveResults(unitTestsControl), "runtimetests-results.zip"); + + var count = GetValue(nameof(unitTestsControl), unitTestsControl, "FailedTestCountForUITest"); + if (count != "0") + { + var tests = GetValue(nameof(failedTests), failedTests) + .Split(new char[] { '§' }, StringSplitOptions.RemoveEmptyEntries) + .Select((x, i) => $"\t{i + 1}. {x}\n") + .ToArray(); + var details = GetValue(nameof(failedTestsDetails), failedTestsDetails); + + Assert.Fail($"{tests.Length} unit test(s) failed (count={count}).\n\tFailing Tests:\n{string.Join("", tests)}\n\n---\n\tDetails:\n{details}"); + } + + TakeScreenshot("Runtime Tests Results"); + } + + async Task GetWithRetry(string logName, Func getter, int timeoutSeconds = 120) + { + var sw = Stopwatch.StartNew(); + Exception? lastException = null; + do + { + try + { + var result = getter(); + + if (sw.Elapsed > TimeSpan.FromSeconds(timeoutSeconds / 2)) + { + Console.WriteLine($"{logName} succeeded after retries"); + } + + return result; + } + catch (Exception e) + { + lastException = e; + Console.WriteLine($"{logName} failed with {e.Message}"); + } + + await Task.Delay(TimeSpan.FromSeconds(2)); + + Console.WriteLine($"{logName} retrying"); + } + while (sw.Elapsed < TimeSpan.FromSeconds(timeoutSeconds)); + + throw lastException; + } + + private static async Task ArchiveResults(QueryEx unitTestsControl) + { + var document = await GetNUnitTestResultsDocument(unitTestsControl); + + var file = Path.GetTempFileName(); + File.WriteAllText(file, document, Encoding.Unicode); + + if (Environment.GetEnvironmentVariable(TestResultsOutputFilePath) is { } path) + { + File.Copy(file, path, true); + } + else + { + Console.WriteLine($"The environment variable {TestResultsOutputFilePath} is not defined, skipping file system extraction"); + } + + var finalFile = Path.Combine(Path.GetDirectoryName(file), "test-results.xml"); + + if (File.Exists(finalFile)) + { + File.Delete(finalFile); + } + + File.Move(file, finalFile); + + return finalFile; + } + + private static async Task GetNUnitTestResultsDocument(QueryEx unitTestsControl) + { + int counter = 0; + + do + { + var document = GetValue(nameof(unitTestsControl), unitTestsControl, "NUnitTestResultsDocument"); + + if (!string.IsNullOrEmpty(document)) + { + return document; + } + + // The results are built asynchronously, it may not be available right away. + await Task.Delay(1000); + + } while (counter++ < 3); + + throw new InvalidOperationException($"Failed to get the test results document"); + } + + private static string GetValue(string elementName, QueryEx element, string dpName = "Text", [CallerLineNumber] int line = -1) + { + try + { + return element + ?.GetDependencyPropertyValue(dpName) + ?.ToString() ?? string.Empty; + } + catch (Exception e) + { + Assert.Fail($"Failed to get DP ${dpName} on {elementName} (@{line}), {e}", e); + throw new InvalidOperationException($"Failed to get DP ${dpName} on {elementName} (@{line}), {e}"); + } + } + } +} diff --git a/src/Uno.Toolkit.UITest/TestBase.cs b/src/Uno.Toolkit.UITest/TestBase.cs index 95a0cbc82..e216d2b42 100644 --- a/src/Uno.Toolkit.UITest/TestBase.cs +++ b/src/Uno.Toolkit.UITest/TestBase.cs @@ -33,7 +33,6 @@ static TestBase() AppInitializer.TestEnvironment.AndroidAppName = Constants.AndroidAppName; AppInitializer.TestEnvironment.WebAssemblyDefaultUri = Constants.WebAssemblyDefaultUri; AppInitializer.TestEnvironment.iOSAppName = Constants.iOSAppName; - AppInitializer.TestEnvironment.AndroidAppName = Constants.AndroidAppName; AppInitializer.TestEnvironment.iOSDeviceNameOrId = Constants.iOSDeviceNameOrId; AppInitializer.TestEnvironment.CurrentPlatform = Constants.CurrentPlatform; diff --git a/src/Uno.Toolkit.UITest/Uno.Toolkit.UITest.csproj b/src/Uno.Toolkit.UITest/Uno.Toolkit.UITest.csproj index 2b71dff05..f114e1d28 100644 --- a/src/Uno.Toolkit.UITest/Uno.Toolkit.UITest.csproj +++ b/src/Uno.Toolkit.UITest/Uno.Toolkit.UITest.csproj @@ -8,9 +8,9 @@ - + From bee207b4a43382316ab1ada3cbe6234b490a73a8 Mon Sep 17 00:00:00 2001 From: Steve Bilogan Date: Mon, 6 Feb 2023 11:10:00 -0500 Subject: [PATCH 2/2] chore: undo --- build/workflow/pipeline.yml | 5 +- build/workflow/scripts/android-uitest-run.sh | 77 +++---- build/workflow/scripts/ios-uitest-run.sh | 56 +++--- build/workflow/scripts/wasm-uitest-run.sh | 49 ++--- build/workflow/stage-uitests-android.yml | 118 ++--------- build/workflow/stage-uitests-build.yml | 38 ---- build/workflow/stage-uitests-ios.yml | 126 ++---------- build/workflow/stage-uitests-wasm.yml | 119 ++--------- build/workflow/templates/dotnet-install.yml | 15 -- ...nstall-mac.yml => dotnet6-install-mac.yml} | 22 +- .../templates/dotnet6-install-windows.yml | 54 +++++ .../templates/dotnet7-install-windows.yml | 34 ---- samples/Directory.Packages.props | 20 +- .../Properties/AndroidManifest.xml | 2 +- .../Uno.Toolkit.Samples.Droid.csproj | 4 +- .../Properties/AndroidManifest.xml | 2 +- .../Uno.Toolkit.WinUI.Samples.Droid.csproj | 4 +- src/Directory.Packages.props | 11 +- .../Tests/AutoLayoutTest.cs | 3 - src/Uno.Toolkit.UITest/Constants.cs | 2 +- .../RuntimeTests/RuntimeTestRunner.cs | 190 ------------------ src/Uno.Toolkit.UITest/TestBase.cs | 1 + .../Uno.Toolkit.UITest.csproj | 2 +- 23 files changed, 210 insertions(+), 744 deletions(-) delete mode 100644 build/workflow/stage-uitests-build.yml delete mode 100644 build/workflow/templates/dotnet-install.yml rename build/workflow/templates/{dotnet7-install-mac.yml => dotnet6-install-mac.yml} (65%) create mode 100644 build/workflow/templates/dotnet6-install-windows.yml delete mode 100644 build/workflow/templates/dotnet7-install-windows.yml delete mode 100644 src/Uno.Toolkit.UITest/RuntimeTests/RuntimeTestRunner.cs diff --git a/build/workflow/pipeline.yml b/build/workflow/pipeline.yml index fc343fa09..ac8a22db2 100644 --- a/build/workflow/pipeline.yml +++ b/build/workflow/pipeline.yml @@ -75,7 +75,7 @@ jobs: steps: - template: templates/gitversion.yml - - template: templates/dotnet7-install-windows.yml + - template: templates/dotnet6-install-windows.yml # This SDK version is needed as long as `uap10.0` will be supported in Uno.Core - powershell: .\build\Install-WindowsSdkISO.ps1 18362 @@ -126,7 +126,7 @@ jobs: provProfileSecureFile: Uno_Toolkit_iOS.mobileprovision - template: templates/gitversion.yml - - template: templates/dotnet7-install-mac.yml + - template: templates/dotnet6-install-mac.yml - bash: /bin/bash -c "sudo $AGENT_HOMEDIRECTORY/scripts/select-xamarin-sdk.sh $(XamarinSDKVersion)" displayName: Select Xamarin Version @@ -156,7 +156,6 @@ jobs: BUILD_SOLUTION: "src/Uno.Toolkit.sln" BUILD_BINLOG: "$(build.artifactstagingdirectory)/toolkit-build-$(ApplicationPlatform).binlog" -- template: stage-uitests-build.yml - template: stage-uitests-wasm.yml - template: stage-uitests-ios.yml - template: stage-uitests-android.yml diff --git a/build/workflow/scripts/android-uitest-run.sh b/build/workflow/scripts/android-uitest-run.sh index 805d88697..76aa6b355 100644 --- a/build/workflow/scripts/android-uitest-run.sh +++ b/build/workflow/scripts/android-uitest-run.sh @@ -5,50 +5,25 @@ IFS=$'\n\t' # echo commands set -x -export BUILDCONFIGURATION=Release -export NUNIT_VERSION=3.12.0 - -if [ "$UITEST_TEST_MODE_NAME" == 'Automated' ]; -then - export TEST_FILTERS="namespace != 'Uno.Toolkit.UITest.RuntimeTests'"; -elif [ "$UITEST_TEST_MODE_NAME" == 'RuntimeTests' ]; -then - export TEST_FILTERS="class == 'Uno.Toolkit.UITest.RuntimeTests.RuntimeTestRunner'"; -fi +export UNO_UITEST_SCREENSHOT_PATH=$BUILD_ARTIFACTSTAGINGDIRECTORY/screenshots/android export UNO_UITEST_PLATFORM=Android -export BASE_ARTIFACTS_PATH=$BUILD_ARTIFACTSTAGINGDIRECTORY/android/$XAML_FLAVOR_BUILD/$UITEST_TEST_MODE_NAME -export UNO_UITEST_SCREENSHOT_PATH=$BASE_ARTIFACTS_PATH/screenshots -export UNO_UITEST_ANDROIDAPK_PATH=$BUILD_SOURCESDIRECTORY/build/$SAMPLEAPP_ARTIFACT_NAME/$SAMPLE_PROJECT_NAME-Signed.apk +export UNO_UITEST_ANDROIDAPK_PATH=$BUILD_SOURCESDIRECTORY/samples/$SAMPLE_PROJECT_NAME/$SAMPLE_PROJECT_NAME.Droid/bin/Release/$SAMPLE_PROJECT_NAME-Signed.apk export UNO_UITEST_PROJECT=$BUILD_SOURCESDIRECTORY/src/Uno.Toolkit.UITest/Uno.Toolkit.UITest.csproj export UNO_UITEST_ANDROID_PROJECT=$BUILD_SOURCESDIRECTORY/samples/$SAMPLE_PROJECT_NAME/$SAMPLE_PROJECT_NAME.Droid/$SAMPLE_PROJECT_NAME.Droid.csproj -export UNO_UITEST_BINARY=$BUILD_SOURCESDIRECTORY/build/toolkit-uitest-binaries/Uno.Toolkit.UITest.dll -export UNO_UITEST_NUNIT_VERSION=$NUNIT_VERSION +export UNO_UITEST_BINARY=$BUILD_SOURCESDIRECTORY/src/Uno.Toolkit.UITest/bin/Uno.Toolkit.UITest/Release/Uno.Toolkit.UITest.dll +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_EMULATOR_INSTALLED=$BUILD_SOURCESDIRECTORY/build/.emulator_started -export UNO_ORIGINAL_TEST_RESULTS=$BUILD_SOURCESDIRECTORY/build/$UNO_TEST_RESULTS_FILE_NAME -export UNO_UITEST_RUNTIMETESTS_RESULTS_FILE_PATH=$UNO_ORIGINAL_TEST_RESULTS +export UNO_ORIGINAL_TEST_RESULTS=$BUILD_SOURCESDIRECTORY/build/TestResult-original.xml export UNO_TESTS_RESPONSE_FILE=$BUILD_SOURCESDIRECTORY/build/nunit.response +export ANDROID_SIMULATOR_APILEVEL=28 +export CMDLINETOOLS=commandlinetools-mac-8512546_latest.zip +export ANDROID_SDK_ROOT=$ANDROID_HOME 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 - AVD_NAME=xamarin_android_emulator AVD_CONFIG_FILE=~/.android/avd/$AVD_NAME.avd/config.ini EMU_UPDATE_FILE=~/.android/emu-update-last-check.ini @@ -61,13 +36,13 @@ fi if [[ ! -f $AVD_CONFIG_FILE ]]; then # Install AVD files - 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;33.0.0' | tr '\r' '\n' | uniq - echo "y" | $LATEST_CMDLINE_TOOLS_PATH/bin/sdkmanager --sdk_root=${ANDROID_HOME} --install 'platforms;android-28' | tr '\r' '\n' | uniq - echo "y" | $LATEST_CMDLINE_TOOLS_PATH/bin/sdkmanager --sdk_root=${ANDROID_HOME} --install 'extras;android;m2repository' | tr '\r' '\n' | uniq - echo "y" | $LATEST_CMDLINE_TOOLS_PATH/bin/sdkmanager --sdk_root=${ANDROID_HOME} --install 'system-images;android-28;google_apis_playstore;x86_64' | tr '\r' '\n' | uniq - echo "y" | $LATEST_CMDLINE_TOOLS_PATH/bin/sdkmanager --sdk_root=${ANDROID_HOME} --install "system-images;android-$ANDROID_SIMULATOR_APILEVEL;google_apis_playstore;x86_64" | 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;33.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 'extras;android;m2repository' | tr '\r' '\n' | uniq + echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --sdk_root=${ANDROID_HOME} --install 'system-images;android-28;google_apis_playstore;x86_64' | tr '\r' '\n' | uniq + 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" | tr '\r' '\n' | uniq if [[ -f $ANDROID_HOME/platform-tools/platform-tools/adb ]] then @@ -76,7 +51,7 @@ then 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 + 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. @@ -93,7 +68,7 @@ then $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 & + nohup $ANDROID_HOME/emulator/emulator -avd "$AVD_NAME" -skin 1280x800 -no-window -gpu swiftshader_indirect -no-snapshot -noaudio -no-boot-anim > $BUILD_ARTIFACTSTAGINGDIRECTORY/screenshots/android/android-emulator-log.txt 2>&1 & # Wait for the emulator to finish booting source $BUILD_SOURCESDIRECTORY/build/workflow/scripts/android-uitest-wait-systemui.sh 500 @@ -114,7 +89,11 @@ $ANDROID_HOME/platform-tools/adb shell settings put global hidden_api_policy 1 echo "Emulator started" -cp $UNO_UITEST_ANDROIDAPK_PATH $BUILD_ARTIFACTSTAGINGDIRECTORY +cd $BUILD_SOURCESDIRECTORY + +# build the sample, while the emulator is starting +mono '/Applications/Visual Studio.app/Contents/MonoBundle/MSBuild/Current/bin/MSBuild.dll' /m /r /p:Configuration=Release $UNO_UITEST_PROJECT +mono '/Applications/Visual Studio.app/Contents/MonoBundle/MSBuild/Current/bin/MSBuild.dll' /m /r /p:Configuration=Release /p:IsUiAutomationMappingEnabled=True /p:DisableNet6MobileTargets=True /p:UnoUIUseRoslynSourceGenerators=False /p:AndroidBuildApplicationPackage=True $UNO_UITEST_ANDROID_PROJECT cd $BUILD_SOURCESDIRECTORY/build @@ -132,26 +111,18 @@ echo "--inprocess" >> $UNO_TESTS_RESPONSE_FILE echo "--agents=1" >> $UNO_TESTS_RESPONSE_FILE echo "--workers=1" >> $UNO_TESTS_RESPONSE_FILE echo "--result=$UNO_ORIGINAL_TEST_RESULTS" >> $UNO_TESTS_RESPONSE_FILE -echo "--where \"$TEST_FILTERS\"" >> $UNO_TESTS_RESPONSE_FILE echo "$UNO_UITEST_BINARY" >> $UNO_TESTS_RESPONSE_FILE echo Response file: cat $UNO_TESTS_RESPONSE_FILE -## Show the tests list -mono $BUILD_SOURCESDIRECTORY/build/NUnit.ConsoleRunner.$UNO_UITEST_NUNIT_VERSION/tools/nunit3-console.exe \ - @$UNO_TESTS_RESPONSE_FILE --explore || true - mono $BUILD_SOURCESDIRECTORY/build/NUnit.ConsoleRunner.$UNO_UITEST_NUNIT_VERSION/tools/nunit3-console.exe \ @$UNO_TESTS_RESPONSE_FILE || true -## Copy the results file to the results folder -cp $UNO_ORIGINAL_TEST_RESULTS $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 +$ANDROID_HOME/platform-tools/adb shell logcat -d > $BUILD_ARTIFACTSTAGINGDIRECTORY/screenshots/android/android-device-log.txt -if [[ ! -f $UNO_ORIGINAL_TEST_RESULTS ]]; then +if [ ! -f "$UNO_ORIGINAL_TEST_RESULTS" ]; then echo "ERROR: The test results file $UNO_ORIGINAL_TEST_RESULTS does not exist (did nunit crash ?)" return 1 fi diff --git a/build/workflow/scripts/ios-uitest-run.sh b/build/workflow/scripts/ios-uitest-run.sh index 7c289eaa4..306c318e1 100644 --- a/build/workflow/scripts/ios-uitest-run.sh +++ b/build/workflow/scripts/ios-uitest-run.sh @@ -2,28 +2,16 @@ set -euo pipefail IFS=$'\n\t' - -if [ "$UITEST_TEST_MODE_NAME" == 'Automated' ]; -then - export TEST_FILTERS="namespace != 'Uno.Toolkit.UITest.RuntimeTests'"; - export UITEST_RUNTIMETESTS_RESULTS_FILE_PATH=$BUILD_SOURCESDIRECTORY/build/UITestResults-ios-automated.xml -elif [ "$UITEST_TEST_MODE_NAME" == 'RuntimeTests' ]; -then - export TEST_FILTERS="class == 'Uno.Toolkit.UITest.RuntimeTests.RuntimeTestRunner'"; - export UITEST_RUNTIMETESTS_RESULTS_FILE_PATH=$BUILD_SOURCESDIRECTORY/build/UITestResults-ios-runtime.xml -fi +export UNO_UITEST_SCREENSHOT_PATH=$BUILD_ARTIFACTSTAGINGDIRECTORY/screenshots/ios export UNO_UITEST_PLATFORM=iOS -export BASE_ARTIFACTS_PATH=$BUILD_ARTIFACTSTAGINGDIRECTORY/ios/$XAML_FLAVOR_BUILD/$UITEST_TEST_MODE_NAME -export UNO_UITEST_IOSBUNDLE_PATH=$BUILD_SOURCESDIRECTORY/build/$SAMPLEAPP_ARTIFACT_NAME/$SAMPLE_PROJECT_NAME.app -export UNO_UITEST_SCREENSHOT_PATH=$BASE_ARTIFACTS_PATH/screenshots +export UNO_UITEST_IOSBUNDLE_PATH=$BUILD_SOURCESDIRECTORY/samples/$SAMPLE_PROJECT_NAME/$SAMPLE_PROJECT_NAME.iOS/bin/iPhoneSimulator/Release/$SAMPLE_PROJECT_NAME.app export UNO_UITEST_PROJECT=$BUILD_SOURCESDIRECTORY/src/Uno.Toolkit.UITest/Uno.Toolkit.UITest.csproj -export UNO_UITEST_LOGFILE=$UNO_UITEST_SCREENSHOT_PATH/nunit-log.txt +export UNO_UITEST_LOGFILE=$BUILD_ARTIFACTSTAGINGDIRECTORY/screenshots/ios/nunit-log.txt export UNO_UITEST_IOS_PROJECT=$BUILD_SOURCESDIRECTORY/samples/$SAMPLE_PROJECT_NAME/$SAMPLE_PROJECT_NAME.iOS/$SAMPLE_PROJECT_NAME.iOS.csproj -export UNO_UITEST_BINARY=$BUILD_SOURCESDIRECTORY/build/toolkit-uitest-binaries/Uno.Toolkit.UITest.dll +export UNO_UITEST_BINARY=$BUILD_SOURCESDIRECTORY/src/Uno.Toolkit.UITest/bin/Uno.Toolkit.UITest/Release/Uno.Toolkit.UITest.dll 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/$UNO_TEST_RESULTS_FILE_NAME -export UNO_UITEST_RUNTIMETESTS_RESULTS_FILE_PATH=$UNO_ORIGINAL_TEST_RESULTS +export UNO_ORIGINAL_TEST_RESULTS=$BUILD_SOURCESDIRECTORY/build/TestResult-original.xml export UNO_TESTS_RESPONSE_FILE=$BUILD_SOURCESDIRECTORY/build/nunit.response export UNO_UITEST_SIMULATOR_VERSION="com.apple.CoreSimulator.SimRuntime.iOS-15-2" export UNO_UITEST_SIMULATOR_NAME="iPad Pro (12.9-inch) (4th generation)" @@ -34,6 +22,28 @@ xcrun simctl list devices --json /Applications/Xcode_13.2.1.app/Contents/Developer/Applications/Simulator.app/Contents/MacOS/Simulator & +cd $BUILD_SOURCESDIRECTORY + +mono '/Applications/Visual Studio.app/Contents/MonoBundle/MSBuild/Current/bin/MSBuild.dll' /m /r /p:Configuration=Release $UNO_UITEST_PROJECT +mono '/Applications/Visual Studio.app/Contents/MonoBundle/MSBuild/Current/bin/MSBuild.dll' /m /r /p:Configuration=Release /p:Platform=iPhoneSimulator /p:IsUiAutomationMappingEnabled=True /p:UnoUIUseRoslynSourceGenerators=False /p:DisableNet6MobileTargets=True $UNO_UITEST_IOS_PROJECT + +# echo "Current system date" +# date + +# echo "Listing iOS simulators" +# xcrun simctl list devices --json + +# ## +# ## Pre-install the application to avoid https://github.com/microsoft/appcenter/issues/2389 +# ## +# export SIMULATOR_ID=`xcrun simctl list -j | jq -r --arg sim "$UNO_UITEST_SIMULATOR_VERSION" --arg name "$UNO_UITEST_SIMULATOR_NAME" '.devices[$sim] | .[] | select(.name==$name) | .udid'` + +# echo "Starting simulator: $SIMULATOR_ID ($UNO_UITEST_SIMULATOR_VERSION / $UNO_UITEST_SIMULATOR_NAME)" +# xcrun simctl boot "$SIMULATOR_ID" || true + +# echo "Install app on simulator: $SIMULATOR_ID" +# xcrun simctl install "$SIMULATOR_ID" "$UNO_UITEST_IOSBUNDLE_PATH" || true + cd $BUILD_SOURCESDIRECTORY/build wget $UNO_UITEST_NUGET_URL @@ -41,8 +51,7 @@ mono nuget.exe install NUnit.ConsoleRunner -Version $UNO_UITEST_NUNIT_VERSION mkdir -p $UNO_UITEST_SCREENSHOT_PATH -# Imported app bundle from artifacts is not executable -chmod -R +x $UNO_UITEST_IOSBUNDLE_PATH +# chmod -R +x $UNO_UITEST_IOSBUNDLE_PATH # Move to the screenshot directory so that the output path is the proper one, as # required by Xamarin.UITest @@ -54,26 +63,17 @@ echo "--inprocess" >> $UNO_TESTS_RESPONSE_FILE echo "--agents=1" >> $UNO_TESTS_RESPONSE_FILE echo "--workers=1" >> $UNO_TESTS_RESPONSE_FILE echo "--result=$UNO_ORIGINAL_TEST_RESULTS" >> $UNO_TESTS_RESPONSE_FILE -echo "--where \"$TEST_FILTERS\"" >> $UNO_TESTS_RESPONSE_FILE echo "$UNO_UITEST_BINARY" >> $UNO_TESTS_RESPONSE_FILE echo Response file: cat $UNO_TESTS_RESPONSE_FILE -## Show the tests list -mono $BUILD_SOURCESDIRECTORY/build/NUnit.ConsoleRunner.$UNO_UITEST_NUNIT_VERSION/tools/nunit3-console.exe \ - @$UNO_TESTS_RESPONSE_FILE --explore || true - -## Run NUnit tests mono $BUILD_SOURCESDIRECTORY/build/NUnit.ConsoleRunner.$UNO_UITEST_NUNIT_VERSION/tools/nunit3-console.exe \ @$UNO_TESTS_RESPONSE_FILE || true echo "Current system date" date -## Copy the results file to the results folder -cp $UNO_ORIGINAL_TEST_RESULTS $BASE_ARTIFACTS_PATH - # export the simulator logs export LOG_FILEPATH=$UNO_UITEST_SCREENSHOT_PATH/_logs export TMP_LOG_FILEPATH=/tmp/DeviceLog-`date +"%Y%m%d%H%M%S"`.logarchive diff --git a/build/workflow/scripts/wasm-uitest-run.sh b/build/workflow/scripts/wasm-uitest-run.sh index 12707bfab..c06cdce3d 100644 --- a/build/workflow/scripts/wasm-uitest-run.sh +++ b/build/workflow/scripts/wasm-uitest-run.sh @@ -3,63 +3,46 @@ set -x #echo on set -euo pipefail IFS=$'\n\t' -if [ "$UITEST_TEST_MODE_NAME" == 'Automated' ]; -then - export TEST_FILTERS="namespace != 'Uno.Toolkit.UITest.RuntimeTests'"; - export UITEST_RUNTIMETESTS_RESULTS_FILE_PATH=$BUILD_SOURCESDIRECTORY/build/UITestResults-wasm-automated.xml -elif [ "$UITEST_TEST_MODE_NAME" == 'RuntimeTests' ]; -then - export TEST_FILTERS="class == 'Uno.Toolkit.UITest.RuntimeTests.RuntimeTestRunner'"; - export UITEST_RUNTIMETESTS_RESULTS_FILE_PATH=$BUILD_SOURCESDIRECTORY/build/UITestResults-wasm-runtime.xml -fi - -cd $BUILD_SOURCESDIRECTORY/build/$SAMPLEAPP_ARTIFACT_NAME - -npm i chromedriver@86.0.0 -npm i puppeteer@5.3.1 - -# install dotnet serve / Remove as needed -dotnet tool uninstall dotnet-serve -g || true -dotnet tool uninstall dotnet-serve --tool-path $BUILD_SOURCESDIRECTORY/build/tools || true -dotnet tool install dotnet-serve --version 1.10.140 --tool-path $BUILD_SOURCESDIRECTORY/build/tools || true -export PATH="$PATH:$BUILD_SOURCESDIRECTORY/build/tools" - -export BASE_ARTIFACTS_PATH=$BUILD_ARTIFACTSTAGINGDIRECTORY/wasm/$XAML_FLAVOR_BUILD/$UITEST_TEST_MODE_NAME export UNO_UITEST_TARGETURI=http://localhost:5000 -export UNO_UITEST_DRIVERPATH_CHROME=$BUILD_SOURCESDIRECTORY/build/$SAMPLEAPP_ARTIFACT_NAME/node_modules/chromedriver/lib/chromedriver -export UNO_UITEST_CHROME_BINARY_PATH=$BUILD_SOURCESDIRECTORY/build/$SAMPLEAPP_ARTIFACT_NAME/node_modules/puppeteer/.local-chromium/linux-800071/chrome-linux/chrome -export UNO_UITEST_SCREENSHOT_PATH=$BASE_ARTIFACTS_PATH/screenshots +export UNO_UITEST_DRIVERPATH_CHROME=$BUILD_SOURCESDIRECTORY/build/node_modules/chromedriver/lib/chromedriver +export UNO_UITEST_CHROME_BINARY_PATH=$BUILD_SOURCESDIRECTORY/build/node_modules/puppeteer/.local-chromium/linux-800071/chrome-linux/chrome +export UNO_UITEST_SCREENSHOT_PATH=$BUILD_ARTIFACTSTAGINGDIRECTORY/screenshots/wasm export UNO_UITEST_PLATFORM=Browser export UNO_UITEST_CHROME_CONTAINER_MODE=true export UNO_UITEST_PROJECT=$BUILD_SOURCESDIRECTORY/src/Uno.Toolkit.UITest/Uno.Toolkit.UITest.csproj -export UNO_UITEST_BINARY=$BUILD_SOURCESDIRECTORY/build/toolkit-uitest-binaries/Uno.Toolkit.UITest.dll -export UNO_UITEST_LOGFILE=$BASE_ARTIFACTS_PATH/nunit-log.txt +export UNO_UITEST_BINARY=$BUILD_SOURCESDIRECTORY/src/Uno.Toolkit.UITest/bin/Uno.Toolkit.UITest/Release/Uno.Toolkit.UITest.dll +export UNO_UITEST_LOGFILE=$BUILD_ARTIFACTSTAGINGDIRECTORY/screenshots/wasm/nunit-log.txt export UNO_UITEST_WASM_PROJECT=$BUILD_SOURCESDIRECTORY/samples/$SAMPLE_PROJECT_NAME/$SAMPLE_PROJECT_NAME.Wasm/$SAMPLE_PROJECT_NAME.Wasm.csproj export UNO_UITEST_WASM_OUTPUT_PATH=$BUILD_SOURCESDIRECTORY/samples/$SAMPLE_PROJECT_NAME/$SAMPLE_PROJECT_NAME.Wasm/bin/Release/net5.0/dist/ export UNO_UITEST_NUNIT_VERSION=3.11.1 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/$UNO_TEST_RESULTS_FILE_NAME -export UNO_UITEST_RUNTIMETESTS_RESULTS_FILE_PATH=$UNO_ORIGINAL_TEST_RESULTS +export UNO_ORIGINAL_TEST_RESULTS=$BUILD_SOURCESDIRECTORY/build/TestResult-original.xml export UNO_TESTS_RESPONSE_FILE=$BUILD_SOURCESDIRECTORY/build/nunit.response mkdir -p $UNO_UITEST_SCREENSHOT_PATH -## The python server serves the current working directory, and may be changed by the nunit runner -dotnet-serve -p 5000 -d "$BUILD_SOURCESDIRECTORY/build/$SAMPLEAPP_ARTIFACT_NAME/site" & +cd $BUILD_SOURCESDIRECTORY + +dotnet build /r /p:Configuration=Release $UNO_UITEST_PROJECT +dotnet build /r /p:Configuration=Release $UNO_UITEST_WASM_PROJECT /p:IsUiAutomationMappingEnabled=True /p:DisableNet6MobileTargets=True + +# Start the server +dotnet run --project $UNO_UITEST_WASM_PROJECT -c Release --no-build & cd $BUILD_SOURCESDIRECTORY/build +npm i chromedriver@86.0.0 +npm i puppeteer@5.3.1 wget $UNO_UITEST_NUGET_URL mono nuget.exe install NUnit.ConsoleRunner -Version $UNO_UITEST_NUNIT_VERSION ## Build the NUnit configuration file echo "--trace=Verbose" > $UNO_TESTS_RESPONSE_FILE echo "--result=$UNO_ORIGINAL_TEST_RESULTS" >> $UNO_TESTS_RESPONSE_FILE -echo "--where \"$TEST_FILTERS\"" >> $UNO_TESTS_RESPONSE_FILE echo "$UNO_UITEST_BINARY" >> $UNO_TESTS_RESPONSE_FILE mono $BUILD_SOURCESDIRECTORY/build/NUnit.ConsoleRunner.$UNO_UITEST_NUNIT_VERSION/tools/nunit3-console.exe \ @$UNO_TESTS_RESPONSE_FILE || true ## Copy the results file to the results folder -cp --backup=t $UNO_ORIGINAL_TEST_RESULTS $BASE_ARTIFACTS_PATH \ No newline at end of file +cp --backup=t $UNO_ORIGINAL_TEST_RESULTS $UNO_UITEST_SCREENSHOT_PATH diff --git a/build/workflow/stage-uitests-android.yml b/build/workflow/stage-uitests-android.yml index 92c03c9d5..d749703f3 100644 --- a/build/workflow/stage-uitests-android.yml +++ b/build/workflow/stage-uitests-android.yml @@ -1,101 +1,20 @@ jobs: - -- job: Android_Build_For_Tests - displayName: 'Build Android Samples App' - - pool: - vmImage: 'macOS-11' - - variables: - CI_Build: true - SourceLinkEnabled: false - VS_MSBUILD: '/Applications/Visual Studio.app/Contents/MonoBundle/MSBuild/Current/bin/MSBuild.dll' - - strategy: - maxParallel: 2 - matrix: - UWP: - SAMPLE_PROJECT_NAME: Uno.Toolkit.Samples - XAML_FLAVOR_BUILD: UWP - WinUI: - SAMPLE_PROJECT_NAME: Uno.Toolkit.WinUI.Samples - XAML_FLAVOR_BUILD: WinUI - - steps: - - checkout: self - clean: true - - - template: templates/dotnet7-install-mac.yml - - template: templates/jdk-setup.yml - - - script: | - mono '$(VS_MSBUILD)' '$(BUILD.SOURCESDIRECTORY)/samples/$(SAMPLE_PROJECT_NAME)/$(SAMPLE_PROJECT_NAME).Droid/$(SAMPLE_PROJECT_NAME).Droid.csproj' /m /r /p:Configuration=Release /p:UnoUIUseRoslynSourceGenerators=False /p:DisableNet6MobileTargets=true /p:IsUiAutomationMappingEnabled=true /p:AndroidBuildApplicationPackage=True /p:AndroidUseLatestPlatformSdk=true /bl:$(build.artifactstagingdirectory)/android-sampleapp.binlog - displayName: Build Android Samples App ($(XAML_FLAVOR_BUILD)) - - - - task: CopyFiles@2 - inputs: - SourceFolder: $(build.sourcesdirectory)/samples/$(SAMPLE_PROJECT_NAME)/$(SAMPLE_PROJECT_NAME).Droid/bin/Release/ - Contents: '$(SAMPLE_PROJECT_NAME)-Signed.apk' - TargetFolder: $(build.artifactstagingdirectory) - CleanTargetFolder: false - OverWrite: false - flattenFolders: false - - - task: PublishBuildArtifacts@1 - condition: always() - retryCountOnTaskFailure: 3 - inputs: - PathtoPublish: $(build.artifactstagingdirectory) - ArtifactName: sampleapp-android-build-$(XAML_FLAVOR_BUILD) - ArtifactType: Container - - - job: Android_UITests - displayName: 'Run Android UI Tests' - dependsOn: - - Android_Build_For_Tests - - Toolkit_UITests_Build - timeoutInMinutes: 90 + displayName: 'Android UI Tests' variables: CI_Build: true SourceLinkEnabled: false XamarinSDKVersion: 6_12_12 strategy: - maxParallel: 4 + maxParallel: 2 matrix: UWP: SAMPLE_PROJECT_NAME: Uno.Toolkit.Samples XAML_FLAVOR_BUILD: UWP - UITEST_TEST_MODE_NAME: Automated - ANDROID_SIMULATOR_APILEVEL: 28 - UNO_TEST_RESULTS_FILE_NAME: TestResult-android-UWP-Automated.xml - SAMPLEAPP_ARTIFACT_NAME: sampleapp-android-build-UWP WinUI: SAMPLE_PROJECT_NAME: Uno.Toolkit.WinUI.Samples XAML_FLAVOR_BUILD: WinUI - UITEST_TEST_MODE_NAME: Automated - ANDROID_SIMULATOR_APILEVEL: 28 - UNO_TEST_RESULTS_FILE_NAME: TestResult-android-WinUI-Automated.xml - SAMPLEAPP_ARTIFACT_NAME: sampleapp-android-build-WinUI - - UWP_Runtime: - SAMPLE_PROJECT_NAME: Uno.Toolkit.Samples - XAML_FLAVOR_BUILD: UWP - UITEST_TEST_MODE_NAME: RuntimeTests - ANDROID_SIMULATOR_APILEVEL: 28 - UNO_TEST_RESULTS_FILE_NAME: TestResult-android-UWP-RuntimeTests.xml - SAMPLEAPP_ARTIFACT_NAME: sampleapp-android-build-UWP - - WinUI_Runtime: - SAMPLE_PROJECT_NAME: Uno.Toolkit.WinUI.Samples - XAML_FLAVOR_BUILD: WinUI - UITEST_TEST_MODE_NAME: RuntimeTests - ANDROID_SIMULATOR_APILEVEL: 28 - UNO_TEST_RESULTS_FILE_NAME: TestResult-android-WinUI-RuntimeTests.xml - SAMPLEAPP_ARTIFACT_NAME: sampleapp-android-build-WinUI - pool: vmImage: 'macOS-11' @@ -104,20 +23,19 @@ - checkout: self clean: true - - task: DownloadBuildArtifacts@0 - displayName: 'Download Android SamplesApp Binaries' - inputs: - artifactName: $(SAMPLEAPP_ARTIFACT_NAME) - downloadPath: '$(build.sourcesdirectory)/build' - - - task: DownloadBuildArtifacts@0 - displayName: 'Download UITest Binaries' - inputs: - artifactName: toolkit-uitest-binaries - downloadPath: '$(build.sourcesdirectory)/build' + - task: UseDotNet@2 + displayName: 'Use .NET 5.0.406' + retryCountOnTaskFailure: 3 + inputs: + packageType: runtime + version: 5.0.15 - - template: templates/dotnet7-install-mac.yml - - template: templates/jdk-setup.yml + - task: UseDotNet@2 + displayName: 'Use .NET runtime 2.2.x' + retryCountOnTaskFailure: 3 + inputs: + packageType: runtime + version: 2.2.x - bash: /bin/bash -c "sudo $AGENT_HOMEDIRECTORY/scripts/select-xamarin-sdk.sh $(XamarinSDKVersion)" displayName: Select Xamarin Version @@ -132,16 +50,16 @@ - bash: | chmod +x $(build.sourcesdirectory)/build/workflow/scripts/android-uitest-run.sh $(build.sourcesdirectory)/build/workflow/scripts/android-uitest-run.sh - displayName: Run Android UITests ($(XAML_FLAVOR_BUILD) / $(UITEST_TEST_MODE_NAME)) + displayName: Build and Run Android Tests retryCountOnTaskFailure: 3 - task: PublishTestResults@2 condition: always() retryCountOnTaskFailure: 3 inputs: - testRunTitle: 'Android UITest Run ($(XAML_FLAVOR_BUILD) / $(UITEST_TEST_MODE_NAME))' + testRunTitle: 'Android UI Test Run ($(XAML_FLAVOR_BUILD))' testResultsFormat: 'NUnit' - testResultsFiles: $(build.sourcesdirectory)/build/$(UNO_TEST_RESULTS_FILE_NAME) + testResultsFiles: '$(build.sourcesdirectory)/build/TestResult-original.xml' failTaskOnFailedTests: true - task: PublishBuildArtifacts@1 @@ -149,5 +67,5 @@ retryCountOnTaskFailure: 3 inputs: PathtoPublish: $(build.artifactstagingdirectory) - ArtifactName: toolkit-uitests + ArtifactName: uno-uitest-tests-$(XAML_FLAVOR_BUILD) ArtifactType: Container diff --git a/build/workflow/stage-uitests-build.yml b/build/workflow/stage-uitests-build.yml deleted file mode 100644 index acd2d00e0..000000000 --- a/build/workflow/stage-uitests-build.yml +++ /dev/null @@ -1,38 +0,0 @@ -jobs: -- job: Toolkit_UITests_Build - displayName: 'Build Toolkit UI Tests' - - variables: - CI_Build: true - - pool: - vmImage: windows-2022 - - steps: - - checkout: self - clean: true - - - template: templates/dotnet-install.yml - - - task: MSBuild@1 - displayName: 'Build UI Tests' - inputs: - solution: src/Uno.Toolkit.UITest/Uno.Toolkit.UITest.csproj - msbuildArguments: /r /m /p:Configuration=Release /detailedsummary /m /bl:$(build.artifactstagingdirectory)\build.binlog - - - task: CopyFiles@2 - displayName: 'Publish UITest binaries' - inputs: - SourceFolder: $(BUILD.SOURCESDIRECTORY)/src/Uno.Toolkit.UITest/bin/Uno.Toolkit.UITest/Release - Contents: '**/*.*' - TargetFolder: $(build.artifactstagingdirectory) - CleanTargetFolder: false - OverWrite: false - flattenFolders: false - - - task: PublishBuildArtifacts@1 - retryCountOnTaskFailure: 3 - inputs: - PathtoPublish: $(build.artifactstagingdirectory) - ArtifactName: toolkit-uitest-binaries - ArtifactType: Container diff --git a/build/workflow/stage-uitests-ios.yml b/build/workflow/stage-uitests-ios.yml index 679b865de..97d66c3de 100644 --- a/build/workflow/stage-uitests-ios.yml +++ b/build/workflow/stage-uitests-ios.yml @@ -1,76 +1,6 @@ jobs: -- job: iOS_Build_For_Tests - displayName: 'Build iOS Samples App' - - pool: - vmImage: 'macOS-11' - - variables: - CI_Build: true - SourceLinkEnabled: false - VS_MSBUILD: '/Applications/Visual Studio.app/Contents/MonoBundle/MSBuild/Current/bin/MSBuild.dll' - XCODE_ROOT: '/Applications/Xcode_13.2.1.app' - XamarinSDKVersion: 6_12_12 - - strategy: - maxParallel: 2 - matrix: - UWP: - SAMPLE_PROJECT_NAME: Uno.Toolkit.Samples - XAML_FLAVOR_BUILD: UWP - WinUI: - SAMPLE_PROJECT_NAME: Uno.Toolkit.WinUI.Samples - XAML_FLAVOR_BUILD: WinUI - - steps: - - checkout: self - clean: true - - - template: templates/dotnet7-install-mac.yml - - template: templates/jdk-setup.yml - - - bash: /bin/bash -c "sudo $AGENT_HOMEDIRECTORY/scripts/select-xamarin-sdk.sh $(XamarinSDKVersion)" - displayName: Select Xamarin Version - - - bash: | - echo 'xCode Root to ${XCODE_ROOT}' - echo '##vso[task.setvariable variable=MD_APPLE_SDK_ROOT;]'${XCODE_ROOT} - sudo xcode-select --switch ${XCODE_ROOT}/Contents/Developer - - displayName: Select Xcode - - - bash: | - rm -f ${HOME}/Library/Preferences/Xamarin/Settings.plist - - # https://github.com/actions/virtual-environments/issues/1932 - displayName: Apply workaround for Azure Devops issue 1932 - - - script: | - mono '$(VS_MSBUILD)' '$(BUILD.SOURCESDIRECTORY)/samples/$(SAMPLE_PROJECT_NAME)/$(SAMPLE_PROJECT_NAME).iOS/$(SAMPLE_PROJECT_NAME).iOS.csproj' /m /r /p:Configuration=Release /p:UnoUIUseRoslynSourceGenerators=False /p:DisableNet6MobileTargets=true /p:IsUiAutomationMappingEnabled=true /bl:$(BUILD.ARTIFACTSTAGINGDIRECTORY)/ios-sampleapp.binlog - displayName: Build iOS Samples App ($(XAML_FLAVOR_BUILD)) - - - task: CopyFiles@2 - inputs: - SourceFolder: $(build.sourcesdirectory)/samples/$(SAMPLE_PROJECT_NAME)/$(SAMPLE_PROJECT_NAME).iOS/bin/iPhoneSimulator/Release/$(SAMPLE_PROJECT_NAME).app - Contents: '**' - TargetFolder: $(build.artifactstagingdirectory)/$(SAMPLE_PROJECT_NAME).app - CleanTargetFolder: false - OverWrite: false - flattenFolders: false - - - task: PublishBuildArtifacts@1 - condition: always() - retryCountOnTaskFailure: 3 - inputs: - PathtoPublish: $(build.artifactstagingdirectory) - ArtifactName: sampleapp-ios-build-$(XAML_FLAVOR_BUILD) - ArtifactType: Container - - job: iOS_UITests - displayName: 'Run iOS UI Tests' - dependsOn: - - iOS_Build_For_Tests - - Toolkit_UITests_Build + displayName: 'iOS UI Tests' timeoutInMinutes: 90 variables: CI_Build: true @@ -79,32 +9,14 @@ XamarinSDKVersion: 6_12_12 strategy: - maxParallel: 4 + maxParallel: 2 matrix: UWP: SAMPLE_PROJECT_NAME: Uno.Toolkit.Samples XAML_FLAVOR_BUILD: UWP - UITEST_TEST_MODE_NAME: Automated - UNO_TEST_RESULTS_FILE_NAME: TestResult-ios-UWP-Automated.xml - SAMPLEAPP_ARTIFACT_NAME: sampleapp-ios-build-UWP WinUI: SAMPLE_PROJECT_NAME: Uno.Toolkit.WinUI.Samples XAML_FLAVOR_BUILD: WinUI - UITEST_TEST_MODE_NAME: Automated - UNO_TEST_RESULTS_FILE_NAME: TestResult-ios-WinUI-Automated.xml - SAMPLEAPP_ARTIFACT_NAME: sampleapp-ios-build-WinUI - UWP_Runtime: - SAMPLE_PROJECT_NAME: Uno.Toolkit.Samples - XAML_FLAVOR_BUILD: UWP - UITEST_TEST_MODE_NAME: RuntimeTests - UNO_TEST_RESULTS_FILE_NAME: TestResult-ios-UWP-RuntimeTests.xml - SAMPLEAPP_ARTIFACT_NAME: sampleapp-ios-build-UWP - WinUI_Runtime: - SAMPLE_PROJECT_NAME: Uno.Toolkit.WinUI.Samples - XAML_FLAVOR_BUILD: WinUI - UITEST_TEST_MODE_NAME: RuntimeTests - UNO_TEST_RESULTS_FILE_NAME: TestResult-ios-WinUI-RuntimeTests.xml - SAMPLEAPP_ARTIFACT_NAME: sampleapp-ios-build-WinUI pool: vmImage: 'macOS-11' @@ -113,19 +25,19 @@ - checkout: self clean: true - - task: DownloadBuildArtifacts@0 - displayName: 'Download iOS Samples App' - inputs: - artifactName: $(SAMPLEAPP_ARTIFACT_NAME) - downloadPath: '$(build.sourcesdirectory)/build' + - task: UseDotNet@2 + displayName: 'Use .NET 5.0.406' + retryCountOnTaskFailure: 3 + inputs: + packageType: runtime + version: 5.0.15 - - task: DownloadBuildArtifacts@0 - displayName: 'Download UITest Binaries' - inputs: - artifactName: toolkit-uitest-binaries - downloadPath: '$(build.sourcesdirectory)/build' - - - template: templates/dotnet7-install-mac.yml + - task: UseDotNet@2 + displayName: 'Use .NET runtime 2.2.x' + retryCountOnTaskFailure: 3 + inputs: + packageType: runtime + version: 2.2.x - bash: /bin/bash -c "sudo $AGENT_HOMEDIRECTORY/scripts/select-xamarin-sdk.sh $(XamarinSDKVersion)" displayName: Select Xamarin Version @@ -142,20 +54,20 @@ # https://github.com/actions/virtual-environments/issues/1932 displayName: Apply workaround for Azure Devops issue 1932 - + - bash: | chmod +x $(build.sourcesdirectory)/build/workflow/scripts/ios-uitest-run.sh $(build.sourcesdirectory)/build/workflow/scripts/ios-uitest-run.sh - displayName: Run iOS UITests ($(XAML_FLAVOR_BUILD) / $(UITEST_TEST_MODE_NAME)) + displayName: Build and Run iOS Test retryCountOnTaskFailure: 3 - task: PublishTestResults@2 condition: always() retryCountOnTaskFailure: 3 inputs: - testRunTitle: 'iOS UITest Run ($(XAML_FLAVOR_BUILD) / $(UITEST_TEST_MODE_NAME))' + testRunTitle: 'iOS UI Test Run ($(XAML_FLAVOR_BUILD))' testResultsFormat: 'NUnit' - testResultsFiles: '$(build.sourcesdirectory)/build/$(UNO_TEST_RESULTS_FILE_NAME)' + testResultsFiles: '$(build.sourcesdirectory)/build/TestResult-original.xml' failTaskOnFailedTests: true - task: PublishBuildArtifacts@1 @@ -163,5 +75,5 @@ retryCountOnTaskFailure: 3 inputs: PathtoPublish: $(build.artifactstagingdirectory) - ArtifactName: toolkit-uitests + ArtifactName: uno-uitest-tests-$(XAML_FLAVOR_BUILD) ArtifactType: Container diff --git a/build/workflow/stage-uitests-wasm.yml b/build/workflow/stage-uitests-wasm.yml index ea4908eba..cb86eb533 100644 --- a/build/workflow/stage-uitests-wasm.yml +++ b/build/workflow/stage-uitests-wasm.yml @@ -1,11 +1,8 @@ jobs: -- job: Wasm_Build_For_Tests - displayName: 'Build WebAssembly Sample App' +- job: Wasm_UITests + displayName: 'WebAssembly UI Tests' container: unoplatform/wasm-build:3.0 - pool: - vmImage: 'ubuntu-20.04' - strategy: maxParallel: 2 matrix: @@ -16,89 +13,6 @@ SAMPLE_PROJECT_NAME: Uno.Toolkit.WinUI.Samples XAML_FLAVOR_BUILD: WinUI - steps: - - checkout: self - clean: true - - - task: UseDotNet@2 - displayName: 'Use .NET Core SDK 6.0.300' - retryCountOnTaskFailure: 3 - inputs: - packageType: sdk - version: 6.0.300 - - - task: UseDotNet@2 - displayName: 'Use .NET Core SDK 5.0.400' - retryCountOnTaskFailure: 3 - inputs: - packageType: sdk - version: 5.0.400 - - - task: UseDotNet@2 - displayName: 'Use .NET Core SDK 3.1.406' - retryCountOnTaskFailure: 3 - inputs: - packageType: sdk - version: 3.1.406 - - - bash: | - dotnet build /r /p:Configuration=Release '$(BUILD.SOURCESDIRECTORY)/samples/$(SAMPLE_PROJECT_NAME)/$(SAMPLE_PROJECT_NAME).Wasm/$(SAMPLE_PROJECT_NAME).Wasm.csproj' /p:IsUiAutomationMappingEnabled=True /p:DisableNet6MobileTargets=True /bl:$(build.artifactstagingdirectory)/wasm-sampleapp.binlog - - displayName: Build WASM Samples App ($(XAML_FLAVOR_BUILD)) - - - task: CopyFiles@2 - displayName: 'Publish Wasm Site (net5.0)' - inputs: - SourceFolder: $(build.sourcesdirectory)/samples/$(SAMPLE_PROJECT_NAME)/$(SAMPLE_PROJECT_NAME).Wasm/bin/Release/net5.0/dist - Contents: '**/*.*' - TargetFolder: $(build.artifactstagingdirectory)/site - CleanTargetFolder: false - OverWrite: false - flattenFolders: false - - - task: PublishBuildArtifacts@1 - condition: always() - retryCountOnTaskFailure: 3 - inputs: - PathtoPublish: $(build.artifactstagingdirectory) - ArtifactName: sampleapp-wasm-build-$(XAML_FLAVOR_BUILD) - ArtifactType: Container - -- job: Wasm_UITests - displayName: 'Run WebAssembly UI Tests' - container: unoplatform/wasm-build:3.0 - timeoutInMinutes: 90 - dependsOn: - - Wasm_Build_For_Tests - - Toolkit_UITests_Build - strategy: - maxParallel: 4 - matrix: - UWP: - SAMPLE_PROJECT_NAME: Uno.Toolkit.Samples - XAML_FLAVOR_BUILD: UWP - UITEST_TEST_MODE_NAME: Automated - UNO_TEST_RESULTS_FILE_NAME: TestResult-wasm-UWP-Automated.xml - SAMPLEAPP_ARTIFACT_NAME: sampleapp-wasm-build-UWP - WinUI: - SAMPLE_PROJECT_NAME: Uno.Toolkit.WinUI.Samples - XAML_FLAVOR_BUILD: WinUI - UITEST_TEST_MODE_NAME: Automated - UNO_TEST_RESULTS_FILE_NAME: TestResult-wasm-WinUI-Automated.xml - SAMPLEAPP_ARTIFACT_NAME: sampleapp-wasm-build-WinUI - UWP_Runtime: - SAMPLE_PROJECT_NAME: Uno.Toolkit.Samples - XAML_FLAVOR_BUILD: UWP - UITEST_TEST_MODE_NAME: RuntimeTests - UNO_TEST_RESULTS_FILE_NAME: TestResult-wasm-UWP-RuntimeTests.xml - SAMPLEAPP_ARTIFACT_NAME: sampleapp-wasm-build-UWP - WinUI_Runtime: - SAMPLE_PROJECT_NAME: Uno.Toolkit.WinUI.Samples - XAML_FLAVOR_BUILD: WinUI - UITEST_TEST_MODE_NAME: RuntimeTests - UNO_TEST_RESULTS_FILE_NAME: TestResult-wasm-WinUI-RuntimeTests.xml - SAMPLEAPP_ARTIFACT_NAME: sampleapp-wasm-build-WinUI - pool: vmImage: 'ubuntu-20.04' @@ -108,18 +22,6 @@ steps: - checkout: self clean: true - - - task: DownloadBuildArtifacts@0 - displayName: 'Download WASM Samples App' - inputs: - artifactName: $(SAMPLEAPP_ARTIFACT_NAME) - downloadPath: '$(build.sourcesdirectory)/build' - - - task: DownloadBuildArtifacts@0 - displayName: 'Download UITest Binaries' - inputs: - artifactName: toolkit-uitest-binaries - downloadPath: '$(build.sourcesdirectory)/build' - task: UseDotNet@2 displayName: 'Use .NET Core SDK 6.0.300' @@ -146,7 +48,7 @@ chmod +x build/workflow/scripts/wasm-uitest-run.sh build/workflow/scripts/wasm-uitest-run.sh retryCountOnTaskFailure: 3 - displayName: Run WASM UITests ($(XAML_FLAVOR_BUILD) / $(UITEST_TEST_MODE_NAME)) + displayName: 'Running build' - task: PublishTestResults@2 condition: always() @@ -154,13 +56,24 @@ inputs: testRunTitle: 'WebAssembly UI Test Run ($(XAML_FLAVOR_BUILD))' testResultsFormat: 'NUnit' - testResultsFiles: '$(build.sourcesdirectory)/build/$(UNO_TEST_RESULTS_FILE_NAME)' + testResultsFiles: '$(build.sourcesdirectory)/build/TestResult-original.xml' failTaskOnFailedTests: true + searchFolder: '$(build.artifactstagingdirectory)/screenshots/wasm' + + - task: CopyFiles@2 + displayName: Copy Wasm output + inputs: + SourceFolder: $(build.sourcesdirectory)/samples/$(SAMPLE_PROJECT_NAME)/$(SAMPLE_PROJECT_NAME).Wasm/bin/Release/net5.0/dist + Contents: '**/*.*' + TargetFolder: $(Build.ArtifactStagingDirectory)/screenshots/wasm + CleanTargetFolder: false + OverWrite: false + flattenFolders: false - task: PublishBuildArtifacts@1 retryCountOnTaskFailure: 3 condition: always() inputs: PathtoPublish: $(build.artifactstagingdirectory) - ArtifactName: toolkit-uitests + ArtifactName: uno-uitest-tests-$(XAML_FLAVOR_BUILD) ArtifactType: Container diff --git a/build/workflow/templates/dotnet-install.yml b/build/workflow/templates/dotnet-install.yml deleted file mode 100644 index d6119af8d..000000000 --- a/build/workflow/templates/dotnet-install.yml +++ /dev/null @@ -1,15 +0,0 @@ -steps: - - - task: UseDotNet@2 - displayName: 'Use .NET 5.0.406' - retryCountOnTaskFailure: 3 - inputs: - packageType: runtime - version: 5.0.15 - - - task: UseDotNet@2 - displayName: 'Use .NET runtime 2.2.x' - retryCountOnTaskFailure: 3 - inputs: - packageType: runtime - version: 2.2.x \ No newline at end of file diff --git a/build/workflow/templates/dotnet7-install-mac.yml b/build/workflow/templates/dotnet6-install-mac.yml similarity index 65% rename from build/workflow/templates/dotnet7-install-mac.yml rename to build/workflow/templates/dotnet6-install-mac.yml index 252f35802..a3b44a088 100644 --- a/build/workflow/templates/dotnet7-install-mac.yml +++ b/build/workflow/templates/dotnet6-install-mac.yml @@ -1,7 +1,7 @@ parameters: - DotNetVersion: '7.0.102' - UnoCheck_Version: '1.11.0-dev.2' - UnoCheck_Manifest: 'https://raw.githubusercontent.com/unoplatform/uno.check/146b0b4b23d866bef455494a12ad7ffd2f6f2d20/manifests/uno.ui.manifest.json' + DotNetVersion: '6.0.401' + UnoCheck_Version: '1.5.4' + UnoCheck_Manifest: 'https://raw.githubusercontent.com/unoplatform/uno.check/34b1a60f5c1c51604b47362781969dde46979fd5/manifests/uno.ui.manifest.json' Dotnet_Root: '/usr/local/share/dotnet/' Dotnet_Tools: '~/.dotnet/tools' @@ -22,14 +22,14 @@ steps: # Required until .NET 6 installs properly using UseDotnet # using preview builds - #- bash: | - # export PATH="${{ parameters.Dotnet_Root }}:${{ parameters.Dotnet_Tools }}:$PATH" - # curl -L https://raw.githubusercontent.com/dotnet/install-scripts/11b4eebe23d871c074364940d301c3eb53e7c7ec/src/dotnet-install.sh > dotnet-install.sh - # sh dotnet-install.sh --version ${{ parameters.DotNetVersion }} --install-dir $DOTNET_ROOT --verbose - # dotnet --list-sdks - # echo "##vso[task.setvariable variable=PATH]$PATH" - # displayName: install .NET ${{ parameters.DotNetVersion }} - # retryCountOnTaskFailure: 3 + # - bash: | + # export PATH="${{ parameters.Dotnet_Root }}:${{ parameters.Dotnet_Tools }}:$PATH" + # curl -L https://raw.githubusercontent.com/dotnet/install-scripts/11b4eebe23d871c074364940d301c3eb53e7c7ec/src/dotnet-install.sh > dotnet-install.sh + # sh dotnet-install.sh --version ${{ parameters.DotNetVersion }} --install-dir $DOTNET_ROOT --verbose + # dotnet --list-sdks + # echo "##vso[task.setvariable variable=PATH]$PATH" + # displayName: install .NET ${{ parameters.DotNetVersion }} + # retryCountOnTaskFailure: 3 - task: UseDotNet@2 displayName: 'Use .NET Core SDK ${{ parameters.DotNetVersion }}' diff --git a/build/workflow/templates/dotnet6-install-windows.yml b/build/workflow/templates/dotnet6-install-windows.yml new file mode 100644 index 000000000..c02d6fb3c --- /dev/null +++ b/build/workflow/templates/dotnet6-install-windows.yml @@ -0,0 +1,54 @@ +parameters: + DotNetVersion: '6.0.401' + UnoCheck_Version: '1.5.4' + UnoCheck_Manifest: 'https://raw.githubusercontent.com/unoplatform/uno.check/34b1a60f5c1c51604b47362781969dde46979fd5/manifests/uno.ui.manifest.json' + +steps: + + # Required until .NET 6 installs properly on Windows using UseDotnet + # using preview builds + # - powershell: | + # $ProgressPreference = 'SilentlyContinue' + # Invoke-WebRequest -Uri "https://dot.net/v1/dotnet-install.ps1" -OutFile dotnet-install.ps1 + # & .\dotnet-install.ps1 -Version ${{ parameters.DotNetVersion }} -InstallDir "$env:ProgramFiles\dotnet\" -Verbose + # & dotnet --list-sdks + # displayName: Install .NET ${{ parameters.DotNetVersion }} + # errorActionPreference: stop + # retryCountOnTaskFailure: 3 + - task: UseDotNet@2 + displayName: 'Use .NET Core SDK ${{ parameters.DotNetVersion }}' + retryCountOnTaskFailure: 3 + inputs: + packageType: sdk + version: ${{ parameters.DotNetVersion }} + includePreviewVersions: true + + - template: jdk-setup.yml + + - powershell: | + & dotnet tool update --global uno.check --version ${{ parameters.UnoCheck_Version }} --add-source https://api.nuget.org/v3/index.json + & uno-check -v --ci --non-interactive --fix --skip xcode --skip gtk3 --skip vswin --skip vsmac --manifest ${{ parameters.UnoCheck_Manifest }} + displayName: Install .NET Workloads + errorActionPreference: continue + ignoreLASTEXITCODE: true + retryCountOnTaskFailure: 3 + + # https://github.com/actions/runner-images/issues/6082#issuecomment-1215100175 + - powershell: | + Set-Location "C:\Program Files (x86)\Microsoft Visual Studio\Installer\" + $InstallPath = "C:\Program Files\Microsoft Visual Studio\2022\Enterprise" + $componentsToAdd = @( + "Component.Xamarin" + ) + [string]$workloadArgs = $componentsToAdd | ForEach-Object {" --add " + $_} + $Arguments = ('/c', "vs_installer.exe", 'modify', '--installPath', "`"$InstallPath`"",$workloadArgs, '--quiet', '--norestart', '--nocache') + $process = Start-Process -FilePath cmd.exe -ArgumentList $Arguments -Wait -PassThru -WindowStyle Hidden + if ($process.ExitCode -eq 0) + { + Write-Host "components have been successfully added" + } + else + { + Write-Host "components were not installed" + exit 1 + } diff --git a/build/workflow/templates/dotnet7-install-windows.yml b/build/workflow/templates/dotnet7-install-windows.yml deleted file mode 100644 index bdf325af4..000000000 --- a/build/workflow/templates/dotnet7-install-windows.yml +++ /dev/null @@ -1,34 +0,0 @@ -parameters: - DotNetVersion: '7.0.102' - UnoCheck_Version: '1.11.0-dev.2' - UnoCheck_Manifest: 'https://raw.githubusercontent.com/unoplatform/uno.check/146b0b4b23d866bef455494a12ad7ffd2f6f2d20/manifests/uno.ui.manifest.json' - -steps: - - # Required until .NET 6 installs properly on Windows using UseDotnet - # using preview builds - #- powershell: | - # $ProgressPreference = 'SilentlyContinue' - # Invoke-WebRequest -Uri "https://dot.net/v1/dotnet-install.ps1" -OutFile dotnet-install.ps1 - # & .\dotnet-install.ps1 -Version ${{ parameters.DotNetVersion }} -InstallDir "$env:ProgramFiles\dotnet\" -Verbose - # & dotnet --list-sdks - # displayName: Install .NET ${{ parameters.DotNetVersion }} - # errorActionPreference: stop - # retryCountOnTaskFailure: 3 - - task: UseDotNet@2 - displayName: 'Use .NET Core SDK ${{ parameters.DotNetVersion }}' - retryCountOnTaskFailure: 3 - inputs: - packageType: sdk - version: ${{ parameters.DotNetVersion }} - includePreviewVersions: true - - - template: jdk-setup.yml - - - powershell: | - & dotnet tool update --global uno.check --version ${{ parameters.UnoCheck_Version }} --add-source https://api.nuget.org/v3/index.json - & uno-check -v --ci --non-interactive --fix --skip xcode --skip gtk3 --skip vswin --skip vsmac --manifest ${{ parameters.UnoCheck_Manifest }} - displayName: Install .NET Workloads - errorActionPreference: continue - ignoreLASTEXITCODE: true - retryCountOnTaskFailure: 3 diff --git a/samples/Directory.Packages.props b/samples/Directory.Packages.props index 4fc3c1dda..3292ce3c0 100644 --- a/samples/Directory.Packages.props +++ b/samples/Directory.Packages.props @@ -25,20 +25,20 @@ - + - - - - - + + + + + - - - - + + + + diff --git a/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Droid/Properties/AndroidManifest.xml b/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Droid/Properties/AndroidManifest.xml index 6e596781d..0bbc060a8 100644 --- a/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Droid/Properties/AndroidManifest.xml +++ b/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Droid/Properties/AndroidManifest.xml @@ -3,4 +3,4 @@ - + \ No newline at end of file diff --git a/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Droid/Uno.Toolkit.Samples.Droid.csproj b/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Droid/Uno.Toolkit.Samples.Droid.csproj index 8c6642776..52ead77d9 100644 --- a/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Droid/Uno.Toolkit.Samples.Droid.csproj +++ b/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Droid/Uno.Toolkit.Samples.Droid.csproj @@ -32,7 +32,6 @@ 4 True None - armeabi-v7a;x86;x86_64;arm64-v8a portable @@ -50,7 +49,6 @@ false true true - armeabi-v7a;x86;x86_64;arm64-v8a True @@ -144,4 +142,4 @@ - \ No newline at end of file + diff --git a/samples/Uno.Toolkit.WinUI.Samples/Uno.Toolkit.WinUI.Samples.Droid/Properties/AndroidManifest.xml b/samples/Uno.Toolkit.WinUI.Samples/Uno.Toolkit.WinUI.Samples.Droid/Properties/AndroidManifest.xml index 74d30eb9b..3e7567289 100644 --- a/samples/Uno.Toolkit.WinUI.Samples/Uno.Toolkit.WinUI.Samples.Droid/Properties/AndroidManifest.xml +++ b/samples/Uno.Toolkit.WinUI.Samples/Uno.Toolkit.WinUI.Samples.Droid/Properties/AndroidManifest.xml @@ -1,6 +1,6 @@  - + diff --git a/samples/Uno.Toolkit.WinUI.Samples/Uno.Toolkit.WinUI.Samples.Droid/Uno.Toolkit.WinUI.Samples.Droid.csproj b/samples/Uno.Toolkit.WinUI.Samples/Uno.Toolkit.WinUI.Samples.Droid/Uno.Toolkit.WinUI.Samples.Droid.csproj index 78b3519e0..99419bb5a 100644 --- a/samples/Uno.Toolkit.WinUI.Samples/Uno.Toolkit.WinUI.Samples.Droid/Uno.Toolkit.WinUI.Samples.Droid.csproj +++ b/samples/Uno.Toolkit.WinUI.Samples/Uno.Toolkit.WinUI.Samples.Droid/Uno.Toolkit.WinUI.Samples.Droid.csproj @@ -36,7 +36,6 @@ false false false - armeabi-v7a;x86;x86_64;arm64-v8a portable @@ -56,7 +55,6 @@ true false false - armeabi-v7a;x86;x86_64;arm64-v8a $(DefineConstants);IS_WINUI @@ -155,4 +153,4 @@ - \ No newline at end of file + diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props index fa5b455be..f7de4a225 100644 --- a/src/Directory.Packages.props +++ b/src/Directory.Packages.props @@ -9,7 +9,6 @@ - @@ -17,18 +16,18 @@ - + - + - + - + - \ No newline at end of file + diff --git a/src/Uno.Toolkit.RuntimeTests/Tests/AutoLayoutTest.cs b/src/Uno.Toolkit.RuntimeTests/Tests/AutoLayoutTest.cs index a804e7a83..e70cfe87e 100644 --- a/src/Uno.Toolkit.RuntimeTests/Tests/AutoLayoutTest.cs +++ b/src/Uno.Toolkit.RuntimeTests/Tests/AutoLayoutTest.cs @@ -87,9 +87,6 @@ public async Task When_SpaceBetween_with_spacing(Orientation orientation, double [DataRow(false, Orientation.Horizontal, VerticalAlignment.Top, HorizontalAlignment.Left, new[] { 10, 10, 10, 10 }, new[] { 108, 10, 0, 0 }, 10, 12, 110, 78, 138)] [DataRow(false, Orientation.Vertical, VerticalAlignment.Top, HorizontalAlignment.Left, new[] { 10, 10, 10, 10 }, new[] { 108, 10, 0, 0 }, -20, 12, 110, 168, 248)] [DataRow(false, Orientation.Horizontal, VerticalAlignment.Top, HorizontalAlignment.Left, new[] { 10, 10, 10, 10 }, new[] { 108, 10, 0, 0 }, -20, 12, 110, 108, 138)] -#if !__ANDROID__ && !__IOS__ - [Ignore("Currently fails on wasm")] -#endif public async Task When_AbsolutePosition_WithPadding(bool isStretch, Orientation orientation, VerticalAlignment vAlign, HorizontalAlignment hAlign, int[] padding, int[] margin, int spacing, double expectedY, double expectedX, double rec1expected, double rec2expected) { var SUT = new AutoLayout() diff --git a/src/Uno.Toolkit.UITest/Constants.cs b/src/Uno.Toolkit.UITest/Constants.cs index 86cf91e6c..339d406e1 100644 --- a/src/Uno.Toolkit.UITest/Constants.cs +++ b/src/Uno.Toolkit.UITest/Constants.cs @@ -11,7 +11,7 @@ public class Constants { public readonly static string WebAssemblyDefaultUri = "http://localhost:59402/"; public readonly static string iOSAppName = "com.nventive.Uno.Toolkit.Samples"; - public readonly static string AndroidAppName = "Uno.Toolkit.Samples"; + public readonly static string AndroidAppName = "Uno.Toolkit.WinUI.Samples"; public readonly static string iOSDeviceNameOrId = "iPad Pro (12.9-inch) (5th generation)"; public readonly static Platform CurrentPlatform = Platform.Android; diff --git a/src/Uno.Toolkit.UITest/RuntimeTests/RuntimeTestRunner.cs b/src/Uno.Toolkit.UITest/RuntimeTests/RuntimeTestRunner.cs deleted file mode 100644 index c6ad6f902..000000000 --- a/src/Uno.Toolkit.UITest/RuntimeTests/RuntimeTestRunner.cs +++ /dev/null @@ -1,190 +0,0 @@ -using NUnit.Framework; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Runtime.CompilerServices; -using System.Text; -using System.Threading.Tasks; -using Uno.UITest.Helpers.Queries; -using Uno.UITest; -using Uno.UITests.Helpers; -using Uno.Toolkit.UITest.Extensions; - -namespace Uno.Toolkit.UITest.RuntimeTests -{ - [TestFixture] - public partial class RuntimeTestRunner : TestBase - { - private readonly TimeSpan TestRunTimeout = TimeSpan.FromMinutes(2); - private const string TestResultsOutputFilePath = "UITEST_RUNTIMETESTS_RESULTS_FILE_PATH"; - - protected override string SampleName => "RuntimeTest Runner"; - - [Test] - public async Task RunRuntimeTests() - { - IAppQuery AllQuery(IAppQuery query) - // .All() is not yet supported for wasm. - => AppInitializer.GetLocalPlatform() == Platform.Browser ? query : query.All(); - - var runButton = new QueryEx(q => AllQuery(q).Marked("runButton")); - var failedTests = new QueryEx(q => AllQuery(q).Marked("failedTests")); - var failedTestsDetails = new QueryEx(q => AllQuery(q).Marked("failedTestDetails")); - var unitTestsControl = new QueryEx(q => AllQuery(q).Marked("UnitTestsRootControl")); - - async Task IsTestExecutionDone() - { - return await GetWithRetry("IsTestExecutionDone", () => unitTestsControl.GetDependencyPropertyValue("RunningStateForUITest")?.ToString().Equals("Finished", StringComparison.OrdinalIgnoreCase) ?? false); - } - - App.WaitForElement(runButton); - - if (Environment.GetEnvironmentVariable(TestResultsOutputFilePath) is { } path) - { - // Used to disable showing the test output visually - unitTestsControl.SetDependencyPropertyValue("IsRunningOnCI", "true"); - } - - App.FastTap(runButton); - - var lastChange = DateTimeOffset.Now; - var lastValue = ""; - - while (DateTimeOffset.Now - lastChange < TestRunTimeout) - { - var newValue = await GetWithRetry("GetRunTestCount", () => unitTestsControl.GetDependencyPropertyValue("RunTestCountForUITest")?.ToString()); - - if (lastValue != newValue) - { - lastChange = DateTimeOffset.Now; - } - - await Task.Delay(TimeSpan.FromSeconds(.5)); - - if (await IsTestExecutionDone()) - { - break; - } - } - - if (!await IsTestExecutionDone()) - { - Assert.Fail("A test run timed out"); - } - - TestContext.AddTestAttachment(await ArchiveResults(unitTestsControl), "runtimetests-results.zip"); - - var count = GetValue(nameof(unitTestsControl), unitTestsControl, "FailedTestCountForUITest"); - if (count != "0") - { - var tests = GetValue(nameof(failedTests), failedTests) - .Split(new char[] { '§' }, StringSplitOptions.RemoveEmptyEntries) - .Select((x, i) => $"\t{i + 1}. {x}\n") - .ToArray(); - var details = GetValue(nameof(failedTestsDetails), failedTestsDetails); - - Assert.Fail($"{tests.Length} unit test(s) failed (count={count}).\n\tFailing Tests:\n{string.Join("", tests)}\n\n---\n\tDetails:\n{details}"); - } - - TakeScreenshot("Runtime Tests Results"); - } - - async Task GetWithRetry(string logName, Func getter, int timeoutSeconds = 120) - { - var sw = Stopwatch.StartNew(); - Exception? lastException = null; - do - { - try - { - var result = getter(); - - if (sw.Elapsed > TimeSpan.FromSeconds(timeoutSeconds / 2)) - { - Console.WriteLine($"{logName} succeeded after retries"); - } - - return result; - } - catch (Exception e) - { - lastException = e; - Console.WriteLine($"{logName} failed with {e.Message}"); - } - - await Task.Delay(TimeSpan.FromSeconds(2)); - - Console.WriteLine($"{logName} retrying"); - } - while (sw.Elapsed < TimeSpan.FromSeconds(timeoutSeconds)); - - throw lastException; - } - - private static async Task ArchiveResults(QueryEx unitTestsControl) - { - var document = await GetNUnitTestResultsDocument(unitTestsControl); - - var file = Path.GetTempFileName(); - File.WriteAllText(file, document, Encoding.Unicode); - - if (Environment.GetEnvironmentVariable(TestResultsOutputFilePath) is { } path) - { - File.Copy(file, path, true); - } - else - { - Console.WriteLine($"The environment variable {TestResultsOutputFilePath} is not defined, skipping file system extraction"); - } - - var finalFile = Path.Combine(Path.GetDirectoryName(file), "test-results.xml"); - - if (File.Exists(finalFile)) - { - File.Delete(finalFile); - } - - File.Move(file, finalFile); - - return finalFile; - } - - private static async Task GetNUnitTestResultsDocument(QueryEx unitTestsControl) - { - int counter = 0; - - do - { - var document = GetValue(nameof(unitTestsControl), unitTestsControl, "NUnitTestResultsDocument"); - - if (!string.IsNullOrEmpty(document)) - { - return document; - } - - // The results are built asynchronously, it may not be available right away. - await Task.Delay(1000); - - } while (counter++ < 3); - - throw new InvalidOperationException($"Failed to get the test results document"); - } - - private static string GetValue(string elementName, QueryEx element, string dpName = "Text", [CallerLineNumber] int line = -1) - { - try - { - return element - ?.GetDependencyPropertyValue(dpName) - ?.ToString() ?? string.Empty; - } - catch (Exception e) - { - Assert.Fail($"Failed to get DP ${dpName} on {elementName} (@{line}), {e}", e); - throw new InvalidOperationException($"Failed to get DP ${dpName} on {elementName} (@{line}), {e}"); - } - } - } -} diff --git a/src/Uno.Toolkit.UITest/TestBase.cs b/src/Uno.Toolkit.UITest/TestBase.cs index e216d2b42..95a0cbc82 100644 --- a/src/Uno.Toolkit.UITest/TestBase.cs +++ b/src/Uno.Toolkit.UITest/TestBase.cs @@ -33,6 +33,7 @@ static TestBase() AppInitializer.TestEnvironment.AndroidAppName = Constants.AndroidAppName; AppInitializer.TestEnvironment.WebAssemblyDefaultUri = Constants.WebAssemblyDefaultUri; AppInitializer.TestEnvironment.iOSAppName = Constants.iOSAppName; + AppInitializer.TestEnvironment.AndroidAppName = Constants.AndroidAppName; AppInitializer.TestEnvironment.iOSDeviceNameOrId = Constants.iOSDeviceNameOrId; AppInitializer.TestEnvironment.CurrentPlatform = Constants.CurrentPlatform; diff --git a/src/Uno.Toolkit.UITest/Uno.Toolkit.UITest.csproj b/src/Uno.Toolkit.UITest/Uno.Toolkit.UITest.csproj index f114e1d28..2b71dff05 100644 --- a/src/Uno.Toolkit.UITest/Uno.Toolkit.UITest.csproj +++ b/src/Uno.Toolkit.UITest/Uno.Toolkit.UITest.csproj @@ -8,9 +8,9 @@ + -