detox 20.0.10-prerelease.0 → 20.0.12-prerelease.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. package/Detox-android/com/wix/detox/{20.0.10-prerelease.0/detox-20.0.10-prerelease.0-javadoc.jar → 20.0.12-prerelease.0/detox-20.0.12-prerelease.0-javadoc.jar} +0 -0
  2. package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-prerelease.0-javadoc.jar.md5 +1 -0
  3. package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-prerelease.0-javadoc.jar.sha1 +1 -0
  4. package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-prerelease.0-javadoc.jar.sha256 +1 -0
  5. package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-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.12-prerelease.0/detox-20.0.12-prerelease.0-sources.jar} +0 -0
  7. package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-prerelease.0-sources.jar.md5 +1 -0
  8. package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-prerelease.0-sources.jar.sha1 +1 -0
  9. package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-prerelease.0-sources.jar.sha256 +1 -0
  10. package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-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.12-prerelease.0/detox-20.0.12-prerelease.0.aar} +0 -0
  12. package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-prerelease.0.aar.md5 +1 -0
  13. package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-prerelease.0.aar.sha1 +1 -0
  14. package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-prerelease.0.aar.sha256 +1 -0
  15. package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-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.12-prerelease.0/detox-20.0.12-prerelease.0.pom} +1 -1
  17. package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-prerelease.0.pom.md5 +1 -0
  18. package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-prerelease.0.pom.sha1 +1 -0
  19. package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-prerelease.0.pom.sha256 +1 -0
  20. package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-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 +25 -2
  34. package/internals.d.ts +36 -14
  35. package/local-cli/cli.js +7 -5
  36. package/local-cli/init.js +2 -1
  37. package/local-cli/reset-lock-file.js +16 -0
  38. package/local-cli/templates/jest.js +3 -1
  39. package/local-cli/test.test.js +58 -14
  40. package/local-cli/testCommand/TestRunnerCommand.js +10 -3
  41. package/package.json +2 -2
  42. package/runners/deprecation.js +2 -2
  43. package/runners/jest/reporters/DetoxReporter.js +22 -2
  44. package/runners/jest/testEnvironment/index.js +83 -82
  45. package/runners/jest/testEnvironment/listeners/DetoxCoreListener.js +9 -24
  46. package/runners/jest/testEnvironment/listeners/DetoxPlatformFilterListener.js +1 -1
  47. package/src/client/actions/formatters/sync-resources/NetworkFormatter.js +1 -1
  48. package/src/configuration/composeAppsConfig.js +4 -0
  49. package/src/configuration/composeRunnerConfig.js +4 -2
  50. package/src/devices/allocation/drivers/android/emulator/AVDValidator.js +4 -4
  51. package/src/devices/allocation/drivers/android/emulator/EmulatorAllocDriver.js +1 -1
  52. package/src/devices/common/drivers/ios/tools/AppleSimUtils.js +25 -1
  53. package/src/devices/lifecycle/GenyGlobalLifecycleHandler.js +2 -2
  54. package/src/devices/runtime/RuntimeDevice.js +10 -0
  55. package/src/errors/DetoxConfigErrorComposer.js +8 -0
  56. package/src/ipc/IPCClient.js +9 -5
  57. package/src/ipc/IPCServer.js +17 -13
  58. package/src/ipc/SessionState.js +2 -4
  59. package/src/realms/DetoxContext.js +2 -2
  60. package/src/realms/DetoxInternalsFacade.js +1 -1
  61. package/src/realms/DetoxPrimaryContext.js +6 -8
  62. package/src/realms/DetoxSecondaryContext.js +2 -2
  63. package/src/symbols.js +2 -2
  64. package/src/utils/Timer.js +55 -38
  65. package/src/utils/errorUtils.js +20 -0
  66. package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0-javadoc.jar.md5 +0 -1
  67. package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0-javadoc.jar.sha1 +0 -1
  68. package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0-javadoc.jar.sha256 +0 -1
  69. package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0-javadoc.jar.sha512 +0 -1
  70. package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0-sources.jar.md5 +0 -1
  71. package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0-sources.jar.sha1 +0 -1
  72. package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0-sources.jar.sha256 +0 -1
  73. package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0-sources.jar.sha512 +0 -1
  74. package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0.aar.md5 +0 -1
  75. package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0.aar.sha1 +0 -1
  76. package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0.aar.sha256 +0 -1
  77. package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0.aar.sha512 +0 -1
  78. package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0.pom.md5 +0 -1
  79. package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0.pom.sha1 +0 -1
  80. package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0.pom.sha256 +0 -1
  81. 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
