detox 21.0.0-rc.6 → 21.0.0-rc.7
Sign up to get free protection for your applications and to get access to all the features.
- package/.eslintignore +1 -0
- package/Detox-android/com/wix/detox/{21.0.0-rc.6/detox-21.0.0-rc.6-javadoc.jar → 21.0.0-rc.7/detox-21.0.0-rc.7-javadoc.jar} +0 -0
- package/Detox-android/com/wix/detox/21.0.0-rc.7/detox-21.0.0-rc.7-javadoc.jar.md5 +1 -0
- package/Detox-android/com/wix/detox/21.0.0-rc.7/detox-21.0.0-rc.7-javadoc.jar.sha1 +1 -0
- package/Detox-android/com/wix/detox/21.0.0-rc.7/detox-21.0.0-rc.7-javadoc.jar.sha256 +1 -0
- package/Detox-android/com/wix/detox/21.0.0-rc.7/detox-21.0.0-rc.7-javadoc.jar.sha512 +1 -0
- package/Detox-android/com/wix/detox/{21.0.0-rc.6/detox-21.0.0-rc.6-sources.jar → 21.0.0-rc.7/detox-21.0.0-rc.7-sources.jar} +0 -0
- package/Detox-android/com/wix/detox/21.0.0-rc.7/detox-21.0.0-rc.7-sources.jar.md5 +1 -0
- package/Detox-android/com/wix/detox/21.0.0-rc.7/detox-21.0.0-rc.7-sources.jar.sha1 +1 -0
- package/Detox-android/com/wix/detox/21.0.0-rc.7/detox-21.0.0-rc.7-sources.jar.sha256 +1 -0
- package/Detox-android/com/wix/detox/21.0.0-rc.7/detox-21.0.0-rc.7-sources.jar.sha512 +1 -0
- package/Detox-android/com/wix/detox/21.0.0-rc.7/detox-21.0.0-rc.7.aar +0 -0
- package/Detox-android/com/wix/detox/21.0.0-rc.7/detox-21.0.0-rc.7.aar.md5 +1 -0
- package/Detox-android/com/wix/detox/21.0.0-rc.7/detox-21.0.0-rc.7.aar.sha1 +1 -0
- package/Detox-android/com/wix/detox/21.0.0-rc.7/detox-21.0.0-rc.7.aar.sha256 +1 -0
- package/Detox-android/com/wix/detox/21.0.0-rc.7/detox-21.0.0-rc.7.aar.sha512 +1 -0
- package/Detox-android/com/wix/detox/{21.0.0-rc.6/detox-21.0.0-rc.6.pom → 21.0.0-rc.7/detox-21.0.0-rc.7.pom} +1 -7
- package/Detox-android/com/wix/detox/21.0.0-rc.7/detox-21.0.0-rc.7.pom.md5 +1 -0
- package/Detox-android/com/wix/detox/21.0.0-rc.7/detox-21.0.0-rc.7.pom.sha1 +1 -0
- package/Detox-android/com/wix/detox/21.0.0-rc.7/detox-21.0.0-rc.7.pom.sha256 +1 -0
- package/Detox-android/com/wix/detox/21.0.0-rc.7/detox-21.0.0-rc.7.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 +13 -8
- package/android/detox/src/full/java/com/wix/detox/espresso/DetoxAssertion.java +44 -25
- package/android/detox/src/full/java/com/wix/detox/espresso/EspressoDetox.java +6 -7
- package/android/detox/src/full/java/com/wix/detox/espresso/action/AdjustSliderToPositionAction.kt +2 -2
- package/android/detox/src/full/java/com/wix/detox/espresso/action/GetAttributesAction.kt +34 -35
- package/android/detox/src/full/java/com/wix/detox/espresso/common/MaterialSliderHelper.kt +21 -0
- package/android/detox/src/full/java/com/wix/detox/espresso/common/{SliderHelper.kt → ReactSliderHelper.kt} +6 -5
- package/android/detox/src/full/java/com/wix/detox/espresso/matcher/ViewMatchers.kt +2 -2
- package/android/detox/src/full/java/com/wix/detox/espresso/performer/MultipleViewsActionPerformer.kt +43 -0
- package/android/detox/src/full/java/com/wix/detox/espresso/performer/SingleViewActionPerformer.kt +19 -0
- package/android/detox/src/full/java/com/wix/detox/espresso/performer/ViewActionPerformer.kt +24 -0
- package/android/detox/src/full/java/com/wix/detox/espresso/web/WebElement.java +4 -4
- package/android/detox/src/full/java/com/wix/invoke/types/Invocation.java +7 -6
- package/android/detox/src/main/java/com/wix/detox/espresso/MultipleViewsAction.kt +4 -0
- package/android/detox/src/main/java/com/wix/detox/espresso/UiControllerSpy.kt +0 -1
- package/android/detox/src/main/java/com/wix/detox/espresso/ViewActionWithResult.kt +2 -1
- package/android/detox/src/main/java/com/wix/detox/espresso/action/common/MotionEvents.kt +60 -4
- package/android/detox/src/testFull/java/com/wix/detox/espresso/action/GetAttributesActionTest.kt +6 -5
- package/android/detox/src/testFull/java/com/wix/detox/espresso/common/MaterialSliderHelperTest.kt +33 -0
- package/android/detox/src/testFull/java/com/wix/detox/espresso/common/{SliderHelperTest.kt → ReactSliderHelperTest.kt} +3 -3
- package/android/detox/src/testFull/java/com/wix/detox/espresso/performer/ViewActionPerformerSpec.kt +37 -0
- package/android/detox/src/testFull/java/com/wix/invoke/JsonParserTest.java +23 -7
- package/android/detox/src/testFull/resources/targetInvocationEspressoWebDetoxScript.json +47 -0
- package/detox.d.ts +1830 -0
- package/globals.d.ts +23 -0
- package/index.d.ts +2 -1823
- package/internals.d.ts +11 -1
- package/jest.config.js +108 -0
- package/local-cli/reset-lock-file.js +5 -9
- package/local-cli/testCommand/TestRunnerCommand.js +26 -3
- package/local-cli/utils/interruptListeners.js +15 -0
- package/package.json +2 -100
- package/runners/jest/reporter.js +21 -1
- package/runners/jest/reporters/DetoxIPCReporter.js +34 -0
- package/runners/jest/reporters/DetoxReporterDispatcher.js +144 -0
- package/runners/jest/reporters/DetoxSummaryReporter.js +16 -0
- package/runners/jest/reporters/DetoxVerboseReporter.js +16 -0
- package/runners/jest/reporters/index.js +6 -0
- package/runners/jest/testEnvironment/index.js +11 -0
- package/src/DetoxWorker.js +5 -11
- package/src/android/core/NativeElement.js +26 -29
- package/src/android/core/WebElement.js +24 -6
- package/src/android/espressoapi/DetoxAssertion.js +16 -14
- package/src/android/espressoapi/EspressoDetox.js +9 -2
- package/src/android/espressoapi/web/WebElement.js +1 -4
- package/src/android/interactions/native.js +2 -3
- package/src/artifacts/providers/index.js +3 -3
- package/src/artifacts/screenshot/SimulatorScreenshotPlugin.js +0 -17
- package/src/configuration/composeLoggerConfig.js +1 -0
- package/src/configuration/composeRunnerConfig.js +3 -1
- package/src/devices/allocation/DeviceAllocator.js +66 -20
- package/src/devices/allocation/DeviceList.js +44 -0
- package/src/devices/allocation/DeviceRegistry.js +189 -0
- package/src/devices/allocation/drivers/AllocationDriverBase.d.ts +15 -0
- package/src/devices/{common/drivers/android/tools → allocation/drivers/android}/FreeDeviceFinder.js +11 -10
- package/src/devices/allocation/drivers/android/attached/AttachedAndroidAllocDriver.js +22 -17
- package/src/devices/allocation/drivers/android/emulator/EmulatorAllocDriver.js +97 -38
- package/src/devices/allocation/drivers/android/emulator/EmulatorLauncher.js +32 -45
- package/src/devices/allocation/drivers/android/emulator/FreeEmulatorFinder.js +1 -1
- package/src/devices/allocation/drivers/android/emulator/FreePortFinder.js +37 -0
- package/src/devices/allocation/drivers/android/emulator/launchEmulatorProcess.js +3 -3
- package/src/devices/allocation/drivers/android/genycloud/GenyAllocDriver.js +104 -32
- package/src/devices/allocation/drivers/android/genycloud/GenyInstanceLauncher.js +40 -31
- package/src/devices/allocation/drivers/android/genycloud/GenyRegistry.js +121 -0
- package/src/devices/allocation/drivers/android/genycloud/services/GenyInstanceLifecycleService.js +24 -0
- package/src/devices/{common → allocation}/drivers/android/genycloud/services/GenyRecipesService.js +1 -1
- package/src/devices/allocation/drivers/android/genycloud/services/dto/GenyInstance.js +83 -0
- package/src/devices/allocation/drivers/android/genycloud/services/dto/GenyRecipe.js +25 -0
- package/src/devices/allocation/drivers/ios/SimulatorAllocDriver.js +95 -54
- package/src/devices/allocation/drivers/ios/SimulatorQuery.js +24 -0
- package/src/devices/allocation/factories/android.js +29 -35
- package/src/devices/allocation/factories/ios.js +6 -7
- package/src/devices/common/drivers/DeviceCookie.d.ts +12 -0
- package/src/devices/common/drivers/android/cookies.d.ts +11 -0
- package/src/devices/common/drivers/android/emulator/exec/EmulatorExec.js +17 -5
- package/src/devices/common/drivers/android/exec/ADB.js +1 -0
- package/src/devices/common/drivers/android/tools/instrumentationArgs.js +7 -1
- package/src/devices/common/drivers/ios/cookies.d.ts +9 -0
- package/src/devices/common/drivers/ios/tools/AppleSimUtils.js +3 -1
- package/src/devices/cookies/index.js +0 -6
- package/src/devices/runtime/drivers/android/genycloud/GenyCloudDriver.js +7 -6
- package/src/devices/runtime/drivers/ios/SimulatorDriver.js +5 -4
- package/src/devices/runtime/factories/android.js +3 -11
- package/src/devices/runtime/factories/ios.js +3 -4
- package/src/{servicelocator → devices/servicelocator}/android/emulatorServiceLocator.js +1 -1
- package/src/devices/servicelocator/android/genycloudServiceLocator.js +17 -0
- package/src/devices/servicelocator/android/index.js +23 -0
- package/src/{validation → devices/validation}/EnvironmentValidatorBase.js +1 -0
- package/src/{validation → devices/validation}/android/GenycloudEnvValidator.js +2 -2
- package/src/{validation → devices/validation}/factories/index.js +1 -1
- package/src/{validation → devices/validation}/ios/IosSimulatorEnvValidator.js +2 -2
- package/src/environmentFactory.js +1 -11
- package/src/ios/web.js +21 -5
- package/src/ipc/IPCClient.js +22 -1
- package/src/ipc/IPCServer.js +42 -1
- package/src/ipc/SessionState.js +1 -0
- package/src/logger/DetoxLogger.js +2 -2
- package/src/realms/DetoxContext.js +8 -0
- package/src/realms/DetoxInternalsFacade.js +1 -0
- package/src/realms/DetoxPrimaryContext.js +48 -42
- package/src/realms/DetoxSecondaryContext.js +27 -0
- package/src/realms/symbols.js +6 -0
- package/src/utils/PIDService.js +27 -0
- package/src/utils/assertIsFunction.js +35 -0
- package/src/utils/environment.js +8 -15
- package/src/utils/errorUtils.js +3 -3
- package/src/utils/isArrowFunction.js +24 -0
- package/tsconfig.json +8 -3
- package/Detox-android/com/wix/detox/21.0.0-rc.6/detox-21.0.0-rc.6-javadoc.jar.md5 +0 -1
- package/Detox-android/com/wix/detox/21.0.0-rc.6/detox-21.0.0-rc.6-javadoc.jar.sha1 +0 -1
- package/Detox-android/com/wix/detox/21.0.0-rc.6/detox-21.0.0-rc.6-javadoc.jar.sha256 +0 -1
- package/Detox-android/com/wix/detox/21.0.0-rc.6/detox-21.0.0-rc.6-javadoc.jar.sha512 +0 -1
- package/Detox-android/com/wix/detox/21.0.0-rc.6/detox-21.0.0-rc.6-sources.jar.md5 +0 -1
- package/Detox-android/com/wix/detox/21.0.0-rc.6/detox-21.0.0-rc.6-sources.jar.sha1 +0 -1
- package/Detox-android/com/wix/detox/21.0.0-rc.6/detox-21.0.0-rc.6-sources.jar.sha256 +0 -1
- package/Detox-android/com/wix/detox/21.0.0-rc.6/detox-21.0.0-rc.6-sources.jar.sha512 +0 -1
- package/Detox-android/com/wix/detox/21.0.0-rc.6/detox-21.0.0-rc.6.aar +0 -0
- package/Detox-android/com/wix/detox/21.0.0-rc.6/detox-21.0.0-rc.6.aar.md5 +0 -1
- package/Detox-android/com/wix/detox/21.0.0-rc.6/detox-21.0.0-rc.6.aar.sha1 +0 -1
- package/Detox-android/com/wix/detox/21.0.0-rc.6/detox-21.0.0-rc.6.aar.sha256 +0 -1
- package/Detox-android/com/wix/detox/21.0.0-rc.6/detox-21.0.0-rc.6.aar.sha512 +0 -1
- package/Detox-android/com/wix/detox/21.0.0-rc.6/detox-21.0.0-rc.6.pom.md5 +0 -1
- package/Detox-android/com/wix/detox/21.0.0-rc.6/detox-21.0.0-rc.6.pom.sha1 +0 -1
- package/Detox-android/com/wix/detox/21.0.0-rc.6/detox-21.0.0-rc.6.pom.sha256 +0 -1
- package/Detox-android/com/wix/detox/21.0.0-rc.6/detox-21.0.0-rc.6.pom.sha512 +0 -1
- package/runners/jest/reporters/DetoxReporter.js +0 -36
- package/src/devices/DeviceRegistry.js +0 -176
- package/src/devices/allocation/drivers/AllocationDriverBase.js +0 -30
- package/src/devices/allocation/drivers/android/attached/AttachedAndroidLauncher.js +0 -13
- package/src/devices/allocation/drivers/android/emulator/EmulatorAllocationHelper.js +0 -72
- package/src/devices/allocation/drivers/android/genycloud/GenyDeviceRegistryFactory.js +0 -16
- package/src/devices/allocation/drivers/android/genycloud/GenyInstanceAllocationHelper.js +0 -65
- package/src/devices/allocation/drivers/ios/SimulatorLauncher.js +0 -21
- package/src/devices/common/drivers/DeviceAllocationHelper.js +0 -20
- package/src/devices/common/drivers/DeviceLauncher.js +0 -19
- package/src/devices/common/drivers/android/genycloud/services/GenyInstanceLifecycleService.js +0 -25
- package/src/devices/common/drivers/android/genycloud/services/GenyInstanceLookupService.js +0 -38
- package/src/devices/common/drivers/android/genycloud/services/GenyInstanceNaming.js +0 -14
- package/src/devices/common/drivers/android/genycloud/services/dto/GenyInstance.js +0 -66
- package/src/devices/common/drivers/android/genycloud/services/dto/GenyRecipe.js +0 -13
- package/src/devices/cookies/AndroidDeviceCookie.js +0 -13
- package/src/devices/cookies/AndroidEmulatorCookie.js +0 -6
- package/src/devices/cookies/AttachedAndroidDeviceCookie.js +0 -12
- package/src/devices/cookies/DeviceCookie.js +0 -4
- package/src/devices/cookies/GenycloudEmulatorCookie.js +0 -20
- package/src/devices/cookies/IosCookie.js +0 -6
- package/src/devices/cookies/IosSimulatorCookie.js +0 -10
- package/src/devices/lifecycle/GenyGlobalLifecycleHandler.js +0 -71
- package/src/devices/lifecycle/factories/GenyGlobalLifecycleHandlerFactory.js +0 -18
- package/src/servicelocator/android/genycloudServiceLocator.js +0 -21
- package/src/servicelocator/android/index.js +0 -25
- package/src/servicelocator/ios.js +0 -7
- /package/src/devices/{common → allocation}/drivers/android/genycloud/exec/GenyCloudExec.js +0 -0
- /package/src/devices/{common → allocation}/drivers/android/genycloud/services/GenyAuthService.js +0 -0
package/src/utils/environment.js
CHANGED
@@ -19,9 +19,8 @@ function which(executable, path) {
|
|
19
19
|
const DETOX_LIBRARY_ROOT_PATH = path.join(appdatapath.appDataPath(), 'Detox');
|
20
20
|
const MISSING_SDK_ERROR = `$ANDROID_SDK_ROOT is not defined, set the path to the SDK installation directory into $ANDROID_SDK_ROOT,
|
21
21
|
Go to https://developer.android.com/studio/command-line/variables.html for more details`;
|
22
|
-
const
|
23
|
-
const
|
24
|
-
const GENYCLOUD_GLOBAL_CLEANUP_FILE_PATH = path.join(DETOX_LIBRARY_ROOT_PATH, 'genycloud-cleanup.lock');
|
22
|
+
const DETOX_LOCK_FILE_PATH = path.join(DETOX_LIBRARY_ROOT_PATH, 'global-context.json');
|
23
|
+
const DEVICE_REGISTRY_PATH = path.join(DETOX_LIBRARY_ROOT_PATH, 'device.registry.json');
|
25
24
|
const LAST_FAILED_TESTS_PATH = path.join(DETOX_LIBRARY_ROOT_PATH, 'last-failed.txt');
|
26
25
|
|
27
26
|
function getAndroidSDKPath() {
|
@@ -218,17 +217,12 @@ function getDetoxLibraryRootPath() {
|
|
218
217
|
return DETOX_LIBRARY_ROOT_PATH;
|
219
218
|
}
|
220
219
|
|
221
|
-
function
|
222
|
-
return
|
220
|
+
function getDetoxLockFilePath() {
|
221
|
+
return DETOX_LOCK_FILE_PATH;
|
223
222
|
}
|
224
223
|
|
225
|
-
|
226
|
-
|
227
|
-
return DEVICE_LOCK_FILE_PATH_ANDROID;
|
228
|
-
}
|
229
|
-
|
230
|
-
function getGenyCloudGlobalCleanupFilePath() {
|
231
|
-
return GENYCLOUD_GLOBAL_CLEANUP_FILE_PATH;
|
224
|
+
function getDeviceRegistryPath() {
|
225
|
+
return DEVICE_REGISTRY_PATH;
|
232
226
|
}
|
233
227
|
|
234
228
|
function getLastFailedTestsPath() {
|
@@ -253,9 +247,8 @@ module.exports = {
|
|
253
247
|
getAndroidSDKPath,
|
254
248
|
getAndroidEmulatorPath,
|
255
249
|
getDetoxLibraryRootPath,
|
256
|
-
|
257
|
-
|
258
|
-
getGenyCloudGlobalCleanupFilePath,
|
250
|
+
getDetoxLockFilePath,
|
251
|
+
getDeviceRegistryPath,
|
259
252
|
getLastFailedTestsPath,
|
260
253
|
getHomeDir,
|
261
254
|
};
|
package/src/utils/errorUtils.js
CHANGED
@@ -40,15 +40,15 @@ function asError(error) {
|
|
40
40
|
return isError(error) ? error : new Error(error);
|
41
41
|
}
|
42
42
|
|
43
|
-
function serializeObjectWithError(obj, errorKey) {
|
44
|
-
if (obj[errorKey]) {
|
43
|
+
function serializeObjectWithError(obj, errorKey = 'error') {
|
44
|
+
if (obj[errorKey] instanceof Error) {
|
45
45
|
return { ...obj, [errorKey]: serializeError(obj[errorKey]) };
|
46
46
|
}
|
47
47
|
|
48
48
|
return obj;
|
49
49
|
}
|
50
50
|
|
51
|
-
function deserializeObjectWithError(obj, errorKey) {
|
51
|
+
function deserializeObjectWithError(obj, errorKey = 'error') {
|
52
52
|
if (typeof obj[errorKey] === 'object' && !(obj[errorKey] instanceof Error)) {
|
53
53
|
return { ...obj, [errorKey]: deserializeError(obj[errorKey]) };
|
54
54
|
}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
function isArrowFunction(code) {
|
2
|
+
if (!code.includes('=>')) {
|
3
|
+
return false;
|
4
|
+
}
|
5
|
+
|
6
|
+
const syncCode = removeAsync(code.trimStart());
|
7
|
+
return syncCode.startsWith('(') || isSimpleArrowFunction(code);
|
8
|
+
}
|
9
|
+
|
10
|
+
function removeAsync(code) {
|
11
|
+
return code.startsWith('async') ? code.slice(5).trimStart() : code;
|
12
|
+
}
|
13
|
+
|
14
|
+
function isSimpleArrowFunction(code) {
|
15
|
+
const [signature] = code.split('=>', 1);
|
16
|
+
|
17
|
+
return isAlphanumericId(removeAsync(signature.trim()));
|
18
|
+
}
|
19
|
+
|
20
|
+
function isAlphanumericId(code) {
|
21
|
+
return /^[a-zA-Z0-9]+$/.test(code);
|
22
|
+
}
|
23
|
+
|
24
|
+
module.exports = isArrowFunction;
|
package/tsconfig.json
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
{
|
2
2
|
"compilerOptions": {
|
3
3
|
"module": "commonjs",
|
4
|
-
"lib": ["
|
5
|
-
"target": "
|
4
|
+
"lib": ["es2022"],
|
5
|
+
"target": "ES2022",
|
6
6
|
"allowJs": true,
|
7
7
|
"checkJs": true,
|
8
|
-
"moduleResolution": "
|
8
|
+
"moduleResolution": "node16",
|
9
9
|
"resolveJsonModule": true,
|
10
10
|
"esModuleInterop": true,
|
11
11
|
"noEmit": true,
|
@@ -15,11 +15,16 @@
|
|
15
15
|
},
|
16
16
|
"rootDir": ".",
|
17
17
|
"include": [
|
18
|
+
"detox.d.ts",
|
19
|
+
"globals.d.ts",
|
20
|
+
"index.d.ts",
|
18
21
|
"**/*.js",
|
19
22
|
"**/*.ts"
|
20
23
|
],
|
21
24
|
"exclude": [
|
22
25
|
"android",
|
26
|
+
"allure-report",
|
27
|
+
"allure-results",
|
23
28
|
"coverage",
|
24
29
|
"ios",
|
25
30
|
"test"
|
@@ -1 +0,0 @@
|
|
1
|
-
b5dc3fd21bb453975b7a9a671d88fc46
|
@@ -1 +0,0 @@
|
|
1
|
-
87c31479c4c938d2ee09a9893086d469048b7eb9
|
@@ -1 +0,0 @@
|
|
1
|
-
0ff0065b697cf1af31ffede102f23949fd1ffc346aa6ac9776818c4d0f95af7f
|
@@ -1 +0,0 @@
|
|
1
|
-
d083764071e59b65092786bf5ef3241169908186462b6ee929f4a9a3190e73b1191f6f002b8efeb64ebf76193b847437a4bccf9d1a2fdd02af87e223bc6528a5
|
@@ -1 +0,0 @@
|
|
1
|
-
54f14766f943e6aefd34d0097a66e772
|
@@ -1 +0,0 @@
|
|
1
|
-
809a9efa56e6755be2c3a0cb8c689ed3fc6e6140
|
@@ -1 +0,0 @@
|
|
1
|
-
605901d010d65f0713a874265c8a7a16c7b3e62e08095ceccce93281d161f00d
|
@@ -1 +0,0 @@
|
|
1
|
-
16bcdc742eddcfebcda078033190a7e690a29d5c6a6b67a4b475d9cc517de1d8fc83538ed8015b5ebf9282b3ed54705a04dd6288c71eceff3259f8fec1bc927c
|
Binary file
|
@@ -1 +0,0 @@
|
|
1
|
-
e1d6c5353b93ff848864f887b4763050
|
@@ -1 +0,0 @@
|
|
1
|
-
809426e1ab6811b1e6a727fdcd22bbbf20f89b02
|
@@ -1 +0,0 @@
|
|
1
|
-
dadebda11f4a94f751e23277fadbbaef518955f72ba353a5ae5f52ef1ba9acde
|
@@ -1 +0,0 @@
|
|
1
|
-
ba77a84e27f54bc932e73fac36cf2aa3b2a45fc51975088af59632256b214365fb1decbb77c117e5889013b10e4dc110e074100ac439b201e58ffd7333aa370e
|
@@ -1 +0,0 @@
|
|
1
|
-
bde852544728eef8cc1787467f1fea0f
|
@@ -1 +0,0 @@
|
|
1
|
-
f6f0410c57db363f4305349d39c13eb455cd2674
|
@@ -1 +0,0 @@
|
|
1
|
-
fc32e0b10df9b581d50334008310f238eaeb1bef0b04dc27b0b05e2d02868684
|
@@ -1 +0,0 @@
|
|
1
|
-
161ec12df6330a23895bfe241e2790b567ab45166dde07e31d7b31a3e53bcf4791d75922da1f3eaf881be4a33a882b6fe51e535a0f33e726635d92fe8f086edc
|
@@ -1,36 +0,0 @@
|
|
1
|
-
const resolveFrom = require('resolve-from');
|
2
|
-
/** @type {typeof import('@jest/reporters').VerboseReporter} */
|
3
|
-
const JestVerboseReporter = require(resolveFrom(process.cwd(), '@jest/reporters')).VerboseReporter;
|
4
|
-
|
5
|
-
const { config, reportTestResults } = require('../../../internals');
|
6
|
-
|
7
|
-
class DetoxReporter extends JestVerboseReporter {
|
8
|
-
/**
|
9
|
-
* @param {import('@jest/test-result').AggregatedResult} results
|
10
|
-
*/
|
11
|
-
// @ts-ignore
|
12
|
-
async onRunComplete(_contexts, results) {
|
13
|
-
// @ts-ignore
|
14
|
-
await super.onRunComplete(_contexts, results);
|
15
|
-
|
16
|
-
await reportTestResults(results.testResults.map(r => ({
|
17
|
-
success: !r.failureMessage,
|
18
|
-
testFilePath: r.testFilePath,
|
19
|
-
testExecError: r.testExecError,
|
20
|
-
isPermanentFailure: this._isPermanentFailure(r),
|
21
|
-
})));
|
22
|
-
}
|
23
|
-
|
24
|
-
/**
|
25
|
-
* @param {import('@jest/test-result').TestResult} testResult
|
26
|
-
*/
|
27
|
-
_isPermanentFailure(testResult) {
|
28
|
-
if (config.testRunner.jest.retryAfterCircusRetries) {
|
29
|
-
return false;
|
30
|
-
}
|
31
|
-
|
32
|
-
return testResult.testResults.some(r => r.status === 'failed' && r.invocations > 1);
|
33
|
-
}
|
34
|
-
}
|
35
|
-
|
36
|
-
module.exports = DetoxReporter;
|
@@ -1,176 +0,0 @@
|
|
1
|
-
// @ts-nocheck
|
2
|
-
const fs = require('fs-extra');
|
3
|
-
const _ = require('lodash');
|
4
|
-
|
5
|
-
const ExclusiveLockfile = require('../utils/ExclusiveLockfile');
|
6
|
-
const environment = require('../utils/environment');
|
7
|
-
const safeAsync = require('../utils/safeAsync');
|
8
|
-
|
9
|
-
const readOptions = {
|
10
|
-
encoding: 'utf8',
|
11
|
-
};
|
12
|
-
|
13
|
-
const FIELD_NAME_ID = 'id';
|
14
|
-
const FIELD_NAME_DATA = 'data';
|
15
|
-
|
16
|
-
class DevicesList {
|
17
|
-
constructor(devices) {
|
18
|
-
this._devices = Object.freeze(devices);
|
19
|
-
}
|
20
|
-
|
21
|
-
/**
|
22
|
-
* @returns {{id: string, data: *?}[]}
|
23
|
-
*/
|
24
|
-
get rawDevices() {
|
25
|
-
return this._devices;
|
26
|
-
}
|
27
|
-
|
28
|
-
/**
|
29
|
-
* @param {string} deviceId
|
30
|
-
* @returns {boolean}
|
31
|
-
*/
|
32
|
-
includes(deviceId) {
|
33
|
-
return DevicesList._includes(deviceId, this._devices);
|
34
|
-
}
|
35
|
-
|
36
|
-
static _includes(deviceId, devices) {
|
37
|
-
return _.some(devices, [FIELD_NAME_ID, deviceId]);
|
38
|
-
}
|
39
|
-
}
|
40
|
-
|
41
|
-
class DeviceRegistry {
|
42
|
-
constructor({ lockfilePath }) {
|
43
|
-
/***
|
44
|
-
* @private
|
45
|
-
* @type {string}
|
46
|
-
*/
|
47
|
-
this._lockfilePath = lockfilePath;
|
48
|
-
|
49
|
-
/***
|
50
|
-
* @protected
|
51
|
-
* @type {ExclusiveLockfile}
|
52
|
-
*/
|
53
|
-
this._lockfile = new ExclusiveLockfile(lockfilePath, {
|
54
|
-
getInitialState: this._getInitialLockFileState.bind(this),
|
55
|
-
readOptions,
|
56
|
-
});
|
57
|
-
}
|
58
|
-
|
59
|
-
async reset() {
|
60
|
-
await this._lockfile.exclusively(() => {
|
61
|
-
const empty = this._getInitialLockFileState();
|
62
|
-
this._lockfile.write(empty);
|
63
|
-
});
|
64
|
-
}
|
65
|
-
|
66
|
-
/***
|
67
|
-
* @param {string|Function} getDeviceId
|
68
|
-
* @param {*?} data
|
69
|
-
* @returns {Promise<string>}
|
70
|
-
*/
|
71
|
-
async allocateDevice(getDeviceId, data) {
|
72
|
-
return this._lockfile.exclusively(async () => {
|
73
|
-
const deviceId = await safeAsync(getDeviceId);
|
74
|
-
this._registerDevice(deviceId, data);
|
75
|
-
return deviceId;
|
76
|
-
});
|
77
|
-
}
|
78
|
-
|
79
|
-
/***
|
80
|
-
* @param {string|Function} getDeviceId
|
81
|
-
* @returns {Promise<void>}
|
82
|
-
*/
|
83
|
-
async disposeDevice(getDeviceId) {
|
84
|
-
await this._lockfile.exclusively(async () => {
|
85
|
-
const deviceId = await safeAsync(getDeviceId);
|
86
|
-
if (deviceId) {
|
87
|
-
this._unregisterDevice(deviceId);
|
88
|
-
}
|
89
|
-
});
|
90
|
-
}
|
91
|
-
|
92
|
-
/***
|
93
|
-
* @param {string} deviceId
|
94
|
-
* @returns {boolean}
|
95
|
-
*/
|
96
|
-
includes(deviceId) {
|
97
|
-
const devices = this._lockfile.read();
|
98
|
-
return DevicesList._includes(deviceId, devices);
|
99
|
-
}
|
100
|
-
|
101
|
-
/***
|
102
|
-
* @returns {DevicesList}
|
103
|
-
*/
|
104
|
-
getRegisteredDevices() {
|
105
|
-
const devices = this._lockfile.read();
|
106
|
-
return new DevicesList(devices);
|
107
|
-
}
|
108
|
-
|
109
|
-
/***
|
110
|
-
* @returns {DevicesList}
|
111
|
-
*/
|
112
|
-
async readRegisteredDevices() {
|
113
|
-
let result = null;
|
114
|
-
await this._lockfile.exclusively(() => {
|
115
|
-
result = this.getRegisteredDevices();
|
116
|
-
});
|
117
|
-
return result;
|
118
|
-
}
|
119
|
-
|
120
|
-
/***
|
121
|
-
* @returns {DevicesList}
|
122
|
-
*/
|
123
|
-
readRegisteredDevicesUNSAFE() {
|
124
|
-
const contents = fs.readFileSync(this._lockfilePath, readOptions);
|
125
|
-
const devices = JSON.parse(contents);
|
126
|
-
return new DevicesList(devices);
|
127
|
-
}
|
128
|
-
|
129
|
-
/***
|
130
|
-
* @private
|
131
|
-
*/
|
132
|
-
_getInitialLockFileState() {
|
133
|
-
return [];
|
134
|
-
}
|
135
|
-
|
136
|
-
/**
|
137
|
-
* @private
|
138
|
-
*/
|
139
|
-
_registerDevice(deviceId, data) {
|
140
|
-
const state = this._lockfile.read();
|
141
|
-
let newState = _.reject(state, [FIELD_NAME_ID, deviceId]);
|
142
|
-
|
143
|
-
const device = {};
|
144
|
-
device[FIELD_NAME_ID] = deviceId;
|
145
|
-
|
146
|
-
if (data) {
|
147
|
-
device[FIELD_NAME_DATA] = data;
|
148
|
-
}
|
149
|
-
|
150
|
-
newState = _.concat(newState, device);
|
151
|
-
this._lockfile.write(newState);
|
152
|
-
}
|
153
|
-
|
154
|
-
/**
|
155
|
-
* @private
|
156
|
-
*/
|
157
|
-
_unregisterDevice(deviceId) {
|
158
|
-
const state = this._lockfile.read();
|
159
|
-
const newState = _.reject(state, [FIELD_NAME_ID, deviceId]);
|
160
|
-
this._lockfile.write(newState);
|
161
|
-
}
|
162
|
-
|
163
|
-
static forIOS() {
|
164
|
-
return new DeviceRegistry({
|
165
|
-
lockfilePath: environment.getDeviceLockFilePathIOS(),
|
166
|
-
});
|
167
|
-
}
|
168
|
-
|
169
|
-
static forAndroid() {
|
170
|
-
return new DeviceRegistry({
|
171
|
-
lockfilePath: environment.getDeviceLockFilePathAndroid(),
|
172
|
-
});
|
173
|
-
}
|
174
|
-
}
|
175
|
-
|
176
|
-
module.exports = DeviceRegistry;
|
@@ -1,30 +0,0 @@
|
|
1
|
-
/* eslint @typescript-eslint/no-unused-vars: ["error", { "args": "none" }] */
|
2
|
-
// @ts-nocheck
|
3
|
-
|
4
|
-
/**
|
5
|
-
* @typedef DeallocOptions
|
6
|
-
* @property shutdown { Boolean }
|
7
|
-
*/
|
8
|
-
|
9
|
-
class AllocationDriverBase {
|
10
|
-
/**
|
11
|
-
* @param deviceConfig { Object }
|
12
|
-
* @return {Promise<DeviceCookie>}
|
13
|
-
*/
|
14
|
-
async allocate(deviceConfig) {}
|
15
|
-
|
16
|
-
/**
|
17
|
-
* @param {DeviceCookie} deviceCookie
|
18
|
-
* @return {Promise<void>}
|
19
|
-
*/
|
20
|
-
async postAllocate(deviceCookie) {}
|
21
|
-
|
22
|
-
/**
|
23
|
-
* @param cookie { DeviceCookie }
|
24
|
-
* @param options { DeallocOptions }
|
25
|
-
* @return {Promise<void>}
|
26
|
-
*/
|
27
|
-
async free(cookie, options) {}
|
28
|
-
}
|
29
|
-
|
30
|
-
module.exports = AllocationDriverBase;
|
@@ -1,13 +0,0 @@
|
|
1
|
-
const DeviceLauncher = require('../../../../common/drivers/DeviceLauncher');
|
2
|
-
|
3
|
-
class AttachedAndroidLauncher extends DeviceLauncher {
|
4
|
-
constructor(eventEmitter) {
|
5
|
-
super(eventEmitter);
|
6
|
-
}
|
7
|
-
|
8
|
-
notifyLaunchCompleted(adbName) {
|
9
|
-
return super._notifyBootEvent(adbName, 'device', false);
|
10
|
-
}
|
11
|
-
}
|
12
|
-
|
13
|
-
module.exports = AttachedAndroidLauncher;
|
@@ -1,72 +0,0 @@
|
|
1
|
-
const logger = require('../../../../../utils/logger').child({ cat: 'device' });
|
2
|
-
const DeviceAllocationHelper = require('../../../../common/drivers/DeviceAllocationHelper');
|
3
|
-
|
4
|
-
const DetoxEmulatorsPortRange = {
|
5
|
-
min: 10000,
|
6
|
-
max: 20000
|
7
|
-
};
|
8
|
-
|
9
|
-
class AllocationResult {
|
10
|
-
constructor(adbName, placeholderPort) {
|
11
|
-
this.adbName = adbName;
|
12
|
-
this.placeholderPort = placeholderPort;
|
13
|
-
}
|
14
|
-
|
15
|
-
get isRunning() {
|
16
|
-
return !this.placeholderPort;
|
17
|
-
}
|
18
|
-
}
|
19
|
-
|
20
|
-
class EmulatorAllocationHelper extends DeviceAllocationHelper {
|
21
|
-
constructor(deviceRegistry, freeDeviceFinder, rand = Math.random) {
|
22
|
-
super(deviceRegistry, logger);
|
23
|
-
this._freeDeviceFinder = freeDeviceFinder;
|
24
|
-
this._rand = rand;
|
25
|
-
}
|
26
|
-
|
27
|
-
/**
|
28
|
-
* @param avdName
|
29
|
-
* @returns {Promise<AllocationResult>}
|
30
|
-
*/
|
31
|
-
async allocateDevice(avdName) {
|
32
|
-
this._logAllocationAttempt(avdName);
|
33
|
-
|
34
|
-
const result = await this._doSynchronizedAllocation(avdName);
|
35
|
-
this._logAllocationResult(avdName, result.adbName);
|
36
|
-
|
37
|
-
return result;
|
38
|
-
}
|
39
|
-
|
40
|
-
async deallocateDevice(adbName) {
|
41
|
-
await this._deviceRegistry.disposeDevice(adbName);
|
42
|
-
}
|
43
|
-
|
44
|
-
/**
|
45
|
-
* @returns {Promise<AllocationResult>}
|
46
|
-
* @private
|
47
|
-
*/
|
48
|
-
async _doSynchronizedAllocation(avdName) {
|
49
|
-
let placeholderPort = null;
|
50
|
-
let adbName = null;
|
51
|
-
|
52
|
-
await this._deviceRegistry.allocateDevice(async () => {
|
53
|
-
adbName = await this._freeDeviceFinder.findFreeDevice(avdName);
|
54
|
-
if (!adbName) {
|
55
|
-
placeholderPort = this._allocateEmulatorPlaceholderPort();
|
56
|
-
adbName = `emulator-${placeholderPort}`;
|
57
|
-
}
|
58
|
-
return adbName;
|
59
|
-
});
|
60
|
-
|
61
|
-
return new AllocationResult(adbName, placeholderPort);
|
62
|
-
}
|
63
|
-
|
64
|
-
_allocateEmulatorPlaceholderPort() {
|
65
|
-
const { min, max } = DetoxEmulatorsPortRange;
|
66
|
-
let port = this._rand() * (max - min) + min;
|
67
|
-
port = port & 0xFFFFFFFE; // Should always be even
|
68
|
-
return port;
|
69
|
-
}
|
70
|
-
}
|
71
|
-
|
72
|
-
module.exports = EmulatorAllocationHelper;
|
@@ -1,16 +0,0 @@
|
|
1
|
-
const environment = require('../../../../../utils/environment');
|
2
|
-
const DeviceRegistry = require('../../../../DeviceRegistry');
|
3
|
-
|
4
|
-
class GenyDeviceRegistryFactory {
|
5
|
-
forRuntime() {
|
6
|
-
return DeviceRegistry.forAndroid();
|
7
|
-
}
|
8
|
-
|
9
|
-
forGlobalShutdown() {
|
10
|
-
return new DeviceRegistry({
|
11
|
-
lockfilePath: environment.getGenyCloudGlobalCleanupFilePath(),
|
12
|
-
});
|
13
|
-
}
|
14
|
-
}
|
15
|
-
|
16
|
-
module.exports = new GenyDeviceRegistryFactory();
|
@@ -1,65 +0,0 @@
|
|
1
|
-
// @ts-nocheck
|
2
|
-
const logger = require('../../../../../utils/logger').child({ cat: 'device' });
|
3
|
-
const DeviceAllocationHelper = require('../../../../common/drivers/DeviceAllocationHelper');
|
4
|
-
|
5
|
-
const { ALLOCATE_DEVICE_LOG_EVT } = DeviceAllocationHelper;
|
6
|
-
|
7
|
-
class AllocationResult {
|
8
|
-
constructor(instance, isNew) {
|
9
|
-
this.instance = instance;
|
10
|
-
this.isNew = isNew;
|
11
|
-
}
|
12
|
-
}
|
13
|
-
|
14
|
-
class GenyInstanceAllocationHelper extends DeviceAllocationHelper {
|
15
|
-
constructor({ deviceRegistry, instanceLookupService, instanceLifecycleService }) {
|
16
|
-
super(deviceRegistry, logger);
|
17
|
-
|
18
|
-
this._instanceLookupService = instanceLookupService;
|
19
|
-
this._instanceLifecycleService = instanceLifecycleService;
|
20
|
-
}
|
21
|
-
|
22
|
-
/**
|
23
|
-
* @param recipe { GenyRecipe }
|
24
|
-
* @return { Promise<AllocationResult> }
|
25
|
-
*/
|
26
|
-
async allocateDevice(recipe) {
|
27
|
-
this._logAllocationAttempt(recipe);
|
28
|
-
|
29
|
-
const allocationResult = await this._doSynchronizedAllocation(recipe);
|
30
|
-
this._logAllocationResult(recipe, allocationResult.instance);
|
31
|
-
|
32
|
-
return allocationResult;
|
33
|
-
}
|
34
|
-
|
35
|
-
async deallocateDevice(instanceUUID) {
|
36
|
-
await this._deviceRegistry.disposeDevice(instanceUUID);
|
37
|
-
}
|
38
|
-
|
39
|
-
/**
|
40
|
-
* @param recipe { GenyRecipe }
|
41
|
-
* @return {Promise<{AllocationResult}>}
|
42
|
-
* @private
|
43
|
-
*/
|
44
|
-
async _doSynchronizedAllocation(recipe) {
|
45
|
-
let instance = null;
|
46
|
-
let isNew = false;
|
47
|
-
|
48
|
-
await this._deviceRegistry.allocateDevice(async () => {
|
49
|
-
instance = await this._instanceLookupService.findFreeInstance();
|
50
|
-
if (!instance) {
|
51
|
-
instance = await this._instanceLifecycleService.createInstance(recipe.uuid);
|
52
|
-
isNew = true;
|
53
|
-
}
|
54
|
-
return instance.uuid;
|
55
|
-
});
|
56
|
-
|
57
|
-
return new AllocationResult(instance, isNew);
|
58
|
-
}
|
59
|
-
|
60
|
-
_logAllocationResult(deviceQuery, deviceHandle) {
|
61
|
-
logger.info({ event: ALLOCATE_DEVICE_LOG_EVT }, `Allocating Genymotion-Cloud instance ${deviceHandle.name} for testing. To access it via a browser, go to: https://cloud.geny.io/instance/${deviceHandle.uuid}`);
|
62
|
-
}
|
63
|
-
}
|
64
|
-
|
65
|
-
module.exports = GenyInstanceAllocationHelper;
|
@@ -1,21 +0,0 @@
|
|
1
|
-
const DeviceLauncher = require('../../../common/drivers/DeviceLauncher');
|
2
|
-
|
3
|
-
class SimulatorLauncher extends DeviceLauncher {
|
4
|
-
constructor({ applesimutils, eventEmitter }) {
|
5
|
-
super(eventEmitter);
|
6
|
-
this._applesimutils = applesimutils;
|
7
|
-
}
|
8
|
-
|
9
|
-
async launch(udid, type, bootArgs, headless) {
|
10
|
-
const coldBoot = await this._applesimutils.boot(udid, bootArgs, headless);
|
11
|
-
await this._notifyBootEvent(udid, type, coldBoot, headless);
|
12
|
-
}
|
13
|
-
|
14
|
-
async shutdown(udid) {
|
15
|
-
await this._notifyPreShutdown(udid);
|
16
|
-
await this._applesimutils.shutdown(udid);
|
17
|
-
await this._notifyShutdownCompleted(udid);
|
18
|
-
}
|
19
|
-
}
|
20
|
-
|
21
|
-
module.exports = SimulatorLauncher;
|
@@ -1,20 +0,0 @@
|
|
1
|
-
const ALLOCATE_DEVICE_LOG_EVT = 'ALLOCATE_DEVICE';
|
2
|
-
|
3
|
-
class DeviceAllocationHelper {
|
4
|
-
constructor(deviceRegistry, logger) {
|
5
|
-
this._deviceRegistry = deviceRegistry;
|
6
|
-
this._logger = logger;
|
7
|
-
}
|
8
|
-
|
9
|
-
_logAllocationAttempt(deviceQuery) {
|
10
|
-
this._logger.debug({ event: ALLOCATE_DEVICE_LOG_EVT }, `Trying to allocate a device based on "${deviceQuery}"`);
|
11
|
-
}
|
12
|
-
|
13
|
-
_logAllocationResult(deviceQuery, deviceHandle) {
|
14
|
-
this._logger.debug({ event: ALLOCATE_DEVICE_LOG_EVT }, `Settled on ${deviceHandle}`);
|
15
|
-
}
|
16
|
-
}
|
17
|
-
|
18
|
-
DeviceAllocationHelper.ALLOCATE_DEVICE_LOG_EVT = ALLOCATE_DEVICE_LOG_EVT;
|
19
|
-
|
20
|
-
module.exports = DeviceAllocationHelper;
|
@@ -1,19 +0,0 @@
|
|
1
|
-
class DeviceLauncher {
|
2
|
-
constructor(eventEmitter) {
|
3
|
-
this._eventEmitter = eventEmitter;
|
4
|
-
}
|
5
|
-
|
6
|
-
async _notifyPreShutdown(deviceId) {
|
7
|
-
return this._eventEmitter.emit('beforeShutdownDevice', { deviceId });
|
8
|
-
}
|
9
|
-
|
10
|
-
async _notifyShutdownCompleted(deviceId) {
|
11
|
-
return this._eventEmitter.emit('shutdownDevice', { deviceId });
|
12
|
-
}
|
13
|
-
|
14
|
-
async _notifyBootEvent(deviceId, type, coldBoot, headless) {
|
15
|
-
return this._eventEmitter.emit('bootDevice', { deviceId, type, coldBoot, headless });
|
16
|
-
}
|
17
|
-
}
|
18
|
-
|
19
|
-
module.exports = DeviceLauncher;
|