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.
Files changed (183) hide show
  1. package/.eslintignore +1 -0
  2. 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
  3. package/Detox-android/com/wix/detox/21.0.0-rc.7/detox-21.0.0-rc.7-javadoc.jar.md5 +1 -0
  4. package/Detox-android/com/wix/detox/21.0.0-rc.7/detox-21.0.0-rc.7-javadoc.jar.sha1 +1 -0
  5. package/Detox-android/com/wix/detox/21.0.0-rc.7/detox-21.0.0-rc.7-javadoc.jar.sha256 +1 -0
  6. package/Detox-android/com/wix/detox/21.0.0-rc.7/detox-21.0.0-rc.7-javadoc.jar.sha512 +1 -0
  7. 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
  8. package/Detox-android/com/wix/detox/21.0.0-rc.7/detox-21.0.0-rc.7-sources.jar.md5 +1 -0
  9. package/Detox-android/com/wix/detox/21.0.0-rc.7/detox-21.0.0-rc.7-sources.jar.sha1 +1 -0
  10. package/Detox-android/com/wix/detox/21.0.0-rc.7/detox-21.0.0-rc.7-sources.jar.sha256 +1 -0
  11. package/Detox-android/com/wix/detox/21.0.0-rc.7/detox-21.0.0-rc.7-sources.jar.sha512 +1 -0
  12. package/Detox-android/com/wix/detox/21.0.0-rc.7/detox-21.0.0-rc.7.aar +0 -0
  13. package/Detox-android/com/wix/detox/21.0.0-rc.7/detox-21.0.0-rc.7.aar.md5 +1 -0
  14. package/Detox-android/com/wix/detox/21.0.0-rc.7/detox-21.0.0-rc.7.aar.sha1 +1 -0
  15. package/Detox-android/com/wix/detox/21.0.0-rc.7/detox-21.0.0-rc.7.aar.sha256 +1 -0
  16. package/Detox-android/com/wix/detox/21.0.0-rc.7/detox-21.0.0-rc.7.aar.sha512 +1 -0
  17. 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
  18. package/Detox-android/com/wix/detox/21.0.0-rc.7/detox-21.0.0-rc.7.pom.md5 +1 -0
  19. package/Detox-android/com/wix/detox/21.0.0-rc.7/detox-21.0.0-rc.7.pom.sha1 +1 -0
  20. package/Detox-android/com/wix/detox/21.0.0-rc.7/detox-21.0.0-rc.7.pom.sha256 +1 -0
  21. package/Detox-android/com/wix/detox/21.0.0-rc.7/detox-21.0.0-rc.7.pom.sha512 +1 -0
  22. package/Detox-android/com/wix/detox/maven-metadata.xml +4 -4
  23. package/Detox-android/com/wix/detox/maven-metadata.xml.md5 +1 -1
  24. package/Detox-android/com/wix/detox/maven-metadata.xml.sha1 +1 -1
  25. package/Detox-android/com/wix/detox/maven-metadata.xml.sha256 +1 -1
  26. package/Detox-android/com/wix/detox/maven-metadata.xml.sha512 +1 -1
  27. package/Detox-ios-framework.tbz +0 -0
  28. package/Detox-ios-src.tbz +0 -0
  29. package/Detox-ios-xcuitest.tbz +0 -0
  30. package/android/detox/build.gradle +13 -8
  31. package/android/detox/src/full/java/com/wix/detox/espresso/DetoxAssertion.java +44 -25
  32. package/android/detox/src/full/java/com/wix/detox/espresso/EspressoDetox.java +6 -7
  33. package/android/detox/src/full/java/com/wix/detox/espresso/action/AdjustSliderToPositionAction.kt +2 -2
  34. package/android/detox/src/full/java/com/wix/detox/espresso/action/GetAttributesAction.kt +34 -35
  35. package/android/detox/src/full/java/com/wix/detox/espresso/common/MaterialSliderHelper.kt +21 -0
  36. package/android/detox/src/full/java/com/wix/detox/espresso/common/{SliderHelper.kt → ReactSliderHelper.kt} +6 -5
  37. package/android/detox/src/full/java/com/wix/detox/espresso/matcher/ViewMatchers.kt +2 -2
  38. package/android/detox/src/full/java/com/wix/detox/espresso/performer/MultipleViewsActionPerformer.kt +43 -0
  39. package/android/detox/src/full/java/com/wix/detox/espresso/performer/SingleViewActionPerformer.kt +19 -0
  40. package/android/detox/src/full/java/com/wix/detox/espresso/performer/ViewActionPerformer.kt +24 -0
  41. package/android/detox/src/full/java/com/wix/detox/espresso/web/WebElement.java +4 -4
  42. package/android/detox/src/full/java/com/wix/invoke/types/Invocation.java +7 -6
  43. package/android/detox/src/main/java/com/wix/detox/espresso/MultipleViewsAction.kt +4 -0
  44. package/android/detox/src/main/java/com/wix/detox/espresso/UiControllerSpy.kt +0 -1
  45. package/android/detox/src/main/java/com/wix/detox/espresso/ViewActionWithResult.kt +2 -1
  46. package/android/detox/src/main/java/com/wix/detox/espresso/action/common/MotionEvents.kt +60 -4
  47. package/android/detox/src/testFull/java/com/wix/detox/espresso/action/GetAttributesActionTest.kt +6 -5
  48. package/android/detox/src/testFull/java/com/wix/detox/espresso/common/MaterialSliderHelperTest.kt +33 -0
  49. package/android/detox/src/testFull/java/com/wix/detox/espresso/common/{SliderHelperTest.kt → ReactSliderHelperTest.kt} +3 -3
  50. package/android/detox/src/testFull/java/com/wix/detox/espresso/performer/ViewActionPerformerSpec.kt +37 -0
  51. package/android/detox/src/testFull/java/com/wix/invoke/JsonParserTest.java +23 -7
  52. package/android/detox/src/testFull/resources/targetInvocationEspressoWebDetoxScript.json +47 -0
  53. package/detox.d.ts +1830 -0
  54. package/globals.d.ts +23 -0
  55. package/index.d.ts +2 -1823
  56. package/internals.d.ts +11 -1
  57. package/jest.config.js +108 -0
  58. package/local-cli/reset-lock-file.js +5 -9
  59. package/local-cli/testCommand/TestRunnerCommand.js +26 -3
  60. package/local-cli/utils/interruptListeners.js +15 -0
  61. package/package.json +2 -100
  62. package/runners/jest/reporter.js +21 -1
  63. package/runners/jest/reporters/DetoxIPCReporter.js +34 -0
  64. package/runners/jest/reporters/DetoxReporterDispatcher.js +144 -0
  65. package/runners/jest/reporters/DetoxSummaryReporter.js +16 -0
  66. package/runners/jest/reporters/DetoxVerboseReporter.js +16 -0
  67. package/runners/jest/reporters/index.js +6 -0
  68. package/runners/jest/testEnvironment/index.js +11 -0
  69. package/src/DetoxWorker.js +5 -11
  70. package/src/android/core/NativeElement.js +26 -29
  71. package/src/android/core/WebElement.js +24 -6
  72. package/src/android/espressoapi/DetoxAssertion.js +16 -14
  73. package/src/android/espressoapi/EspressoDetox.js +9 -2
  74. package/src/android/espressoapi/web/WebElement.js +1 -4
  75. package/src/android/interactions/native.js +2 -3
  76. package/src/artifacts/providers/index.js +3 -3
  77. package/src/artifacts/screenshot/SimulatorScreenshotPlugin.js +0 -17
  78. package/src/configuration/composeLoggerConfig.js +1 -0
  79. package/src/configuration/composeRunnerConfig.js +3 -1
  80. package/src/devices/allocation/DeviceAllocator.js +66 -20
  81. package/src/devices/allocation/DeviceList.js +44 -0
  82. package/src/devices/allocation/DeviceRegistry.js +189 -0
  83. package/src/devices/allocation/drivers/AllocationDriverBase.d.ts +15 -0
  84. package/src/devices/{common/drivers/android/tools → allocation/drivers/android}/FreeDeviceFinder.js +11 -10
  85. package/src/devices/allocation/drivers/android/attached/AttachedAndroidAllocDriver.js +22 -17
  86. package/src/devices/allocation/drivers/android/emulator/EmulatorAllocDriver.js +97 -38
  87. package/src/devices/allocation/drivers/android/emulator/EmulatorLauncher.js +32 -45
  88. package/src/devices/allocation/drivers/android/emulator/FreeEmulatorFinder.js +1 -1
  89. package/src/devices/allocation/drivers/android/emulator/FreePortFinder.js +37 -0
  90. package/src/devices/allocation/drivers/android/emulator/launchEmulatorProcess.js +3 -3
  91. package/src/devices/allocation/drivers/android/genycloud/GenyAllocDriver.js +104 -32
  92. package/src/devices/allocation/drivers/android/genycloud/GenyInstanceLauncher.js +40 -31
  93. package/src/devices/allocation/drivers/android/genycloud/GenyRegistry.js +121 -0
  94. package/src/devices/allocation/drivers/android/genycloud/services/GenyInstanceLifecycleService.js +24 -0
  95. package/src/devices/{common → allocation}/drivers/android/genycloud/services/GenyRecipesService.js +1 -1
  96. package/src/devices/allocation/drivers/android/genycloud/services/dto/GenyInstance.js +83 -0
  97. package/src/devices/allocation/drivers/android/genycloud/services/dto/GenyRecipe.js +25 -0
  98. package/src/devices/allocation/drivers/ios/SimulatorAllocDriver.js +95 -54
  99. package/src/devices/allocation/drivers/ios/SimulatorQuery.js +24 -0
  100. package/src/devices/allocation/factories/android.js +29 -35
  101. package/src/devices/allocation/factories/ios.js +6 -7
  102. package/src/devices/common/drivers/DeviceCookie.d.ts +12 -0
  103. package/src/devices/common/drivers/android/cookies.d.ts +11 -0
  104. package/src/devices/common/drivers/android/emulator/exec/EmulatorExec.js +17 -5
  105. package/src/devices/common/drivers/android/exec/ADB.js +1 -0
  106. package/src/devices/common/drivers/android/tools/instrumentationArgs.js +7 -1
  107. package/src/devices/common/drivers/ios/cookies.d.ts +9 -0
  108. package/src/devices/common/drivers/ios/tools/AppleSimUtils.js +3 -1
  109. package/src/devices/cookies/index.js +0 -6
  110. package/src/devices/runtime/drivers/android/genycloud/GenyCloudDriver.js +7 -6
  111. package/src/devices/runtime/drivers/ios/SimulatorDriver.js +5 -4
  112. package/src/devices/runtime/factories/android.js +3 -11
  113. package/src/devices/runtime/factories/ios.js +3 -4
  114. package/src/{servicelocator → devices/servicelocator}/android/emulatorServiceLocator.js +1 -1
  115. package/src/devices/servicelocator/android/genycloudServiceLocator.js +17 -0
  116. package/src/devices/servicelocator/android/index.js +23 -0
  117. package/src/{validation → devices/validation}/EnvironmentValidatorBase.js +1 -0
  118. package/src/{validation → devices/validation}/android/GenycloudEnvValidator.js +2 -2
  119. package/src/{validation → devices/validation}/factories/index.js +1 -1
  120. package/src/{validation → devices/validation}/ios/IosSimulatorEnvValidator.js +2 -2
  121. package/src/environmentFactory.js +1 -11
  122. package/src/ios/web.js +21 -5
  123. package/src/ipc/IPCClient.js +22 -1
  124. package/src/ipc/IPCServer.js +42 -1
  125. package/src/ipc/SessionState.js +1 -0
  126. package/src/logger/DetoxLogger.js +2 -2
  127. package/src/realms/DetoxContext.js +8 -0
  128. package/src/realms/DetoxInternalsFacade.js +1 -0
  129. package/src/realms/DetoxPrimaryContext.js +48 -42
  130. package/src/realms/DetoxSecondaryContext.js +27 -0
  131. package/src/realms/symbols.js +6 -0
  132. package/src/utils/PIDService.js +27 -0
  133. package/src/utils/assertIsFunction.js +35 -0
  134. package/src/utils/environment.js +8 -15
  135. package/src/utils/errorUtils.js +3 -3
  136. package/src/utils/isArrowFunction.js +24 -0
  137. package/tsconfig.json +8 -3
  138. package/Detox-android/com/wix/detox/21.0.0-rc.6/detox-21.0.0-rc.6-javadoc.jar.md5 +0 -1
  139. package/Detox-android/com/wix/detox/21.0.0-rc.6/detox-21.0.0-rc.6-javadoc.jar.sha1 +0 -1
  140. package/Detox-android/com/wix/detox/21.0.0-rc.6/detox-21.0.0-rc.6-javadoc.jar.sha256 +0 -1
  141. package/Detox-android/com/wix/detox/21.0.0-rc.6/detox-21.0.0-rc.6-javadoc.jar.sha512 +0 -1
  142. package/Detox-android/com/wix/detox/21.0.0-rc.6/detox-21.0.0-rc.6-sources.jar.md5 +0 -1
  143. package/Detox-android/com/wix/detox/21.0.0-rc.6/detox-21.0.0-rc.6-sources.jar.sha1 +0 -1
  144. package/Detox-android/com/wix/detox/21.0.0-rc.6/detox-21.0.0-rc.6-sources.jar.sha256 +0 -1
  145. package/Detox-android/com/wix/detox/21.0.0-rc.6/detox-21.0.0-rc.6-sources.jar.sha512 +0 -1
  146. package/Detox-android/com/wix/detox/21.0.0-rc.6/detox-21.0.0-rc.6.aar +0 -0
  147. package/Detox-android/com/wix/detox/21.0.0-rc.6/detox-21.0.0-rc.6.aar.md5 +0 -1
  148. package/Detox-android/com/wix/detox/21.0.0-rc.6/detox-21.0.0-rc.6.aar.sha1 +0 -1
  149. package/Detox-android/com/wix/detox/21.0.0-rc.6/detox-21.0.0-rc.6.aar.sha256 +0 -1
  150. package/Detox-android/com/wix/detox/21.0.0-rc.6/detox-21.0.0-rc.6.aar.sha512 +0 -1
  151. package/Detox-android/com/wix/detox/21.0.0-rc.6/detox-21.0.0-rc.6.pom.md5 +0 -1
  152. package/Detox-android/com/wix/detox/21.0.0-rc.6/detox-21.0.0-rc.6.pom.sha1 +0 -1
  153. package/Detox-android/com/wix/detox/21.0.0-rc.6/detox-21.0.0-rc.6.pom.sha256 +0 -1
  154. package/Detox-android/com/wix/detox/21.0.0-rc.6/detox-21.0.0-rc.6.pom.sha512 +0 -1
  155. package/runners/jest/reporters/DetoxReporter.js +0 -36
  156. package/src/devices/DeviceRegistry.js +0 -176
  157. package/src/devices/allocation/drivers/AllocationDriverBase.js +0 -30
  158. package/src/devices/allocation/drivers/android/attached/AttachedAndroidLauncher.js +0 -13
  159. package/src/devices/allocation/drivers/android/emulator/EmulatorAllocationHelper.js +0 -72
  160. package/src/devices/allocation/drivers/android/genycloud/GenyDeviceRegistryFactory.js +0 -16
  161. package/src/devices/allocation/drivers/android/genycloud/GenyInstanceAllocationHelper.js +0 -65
  162. package/src/devices/allocation/drivers/ios/SimulatorLauncher.js +0 -21
  163. package/src/devices/common/drivers/DeviceAllocationHelper.js +0 -20
  164. package/src/devices/common/drivers/DeviceLauncher.js +0 -19
  165. package/src/devices/common/drivers/android/genycloud/services/GenyInstanceLifecycleService.js +0 -25
  166. package/src/devices/common/drivers/android/genycloud/services/GenyInstanceLookupService.js +0 -38
  167. package/src/devices/common/drivers/android/genycloud/services/GenyInstanceNaming.js +0 -14
  168. package/src/devices/common/drivers/android/genycloud/services/dto/GenyInstance.js +0 -66
  169. package/src/devices/common/drivers/android/genycloud/services/dto/GenyRecipe.js +0 -13
  170. package/src/devices/cookies/AndroidDeviceCookie.js +0 -13
  171. package/src/devices/cookies/AndroidEmulatorCookie.js +0 -6
  172. package/src/devices/cookies/AttachedAndroidDeviceCookie.js +0 -12
  173. package/src/devices/cookies/DeviceCookie.js +0 -4
  174. package/src/devices/cookies/GenycloudEmulatorCookie.js +0 -20
  175. package/src/devices/cookies/IosCookie.js +0 -6
  176. package/src/devices/cookies/IosSimulatorCookie.js +0 -10
  177. package/src/devices/lifecycle/GenyGlobalLifecycleHandler.js +0 -71
  178. package/src/devices/lifecycle/factories/GenyGlobalLifecycleHandlerFactory.js +0 -18
  179. package/src/servicelocator/android/genycloudServiceLocator.js +0 -21
  180. package/src/servicelocator/android/index.js +0 -25
  181. package/src/servicelocator/ios.js +0 -7
  182. /package/src/devices/{common → allocation}/drivers/android/genycloud/exec/GenyCloudExec.js +0 -0
  183. /package/src/devices/{common → allocation}/drivers/android/genycloud/services/GenyAuthService.js +0 -0
