detox 20.0.10-prerelease.0 → 20.0.11-prerelease.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. package/Detox-android/com/wix/detox/{20.0.10-prerelease.0/detox-20.0.10-prerelease.0-javadoc.jar → 20.0.11-prerelease.0/detox-20.0.11-prerelease.0-javadoc.jar} +0 -0
  2. package/Detox-android/com/wix/detox/20.0.11-prerelease.0/detox-20.0.11-prerelease.0-javadoc.jar.md5 +1 -0
  3. package/Detox-android/com/wix/detox/20.0.11-prerelease.0/detox-20.0.11-prerelease.0-javadoc.jar.sha1 +1 -0
  4. package/Detox-android/com/wix/detox/20.0.11-prerelease.0/detox-20.0.11-prerelease.0-javadoc.jar.sha256 +1 -0
  5. package/Detox-android/com/wix/detox/20.0.11-prerelease.0/detox-20.0.11-prerelease.0-javadoc.jar.sha512 +1 -0
  6. package/Detox-android/com/wix/detox/{20.0.10-prerelease.0/detox-20.0.10-prerelease.0-sources.jar → 20.0.11-prerelease.0/detox-20.0.11-prerelease.0-sources.jar} +0 -0
  7. package/Detox-android/com/wix/detox/20.0.11-prerelease.0/detox-20.0.11-prerelease.0-sources.jar.md5 +1 -0
  8. package/Detox-android/com/wix/detox/20.0.11-prerelease.0/detox-20.0.11-prerelease.0-sources.jar.sha1 +1 -0
  9. package/Detox-android/com/wix/detox/20.0.11-prerelease.0/detox-20.0.11-prerelease.0-sources.jar.sha256 +1 -0
  10. package/Detox-android/com/wix/detox/20.0.11-prerelease.0/detox-20.0.11-prerelease.0-sources.jar.sha512 +1 -0
  11. package/Detox-android/com/wix/detox/{20.0.10-prerelease.0/detox-20.0.10-prerelease.0.aar → 20.0.11-prerelease.0/detox-20.0.11-prerelease.0.aar} +0 -0
  12. package/Detox-android/com/wix/detox/20.0.11-prerelease.0/detox-20.0.11-prerelease.0.aar.md5 +1 -0
  13. package/Detox-android/com/wix/detox/20.0.11-prerelease.0/detox-20.0.11-prerelease.0.aar.sha1 +1 -0
  14. package/Detox-android/com/wix/detox/20.0.11-prerelease.0/detox-20.0.11-prerelease.0.aar.sha256 +1 -0
  15. package/Detox-android/com/wix/detox/20.0.11-prerelease.0/detox-20.0.11-prerelease.0.aar.sha512 +1 -0
  16. package/Detox-android/com/wix/detox/{20.0.10-prerelease.0/detox-20.0.10-prerelease.0.pom → 20.0.11-prerelease.0/detox-20.0.11-prerelease.0.pom} +1 -1
  17. package/Detox-android/com/wix/detox/20.0.11-prerelease.0/detox-20.0.11-prerelease.0.pom.md5 +1 -0
  18. package/Detox-android/com/wix/detox/20.0.11-prerelease.0/detox-20.0.11-prerelease.0.pom.sha1 +1 -0
  19. package/Detox-android/com/wix/detox/20.0.11-prerelease.0/detox-20.0.11-prerelease.0.pom.sha256 +1 -0
  20. package/Detox-android/com/wix/detox/20.0.11-prerelease.0/detox-20.0.11-prerelease.0.pom.sha512 +1 -0
  21. package/Detox-android/com/wix/detox/maven-metadata.xml +4 -4
  22. package/Detox-android/com/wix/detox/maven-metadata.xml.md5 +1 -1
  23. package/Detox-android/com/wix/detox/maven-metadata.xml.sha1 +1 -1
  24. package/Detox-android/com/wix/detox/maven-metadata.xml.sha256 +1 -1
  25. package/Detox-android/com/wix/detox/maven-metadata.xml.sha512 +1 -1
  26. package/Detox-ios-src.tbz +0 -0
  27. package/Detox-ios.tbz +0 -0
  28. package/README.md +1 -1
  29. package/android/detox/proguard-rules.pro +3 -0
  30. package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/IdlingResourceDescription.kt +19 -13
  31. package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/NetworkIdlingResource.java +33 -30
  32. package/android/detox/src/testFull/java/com/wix/detox/reactnative/idlingresources/NetworkIdlingResourcesTest.kt +61 -0
  33. package/index.d.ts +7 -0
  34. package/local-cli/init.js +1 -0
  35. package/local-cli/templates/jest.js +3 -1
  36. package/package.json +2 -2
  37. package/runners/deprecation.js +2 -2
  38. package/src/client/actions/formatters/sync-resources/NetworkFormatter.js +1 -1
  39. package/src/configuration/composeAppsConfig.js +4 -0
  40. package/src/configuration/composeRunnerConfig.js +1 -1
  41. package/src/devices/common/drivers/ios/tools/AppleSimUtils.js +25 -1
  42. package/src/devices/lifecycle/GenyGlobalLifecycleHandler.js +2 -2
  43. package/src/devices/runtime/RuntimeDevice.js +10 -0
  44. package/src/errors/DetoxConfigErrorComposer.js +8 -0
  45. package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0-javadoc.jar.md5 +0 -1
  46. package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0-javadoc.jar.sha1 +0 -1
  47. package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0-javadoc.jar.sha256 +0 -1
  48. package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0-javadoc.jar.sha512 +0 -1
  49. package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0-sources.jar.md5 +0 -1
  50. package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0-sources.jar.sha1 +0 -1
  51. package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0-sources.jar.sha256 +0 -1
  52. package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0-sources.jar.sha512 +0 -1
  53. package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0.aar.md5 +0 -1
  54. package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0.aar.sha1 +0 -1
  55. package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0.aar.sha256 +0 -1
  56. package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0.aar.sha512 +0 -1
  57. package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0.pom.md5 +0 -1
  58. package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0.pom.sha1 +0 -1
  59. package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0.pom.sha256 +0 -1
  60. package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0.pom.sha512 +0 -1
