-
-
Notifications
You must be signed in to change notification settings - Fork 344
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
test(sample): Add E2E tests for app start transactions #4619
base: main
Are you sure you want to change the base?
Changes from all commits
ab5cdfe
05dac0e
ec20ae4
c24a5f3
cdec5f5
daab748
158bcac
f09a9b6
d9f5804
2618843
65b3fa4
f98ef4a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
|
@@ -13,7 +13,14 @@ concurrency: | |||||
|
||||||
env: | ||||||
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} | ||||||
MAESTRO_VERSION: '1.39.0' | ||||||
RN_SENTRY_POD_NAME: RNSentry | ||||||
IOS_APP_ARCHIVE_PATH: sentry-react-native-sample.app.zip | ||||||
ANDROID_APP_ARCHIVE_PATH: sentry-react-native-sample.apk.zip | ||||||
REACT_NATIVE_SAMPLE_PATH: samples/react-native | ||||||
IOS_DEVICE: 'iPhone 16' | ||||||
IOS_VERSION: '18.1' | ||||||
ANDROID_API_LEVEL: '30' | ||||||
|
||||||
jobs: | ||||||
diff_check: | ||||||
|
@@ -66,7 +73,7 @@ jobs: | |||||
- uses: ruby/setup-ruby@v1 | ||||||
if: ${{ matrix.platform == 'ios' || matrix.platform == 'macos' }} | ||||||
with: | ||||||
working-directory: ${{ matrix.platform == 'ios' && ' samples/react-native' || ' samples/react-native-macos' }} | ||||||
working-directory: ${{ matrix.platform == 'ios' && env.REACT_NATIVE_SAMPLE_PATH || ' samples/react-native-macos' }} | ||||||
ruby-version: '3.3.0' # based on what is used in the sample | ||||||
bundler-cache: true # runs 'bundle install' and caches installed gems automatically | ||||||
cache-version: 1 # cache the installed gems | ||||||
|
@@ -106,7 +113,7 @@ jobs: | |||||
|
||||||
- name: Build Android App | ||||||
if: ${{ matrix.platform == 'android' }} | ||||||
working-directory: samples/react-native/android | ||||||
working-directory: ${{ env.REACT_NATIVE_SAMPLE_PATH }}/android | ||||||
run: | | ||||||
if [[ ${{ matrix.rn-architecture }} == 'new' ]]; then | ||||||
perl -i -pe's/newArchEnabled=false/newArchEnabled=true/g' gradle.properties | ||||||
|
@@ -119,11 +126,14 @@ jobs: | |||||
fi | ||||||
[[ "${{ matrix.build-type }}" == "production" ]] && CONFIG='Release' || CONFIG='Debug' | ||||||
echo "Building $CONFIG" | ||||||
[[ "${{ matrix.build-type }}" == "production" ]] && TEST_TYPE='release' || TEST_TYPE='debug' | ||||||
echo "Building $TEST_TYPE" | ||||||
|
||||||
./gradlew ":app:assemble$CONFIG" -PreactNativeArchitectures=x86 | ||||||
|
||||||
- name: Build iOS App | ||||||
if: ${{ matrix.platform == 'ios' }} | ||||||
working-directory: samples/react-native/ios | ||||||
working-directory: ${{ env.REACT_NATIVE_SAMPLE_PATH }}/ios | ||||||
run: | | ||||||
[[ "${{ matrix.build-type }}" == "production" ]] && CONFIG='Release' || CONFIG='Debug' | ||||||
echo "Building $CONFIG" | ||||||
|
@@ -160,9 +170,165 @@ jobs: | |||||
| tee xcodebuild.log \ | ||||||
| xcbeautify --quieter --is-ci --disable-colored-output | ||||||
|
||||||
- name: Archive iOS App | ||||||
if: ${{ matrix.platform == 'ios' && matrix.rn-architecture == 'new' && matrix.build-type == 'production' && matrix.ios-use-frameworks == 'no-frameworks' }} | ||||||
run: | | ||||||
cd ${{ env.REACT_NATIVE_SAMPLE_PATH }}/ios/DerivedData/Build/Products/Release-iphonesimulator | ||||||
zip -r \ | ||||||
${{ github.workspace }}/${{ env.IOS_APP_ARCHIVE_PATH }} \ | ||||||
sentryreactnativesample.app | ||||||
|
||||||
- name: Archive Android App | ||||||
if: ${{ matrix.platform == 'android' && matrix.rn-architecture == 'new' && matrix.build-type == 'production' }} | ||||||
run: | | ||||||
mv ${{ env.REACT_NATIVE_SAMPLE_PATH }}/android/app/build/outputs/apk/release/app-release.apk app.apk | ||||||
zip -j \ | ||||||
${{ env.ANDROID_APP_ARCHIVE_PATH }} \ | ||||||
app.apk | ||||||
|
||||||
- name: Upload iOS APP | ||||||
if: ${{ matrix.platform == 'ios' && matrix.rn-architecture == 'new' && matrix.build-type == 'production' && matrix.ios-use-frameworks == 'no-frameworks' }} | ||||||
uses: actions/upload-artifact@v4 | ||||||
with: | ||||||
name: sample-rn-${{ matrix.rn-architecture }}-${{ matrix.build-type }}-${{ matrix.ios-use-frameworks}}-${{ matrix.platform }} | ||||||
path: ${{ env.IOS_APP_ARCHIVE_PATH }} | ||||||
retention-days: 1 | ||||||
|
||||||
- name: Upload Android APK | ||||||
if: ${{ matrix.platform == 'android' && matrix.rn-architecture == 'new' && matrix.build-type == 'production' }} | ||||||
uses: actions/upload-artifact@v4 | ||||||
with: | ||||||
name: sample-rn-${{ matrix.rn-architecture }}-${{ matrix.build-type }}-${{ matrix.platform }} | ||||||
path: ${{ env.ANDROID_APP_ARCHIVE_PATH }} | ||||||
retention-days: 1 | ||||||
|
||||||
- name: Upload logs | ||||||
if: ${{ always() }} | ||||||
uses: actions/upload-artifact@v4 | ||||||
with: | ||||||
name: build-sample-${{ matrix.rn-architecture }}-${{ matrix.platform }}-${{ matrix.build-type }}-${{ matrix.ios-use-frameworks}}-logs | ||||||
path: samples/react-native/${{ matrix.platform }}/*.log | ||||||
path: ${{ env.REACT_NATIVE_SAMPLE_PATH }}/${{ matrix.platform }}/*.log | ||||||
|
||||||
test: | ||||||
name: Test ${{ matrix.platform }} ${{ matrix.build-type }} | ||||||
runs-on: ${{ matrix.runs-on }} | ||||||
needs: [diff_check, build] | ||||||
if: ${{ needs.diff_check.outputs.skip_ci != 'true' }} | ||||||
strategy: | ||||||
# we want that the matrix keeps running, default is to cancel them if it fails. | ||||||
fail-fast: false | ||||||
matrix: | ||||||
include: | ||||||
- platform: ios | ||||||
runs-on: macos-15 | ||||||
rn-architecture: 'new' | ||||||
ios-use-frameworks: 'no-frameworks' | ||||||
build-type: 'production' | ||||||
|
||||||
- platform: android | ||||||
runs-on: ubuntu-latest | ||||||
rn-architecture: 'new' | ||||||
build-type: 'production' | ||||||
|
||||||
steps: | ||||||
- uses: actions/checkout@v4 | ||||||
|
||||||
- name: Install Maestro | ||||||
uses: dniHze/maestro-test-action@bda8a93211c86d0a05b7a4597c5ad134566fbde4 # [email protected] | ||||||
with: | ||||||
version: ${{env.MAESTRO_VERSION}} | ||||||
|
||||||
- name: Download iOS App Archive | ||||||
if: ${{ matrix.platform == 'ios' }} | ||||||
uses: actions/download-artifact@v4 | ||||||
with: | ||||||
name: sample-rn-${{ matrix.rn-architecture }}-${{ matrix.build-type }}-${{ matrix.ios-use-frameworks}}-${{ matrix.platform }} | ||||||
path: ${{ env.REACT_NATIVE_SAMPLE_PATH }} | ||||||
|
||||||
- name: Download Android APK | ||||||
if: ${{ matrix.platform == 'android' }} | ||||||
uses: actions/download-artifact@v4 | ||||||
with: | ||||||
name: sample-rn-${{ matrix.rn-architecture }}-${{ matrix.build-type }}-${{ matrix.platform }} | ||||||
path: ${{ env.REACT_NATIVE_SAMPLE_PATH }} | ||||||
|
||||||
- name: Unzip iOS App Archive | ||||||
if: ${{ matrix.platform == 'ios' }} | ||||||
working-directory: ${{ env.REACT_NATIVE_SAMPLE_PATH }} | ||||||
run: unzip ${{ env.IOS_APP_ARCHIVE_PATH }} | ||||||
|
||||||
- name: Unzip Android APK | ||||||
if: ${{ matrix.platform == 'android' }} | ||||||
working-directory: ${{ env.REACT_NATIVE_SAMPLE_PATH }} | ||||||
run: unzip ${{ env.ANDROID_APP_ARCHIVE_PATH }} | ||||||
|
||||||
- name: Enable Corepack | ||||||
run: | | ||||||
npm install -g [email protected] | ||||||
corepack enable | ||||||
- uses: actions/setup-node@v4 | ||||||
with: | ||||||
node-version: 18 | ||||||
cache: 'yarn' | ||||||
cache-dependency-path: yarn.lock | ||||||
|
||||||
- name: Install JS Dependencies | ||||||
run: yarn install | ||||||
|
||||||
- name: Install Detox | ||||||
run: npm install -g [email protected] | ||||||
|
||||||
- name: Install Apple Simulator Utilities | ||||||
if: ${{ matrix.platform == 'ios' }} | ||||||
run: | | ||||||
brew tap wix/brew | ||||||
brew install applesimutils | ||||||
|
||||||
- name: Setup KVM | ||||||
if: ${{ matrix.platform == 'android' }} | ||||||
shell: bash | ||||||
run: | | ||||||
# check if virtualization is supported... | ||||||
sudo apt install -y --no-install-recommends cpu-checker coreutils && echo "CPUs=$(nproc --all)" && kvm-ok | ||||||
# allow access to KVM to run the emulator | ||||||
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' \ | ||||||
| sudo tee /etc/udev/rules.d/99-kvm4all.rules | ||||||
sudo udevadm control --reload-rules | ||||||
sudo udevadm trigger --name-match=kvm | ||||||
|
||||||
- uses: futureware-tech/simulator-action@dab10d813144ef59b48d401cd95da151222ef8cd # pin@v4 | ||||||
if: ${{ matrix.platform == 'ios' }} | ||||||
with: | ||||||
# the same envs are used by Detox ci.sim configuration | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
model: ${{ env.IOS_DEVICE }} | ||||||
os_version: ${{ env.IOS_VERSION }} | ||||||
|
||||||
- name: Run Detox iOS Tests | ||||||
if: ${{ matrix.platform == 'ios' }} | ||||||
working-directory: ${{ env.REACT_NATIVE_SAMPLE_PATH }} | ||||||
run: yarn test-ios | ||||||
|
||||||
- name: Run tests on Android | ||||||
if: ${{ matrix.platform == 'android' }} | ||||||
env: | ||||||
# used by Detox ci.android configuration | ||||||
ANDROID_AVD_NAME: 'test' # test is default reactivecircus/android-emulator-runner name | ||||||
Comment on lines
+314
to
+315
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
uses: reactivecircus/android-emulator-runner@62dbb605bba737720e10b196cb4220d374026a6d # [email protected] | ||||||
with: | ||||||
api-level: ${{ env.ANDROID_API_LEVEL }} | ||||||
force-avd-creation: false | ||||||
disable-animations: true | ||||||
disable-spellchecker: true | ||||||
target: 'aosp_atd' | ||||||
channel: canary # Necessary for ATDs | ||||||
emulator-options: > | ||||||
-no-window | ||||||
-no-snapshot-save | ||||||
-gpu swiftshader_indirect | ||||||
-noaudio | ||||||
-no-boot-anim | ||||||
-camera-back none | ||||||
-camera-front none | ||||||
-timezone US/Pacific | ||||||
working-directory: ${{ env.REACT_NATIVE_SAMPLE_PATH }} | ||||||
script: yarn test-android |
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
|
@@ -192,11 +192,15 @@ android { | |||||
signingConfig signingConfigs.debug | ||||||
minifyEnabled enableProguardInReleaseBuilds | ||||||
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" | ||||||
proguardFile "${rootProject.projectDir}/../node_modules/detox/android/detox/proguard-rules-app.pro" | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
} | ||||||
} | ||||||
} | ||||||
|
||||||
dependencies { | ||||||
androidTestImplementation('com.wix:detox:+') | ||||||
implementation 'androidx.appcompat:appcompat:1.7.0' | ||||||
|
||||||
Comment on lines
+201
to
+203
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
// The version of react-native is set by the React Native Gradle Plugin | ||||||
implementation("com.facebook.react:react-android") | ||||||
|
||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
<?xml version="1.0" encoding="utf-8"?> | ||
<network-security-config> | ||
<domain-config cleartextTrafficPermitted="true"> | ||
<domain includeSubdomains="true">10.0.2.2</domain> | ||
<domain includeSubdomains="true">localhost</domain> | ||
</domain-config> | ||
</network-security-config> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
*.xml |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
TODO: remove