@@ -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 DEVICE_LOCK_FILE_PATH_IOS = path.join(DETOX_LIBRARY_ROOT_PATH, 'device.registry.state.lock');
23
- const DEVICE_LOCK_FILE_PATH_ANDROID = path.join(DETOX_LIBRARY_ROOT_PATH, 'android-device.registry.state.lock');
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 getDeviceLockFilePathIOS() {
222
- return DEVICE_LOCK_FILE_PATH_IOS;
220
+ function getDetoxLockFilePath() {
221
+ return DETOX_LOCK_FILE_PATH;
223
222
  }
224
223
 
225
- // TODO This can probably be merged with IOS' by now
226
- function getDeviceLockFilePathAndroid() {
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
- getDeviceLockFilePathIOS,
257
- getDeviceLockFilePathAndroid,
258
- getGenyCloudGlobalCleanupFilePath,
250
+ getDetoxLockFilePath,
251
+ getDeviceRegistryPath,
259
252
  getLastFailedTestsPath,
260
253
  getHomeDir,
261
254
  };
@@ -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": ["es2018"],
5
- "target": "ES2018",
4
+ "lib": ["es2022"],
5
+ "target": "ES2022",
6
6
  "allowJs": true,
7
7
  "checkJs": true,
8
- "moduleResolution": "node",
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
@@ -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;