Skip to content

Commit 63bef8f

Browse files
author
Krzysztof
authored
chore: e2e Android (#474)
Co-authored-by: Tommy Nguyen
1 parent 5bb27e9 commit 63bef8f

File tree

7 files changed

+188
-93
lines changed

7 files changed

+188
-93
lines changed

.circleci/config.yml

Lines changed: 93 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,13 @@ default config for macOS: &macos_defaults
2626
macos:
2727
xcode: '12.1.0'
2828

29+
30+
config for macOS (android): &macos_defaults_android
31+
<<: *defaults
32+
resource_class: 'medium'
33+
macos:
34+
xcode: '11.5.0'
35+
2936
default config for android apk builds: &android_defaults
3037
<<: *defaults
3138
docker:
@@ -41,67 +48,76 @@ default config for android apk builds: &android_defaults
4148
# CACHE CONFIG
4249
# ==============================
4350

44-
# brew
45-
save brew cache: &cache_save_brew
46-
name: Saving Brew cache
47-
paths:
51+
cache keys:
52+
brew ios: &key_brew_ios cache-brew-ios-v3-{{ arch }}
53+
brew android: &key_brew_android cache-brew-android-v3-{{ arch }}
54+
yarn: &key_yarn cache-yarn-{{ checksum "package.json" }}-{{ arch }}
55+
gradle: &key_gradle cache-gradle-{{ checksum "example/android/gradle/wrapper/gradle-wrapper.properties" }}-{{ checksum "package.json" }}-{{ arch }}
56+
pods: &key_pods cache-pods-v1-{{ checksum "example/ios/Podfile" }}-{{ checksum "package.json" }}-{{ arch }}
57+
58+
cache:
59+
# brew
60+
save brew cache for ios: &cache_save_brew_ios
61+
name: Saving Brew cache
62+
paths:
63+
- /usr/local/Homebrew
64+
- ~/Library/Caches/Homebrew
65+
key: *key_brew_ios
66+
67+
restore brew cache for ios: &cache_restore_brew_ios
68+
name: Restoring Brew cache
69+
keys:
70+
- *key_brew_ios
71+
72+
save brew cache for android: &cache_save_brew_android
73+
name: Saving Brew cache for android
74+
paths:
4875
- /usr/local/Homebrew
4976
- ~/Library/Caches/Homebrew
50-
key: legacy-brew-cache-node12-{{ arch }}
51-
52-
restore brew cache: &cache_restore_brew
53-
name: Restoring Brew cache
54-
keys:
55-
- legacy-brew-cache-node12-{{ arch }}
56-
57-
save brew cache for android: &cache_save_brew_android
58-
name: Saving Brew cache for android
59-
paths:
60-
- /usr/local/Homebrew
61-
- ~/Library/Caches/Homebrew
62-
key: legacy-brew-cache-node12-{{ arch }}-android
63-
64-
restore brew cache for android: &cache_restore_brew_android
65-
name: Restoring Brew cache for android
66-
keys:
67-
- legacy-brew-cache-node12-{{ arch }}-android
68-
69-
# yarn
70-
save yarn cache: &cache_save_yarn
71-
name: Saving Yarn cache
72-
paths:
73-
- ~/.cache/yarn
74-
- ~/Library/Detox
75-
key: legacy-yarn-cache-{{ checksum "package.json" }}-{{ arch }}
76-
77-
restore yarn cache: &cache_restore_yarn
78-
name: Restoring Yarn cache
79-
keys:
80-
- legacy-yarn-cache-{{ checksum "package.json" }}-{{ arch }}
81-
82-
# gradle
83-
save gradle wrapper cache: &cache_save_gradle_wrapper
84-
name: Saving Gradle Wrapper cache
85-
paths:
86-
- ~/.gradle/wrapper
87-
key: gradle-wrapper-legacy-{{ checksum "example/android/gradle/wrapper/gradle-wrapper.properties" }}
88-
89-
save gradle build cache: &cache_save_gradle_build
90-
name: Saving Gradle app/build cache
91-
paths:
92-
- ~/.gradle/caches
93-
key: app-build-gradle-legacy-{{ checksum "example/android/app/build.gradle" }}
94-
95-
restore gradle wrapper cache: &cache_restore_gradle_wrapper
96-
name: Restoring Gradle Wrapper cache
97-
keys:
98-
- gradle-wrapper-legacy-{{ checksum "example/android/gradle/wrapper/gradle-wrapper.properties" }}
99-
100-
restore gradle build cache: &cache_restore_gradle_build
101-
name: Restoring Gradle app/build cache
102-
keys:
103-
- app-build-gradle-legacy-{{ checksum "example/android/app/build.gradle" }}
104-
77+
key: *key_brew_android
78+
79+
restore brew cache for android: &cache_restore_brew_android
80+
name: Restoring Brew cache for android
81+
keys:
82+
- *key_brew_android
83+
84+
# yarn
85+
save yarn cache: &cache_save_yarn
86+
name: Saving Yarn cache
87+
paths:
88+
- ~/.cache/yarn
89+
- ~/Library/Detox
90+
key: *key_yarn
91+
92+
restore yarn cache: &cache_restore_yarn
93+
name: Restoring Yarn cache
94+
keys:
95+
- *key_yarn
96+
97+
# gradle
98+
save gradle cache: &cache_save_gradle
99+
name: Saving Gradle cache
100+
key: *key_gradle
101+
paths:
102+
- ~/.gradle/wrapper
103+
- ~/.gradle/caches
104+
105+
restore gradle cache: &cache_restore_gradle
106+
name: Restoring Gradle cache
107+
keys:
108+
- *key_gradle
109+
110+
# cocoapods
111+
save pods cache: &cache_save_pods
112+
name: Saving Pods
113+
key: *key_pods
114+
paths:
115+
- example/ios/Pods
116+
117+
restore pods cache: &cache_restore_pods
118+
name: Restoring Pods
119+
keys:
120+
- *key_pods
105121

106122
# ==============================
107123
# JOBS
@@ -141,26 +157,28 @@ jobs:
141157
<<: *macos_defaults
142158
steps:
143159
- *addWorkspace
144-
- restore-cache: *cache_restore_brew
160+
- restore-cache: *cache_restore_brew_ios
145161
- run:
146162
name: Configure macOS Environment
147163
command: |
148164
brew bundle --file=.circleci/Brewfile.ios --no-lock
149165
touch .watchmanconfig
150166
echo Node $(node --version)
151-
- save-cache: *cache_save_brew
167+
- save-cache: *cache_save_brew_ios
152168
- restore-cache: *cache_restore_yarn
153169
- run:
154170
name: Installing Yarn dependencies
155171
command: yarn --pure-lockfile --non-interactive --cache-folder ~/.cache/yarn
156172
- save-cache: *cache_save_yarn
173+
- restore-cache: *cache_restore_pods
157174
- run:
158175
name: Bundle JS
159176
command: yarn bundle:ios --dev false
160177
- run:
161178
name: Install pod dependencies
162179
working_directory: example/ios
163180
command: pod install
181+
- save-cache: *cache_save_pods
164182
- run:
165183
name: Build iOS app
166184
command: yarn build:e2e:ios
@@ -177,18 +195,12 @@ jobs:
177195
name: Installing Yarn dependencies
178196
command: yarn --pure-lockfile --non-interactive --cache-folder ~/.cache/yarn
179197
- save-cache: *cache_save_yarn
180-
181-
# Gradle
182-
- restore-cache: *cache_restore_gradle_wrapper
183-
- restore-cache: *cache_restore_gradle_build
198+
- restore-cache: *cache_restore_gradle
184199
- run:
185200
name: Downloading Gradle dependencies
186201
working_directory: example/android
187202
command: ./gradlew --max-workers 2 fetchDependencies
188-
- save-cache: *cache_save_gradle_wrapper
189-
- save-cache: *cache_save_gradle_build
190-
191-
# Build and test
203+
- save-cache: *cache_save_gradle
192204
- run:
193205
name: Bundle JS
194206
command: yarn bundle:android --dev false
@@ -203,32 +215,31 @@ jobs:
203215
- example/android/app/build/outputs/apk/*
204216

205217
"Test: Android e2e":
206-
<<: *macos_defaults
218+
<<: *macos_defaults_android
207219
steps:
208220
- *addWorkspace
209221
- run:
210222
name: Configure env variables
211223
command: |
212224
echo 'export ANDROID_HOME="/usr/local/share/android-sdk"' >> $BASH_ENV
213225
echo 'export ANDROID_SDK_ROOT="/usr/local/share/android-sdk"' >> $BASH_ENV
214-
echo 'export PATH="$ANDROID_SDK_ROOT/emulator:$ANDROID_SDK_ROOT/tools:$ANDROID_SDK_ROOT/platform-tools:$ANDROID_SDK_ROOT/tools/bin:$PATH"' >> $BASH_ENV
226+
echo 'export PATH="$ANDROID_SDK_ROOT/emulator:$ANDROID_SDK_ROOT/tools:$ANDROID_SDK_ROOT/platform-tools:$PATH"' >> $BASH_ENV
215227
echo 'export QEMU_AUDIO_DRV=none' >> $BASH_ENV
216-
echo 'export JAVA_HOME=/Library/Java/Home' >> $BASH_ENV
228+
echo 'export JAVA_HOME=$(/usr/libexec/java_home)' >> $BASH_ENV
217229
source $BASH_ENV
218-
219-
# Android tools
220230
- restore-cache: *cache_restore_brew_android
221231
- run:
222232
name: Install Android SDK tools
223233
command: |
234+
brew update --preinstall
224235
brew bundle --file=.circleci/Brewfile.android --no-lock
225236
- save-cache: *cache_save_brew_android
226237
- run:
227238
name: Install Android emulator
228239
shell: /bin/bash -e
229240
command: |
230241
yes | sdkmanager "platform-tools" "tools" 1> /dev/null
231-
yes | sdkmanager "platforms;android-28" "system-images;android-21;google_apis;x86" 1> /dev/null
242+
yes | sdkmanager "platforms;android-28" "system-images;android-28;default;x86_64" 1> /dev/null
232243
yes | sdkmanager "emulator" --channel=3 1> /dev/null
233244
yes | sdkmanager "build-tools;28.0.3" 1> /dev/null
234245
yes | sdkmanager --licenses 1> /dev/null
@@ -243,12 +254,11 @@ jobs:
243254
- run:
244255
name: Create emulator
245256
command: |
246-
avdmanager create avd \
247-
--force \
257+
avdmanager create avd --force \
248258
-n "Emu_E2E" \
249-
-k "system-images;android-21;google_apis;x86" \
250-
-g "google_apis" \
251-
-d "Nexus 4"
259+
-k "system-images;android-28;default;x86_64" \
260+
-g "default" \
261+
-d "pixel"
252262
- run:
253263
name: Start emulator in background
254264
background: true
@@ -311,8 +321,6 @@ workflows:
311321
filters:
312322
branches:
313323
only: master
314-
# - "Test: Android e2e":
315-
# requires:
316-
# - "Test: lint"
317-
# - "Test: flow"
318-
# - "Build: Android release apk"
324+
- "Test: Android e2e":
325+
requires:
326+
- "Build: Android release apk"

example/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ yarn-error.log
4040
buck-out/
4141
\.buckd/
4242
*.keystore
43+
!android/debug.keystore
4344

4445
# fastlane
4546
#
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.microsoft.reacttestapp;
2+
3+
import com.wix.detox.Detox;
4+
import com.wix.detox.config.DetoxConfig;
5+
6+
import org.junit.Rule;
7+
import org.junit.Test;
8+
import org.junit.runner.RunWith;
9+
10+
import androidx.test.ext.junit.runners.AndroidJUnit4;
11+
import androidx.test.filters.LargeTest;
12+
import androidx.test.rule.ActivityTestRule;
13+
14+
@RunWith(AndroidJUnit4.class)
15+
@LargeTest
16+
public class DetoxTest {
17+
@Rule
18+
public ActivityTestRule<MainActivity> mActivityRule =
19+
new ActivityTestRule<>(MainActivity.class, false, false);
20+
21+
@Test
22+
public void runDetoxTests() {
23+
DetoxConfig detoxConfig = new DetoxConfig();
24+
detoxConfig.idlePolicyConfig.masterTimeoutSec = 90;
25+
detoxConfig.idlePolicyConfig.idleResourceTimeoutSec = 60;
26+
detoxConfig.rnContextLoadTimeoutSec = 60;
27+
28+
Detox.runTests(mActivityRule, detoxConfig);
29+
}
30+
}

example/android/build.gradle

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,41 @@ task fetchDependencies() {
2424
}
2525
}
2626
}
27+
28+
allprojects {
29+
repositories {
30+
maven {
31+
url("$rootDir/../../node_modules/detox/Detox-android")
32+
}
33+
}
34+
afterEvaluate { project ->
35+
def androidExtension = project.extensions.findByName('android')
36+
37+
if(androidExtension != null && project.name == 'app') {
38+
// android extension from test-app pacakge
39+
androidExtension.defaultConfig {
40+
ndk {
41+
abiFilters 'arm64-v8a', 'x86', 'x86_64'
42+
}
43+
}
44+
45+
androidExtension.signingConfigs {
46+
test {
47+
storeFile file('debug.keystore')
48+
storePassword 'android'
49+
keyAlias 'androiddebugkey'
50+
keyPassword 'android'
51+
}
52+
}
53+
54+
androidExtension.buildTypes.release.signingConfig = androidExtension.signingConfigs.test
55+
androidExtension.testBuildType = 'release'
56+
57+
androidExtension.sourceSets.androidTest.java.srcDirs += "$rootDir/app/src/androidTest/java"
58+
59+
project.dependencies {
60+
androidTestImplementation('com.wix:detox:+')
61+
}
62+
}
63+
}
64+
}

example/android/debug.keystore

2.2 KB
Binary file not shown.

0 commit comments

Comments
 (0)