@@ -0,0 +1 @@
1
+ 3ac292deb3e60c7f80bb4e138e61decdacb32673
@@ -0,0 +1 @@
1
+ 5d4183bf7d91e2375e527f7886a374bcdc227328e09fbe8c5705c82750cb5a80
@@ -0,0 +1 @@
1
+ b149751c26413a63ea98c69ff3a4cb19a4d449b4b626e277ecdd1508b725ef5179dbcbb68aca4c4427651de00ebdf30efb517ea981302eb50ec4aed6e26c432f
@@ -0,0 +1 @@
1
+ 35e4d7a489d2b9ce8bc3298d4e05ace381938968
@@ -0,0 +1 @@
1
+ ba003c4e1afb9667e62a7d1e73db455775e1c082d6f3780d4ed172844e1dcec3
@@ -0,0 +1 @@
1
+ a8254a5574422d06bbe1b256abf87d111b2fb56d82a1e82dd9a827407e95321a81279eaeaa79cc68e985d313f547e70b60251c374d784195d05d90c042f6e93a
@@ -0,0 +1 @@
1
+ 3bdd1b42fa0f182255a47fcdda8f544c
@@ -0,0 +1 @@
1
+ 457ae10d202b196ea92bade4a33ce2dbc2f8bb3f
@@ -0,0 +1 @@
1
+ 52342d1b0d1fae681b2ea1e6f9ac6f6278299ed70d7867fd60b95d63eb7a9ec3
@@ -0,0 +1 @@
1
+ 5dfa73d84d647fd870a2e915d9943c9502c967abfd89a834ef7dee50a2a77d5a8b0be7b13407a34a6b97cbc10e9ed6f5e608fe7366d5a3041e462e3322d5b10d
@@ -3,7 +3,7 @@
3
3
  <modelVersion>4.0.0</modelVersion>
4
4
  <groupId>com.wix</groupId>
5
5
  <artifactId>detox</artifactId>
6
- <version>20.0.10-prerelease.0</version>
6
+ <version>20.0.11-prerelease.0</version>
7
7
  <packaging>aar</packaging>
8
8
  <name>Detox</name>
9
9
  <description>Gray box end-to-end testing and automation library for mobile apps</description>