+ 79e4ecf9e3a592932f8ee594c287345fbcb50ccc
@@ -0,0 +1 @@
1
+ b9135f4a994d21ab1543c223940ba2eae57411c514b6b5ede58db8179ef48ec5
@@ -0,0 +1 @@
1
+ 035992cf8193c98d4335ca7f94842ca794a8a40f94f437a076eee068d930a86623d1e6d7755f624fcad632e092faa445b83557ae297c2ba7f05131848c251fa4
@@ -0,0 +1 @@
1
+ c3769eddce862d29deba41c68b1c3457056d746c
@@ -0,0 +1 @@
1
+ 3263d7cca6d9ae2a88716ef6aa4cd936d47b6c27888c7b3c40c6f745e3407d60
@@ -0,0 +1 @@
1
+ 190e018641c86048d3c8f61efcdd8694d91b099c863f7740898f311bfb2e927179ceed13502e6efad6a915846271c0fc46177a7ac692cdda1899a9ca320dc852
@@ -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.12-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
+ 0493506a4e0ab469402bb1ec8060d6be
@@ -0,0 +1 @@
1
+ 368ca67e6718ee04781403230f984973b7226f4e
@@ -0,0 +1 @@
1
+ 516654dfdf2f2ef5dc08619ab644dd4aeca1a2603bad93520897a6206b43554d
@@ -0,0 +1 @@
1
+ d02dc795d31bf3818e6682da9bbef6399c611cfcd5ed9189f8ff9edad231bd5c98c66b0582fc86cd1843abcaf57cda394cb47e3ba5be641325357b656dcc9585
@@ -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.12-prerelease.0</latest>
7
+ <release>20.0.12-prerelease.0</release>
8
8
  <versions>
9
- <version>20.0.10-prerelease.0</version>
9
+ <version>20.0.12-prerelease.0</version>
10
10
  </versions>
11
- <lastUpdated>20220915145552</lastUpdated>
11
+ <lastUpdated>20221011170939</lastUpdated>
12
12
  </versioning>
13
13
  </metadata>
@@ -1 +1 @@
1
- 1191a5f6183621bd8fee757b41eb2d43
1
+ 79cf31a8db7ad74ff1286cd11496ad71
@@ -1 +1 @@
1
- 0aff1596476fa2a5c51711508d7d9afdb1bb1464
1
+ 0d7ee0e81eefa10376669b9858bd76020fde79ca
@@ -1 +1 @@
1
- 2f27894de27a5a63d47e2fce362ad81bb48dd9ea28c4ff01ede9f19158626db6
1
+ d36ef71b4b4869d33efcc8332d5a8ba0e78539d934e0bf9879af9ff9a47a8f29
@@ -1 +1 @@
1
- 2a3a2ba69037611029babb76220f61d51b9b586ea450b6604f7ce9ae7dddfee84712b308ec877f5a626daf4b5ba8c16aca10168017180b0266a7904577c6ac33
1
+ 91d5852150f7da4be8a3758d64a7eb28bede7863ac6d34e56b81b1587b837c935a4e5af1e5476c0beb90ada1a154efc3028ae6e4f7878699d2942aba64293579
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
@@ -11,6 +11,7 @@
11
11
  import { BunyanDebugStreamOptions } from 'bunyan-debug-stream';
12
12
 
