From 1a707282222165eb044133154294415a9dbaa16f Mon Sep 17 00:00:00 2001 From: Natalie Bunduwongse Date: Thu, 21 Nov 2024 16:18:26 +1300 Subject: [PATCH] test: fix ios build and ui test script --- .github/workflows/ui-tests.yml | 50 +++++----- sample/Assets/Editor/MobileBuilder.cs | 19 ++++ sample/ProjectSettings/ProjectSettings.asset | 4 +- sample/Tests/browserstack.ios.yml | 2 +- sample/Tests/test/test_ios.py | 12 +-- sample/build_ios.sh | 98 ++++++++++++-------- 6 files changed, 114 insertions(+), 71 deletions(-) diff --git a/.github/workflows/ui-tests.yml b/.github/workflows/ui-tests.yml index 7a4adae3..daff3c19 100644 --- a/.github/workflows/ui-tests.yml +++ b/.github/workflows/ui-tests.yml @@ -69,9 +69,9 @@ jobs: - targetPlatform: StandaloneWindows64 runs-on: [self-hosted, windows] test_script: pytest -xs test/test_windows.py::WindowsTest - # - targetPlatform: Android - # runs-on: [ self-hosted, macOS ] - # test_script: browserstack-sdk pytest -s ./test/test_android.py --browserstack.config "browserstack.android.yml" + - targetPlatform: Android + runs-on: [ self-hosted, macOS ] + test_script: browserstack-sdk pytest -s ./test/test_android.py --browserstack.config "browserstack.android.yml" concurrency: group: test-${{ matrix.targetPlatform }} runs-on: ${{ matrix.runs-on }} @@ -110,26 +110,26 @@ jobs: BROWSERSTACK_ACCESS_KEY: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} working-directory: sample/Tests run: ${{ matrix.test_script }} - # test-ios: - # name: Run iOS UI tests 🧪 - # runs-on: [ self-hosted, macOS ] - # steps: - # - uses: actions/checkout@v3 - # with: - # lfs: true - # - name: build iOS app - # working-directory: sample - # run: ./build_ios.sh - # - uses: actions/setup-python@v4 - # with: - # python-version: "3.10" - # - name: Install dependencies - # run: pip install -r "sample/Tests/requirements.txt" - # - name: Run UI tests - # env: - # MAILSLURP_API_KEY: ${{ secrets.MAILSLURP_API_KEY }} - # BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }} - # BROWSERSTACK_ACCESS_KEY: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} - # working-directory: sample/Tests - # run: browserstack-sdk pytest -s ./test/test_ios.py --browserstack.config "browserstack.ios.yml" + test-ios: + name: Run iOS UI tests 🧪 + runs-on: [ self-hosted, macOS ] + steps: + - uses: actions/checkout@v3 + with: + lfs: true + - name: Build iOS app + working-directory: sample + run: ./build_ios.sh + - uses: actions/setup-python@v4 + with: + python-version: "3.10" + - name: Install dependencies + run: pip install -r "sample/Tests/requirements-mobile.txt" + - name: Run UI tests + env: + MAILSLURP_API_KEY: ${{ secrets.MAILSLURP_API_KEY }} + BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }} + BROWSERSTACK_ACCESS_KEY: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} + working-directory: sample/Tests + run: browserstack-sdk pytest -s ./test/test_ios.py --browserstack.config "browserstack.ios.yml" \ No newline at end of file diff --git a/sample/Assets/Editor/MobileBuilder.cs b/sample/Assets/Editor/MobileBuilder.cs index 116108f0..d80d5bf9 100644 --- a/sample/Assets/Editor/MobileBuilder.cs +++ b/sample/Assets/Editor/MobileBuilder.cs @@ -31,6 +31,12 @@ private static void BuildPlayer(string defaultBuildPath, BuildOptions buildOptio { string buildPath = GetBuildPathFromArgs(defaultBuildPath); + if (platform == BuildTarget.iOS) + { + string bundleIdentifier = GetBundleIdentifierFromArgs(); + PlayerSettings.applicationIdentifier = bundleIdentifier; + } + BuildPlayerOptions buildPlayerOptions = CreateBuildPlayerOptions(buildPath, buildOptions, platform); if (setupForAltTester) @@ -79,6 +85,19 @@ private static BuildTarget GetPlatformFromArgs() return BuildTarget.Android; // Default to Android if no platform is specified } + private static string GetBundleIdentifierFromArgs() + { + string[] args = Environment.GetCommandLineArgs(); + for (int i = 0; i < args.Length; i++) + { + if (args[i] == "--bundleIdentifier" && i + 1 < args.Length) + { + return args[i + 1]; + } + } + return "com.immutable.Immutable-Sample"; + } + private static string GetAltTesterHostFromArgs() { string[] args = Environment.GetCommandLineArgs(); diff --git a/sample/ProjectSettings/ProjectSettings.asset b/sample/ProjectSettings/ProjectSettings.asset index 49d6f249..aca384ec 100644 --- a/sample/ProjectSettings/ProjectSettings.asset +++ b/sample/ProjectSettings/ProjectSettings.asset @@ -157,13 +157,13 @@ PlayerSettings: applicationIdentifier: Android: com.immutable.ImmutableSample Standalone: com.immutable.unitysample - iPhone: com.immutable.Immutable-Sample + iPhone: com.immutable.Immutable-Sample-GameSDK buildNumber: Standalone: 0 VisionOS: 0 iPhone: 0 tvOS: 0 - overrideDefaultApplicationIdentifier: 0 + overrideDefaultApplicationIdentifier: 1 AndroidBundleVersionCode: 1 AndroidMinSdkVersion: 26 AndroidTargetSdkVersion: 33 diff --git a/sample/Tests/browserstack.ios.yml b/sample/Tests/browserstack.ios.yml index ed8a216f..4d39ce54 100644 --- a/sample/Tests/browserstack.ios.yml +++ b/sample/Tests/browserstack.ios.yml @@ -26,7 +26,7 @@ source: pytest-browserstack:sample-sdk:v1.0 # Set `app` to define the app that is to be used for testing. # It can either take the id of any uploaded app or the path of the app directly. #app: ./WikipediaSample.apk -app: ../build/output/iOS/IPA/Payload.ipa #For running local tests +app: ./Payload.ipa #For running local tests # ======================================= # Platforms (Browsers / Devices to test) diff --git a/sample/Tests/test/test_ios.py b/sample/Tests/test/test_ios.py index ce5f3aa9..0ccd9f6a 100644 --- a/sample/Tests/test/test_ios.py +++ b/sample/Tests/test/test_ios.py @@ -12,8 +12,10 @@ from alttester import AltDriver, By +from test import TestConfig + sys.path.insert(0, str(Path(__file__).resolve().parent.parent / 'src')) -from fetch_otp import EMAIL, fetch_code +from fetch_otp import fetch_code # To run this test on an actual Android device: appium --base-path /wd/hub --allow-insecure chromedriver_autodownload class TestBase(unittest.TestCase): @@ -24,9 +26,7 @@ class TestBase(unittest.TestCase): def setUpClass(cls): # https://appium.github.io/appium-xcuitest-driver/latest/preparation/real-device-config/ options = XCUITestOptions() - options.app = "./Payload.ipa" options.show_xcode_log = True - options.xcode_org_id = "APPLE_TEAM_ID" # Replace with Apple Team ID options.auto_accept_alerts = True cls.appium_driver = webdriver.Remote('https://hub-cloud.browserstack.com/wd/hub/', options=options) @@ -75,14 +75,14 @@ def test_1_pkce_login(self): # Found email target_context = context - email_field.send_keys("imx.game.sdk.demo@gmail.com") + email_field.send_keys(TestConfig.EMAIL) submit_button = driver.find_element(by=AppiumBy.XPATH, value="//form/div/div/div[2]/button") submit_button.click() time.sleep(10) # Wait for OTP - code = fetch_gmail_code() - assert code, "Failed to fetch OTP from Gmail" + code = fetch_code() + assert code, "Failed to fetch OTP from MailSlurp" print(f"Successfully fetched OTP: {code}") # Unlike on Android, each digit must be entered into a separate input field on iOS. diff --git a/sample/build_ios.sh b/sample/build_ios.sh index a9e3e5e4..b445ddd9 100755 --- a/sample/build_ios.sh +++ b/sample/build_ios.sh @@ -1,14 +1,15 @@ #!/bin/bash -PATH_UNITY="/Applications/Unity/Unity.app/Contents/MacOS/Unity" +PATH_UNITY="/Applications/Unity/Hub/Editor/2021.3.26f1/Unity.app/Contents/MacOS/Unity" PATH_TO_UNITY_SDK_SAMPLE_APP="./" BUILD_METHOD="MobileBuilder.BuildForAltTester" -APPLE_TEAM_ID="" +APPLE_TEAM_ID="54XMLXPF98" # Define the build paths BUILD_XCODE_PATH="$(pwd)/build/output/iOS/Xcode" BUILD_ARCHIVE_PATH="$(pwd)/build/output/iOS/Archive" BUILD_IPA_PATH="$(pwd)/build/output/iOS/IPA" +DERIVED_DATA_PATH="$(pwd)/build/output/iOS/DerivedData" # Function to clear a directory clear_directory() { @@ -25,9 +26,15 @@ clear_directory() { clear_directory "$BUILD_XCODE_PATH" clear_directory "$BUILD_ARCHIVE_PATH" clear_directory "$BUILD_IPA_PATH" +clear_directory "$DERIVED_DATA_PATH" + +mkdir -p "$BUILD_XCODE_PATH" +mkdir -p "$BUILD_ARCHIVE_PATH" +mkdir -p "$BUILD_IPA_PATH" +mkdir -p "$DERIVED_DATA_PATH" # Unity build command -UNITY_COMMAND="$PATH_UNITY -projectPath \"$PATH_TO_UNITY_SDK_SAMPLE_APP\" -executeMethod $BUILD_METHOD -logFile logFile.log -quit -batchmode --buildPath \"$BUILD_XCODE_PATH\" --platform iOS" +UNITY_COMMAND="$PATH_UNITY -projectPath \"$PATH_TO_UNITY_SDK_SAMPLE_APP\" -executeMethod $BUILD_METHOD -logFile logFile.log -quit -batchmode --buildPath \"$BUILD_XCODE_PATH\" --platform iOS --bundleIdentifier com.immutable.Immutable-Sample-GameSDK" echo "Running command: $UNITY_COMMAND" # Execute the Unity build command @@ -39,39 +46,56 @@ if [ $? -ne 0 ]; then exit 1 fi -# Build and archive project -xcodebuild -project "$(pwd)/build/output/iOS/Xcode/Unity-iPhone.xcodeproj" \ +echo "Building app..." +xcodebuild clean build \ + -project "$(pwd)/build/output/iOS/Xcode/Unity-iPhone.xcodeproj" \ -scheme Unity-iPhone \ - -archivePath "$(pwd)/build/output/iOS/Archive/Unity-iPhone.xcarchive" \ - -configuration Release \ + -destination "generic/platform=iOS" \ DEVELOPMENT_TEAM="$APPLE_TEAM_ID" \ - CODE_SIGN_STYLE=Automatic \ - archive - -# Create ExportOptions.plist with the correct APPLE_TEAM_ID -EXPORT_OPTIONS_PATH="$(pwd)/build/output/iOS/Archive/ExportOptions.plist" - -cat < "$EXPORT_OPTIONS_PATH" - - - - - method - development - teamID - $APPLE_TEAM_ID - signingStyle - automatic - compileBitcode - - thinning - <none> - - -EOF - -# Generate .ipa file -xcodebuild -exportArchive \ - -archivePath "$(pwd)/build/output/iOS/Archive/Unity-iPhone.xcarchive" \ - -exportPath "$(pwd)/build/output/iOS/IPA" \ - -exportOptionsPlist "$EXPORT_OPTIONS_PATH" + -allowProvisioningUpdates \ + -derivedDataPath "$(pwd)/build/output/iOS/DerivedData" + +mkdir -p "$(pwd)/build/output/iOS/IPA/Payload" + +mv "$(pwd)/build/output/iOS/DerivedData/Build/Products/ReleaseForRunning-iphoneos/ImmutableSample.app" "$(pwd)/build/output/iOS/IPA/Payload" + +pushd "$(pwd)/build/output/iOS/IPA" && zip -r Payload.zip Payload && popd + +mv "$(pwd)/build/output/iOS/IPA/Payload.zip" "$(pwd)/Tests/Payload.ipa" + +# # Build and archive project +# xcodebuild -project "$(pwd)/build/output/iOS/Xcode/Unity-iPhone.xcodeproj" \ +# -scheme Unity-iPhone \ +# -archivePath "$(pwd)/build/output/iOS/Archive/Unity-iPhone.xcarchive" \ +# -configuration Release \ +# DEVELOPMENT_TEAM="$APPLE_TEAM_ID" \ +# CODE_SIGN_STYLE=Automatic \ +# archive + +# # Create ExportOptions.plist with the correct APPLE_TEAM_ID +# EXPORT_OPTIONS_PATH="$(pwd)/build/output/iOS/Archive/ExportOptions.plist" + +# cat < "$EXPORT_OPTIONS_PATH" +# +# +# +# +# method +# development +# teamID +# $APPLE_TEAM_ID +# signingStyle +# automatic +# compileBitcode +# +# thinning +# <none> +# +# +# EOF + +# # Generate .ipa file +# xcodebuild -exportArchive \ +# -archivePath "$(pwd)/build/output/iOS/Archive/Unity-iPhone.xcarchive" \ +# -exportPath "$(pwd)/build/output/iOS/IPA" \ +# -exportOptionsPlist "$EXPORT_OPTIONS_PATH"