@@ -0,0 +1 @@
1
+ e1de6a89002fc682019853172c69830c
@@ -0,0 +1 @@
1
+ 489bc3e987d66596a3d04353e50a9b7528a2ca8f
@@ -0,0 +1 @@
1
+ 40f07b6d97cc2f6143e7bf5456fc0070af5ee9316a8585c4abdca7d796409d71
@@ -0,0 +1 @@
1
+ 9eae7ac091f209b9ddd0282e6e8eb2dcef416c06d2906857f7d065276787c56cd7a14e19883c710f934005f5831890c33a66218dabb5dbfe6a9143089b6a3462
@@ -3,11 +3,11 @@
3
3
  <groupId>com.wix</groupId>
4
4
  <artifactId>detox</artifactId>
5
5
  <versioning>
6
- <latest>20.0.10-prerelease.0</latest>
7
- <release>20.0.10-prerelease.0</release>
6
+ <latest>20.0.11-prerelease.0</latest>
7
+ <release>20.0.11-prerelease.0</release>
8
8
  <versions>
9
- <version>20.0.10-prerelease.0</version>
9
+ <version>20.0.11-prerelease.0</version>
10
10
  </versions>
11
- <lastUpdated>20220915145552</lastUpdated>
11
+ <lastUpdated>20220930144845</lastUpdated>
12
12
  </versioning>
13
13
  </metadata>
@@ -1 +1 @@
1
- 1191a5f6183621bd8fee757b41eb2d43
1
+ 7298eb41c092e9d6471b11d8c4072549
@@ -1 +1 @@
1
- 0aff1596476fa2a5c51711508d7d9afdb1bb1464
1
+ d59581aa200215423697a398b1e30952dbcad89d
@@ -1 +1 @@
1
- 2f27894de27a5a63d47e2fce362ad81bb48dd9ea28c4ff01ede9f19158626db6
1
+ 964eb89f375a8ac845a5d63eaa867d544a7fdc4b0cd9abe539417827895a9b6a
@@ -1 +1 @@
1
- 2a3a2ba69037611029babb76220f61d51b9b586ea450b6604f7ce9ae7dddfee84712b308ec877f5a626daf4b5ba8c16aca10168017180b0266a7904577c6ac33
1
+ 8b8c26e1906aff908931afb6a7e095bd0d4eb3b08df4061c5b3645c0a6c9e1dc3cc0e9415f7e7a4b5bd7aec76c1e8f2de11388067b1e4d33cfcc2d6eb595933e
package/Detox-ios-src.tbz CHANGED
Binary file
package/Detox-ios.tbz CHANGED
Binary file
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- ## Detox
1
+ # Detox
2
2
 
3
3
  Graybox End-to-End Tests and Automation Library for Mobile
4
4
 
@@ -13,6 +13,9 @@
13
13
  -dontnote org.hamcrest.**
14
14
  -dontnote com.facebook.**
15
15
 
16
+ -keep class org.apache.commons.lang3.** { *; }
17
+ -keep class org.apache.commons.io.** { *; }
18
+
16
19
  # Detox profiler (optional)
17
20
 
18
21
  -keep class com.wix.detoxprofiler.** { *; }
@@ -1,20 +1,26 @@
1
1
  package com.wix.detox.reactnative.idlingresources
2
2
 
3
3
  class IdlingResourceDescription private constructor(
4
- private val name: String,
5
- private val description: Map<String, Any>) {
6
- fun json(): Map<String, Any> = mutableMapOf<String, Any>("name" to name)
7
- .apply { if (description.isNotEmpty()) put("description", description) }
4
+ private val name: String,
5
+ private val description: Map<String, Any>) {
8
6
 
9
- override fun equals(other: Any?): Boolean = other is IdlingResourceDescription &&
10
- other.json() == this.json()
7
+ fun json() =
8
+ mutableMapOf<String, Any>("name" to name)
9
+ .apply {
10
+ if (description.isNotEmpty()) put("description", description)
11
+ }.toMap()
11
12
 
12
- data class Builder(
13
- var name: String = "unknown",
14
- var description: MutableMap<String, Any> = mutableMapOf()) {
13
+ override fun equals(other: Any?) =
14
+ (other is IdlingResourceDescription && other.json() == this.json())
15
+
16
+ override fun hashCode(): Int =
17
+ (31 * name.hashCode() + description.hashCode())
15
18
 
16
- fun name(name: String) = apply { this.name = name }
17
- fun addDescription(key: String, value: Any) = apply { this.description[key] = value }
18
- fun build() = IdlingResourceDescription(name, description)
19
- }
19
+ data class Builder(
20
+ var name: String = "unknown",
21
+ var description: MutableMap<String, Any> = mutableMapOf()) {
22
+ fun name(value: String) = apply { name = value }
23
+ fun addDescription(key: String, value: Any) = apply { description[key] = value }
24
+ fun build() = IdlingResourceDescription(name, description)
25
+ }
20
26
  }