13
13
  declare global {
14
+ const detox: Detox.DetoxExportWrapper;
14
15
  const device: Detox.DetoxExportWrapper['device'];
15
16
  const element: Detox.DetoxExportWrapper['element'];
16
17
  const waitFor: Detox.DetoxExportWrapper['waitFor'];
@@ -20,6 +21,7 @@ declare global {
20
21
 
21
22
  namespace NodeJS {
22
23
  interface Global {
24
+ detox: Detox.DetoxExportWrapper;
23
25
  device: Detox.DetoxExportWrapper['device'];
24
26
  element: Detox.DetoxExportWrapper['element'];
25
27
  waitFor: Detox.DetoxExportWrapper['waitFor'];
@@ -137,9 +139,13 @@ declare global {
137
139
  */
138
140
  jest?: {
139
141
  /**
140
- * Device init timeout
142
+ * Environment setup timeout
141
143
  */
142
- initTimeout?: number | undefined;
144
+ setupTimeout?: number | undefined;
145
+ /**
146
+ * Environment teardown timeout
147
+ */
148
+ teardownTimeout?: number | undefined;
143
149
  /**
144
150
  * Insist on CLI-based retry mechanism even when the failed tests have been handled
145
151
  * by jest.retryTimes(n) mechanism from Jest Circus.
@@ -152,6 +158,16 @@ declare global {
152
158
  * Retries count. Zero means a single attempt to run tests.
153
159
  */
154
160
  retries?: number;
161
+ /**
162
+ * When true, tells Detox CLI to cancel next retrying if it gets
163
+ * at least one report about a permanent test suite failure.
164
+ * Has no effect, if {@link DetoxTestRunnerConfig#retries} is
165
+ * undefined or set to zero.
166
+ *
167
+ * @default false
168
+ * @see {DetoxInternals.DetoxTestFileReport#isPermanentFailure}
169
+ */
170
+ bail?: boolean;
155
171
  /**
156
172
  * Custom handler to process --inspect-brk CLI flag.
157
173
  * Use it when you rely on another test runner than Jest.
@@ -238,6 +254,13 @@ declare global {
238
254
  build?: string;
239
255
  testBinaryPath?: string;
240
256
  launchArgs?: Record<string, any>;
257
+ /**
258
+ * TCP ports to `adb reverse` upon the installation.
259
+ * E.g. 8081 - to be able to access React Native packager in Debug mode.
260
+ *
261
+ * @example [8081]
262
+ */
263
+ reversePorts?: number[];
241
264
  }
242
265
 
243
266
  interface DetoxCustomAppConfig {
package/internals.d.ts CHANGED
@@ -54,14 +54,13 @@ declare global {
54
54
  onRunFinish(event: unknown): Promise<void>;
55
55
 
56
56
  /**
57
- * Reports to Detox CLI about failed tests that could have been re-run if
57
+ * Reports to Detox CLI about passed and failed test files.
58
+ * The failed test files might be re-run again if
58
59
  * {@link Detox.DetoxTestRunnerConfig#retries} is set to a non-zero.
59
60
  *
60
- * @param testFilePaths array of failed test files' paths
61
- * @param permanent whether the failure is permanent, and the tests
62
- * should not be re-run.
61
+ * @param testResults - reports about test files
63
62
  */
64
- reportFailedTests(testFilePaths: string[], permanent?: boolean): Promise<void>;
63
+ reportTestResults(testResults: DetoxTestFileReport[]): Promise<void>;
65
64
  // endregion
66
65
 
67
66
  readonly config: RuntimeConfig;
@@ -92,7 +91,7 @@ declare global {
92
91
  testRunnerArgv: Record<string, unknown>;
93
92
  override: Partial<Detox.DetoxConfig>;
94
93
  /** @inheritDoc */
95
- global: NodeJS.Global;
94
+ global: NodeJS.Global | {};
96
95
  /**
97
96
  * Worker ID. Used to distinguish allocated workers in parallel test execution environment.
98
97
  *
@@ -111,7 +110,7 @@ declare global {
111
110
  * {@link DetoxInternals.Facade#setup} might override {@link Console} methods
112
111
  * to integrate it with Detox loggeing subsystem.
113
112
  */
114
- global: NodeJS.Global;
113
+ global: NodeJS.Global | {};
115
114
  /**
116
115
  * Worker ID. Used to distinguish allocated workers in parallel test execution environment.
117
116
  *
@@ -120,25 +119,48 @@ declare global {
120
119
  workerId: string;
121
120
  };
122
121
 
122
+ type DetoxTestFileReport = {
123
+ /**
124
+ * Global or relative path to the failed test file.
125
+ */
126
+ testFilePath: string;
127
+ /**
128
+ * Whether the test passed or not.
129
+ */
130
+ success: boolean;
131
+ /**
132
+ * Top-level error if the entire test file failed.
133
+ */
134
+ testExecError?: { name?: string; message: string; stack?: string; };
135
+ /**
136
+ * If the test failed, it should tell whether the failure is permanent.
137
+ * Permanent failure means that the test file should not be re-run.
138
+ *
139
+ * @default false
140
+ * @see {Detox.DetoxTestRunnerConfig#retries}
141
+ */
142
+ isPermanentFailure?: boolean;
143
+ };
144
+
123
145
  type SessionState = Readonly<{
124
146
  /**
125
147
  * Randomly generated ID for the entire Detox test session, including retries.
126
148
  */
127
149
  id: string;
128
150
  /**
129
- * Permanently failed test file paths.
151
+ * Results of test file executions. Primarily used for Detox CLI retry mechanism.
130
152
  */
131
- failedTestFiles: string[];
132
- /**
133
- * Failed test file paths suggested to retry via Detox CLI mechanism.
134
- */
135
- testFilesToRetry: string[];
153
+ testResults: DetoxTestFileReport[];
136
154
  /**
137
155
  * Retry index of the test session: 0..retriesCount.
138
156
  */
139
157
  testSessionIndex: number;
140
158
  /**
141
- * TODO
159
+ * Count of Detox contexts with a worker installed.
160
+ * Oversimplified, it reflects the count of allocated devices in the current test session.
161
+ *
162
+ * @see {Facade#init}
163
+ * @see {Facade#installWorker}
142
164
  */
143
165
  workersCount: number;
144
166
  }>;
package/local-cli/cli.js CHANGED
@@ -1,8 +1,11 @@
1
1
  #!/usr/bin/env node
2
+ const fs = require('fs');
3
+
4
+ const _ = require('lodash');
2
5
  const yargs = require('yargs');
3
6
 
7
+ const logger = require('../internals').log.child({ cat: 'cli' });
4
8
  const DetoxError = require('../src/errors/DetoxError');
5
- const logger = require('../src/utils/logger').child({ cat: 'cli' });
6
9
 
7
10
  yargs
8
11
  .scriptName('detox')
@@ -25,12 +28,11 @@ yargs
25
28
  .wrap(yargs.terminalWidth() * 0.9)
26
29
  .fail(function(msg, err, program) {
27
30
  if (err) {
28
- const lines = DetoxError.format(err).split('\n');
29
- for (const line of lines) {
30
- logger.error(line);
31
- }
31
+ logger.error(DetoxError.format(err));
32
32
  // eslint-disable-next-line no-console
33
33
  console.error('');
34
+ // @ts-ignore
35
+ _.attempt(() => fs.unlinkSync(logger.file));
34
36
  // eslint-disable-next-line no-process-exit
35
37
  process.exit(1);
36
38
  }
package/local-cli/init.js CHANGED
@@ -76,7 +76,7 @@ function createDefaultConfigurations() {
76
76
  config: 'e2e/jest.config.js',
77
77
  },
78
78
  jest: {
79
- initTimeout: 120000,
79
+ setupTimeout: 120000,
80
80
  },
81
81
  },
82
82
  apps: {
@@ -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',
@@ -0,0 +1,16 @@
1
+ const { log } = require('../internals');
2
+ const DeviceRegistry = require('../src/devices/DeviceRegistry');
3
+ const { getDetoxLibraryRootPath } = require('../src/utils/environment');
4
+
5
+
6
+ module.exports.command = 'reset-lock-file';
7
+ module.exports.desc = 'Resets all Detox lock files. Useful when you need to run multiple `detox test` commands in parallel with --keepLockFile.';
8
+
9
+ module.exports.handler = async function resetLockFile() {
10
+ await Promise.all([
11
+ DeviceRegistry.forIOS().reset(),
12
+ DeviceRegistry.forAndroid().reset(),
13
+ ]);
14
+
15
+ log.info(`Cleaned lock files from: ${getDetoxLibraryRootPath()}`);
16
+ };
@@ -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,