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.
- 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
- package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-prerelease.0-javadoc.jar.md5 +1 -0
- package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-prerelease.0-javadoc.jar.sha1 +1 -0
- package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-prerelease.0-javadoc.jar.sha256 +1 -0
- package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-prerelease.0-javadoc.jar.sha512 +1 -0
- 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
- package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-prerelease.0-sources.jar.md5 +1 -0
- package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-prerelease.0-sources.jar.sha1 +1 -0
- package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-prerelease.0-sources.jar.sha256 +1 -0
- package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-prerelease.0-sources.jar.sha512 +1 -0
- 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
- package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-prerelease.0.aar.md5 +1 -0
- package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-prerelease.0.aar.sha1 +1 -0
- package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-prerelease.0.aar.sha256 +1 -0
- package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-prerelease.0.aar.sha512 +1 -0
- 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
- package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-prerelease.0.pom.md5 +1 -0
- package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-prerelease.0.pom.sha1 +1 -0
- package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-prerelease.0.pom.sha256 +1 -0
- package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-prerelease.0.pom.sha512 +1 -0
- package/Detox-android/com/wix/detox/maven-metadata.xml +4 -4
- package/Detox-android/com/wix/detox/maven-metadata.xml.md5 +1 -1
- package/Detox-android/com/wix/detox/maven-metadata.xml.sha1 +1 -1
- package/Detox-android/com/wix/detox/maven-metadata.xml.sha256 +1 -1
- package/Detox-android/com/wix/detox/maven-metadata.xml.sha512 +1 -1
- package/Detox-ios-src.tbz +0 -0
- package/Detox-ios.tbz +0 -0
- package/README.md +1 -1
- package/android/detox/proguard-rules.pro +3 -0
- package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/IdlingResourceDescription.kt +19 -13
- package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/NetworkIdlingResource.java +33 -30
- package/android/detox/src/testFull/java/com/wix/detox/reactnative/idlingresources/NetworkIdlingResourcesTest.kt +61 -0
- package/index.d.ts +25 -2
- package/internals.d.ts +36 -14
- package/local-cli/cli.js +7 -5
- package/local-cli/init.js +2 -1
- package/local-cli/reset-lock-file.js +16 -0
- package/local-cli/templates/jest.js +3 -1
- package/local-cli/test.test.js +58 -14
- package/local-cli/testCommand/TestRunnerCommand.js +10 -3
- package/package.json +2 -2
- package/runners/deprecation.js +2 -2
- package/runners/jest/reporters/DetoxReporter.js +22 -2
- package/runners/jest/testEnvironment/index.js +83 -82
- package/runners/jest/testEnvironment/listeners/DetoxCoreListener.js +9 -24
- package/runners/jest/testEnvironment/listeners/DetoxPlatformFilterListener.js +1 -1
- package/src/client/actions/formatters/sync-resources/NetworkFormatter.js +1 -1
- package/src/configuration/composeAppsConfig.js +4 -0
- package/src/configuration/composeRunnerConfig.js +4 -2
- package/src/devices/allocation/drivers/android/emulator/AVDValidator.js +4 -4
- package/src/devices/allocation/drivers/android/emulator/EmulatorAllocDriver.js +1 -1
- package/src/devices/common/drivers/ios/tools/AppleSimUtils.js +25 -1
- package/src/devices/lifecycle/GenyGlobalLifecycleHandler.js +2 -2
- package/src/devices/runtime/RuntimeDevice.js +10 -0
- package/src/errors/DetoxConfigErrorComposer.js +8 -0
- package/src/ipc/IPCClient.js +9 -5
- package/src/ipc/IPCServer.js +17 -13
- package/src/ipc/SessionState.js +2 -4
- package/src/realms/DetoxContext.js +2 -2
- package/src/realms/DetoxInternalsFacade.js +1 -1
- package/src/realms/DetoxPrimaryContext.js +6 -8
- package/src/realms/DetoxSecondaryContext.js +2 -2
- package/src/symbols.js +2 -2
- package/src/utils/Timer.js +55 -38
- package/src/utils/errorUtils.js +20 -0
- package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0-javadoc.jar.md5 +0 -1
- package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0-javadoc.jar.sha1 +0 -1
- package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0-javadoc.jar.sha256 +0 -1
- package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0-javadoc.jar.sha512 +0 -1
- package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0-sources.jar.md5 +0 -1
- package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0-sources.jar.sha1 +0 -1
- package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0-sources.jar.sha256 +0 -1
- package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0-sources.jar.sha512 +0 -1
- package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0.aar.md5 +0 -1
- package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0.aar.sha1 +0 -1
- package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0.aar.sha256 +0 -1
- package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0.aar.sha512 +0 -1
- package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0.pom.md5 +0 -1
- package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0.pom.sha1 +0 -1
- package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0.pom.sha256 +0 -1
- package/Detox-android/com/wix/detox/20.0.10-prerelease.0/detox-20.0.10-prerelease.0.pom.sha512 +0 -1
Binary file
|
package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-prerelease.0-javadoc.jar.md5
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
83f58f2114c4c11df13dc19fb48ec8f3
|
package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-prerelease.0-javadoc.jar.sha1
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
79e4ecf9e3a592932f8ee594c287345fbcb50ccc
|
@@ -0,0 +1 @@
|
|
1
|
+
b9135f4a994d21ab1543c223940ba2eae57411c514b6b5ede58db8179ef48ec5
|
@@ -0,0 +1 @@
|
|
1
|
+
035992cf8193c98d4335ca7f94842ca794a8a40f94f437a076eee068d930a86623d1e6d7755f624fcad632e092faa445b83557ae297c2ba7f05131848c251fa4
|
Binary file
|
package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-prerelease.0-sources.jar.md5
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
6a09651b807ee852e1fbb3e374bc95ca
|
package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-prerelease.0-sources.jar.sha1
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
c3769eddce862d29deba41c68b1c3457056d746c
|
@@ -0,0 +1 @@
|
|
1
|
+
3263d7cca6d9ae2a88716ef6aa4cd936d47b6c27888c7b3c40c6f745e3407d60
|
@@ -0,0 +1 @@
|
|
1
|
+
190e018641c86048d3c8f61efcdd8694d91b099c863f7740898f311bfb2e927179ceed13502e6efad6a915846271c0fc46177a7ac692cdda1899a9ca320dc852
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
3bdd1b42fa0f182255a47fcdda8f544c
|
@@ -0,0 +1 @@
|
|
1
|
+
457ae10d202b196ea92bade4a33ce2dbc2f8bb3f
|
package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-prerelease.0.aar.sha256
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
52342d1b0d1fae681b2ea1e6f9ac6f6278299ed70d7867fd60b95d63eb7a9ec3
|
package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-prerelease.0.aar.sha512
ADDED
@@ -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.
|
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
|
package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-prerelease.0.pom.sha256
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
516654dfdf2f2ef5dc08619ab644dd4aeca1a2603bad93520897a6206b43554d
|
package/Detox-android/com/wix/detox/20.0.12-prerelease.0/detox-20.0.12-prerelease.0.pom.sha512
ADDED
@@ -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.
|
7
|
-
<release>20.0.
|
6
|
+
<latest>20.0.12-prerelease.0</latest>
|
7
|
+
<release>20.0.12-prerelease.0</release>
|
8
8
|
<versions>
|
9
|
-
<version>20.0.
|
9
|
+
<version>20.0.12-prerelease.0</version>
|
10
10
|
</versions>
|
11
|
-
<lastUpdated>
|
11
|
+
<lastUpdated>20221011170939</lastUpdated>
|
12
12
|
</versioning>
|
13
13
|
</metadata>
|
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
79cf31a8db7ad74ff1286cd11496ad71
|
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
0d7ee0e81eefa10376669b9858bd76020fde79ca
|
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
d36ef71b4b4869d33efcc8332d5a8ba0e78539d934e0bf9879af9ff9a47a8f29
|
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
91d5852150f7da4be8a3758d64a7eb28bede7863ac6d34e56b81b1587b837c935a4e5af1e5476c0beb90ada1a154efc3028ae6e4f7878699d2942aba64293579
|
package/Detox-ios-src.tbz
CHANGED
Binary file
|
package/Detox-ios.tbz
CHANGED
Binary file
|
package/README.md
CHANGED
@@ -1,20 +1,26 @@
|
|
1
1
|
package com.wix.detox.reactnative.idlingresources
|
2
2
|
|
3
3
|
class IdlingResourceDescription private constructor(
|
4
|
-
|
5
|
-
|
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
|
-
|
10
|
-
|
7
|
+
fun json() =
|
8
|
+
mutableMapOf<String, Any>("name" to name)
|
9
|
+
.apply {
|
10
|
+
if (description.isNotEmpty()) put("description", description)
|
11
|
+
}.toMap()
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
|
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
|
-
|
17
|
-
|
18
|
-
|
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
|
-
*
|
142
|
+
* Environment setup timeout
|
141
143
|
*/
|
142
|
-
|
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
|
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
|
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
|
-
|
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
|
-
*
|
151
|
+
* Results of test file executions. Primarily used for Detox CLI retry mechanism.
|
130
152
|
*/
|
131
|
-
|
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
|
-
*
|
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
|
-
|
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
|
-
|
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 =
|
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,
|