@@ -69,42 +69,13 @@ public class NetworkIdlingResource extends DetoxBaseIdlingResource implements Ch
69
69
 
70
70
  @NotNull
71
71
  @Override
72
- public IdlingResourceDescription getDescription() {
72
+ public synchronized IdlingResourceDescription getDescription() {
73
73
  return new IdlingResourceDescription.Builder()
74
74
  .name("network")
75
75
  .addDescription("urls", new ArrayList<>(busyResources))
76
76
  .build();
77
77
  }
78
78
 
79
- @Override
80
- protected boolean checkIdle() {
81
- boolean idle = true;
82
- busyResources.clear();
83
- List<Call> calls = dispatcher.runningCalls();
84
- for (Call call : calls) {
85
- idle = false;
86
- String url = call.request().url().toString();
87
- for (Pattern pattern : blacklist) {
88
- if (pattern.matcher(url).matches()) {
89
- idle = true;
90
- break;
91
- }
92
- }
93
- if (!idle) {
94
- busyResources.add(call.request().url().toString());
95
- }
96
- }
97
- if (!idle) {
98
- Choreographer.getInstance().postFrameCallback(this);
99
- Log.i(LOG_TAG, "Network is busy");
100
- } else {
101
- if (callback != null) {
102
- callback.onTransitionToIdle();
103
- }
104
- }
105
- return idle;
106
- }
107
-
108
79
  @Override
109
80
  public void registerIdleTransitionCallback(ResourceCallback callback) {
110
81
  this.callback = callback;
@@ -116,10 +87,42 @@ public class NetworkIdlingResource extends DetoxBaseIdlingResource implements Ch
116
87
  isIdleNow();
117
88
  }
118
89
 
90
+ @Override
91
+ protected synchronized boolean checkIdle() {
92
+ busyResources.clear();
93
+
94
+ List<Call> calls = dispatcher.runningCalls();
95
+ for (Call call: calls) {
96
+ final String url = call.request().url().toString();
97
+
98
+ if (!isUrlBlacklisted(url)) {
99
+ busyResources.add(url);
100
+ }
101
+ }
102
+
103
+ if (!busyResources.isEmpty()) {
104
+ Log.i(LOG_TAG, "Network is busy, with " + busyResources.size() + " in-flight calls");
105
+ Choreographer.getInstance().postFrameCallback(this);
106
+ return false;
107
+ }
108
+
109
+ notifyIdle();
110
+ return true;
111
+ }
112
+
119
113
  @Override
120
114
  protected void notifyIdle() {
121
115
  if (callback != null) {
122
116
  callback.onTransitionToIdle();
123
117
  }
124
118
  }
119
+
120
+ private boolean isUrlBlacklisted(String url) {
121
+ for (Pattern pattern: blacklist) {
122
+ if (pattern.matcher(url).matches()) {
123
+ return true;
124
+ }
125
+ }
126
+ return false;
127
+ }
125
128
  }
