detox 20.31.0 → 20.33.0-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.30.0/detox-20.30.0-sources.jar → 20.33.0-prerelease.0/detox-20.33.0-prerelease.0-sources.jar} +0 -0
- package/Detox-android/com/wix/detox/20.33.0-prerelease.0/detox-20.33.0-prerelease.0-sources.jar.md5 +1 -0
- package/Detox-android/com/wix/detox/20.33.0-prerelease.0/detox-20.33.0-prerelease.0-sources.jar.sha1 +1 -0
- package/Detox-android/com/wix/detox/20.33.0-prerelease.0/detox-20.33.0-prerelease.0-sources.jar.sha256 +1 -0
- package/Detox-android/com/wix/detox/20.33.0-prerelease.0/detox-20.33.0-prerelease.0-sources.jar.sha512 +1 -0
- package/Detox-android/com/wix/detox/20.33.0-prerelease.0/detox-20.33.0-prerelease.0.aar +0 -0
- package/Detox-android/com/wix/detox/20.33.0-prerelease.0/detox-20.33.0-prerelease.0.aar.md5 +1 -0
- package/Detox-android/com/wix/detox/20.33.0-prerelease.0/detox-20.33.0-prerelease.0.aar.sha1 +1 -0
- package/Detox-android/com/wix/detox/20.33.0-prerelease.0/detox-20.33.0-prerelease.0.aar.sha256 +1 -0
- package/Detox-android/com/wix/detox/20.33.0-prerelease.0/detox-20.33.0-prerelease.0.aar.sha512 +1 -0
- package/Detox-android/com/wix/detox/{20.30.0/detox-20.30.0.pom → 20.33.0-prerelease.0/detox-20.33.0-prerelease.0.pom} +13 -1
- package/Detox-android/com/wix/detox/20.33.0-prerelease.0/detox-20.33.0-prerelease.0.pom.md5 +1 -0
- package/Detox-android/com/wix/detox/20.33.0-prerelease.0/detox-20.33.0-prerelease.0.pom.sha1 +1 -0
- package/Detox-android/com/wix/detox/20.33.0-prerelease.0/detox-20.33.0-prerelease.0.pom.sha256 +1 -0
- package/Detox-android/com/wix/detox/20.33.0-prerelease.0/detox-20.33.0-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-framework.tbz +0 -0
- package/Detox-ios-src.tbz +0 -0
- package/Detox-ios-xcuitest.tbz +0 -0
- package/android/detox/build.gradle +6 -1
- package/android/detox/proguard-rules-app.pro +12 -0
- package/android/detox/src/full/java/com/wix/detox/DetoxMain.kt +4 -3
- package/android/detox/src/full/java/com/wix/detox/reactnative/ReactApplicationExt.kt +34 -0
- package/android/detox/src/full/java/com/wix/detox/reactnative/ReactNativeExtension.kt +22 -27
- package/android/detox/src/full/java/com/wix/detox/reactnative/ReactNativeLoadingMonitor.kt +51 -71
- package/android/detox/src/full/java/com/wix/detox/reactnative/helpers/RNHelpers.kt +1 -1
- package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/DetoxIdlingResource.kt +4 -2
- package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/ReactNativeIdlingResources.kt +17 -13
- package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/animations/AnimatedModuleIdlingResource.kt +5 -2
- package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/factory/DetoxIdlingResourceFactory.kt +9 -20
- package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/factory/DetoxIdlingResourceFactoryStrategy.kt +7 -0
- package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/factory/FabricDetoxIdlingResourceFactoryStrategy.kt +31 -0
- package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/factory/IdlingResourcesName.kt +1 -1
- package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/factory/OldArchitectureDetoxIdlingResourceFactoryStrategy.kt +33 -0
- package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/network/NetworkIdlingResource.kt +5 -0
- package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/network/NetworkingModuleReflected.kt +11 -14
- package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/storage/AsyncStorageIdlingResource.kt +31 -29
- package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/timers/FabricTimersIdlingResource.kt +50 -0
- package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/timers/JavaTimersReflected.kt +26 -0
- package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/timers/TimersIdlingResource.kt +6 -5
- package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/uimodule/fabric/FabricUIManagerIdlingResources.kt +70 -0
- package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/uimodule/{DispatchCommandOperationReflected.kt → paper/DispatchCommandOperationReflected.kt} +1 -1
- package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/uimodule/{NativeHierarchyManagerReflected.kt → paper/NativeHierarchyManagerReflected.kt} +5 -3
- package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/uimodule/{UIManagerModuleReflected.kt → paper/UIManagerModuleReflected.kt} +5 -3
- package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/uimodule/{UIModuleIdlingResource.kt → paper/UIModuleIdlingResource.kt} +12 -4
- package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/uimodule/{ViewCommandOpsQueueReflected.kt → paper/ViewCommandOpsQueueReflected.kt} +3 -3
- package/android/detox/src/full/java/com/wix/detox/reactnative/reloader/ReactNativeReloader.kt +34 -0
- package/android/detox/src/full/java/com/wix/detox/reactnative/reloader/ReactNativeReloaderFactory.kt +18 -0
- package/android/detox/src/testFull/java/com/wix/detox/reactnative/idlingresources/AsyncStorageIdlingResourceTest.kt +9 -2
- package/android/detox/src/testFull/java/com/wix/detox/reactnative/idlingresources/timers/TimersIdlingResourceTest.kt +9 -3
- package/package.json +2 -2
- package/scripts/updateGradle.js +37 -0
- package/src/DetoxWorker.js +1 -2
- package/src/devices/allocation/drivers/android/genycloud/exec/GenyCloudExec.js +14 -8
- package/src/devices/validation/android/GenycloudEnvValidator.js +20 -3
- package/Detox-android/com/wix/detox/20.30.0/detox-20.30.0-sources.jar.md5 +0 -1
- package/Detox-android/com/wix/detox/20.30.0/detox-20.30.0-sources.jar.sha1 +0 -1
- package/Detox-android/com/wix/detox/20.30.0/detox-20.30.0-sources.jar.sha256 +0 -1
- package/Detox-android/com/wix/detox/20.30.0/detox-20.30.0-sources.jar.sha512 +0 -1
- package/Detox-android/com/wix/detox/20.30.0/detox-20.30.0.aar +0 -0
- package/Detox-android/com/wix/detox/20.30.0/detox-20.30.0.aar.md5 +0 -1
- package/Detox-android/com/wix/detox/20.30.0/detox-20.30.0.aar.sha1 +0 -1
- package/Detox-android/com/wix/detox/20.30.0/detox-20.30.0.aar.sha256 +0 -1
- package/Detox-android/com/wix/detox/20.30.0/detox-20.30.0.aar.sha512 +0 -1
- package/Detox-android/com/wix/detox/20.30.0/detox-20.30.0.pom.md5 +0 -1
- package/Detox-android/com/wix/detox/20.30.0/detox-20.30.0.pom.sha1 +0 -1
- package/Detox-android/com/wix/detox/20.30.0/detox-20.30.0.pom.sha256 +0 -1
- package/Detox-android/com/wix/detox/20.30.0/detox-20.30.0.pom.sha512 +0 -1
- package/android/detox/src/full/java/com/wix/detox/reactnative/ReactNativeReloader.kt +0 -16
@@ -2,7 +2,9 @@ package com.wix.detox.reactnative.idlingresources
|
|
2
2
|
|
3
3
|
import androidx.test.espresso.IdlingResource
|
4
4
|
import com.facebook.react.bridge.NativeModule
|
5
|
+
import com.facebook.react.bridge.ReactContext
|
5
6
|
import com.wix.detox.UTHelpers.yieldToOtherThreads
|
7
|
+
import com.wix.detox.reactnative.helpers.RNHelpers
|
6
8
|
import com.wix.detox.reactnative.idlingresources.storage.AsyncStorageIdlingResource
|
7
9
|
import com.wix.detox.reactnative.idlingresources.storage.SerialExecutorReflected
|
8
10
|
import org.assertj.core.api.Assertions.assertThat
|
@@ -10,6 +12,7 @@ import org.junit.Before
|
|
10
12
|
import org.junit.Test
|
11
13
|
import org.junit.runner.RunWith
|
12
14
|
import org.mockito.kotlin.any
|
15
|
+
import org.mockito.kotlin.argThat
|
13
16
|
import org.mockito.kotlin.argumentCaptor
|
14
17
|
import org.mockito.kotlin.eq
|
15
18
|
import org.mockito.kotlin.mock
|
@@ -37,6 +40,8 @@ class AsyncStorageIdlingResourceTest {
|
|
37
40
|
private lateinit var sexecutorReflectedGenFn: (executor: Executor) -> SerialExecutorReflected
|
38
41
|
private lateinit var module: AsyncStorageModuleStub
|
39
42
|
private lateinit var uut: AsyncStorageIdlingResource
|
43
|
+
private val reactContext: ReactContext = mock()
|
44
|
+
private lateinit var rnHelpers: RNHelpers
|
40
45
|
|
41
46
|
@Before
|
42
47
|
fun setup() {
|
@@ -49,8 +54,10 @@ class AsyncStorageIdlingResourceTest {
|
|
49
54
|
on { invoke(eq(module.executor)) }.thenReturn(sexecutorReflected)
|
50
55
|
}
|
51
56
|
|
52
|
-
|
53
|
-
|
57
|
+
rnHelpers = mock {
|
58
|
+
on { getNativeModule(any(), any()) }.thenReturn(module)
|
59
|
+
}
|
60
|
+
uut = AsyncStorageIdlingResource(reactContext, sexecutorReflectedGenFn, rnHelpers)
|
54
61
|
}
|
55
62
|
|
56
63
|
fun givenNoActiveTasks() = whenever(sexecutorReflected.hasActiveTask()).thenReturn(false)
|
@@ -5,13 +5,13 @@ import androidx.test.espresso.IdlingResource
|
|
5
5
|
import com.facebook.react.bridge.ReactContext
|
6
6
|
import com.facebook.react.modules.core.TimingModule
|
7
7
|
import org.assertj.core.api.Assertions
|
8
|
+
import org.junit.Assert.assertFalse
|
8
9
|
import org.junit.Before
|
9
10
|
import org.junit.Test
|
10
11
|
import org.junit.runner.RunWith
|
11
12
|
import org.mockito.kotlin.*
|
12
13
|
import org.robolectric.RobolectricTestRunner
|
13
|
-
import
|
14
|
-
import org.spekframework.spek2.style.specification.describe
|
14
|
+
import kotlin.test.assertTrue
|
15
15
|
|
16
16
|
private fun anIdlingResourceCallback() = mock<IdlingResource.ResourceCallback>()
|
17
17
|
|
@@ -28,7 +28,6 @@ class TimersIdlingResourceTest {
|
|
28
28
|
timersIdlingResource = TimersIdlingResource(context) { choreographer }
|
29
29
|
}
|
30
30
|
|
31
|
-
|
32
31
|
private fun givenIdleStrategy() {
|
33
32
|
whenever(timersModule.hasActiveTimersInRange(any())).thenReturn(false)
|
34
33
|
}
|
@@ -48,6 +47,13 @@ class TimersIdlingResourceTest {
|
|
48
47
|
getChoreographerCallback().doFrame(0L)
|
49
48
|
}
|
50
49
|
|
50
|
+
@Test
|
51
|
+
fun `should pause when unregistered`() {
|
52
|
+
assertFalse(timersIdlingResource.paused.get())
|
53
|
+
timersIdlingResource.onUnregistered()
|
54
|
+
assertTrue(timersIdlingResource.paused.get())
|
55
|
+
}
|
56
|
+
|
51
57
|
@Test
|
52
58
|
fun `should return a debug-name`() {
|
53
59
|
Assertions.assertThat(timersIdlingResource.getDebugName()).isEqualTo("timers")
|
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.
|
4
|
+
"version": "20.33.0-prerelease.0",
|
5
5
|
"bin": {
|
6
6
|
"detox": "local-cli/cli.js"
|
7
7
|
},
|
@@ -119,5 +119,5 @@
|
|
119
119
|
"browserslist": [
|
120
120
|
"node 14"
|
121
121
|
],
|
122
|
-
"gitHead": "
|
122
|
+
"gitHead": "24e2e8402c63506e434341130f79a62ad6949e3f"
|
123
123
|
}
|
package/scripts/updateGradle.js
CHANGED
@@ -26,6 +26,43 @@ function getGradleVersionByRNVersion() {
|
|
26
26
|
function patchGradleByRNVersion() {
|
27
27
|
updateGradleWrapperSync();
|
28
28
|
patchSettingsGradle();
|
29
|
+
patchGradlePropertiesSync();
|
30
|
+
}
|
31
|
+
|
32
|
+
/**
|
33
|
+
* By default gralde.properties has new arch enabled. Disable it by adding evn var
|
34
|
+
*/
|
35
|
+
function patchGradlePropertiesSync() {
|
36
|
+
// Read the evn var to check if the new arch is enabled
|
37
|
+
let isNewArch;
|
38
|
+
|
39
|
+
if (!process.env.ENABLE_NEW_ARCH) {
|
40
|
+
isNewArch = true;
|
41
|
+
} else {
|
42
|
+
isNewArch = process.env.ENABLE_NEW_ARCH === 'true';
|
43
|
+
}
|
44
|
+
|
45
|
+
function readGradlePropertiesFile() {
|
46
|
+
const gradlePropertiesFile = path.join(process.cwd(), 'android', 'gradle.properties');
|
47
|
+
console.log(`Patching gradle.properties. File: ${gradlePropertiesFile}`);
|
48
|
+
const data = fs.readFileSync(gradlePropertiesFile, 'utf8');
|
49
|
+
return { gradlePropertiesFile, data };
|
50
|
+
}
|
51
|
+
|
52
|
+
function writeGradlePropertiesFile(gradlePropertiesFile, data) {
|
53
|
+
const updatedData = data.replace('newArchEnabled=true', 'newArchEnabled=false');
|
54
|
+
fs.writeFileSync(gradlePropertiesFile, updatedData, 'utf8');
|
55
|
+
console.log('gradle.properties patched successfully.');
|
56
|
+
}
|
57
|
+
|
58
|
+
if (!isNewArch) {
|
59
|
+
try {
|
60
|
+
const { gradlePropertiesFile, data } = readGradlePropertiesFile();
|
61
|
+
writeGradlePropertiesFile(gradlePropertiesFile, data);
|
62
|
+
} catch (e) {
|
63
|
+
console.error('Error:', e);
|
64
|
+
}
|
65
|
+
}
|
29
66
|
}
|
30
67
|
|
31
68
|
/**
|
package/src/DetoxWorker.js
CHANGED
@@ -259,8 +259,7 @@ class DetoxWorker {
|
|
259
259
|
});
|
260
260
|
|
261
261
|
if (copilot.isInitialized()) {
|
262
|
-
|
263
|
-
copilot.end(testSummary.status === 'passed');
|
262
|
+
copilot.end(testSummary.status !== 'passed');
|
264
263
|
}
|
265
264
|
};
|
266
265
|
|
@@ -3,7 +3,7 @@ const exec = require('../../../../../../utils/childProcess').execWithRetriesAndL
|
|
3
3
|
|
4
4
|
class GenyCloudExec {
|
5
5
|
constructor(binaryPath) {
|
6
|
-
this.binaryExec =
|
6
|
+
this.binaryExec = binaryPath;
|
7
7
|
process.env.GMSAAS_USER_AGENT_EXTRA_DATA = process.env.GMSAAS_USER_AGENT_EXTRA_DATA || 'detox';
|
8
8
|
}
|
9
9
|
|
@@ -11,6 +11,10 @@ class GenyCloudExec {
|
|
11
11
|
return this._exec('--version');
|
12
12
|
}
|
13
13
|
|
14
|
+
doctor() {
|
15
|
+
return this._exec('doctor', { retries: 0 }, 'text');
|
16
|
+
}
|
17
|
+
|
14
18
|
getRecipe(name) {
|
15
19
|
return this._exec(`recipes list --name "${name}"`);
|
16
20
|
}
|
@@ -38,23 +42,25 @@ class GenyCloudExec {
|
|
38
42
|
return this._exec(`instances stop ${instanceUUID}`, options);
|
39
43
|
}
|
40
44
|
|
41
|
-
async _exec(args, options) {
|
45
|
+
async _exec(args, options, format = 'compactjson') {
|
42
46
|
try {
|
43
|
-
const rawResult = await this.__exec(args, options);
|
44
|
-
return
|
47
|
+
const rawResult = await this.__exec(args, options, format);
|
48
|
+
return (
|
49
|
+
format === 'compactjson' ? JSON.parse(rawResult) : rawResult
|
50
|
+
);
|
45
51
|
} catch (error) {
|
46
52
|
throw new Error(error.stderr);
|
47
53
|
}
|
48
54
|
}
|
49
55
|
|
50
|
-
async __exec(args,
|
51
|
-
const
|
52
|
-
...
|
56
|
+
async __exec(args, options, format) {
|
57
|
+
const _options = {
|
58
|
+
...options,
|
53
59
|
statusLogs: {
|
54
60
|
retrying: true,
|
55
61
|
},
|
56
62
|
};
|
57
|
-
return (await exec(
|
63
|
+
return (await exec(`"${this.binaryExec}" --format ${format} ${args}`, _options )).stdout;
|
58
64
|
}
|
59
65
|
}
|
60
66
|
|
@@ -6,6 +6,7 @@ const environment = require('../../../utils/environment');
|
|
6
6
|
const EnvironmentValidatorBase = require('../EnvironmentValidatorBase');
|
7
7
|
|
8
8
|
const MIN_GMSAAS_VERSION = '1.6.0';
|
9
|
+
const MIN_GMSAAS_VERSION_WITH_DOCTOR = '1.11.0';
|
9
10
|
|
10
11
|
class GenycloudEnvValidator extends EnvironmentValidatorBase {
|
11
12
|
/**
|
@@ -18,11 +19,13 @@ class GenycloudEnvValidator extends EnvironmentValidatorBase {
|
|
18
19
|
}
|
19
20
|
|
20
21
|
async validate() {
|
21
|
-
await this.
|
22
|
+
const { version } = await this._exec.getVersion();
|
23
|
+
|
24
|
+
await this._validateGmsaasVersion(version);
|
25
|
+
await this._validateGmsaasDoctorCheck(version);
|
22
26
|
}
|
23
27
|
|
24
|
-
async _validateGmsaasVersion() {
|
25
|
-
const { version } = await this._exec.getVersion();
|
28
|
+
async _validateGmsaasVersion(version) {
|
26
29
|
if (semver.lt(version, MIN_GMSAAS_VERSION)) {
|
27
30
|
throw new DetoxRuntimeError({
|
28
31
|
message: `Your Genymotion-Cloud executable (found in ${environment.getGmsaasPath()}) is too old! (version ${version})`,
|
@@ -30,6 +33,20 @@ class GenycloudEnvValidator extends EnvironmentValidatorBase {
|
|
30
33
|
});
|
31
34
|
}
|
32
35
|
}
|
36
|
+
|
37
|
+
async _validateGmsaasDoctorCheck(version) {
|
38
|
+
if (semver.lt(version, MIN_GMSAAS_VERSION_WITH_DOCTOR)) {
|
39
|
+
return;
|
40
|
+
}
|
41
|
+
|
42
|
+
try {
|
43
|
+
await this._exec.doctor();
|
44
|
+
} catch (e) {
|
45
|
+
throw new DetoxRuntimeError({
|
46
|
+
message: e.message,
|
47
|
+
});
|
48
|
+
}
|
49
|
+
}
|
33
50
|
}
|
34
51
|
|
35
52
|
module.exports = GenycloudEnvValidator;
|
@@ -1 +0,0 @@
|
|
1
|
-
3874ff4a56e24600a473d514e4e29e40
|
@@ -1 +0,0 @@
|
|
1
|
-
629c66f412e7b606503f31713eabd46fa55b618b
|
@@ -1 +0,0 @@
|
|
1
|
-
ca7005ce7e3de6a7fcd96d421742587ed196a0343d90e031501318d3fc3bf54a
|
@@ -1 +0,0 @@
|
|
1
|
-
033a223e6731b20be6db87a17bfcd4be7ff0833cc8686b66f63aa6ba74f2d05c4735715074fcc9834efe265f282823830102b7a5f808dca7865bd9956ec4b782
|
Binary file
|
@@ -1 +0,0 @@
|
|
1
|
-
c5f3daffcbc4e0f545784d563efc793c
|
@@ -1 +0,0 @@
|
|
1
|
-
fd392c76debf7d9afdbfd9f7eb0c48766395bd82
|
@@ -1 +0,0 @@
|
|
1
|
-
f6623de89efe2e0b49241ef2c9ec3fee79cf3d84e7dbf5d2f00d762427a32cab
|
@@ -1 +0,0 @@
|
|
1
|
-
92906ac80969295c0ca21b3428801173fa48bb93ffc0ff2450f2d74af4a6c2b6c9afdcb07c49bd46f2bb791317b8dd43bd30ff5801839fa3c7deafd6c8348548
|
@@ -1 +0,0 @@
|
|
1
|
-
3c6dcd60dee4e0fc2d0224627831750b
|
@@ -1 +0,0 @@
|
|
1
|
-
de3d4cc5a268e3535f7dc4d9e11fd6bf5f91729c
|
@@ -1 +0,0 @@
|
|
1
|
-
463591b08b156e20021aa77adc93813045a82d3925156dc7f08e1aa092a5e3eb
|
@@ -1 +0,0 @@
|
|
1
|
-
ae13b47252859419d791e1f85f44b8abf97d2817a5ad5a7f7cba39172bd8f816b1fbff2a5b72da47875447d8a268c6dd56a9ffcdb04b4c6b98a4cab8485b8865
|
@@ -1,16 +0,0 @@
|
|
1
|
-
package com.wix.detox.reactnative
|
2
|
-
|
3
|
-
import android.app.Instrumentation
|
4
|
-
import com.facebook.react.ReactApplication
|
5
|
-
|
6
|
-
open class ReactNativeReLoader(
|
7
|
-
private val instrumentation: Instrumentation,
|
8
|
-
private val rnApplication: ReactApplication) {
|
9
|
-
|
10
|
-
fun reloadInBackground() {
|
11
|
-
val rnInstanceManager = rnApplication.reactNativeHost.reactInstanceManager
|
12
|
-
instrumentation.runOnMainSync {
|
13
|
-
rnInstanceManager.recreateReactContextInBackground()
|
14
|
-
}
|
15
|
-
}
|
16
|
-
}
|