@@ -0,0 +1,61 @@
1
+ package com.wix.detox.reactnative.idlingresources
2
+
3
+ import com.wix.detox.UTHelpers.yieldToOtherThreads
4
+ import org.assertj.core.api.Assertions.assertThat
5
+
6
+ import okhttp3.Dispatcher
7
+ import org.junit.Before
8
+ import org.junit.Test
9
+ import org.junit.runner.RunWith
10
+ import org.robolectric.RobolectricTestRunner
11
+ import java.util.concurrent.Executors
12
+
13
+ @RunWith(RobolectricTestRunner::class)
14
+ class NetworkIdlingResourcesTest {
15
+ lateinit var dispatcher: Dispatcher
16
+ lateinit var uut: NetworkIdlingResource
17
+
18
+ @Before
19
+ fun setup() {
20
+ dispatcher = Dispatcher()
21
+ uut = NetworkIdlingResource(dispatcher)
22
+ }
23
+
24
+ // Note: Ideally, we should test that the list of busy resources is protected,
25
+ // rather than testing thread-safety as a whole.
26
+ @Test
27
+ fun `should return the description in a thread-safe way`() {
28
+ val localExecutor = Executors.newSingleThreadExecutor()
29
+ var description: IdlingResourceDescription? = null
30
+
31
+ synchronized(uut) {
32
+ localExecutor.submit {
33
+ description = uut.getDescription()
34
+ }
35
+
36
+ yieldToOtherThreads(localExecutor)
37
+ assertThat(description).isNull()
38
+ }
39
+ yieldToOtherThreads(localExecutor)
40
+ assertThat(description).isNotNull()
41
+ }
42
+
43
+ // Note: Ideally, we should test that the list of busy resources is protected,
44
+ // rather than testing thread-safety as a whole.
45
+ @Test
46
+ fun `should check for idle in a thread-safe way`() {
47
+ val localExecutor = Executors.newSingleThreadExecutor()
48
+ var idle = false
49
+
50
+ synchronized(uut) {
51
+ localExecutor.submit {
52
+ idle = uut.isIdleNow
53
+ }
54
+
55
+ yieldToOtherThreads(localExecutor)
56
+ assertThat(idle).isFalse
57
+ }
58
+ yieldToOtherThreads(localExecutor)
59
+ assertThat(idle).isTrue
60
+ }
61
+ }
package/index.d.ts CHANGED
@@ -238,6 +238,13 @@ declare global {
238
238
  build?: string;
239
239
  testBinaryPath?: string;
240
240
  launchArgs?: Record<string, any>;
241
+ /**
242
+ * TCP ports to `adb reverse` upon the installation.
243
+ * E.g. 8081 - to be able to access React Native packager in Debug mode.
244
+ *
245
+ * @example [8081]
246
+ */
247
+ reversePorts?: number[];
241
248
  }
242
249
 
243
250
  interface DetoxCustomAppConfig {
package/local-cli/init.js CHANGED
@@ -94,6 +94,7 @@ function createDefaultConfigurations() {
94
94
  type: 'android.apk',
95
95
  binaryPath: 'android/app/build/outputs/apk/debug/app-debug.apk',
96
96
  build: 'cd android ; ./gradlew assembleDebug assembleAndroidTest -DtestBuildType=debug ; cd -',
97
+ reversePorts: [8081],
97
98
  },
98
99
  'android.release': {
99
100
  type: 'android.apk',
@@ -1,6 +1,8 @@
1
1
  const firstTestContent = require('./firstTestContent');
2
2
 
3
- const runnerConfig = `module.exports = {
3
+ const runnerConfig = `\
4
+ /** @type {import('@jest/types').Config.InitialOptions} */
5
+ module.exports = {
4
6
  rootDir: '..',
5
7
  testMatch: ['<rootDir>/e2e/**/*.test.js'],
6
8
  testTimeout: 120000,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "detox",
3
3
  "description": "E2E tests and automation for mobile",
4
- "version": "20.0.10-prerelease.0",
4
+ "version": "20.0.11-prerelease.0",
5
5
  "bin": {
6
6
  "detox": "local-cli/cli.js"
7
7
  },
@@ -184,5 +184,5 @@
184
184
  }
185
185
  }
186
186
  },
187
- "gitHead": "3116a188b0e4d57613dc2f7d26ca80292b74f192"
187
+ "gitHead": "bd5998c15067ee02fc7cd65ae28e55847a4387c9"
188
188
  }
@@ -4,7 +4,7 @@ const chalk = require('chalk');
4
4
  console.error(chalk.yellow(`
5
5
  ========================= THE NEW JOURNEY BEGINS =============================
6
6
 
7
- https://github.com/wix/Detox/blob/master/docs/Guide.Jest.md
7
+ https://wix.github.io/Detox/docs/next/guide/migration
8
8
 
9
9
  _.-;-._ Sorry, traveler from the lands of Detox 19!
10
10
  ;_.JL___;
@@ -36,7 +36,7 @@ console.error(chalk.yellow(`
36
36
  snd || '---' '.___>
37
37
  Credit: "Gimli" by Shanaka Dias
38
38
 
39
- https://github.com/wix/Detox/blob/master/docs/Guide.Jest.md
39
+ https://wix.github.io/Detox/docs/next/guide/migration
40
40
 
41
41
  ========================= THE NEW JOURNEY BEGINS =============================
42
42
 
@@ -1,7 +1,7 @@
1
1
  const { makeResourceTitle, makeResourceSubTitle } = require('./utils');
2
2
 
3
3
  function makeURLDescription(url, urlCount) {
4
- return makeResourceSubTitle(`URL #${urlCount}: ${url}.`);
4
+ return makeResourceSubTitle(`URL #${urlCount}: ${url}`);
5
5
  }
6
6
 
7
7
  module.exports = function(properties) {
@@ -144,6 +144,10 @@ function validateAppConfig({ appConfig, appPath, deviceConfig, errorComposer })
144
144
  if (appConfig.launchArgs && !_.isObject(appConfig.launchArgs)) {
145
145
  throw errorComposer.malformedAppLaunchArgs(appPath);
146
146
  }
147
+
148
+ if (appConfig.type !== 'android.apk' && appConfig.reversePorts) {
149
+ throw errorComposer.unsupportedReversePorts(appPath);
150
+ }
147
151
  }
148
152
 
149
153
  module.exports = composeAppsConfig;
@@ -88,7 +88,7 @@ function adaptLegacyRunnerConfig(globalConfig) {
88
88
  return globalConfig.testRunner;
89
89
  }
90
90
 
91
- log.warn(`Please migrate your Detox config according to the guide: [TODO: insert the migration guilde link]`);
91
+ log.warn(`Please migrate your Detox config according to the guide:\nhttps://wix.github.io/Detox/docs/next/guide/migration\n`);
92
92
  const testRunner = globalConfig[testRunnerKey];
93
93
  const runnerConfig = globalConfig[runnerConfigKey];
94
94
  const specs = globalConfig.specs != null ? String(globalConfig.specs) : undefined;
@@ -157,6 +157,30 @@ class AppleSimUtils {
157
157
  }
158
158
 
159
159
  async sendToHome(udid) {
160
+ if (await this._isSpringBoardInaccessible(udid)) {
161
+ // SpringBoard is not directly accessible by Simctl on iOS 16.0 and above, therefore we launch and terminate the
162
+ // Settings app instead. This sends the currently open app to the background and brings the home screen to the
163
+ // foreground.
164
+ await this._launchAndTerminateSettings(udid);
165
+ return;
166
+ }
167
+
168
+ await this._launchSpringBoard(udid);
169
+ }
170
+
171
+ async _isSpringBoardInaccessible(udid) {
172
+ const device = await this._findDeviceByUDID(udid);
173
+ const majorIOSVersion = parseInt(device.os.version.split('.')[0]);
174
+ return majorIOSVersion >= 16;
175
+ }
176
+
177
+ async _launchAndTerminateSettings(udid) {
178
+ const bundleId = 'com.apple.Preferences';
179
+ await this._execSimctl({ cmd: `launch ${udid} ${bundleId}`, retries: 10 });
180
+ await this._execSimctl({ cmd: `terminate ${udid} ${bundleId}`, retries: 10 });
181
+ }
182
+
183
+ async _launchSpringBoard(udid) {
160
184
  await this._execSimctl({ cmd: `launch ${udid} com.apple.springboard`, retries: 10 });
161
185
  }
162
186
 
@@ -271,7 +295,7 @@ class AppleSimUtils {
271
295
  // ```
272
296
  // This workaround is done to ignore the error above, as we do not care if the app was running before, we just
273
297
  // want to make sure it isn't now.
274
- if (err.code === 3 &&
298
+ if (err.code === 3 &&
275
299
  (err.stderr.includes(`the app is not currently running`) ||
276
300
  err.stderr.includes(`The operation couldn’t be completed. found nothing to terminate`))) {
277
301
  return;
@@ -30,7 +30,7 @@ class GenyGlobalLifecycleHandler {
30
30
  }
31
31
 
32
32
  async function doSafeCleanup(instanceLifecycleService, instanceHandles) {
33
- logger.info(cleanupLogData, 'Initiating Genymotion cloud instances teardown...');
33
+ logger.info(cleanupLogData, 'Initiating Genymotion SaaS instances teardown...');
34
34
 
35
35
  const deletionLeaks = [];
36
36
  const killPromises = instanceHandles.map((instanceHandle) =>
@@ -43,7 +43,7 @@ async function doSafeCleanup(instanceLifecycleService, instanceHandles) {
43
43
 
44
44
  function reportGlobalCleanupSummary(deletionLeaks) {
45
45
  if (deletionLeaks.length) {
46
- logger.warn(cleanupLogData, 'WARNING! Detected a Genymotion cloud instance leakage, for the following instances:');
46
+ logger.warn(cleanupLogData, 'WARNING! Detected a Genymotion SaaS instance leakage, for the following instances:');
47
47
 
48
48
  deletionLeaks.forEach(({ uuid, name, error }) => {
49
49
  logger.warn(cleanupLogData, [
@@ -238,6 +238,16 @@ class RuntimeDevice {
238
238
  async installApp(binaryPath, testBinaryPath) {
239
239
  const currentApp = binaryPath ? { binaryPath, testBinaryPath } : this._getCurrentApp();
240
240
  await this.deviceDriver.installApp(currentApp.binaryPath, currentApp.testBinaryPath);
241
+
242
+ // This abstraction leaks because our drivers themselves leak,
243
+ // so don't blame me - DeviceBaseDriver itself has `reverseTcpPort`,
244
+ // setting a vicious downward spiral. I can't refactor everything
245
+ // in a single pull request, so let's bear with it for now.
246
+ if (Array.isArray(currentApp.reversePorts)) {
247
+ for (const port of currentApp.reversePorts) {
248
+ await this.reverseTcpPort(port);
249
+ }
250
+ }
241
251
  }
242
252
 
243
253
  async uninstallApp(bundleId) {
@@ -507,6 +507,14 @@ Examine your Detox config${this._atPath()}`,
507
507
  });
508
508
  }
509
509
 
510
+ unsupportedReversePorts(appPath) {
511
+ return new DetoxConfigError({
512
+ message: `Non-Android app configs cannot have "reversePorts" property:`,
513
+ debugInfo: this._focusOnAppConfig(appPath),
514
+ inspectOptions: { depth: 4 },
515
+ });
516
+ }
517
+
510
518
  missingAppBinaryPath(appPath) {
511
519
  return new DetoxConfigError({
512
520
  message: `Missing "binaryPath" property in the app config.\nExpected a string:`,
@@ -1 +0,0 @@
1
- 6f4375b8d626c5e56010bb9079d2def1daf66206
@@ -1 +0,0 @@
1
- 5f2296afd84c0b9887d0f69d5ce484c193e2337f457156755dd5dbd1b18e1f2e
@@ -1 +0,0 @@
1
- 9d30f9d43a3483289b0d34cd1c7f052328167aaf404558cb174f3134561d5cfda3440439af1c58239447ab8b18f6386ac3e3e06acde12db9753993d45fadb254
@@ -1 +0,0 @@
1
- b39c10ee0d40e56d89210314cf5ddaf2d2aa96bb
@@ -1 +0,0 @@
1
- 83099d2c42349ecefa7540645d893fd1f57545a3d4a4176e64b6ea775cd1e624
@@ -1 +0,0 @@
1
- ef17949935df0db02792f2b6c75ed22010258c48da606b417bd69e5ad41e9951810739c19f607f77ca245059573399e76310ac70fb5cfbcb1784be605fefb0d8
@@ -1 +0,0 @@
1
- 7a46662622c24f8677074374fd81b604
@@ -1 +0,0 @@
1
- 43bfd8fb25e7b0c24e0d1ed4b250f138b8f21537
@@ -1 +0,0 @@
1
- 0df8f8ebf03215da2f15fe8e6a093b65dd808d6870b69eabbb4ae8f680b18bdc
@@ -1 +0,0 @@
1
- e0721afc0568f85c754e4741cc58a885a77c8f6f485b9eda322290d906eae9707473016ca97ea6cef6583c9f98e82622dd13343d0fa5a7f9d77daf62f97791df
@@ -1 +0,0 @@
1
- 332c4d3da54dd80f67e23eda984e156b
@@ -1 +0,0 @@
1
- c67b0ded2e25005ab37a36e40f69f2c7ddac7afc
@@ -1 +0,0 @@
1
- f888b95186a4212d022b0288320cf4408d343bc0070522d91ebad8254f4fc20b
@@ -1 +0,0 @@
1
- 67a61376843dba1e684c928d6cab78c2682f7b20424cd75d06f67aae3a9a782ac3f9ca1208c68f5568067698fe7e909c236723a0a7ca11f67033d09292b55fe6