detox 21.0.0-breaking.new-global-lifecycle.0 → 21.0.1-rc.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (304) hide show
  1. package/.eslintrc.js +2 -7
  2. package/Detox-android/com/wix/detox/{21.0.0-breaking.new-global-lifecycle.0/detox-21.0.0-breaking.new-global-lifecycle.0-javadoc.jar → 21.0.1-rc.0/detox-21.0.1-rc.0-javadoc.jar} +0 -0
  3. package/Detox-android/com/wix/detox/21.0.1-rc.0/detox-21.0.1-rc.0-javadoc.jar.md5 +1 -0
  4. package/Detox-android/com/wix/detox/21.0.1-rc.0/detox-21.0.1-rc.0-javadoc.jar.sha1 +1 -0
  5. package/Detox-android/com/wix/detox/21.0.1-rc.0/detox-21.0.1-rc.0-javadoc.jar.sha256 +1 -0
  6. package/Detox-android/com/wix/detox/21.0.1-rc.0/detox-21.0.1-rc.0-javadoc.jar.sha512 +1 -0
  7. package/Detox-android/com/wix/detox/{21.0.0-breaking.new-global-lifecycle.0/detox-21.0.0-breaking.new-global-lifecycle.0-sources.jar → 21.0.1-rc.0/detox-21.0.1-rc.0-sources.jar} +0 -0
  8. package/Detox-android/com/wix/detox/21.0.1-rc.0/detox-21.0.1-rc.0-sources.jar.md5 +1 -0
  9. package/Detox-android/com/wix/detox/21.0.1-rc.0/detox-21.0.1-rc.0-sources.jar.sha1 +1 -0
  10. package/Detox-android/com/wix/detox/21.0.1-rc.0/detox-21.0.1-rc.0-sources.jar.sha256 +1 -0
  11. package/Detox-android/com/wix/detox/21.0.1-rc.0/detox-21.0.1-rc.0-sources.jar.sha512 +1 -0
  12. package/Detox-android/com/wix/detox/21.0.1-rc.0/detox-21.0.1-rc.0.aar +0 -0
  13. package/Detox-android/com/wix/detox/21.0.1-rc.0/detox-21.0.1-rc.0.aar.md5 +1 -0
  14. package/Detox-android/com/wix/detox/21.0.1-rc.0/detox-21.0.1-rc.0.aar.sha1 +1 -0
  15. package/Detox-android/com/wix/detox/21.0.1-rc.0/detox-21.0.1-rc.0.aar.sha256 +1 -0
  16. package/Detox-android/com/wix/detox/21.0.1-rc.0/detox-21.0.1-rc.0.aar.sha512 +1 -0
  17. package/Detox-android/com/wix/detox/{21.0.0-breaking.new-global-lifecycle.0/detox-21.0.0-breaking.new-global-lifecycle.0.pom → 21.0.1-rc.0/detox-21.0.1-rc.0.pom} +22 -10
  18. package/Detox-android/com/wix/detox/21.0.1-rc.0/detox-21.0.1-rc.0.pom.md5 +1 -0
  19. package/Detox-android/com/wix/detox/21.0.1-rc.0/detox-21.0.1-rc.0.pom.sha1 +1 -0
  20. package/Detox-android/com/wix/detox/21.0.1-rc.0/detox-21.0.1-rc.0.pom.sha256 +1 -0
  21. package/Detox-android/com/wix/detox/21.0.1-rc.0/detox-21.0.1-rc.0.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/README.md +1 -1
  31. package/android/build.gradle +13 -8
  32. package/android/detox/build.gradle +24 -13
  33. package/android/detox/proguard-rules-app.pro +6 -0
  34. package/android/detox/proguard-rules.pro +3 -0
  35. package/android/detox/publish-pom.gradle +5 -1
  36. package/android/detox/publishing.gradle +35 -33
  37. package/android/detox/src/full/java/com/wix/detox/DetoxCrashHandler.kt +1 -1
  38. package/android/detox/src/full/java/com/wix/detox/LaunchArgs.java +9 -0
  39. package/android/detox/src/full/java/com/wix/detox/TestEngineFacade.kt +4 -4
  40. package/android/detox/src/full/java/com/wix/detox/adapters/server/QueryStatusActionHandler.kt +12 -80
  41. package/android/detox/src/full/java/com/wix/detox/adapters/server/WebSocketClient.java +3 -1
  42. package/android/detox/src/full/java/com/wix/detox/common/UIExtensions.kt +28 -0
  43. package/android/detox/src/full/java/com/wix/detox/espresso/DetoxAction.java +37 -3
  44. package/android/detox/src/full/java/com/wix/detox/espresso/DetoxMatcher.java +11 -1
  45. package/android/detox/src/full/java/com/wix/detox/espresso/UiAutomatorHelper.java +1 -1
  46. package/android/detox/src/full/java/com/wix/detox/espresso/action/AdjustSliderToPositionAction.kt +22 -0
  47. package/android/detox/src/{main → full}/java/com/wix/detox/espresso/action/GetAttributesAction.kt +17 -4
  48. package/android/detox/src/full/java/com/wix/detox/espresso/action/RNDetoxAccessibilityAction.kt +46 -0
  49. package/android/detox/src/full/java/com/wix/detox/espresso/common/SliderHelper.kt +75 -0
  50. package/android/detox/src/full/java/com/wix/detox/espresso/common/UiControllerImplReflected.kt +16 -0
  51. package/android/detox/src/full/java/com/wix/detox/espresso/idlingresources/DescriptiveIdlingResource.kt +8 -0
  52. package/android/detox/src/full/java/com/wix/detox/espresso/matcher/ViewMatchers.kt +24 -28
  53. package/android/detox/src/full/java/com/wix/detox/espresso/matcher/WithAccessibilityLabelMatcher.kt +23 -0
  54. package/android/detox/src/full/java/com/wix/detox/espresso/registry/BusyResourcesInquirer.kt +48 -0
  55. package/android/detox/src/full/java/com/wix/detox/inquiry/DetoxBusyResource.kt +92 -0
  56. package/android/detox/src/full/java/com/wix/detox/inquiry/DetoxBusyResourceDescription.kt +26 -0
  57. package/android/detox/src/full/java/com/wix/detox/reactnative/ReactNativeExtension.kt +15 -2
  58. package/android/detox/src/full/java/com/wix/detox/reactnative/ReactNativeIdlingResources.kt +43 -38
  59. package/android/detox/src/full/java/com/wix/detox/reactnative/ReactNativeLoadingMonitor.kt +54 -8
  60. package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/AnimatedModuleIdlingResource.java +18 -7
  61. package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/AsyncStorageIdlingResource.kt +3 -4
  62. package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/BridgeIdlingResource.java +12 -6
  63. package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/DetoxBaseIdlingResource.java +2 -0
  64. package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/NetworkIdlingResource.java +43 -34
  65. package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/timers/DelegatedIdleInterrogationStrategy.kt +7 -27
  66. package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/timers/IdleInterrogationStrategy.kt +1 -11
  67. package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/timers/TimersIdlingResource.kt +2 -6
  68. package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/uimodule/RN66Workaround.kt +13 -4
  69. package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/uimodule/UIManagerModuleReflected.kt +1 -1
  70. package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/uimodule/UIModuleIdlingResource.kt +4 -6
  71. package/android/detox/src/full/java/com/wix/detox/reactnative/ui/UIExtensions.kt +37 -0
  72. package/android/detox/src/full/java/com/wix/detox/reactnative/utils/RNUtils.kt +6 -0
  73. package/android/detox/src/main/java/com/wix/detox/common/DetoxErrors.java +4 -1
  74. package/android/detox/src/main/java/com/wix/detox/common/TextFileReader.kt +1 -1
  75. package/android/detox/src/main/java/com/wix/detox/espresso/UiControllerSpy.kt +2 -1
  76. package/android/detox/src/main/java/com/wix/detox/espresso/action/common/ReflectUtils.kt +10 -0
  77. package/android/detox/src/main/java/com/wix/detox/espresso/action/common/utils/UiControllerUtils.kt +1 -1
  78. package/android/detox/src/testFull/java/com/wix/detox/UTHelpers.kt +12 -0
  79. package/android/detox/src/testFull/java/com/wix/detox/adapters/server/QueryStatusActionHandlerSpec.kt +35 -94
  80. package/android/detox/src/testFull/java/com/wix/detox/common/UIExtensionsTest.kt +107 -0
  81. package/android/detox/src/testFull/java/com/wix/detox/espresso/action/DetoxMultiTapSpec.kt +4 -3
  82. package/android/detox/src/testFull/java/com/wix/detox/espresso/action/GetAttributesActionTest.kt +22 -9
  83. package/android/detox/src/testFull/java/com/wix/detox/espresso/common/SliderHelperTest.kt +39 -0
  84. package/android/detox/src/testFull/java/com/wix/detox/espresso/matcher/ViewAtIndexMatcherSpec.kt +1 -2
  85. package/android/detox/src/testFull/java/com/wix/detox/espresso/registry/{IRStatusInquirerTest.kt → BusyResourcesInquirerTest.kt} +46 -7
  86. package/android/detox/src/testFull/java/com/wix/detox/{reactnative/idlingresources/IdlingResourceDescriptionSpec.kt → inquiry/DetoxBusyResourceDescriptionSpec.kt} +6 -6
  87. package/android/detox/src/testFull/java/com/wix/detox/inquiry/DetoxBusyResourceSpec.kt +134 -0
  88. package/android/detox/src/testFull/java/com/wix/detox/reactnative/idlingresources/AsyncStorageIdlingResourceSpec.kt +4 -5
  89. package/android/detox/src/testFull/java/com/wix/detox/reactnative/idlingresources/NetworkIdlingResourcesTest.kt +61 -0
  90. package/android/detox/src/testFull/java/com/wix/detox/reactnative/idlingresources/timers/DelegatedIdleInterrogationStrategySpec.kt +3 -11
  91. package/android/detox/src/testFull/java/com/wix/detox/reactnative/idlingresources/timers/TimersIdlingResourceSpec.kt +4 -6
  92. package/android/gradle/wrapper/gradle-wrapper.properties +2 -1
  93. package/android/gradlew +181 -107
  94. package/index.d.ts +239 -83
  95. package/index.js +12 -1
  96. package/internals.d.ts +219 -45
  97. package/internals.js +10 -3
  98. package/local-cli/build-framework-cache.js +1 -1
  99. package/local-cli/build-xcuitest-cache.js +16 -0
  100. package/local-cli/build.js +2 -2
  101. package/local-cli/clean-framework-cache.js +1 -1
  102. package/local-cli/clean-xcuitest-cache.js +19 -0
  103. package/local-cli/cli.js +13 -7
  104. package/local-cli/init.js +61 -21
  105. package/local-cli/rebuild-framework-cache.js +4 -4
  106. package/local-cli/rebuild-xcuitest-cache.js +21 -0
  107. package/local-cli/reset-lock-file.js +16 -0
  108. package/local-cli/run-server.js +12 -1
  109. package/local-cli/start.js +49 -0
  110. package/local-cli/startCommand/AppStartCommand.js +65 -0
  111. package/local-cli/templates/jest.js +13 -10
  112. package/local-cli/test.js +14 -8
  113. package/local-cli/testCommand/TestRunnerCommand.js +126 -77
  114. package/local-cli/testCommand/TestRunnerError.js +13 -0
  115. package/local-cli/testCommand/builder.js +5 -1
  116. package/local-cli/testCommand/middlewares.js +4 -13
  117. package/local-cli/testCommand/warnings.js +0 -3
  118. package/local-cli/utils/cliErrorHandling.js +15 -0
  119. package/local-cli/utils/jestInternals.js +4 -1
  120. package/package.json +46 -26
  121. package/runners/deprecation.js +42 -44
  122. package/runners/jest/globalSetup.js +1 -1
  123. package/runners/jest/globalTeardown.js +1 -1
  124. package/runners/jest/index.d.ts +61 -0
  125. package/runners/jest/index.js +3 -8
  126. package/runners/jest/reporters/DetoxReporter.js +33 -2
  127. package/runners/jest/testEnvironment/index.js +119 -68
  128. package/runners/jest/testEnvironment/listeners/DetoxCoreListener.js +97 -51
  129. package/runners/jest/testEnvironment/listeners/DetoxPlatformFilterListener.js +1 -1
  130. package/runners/jest/testEnvironment/listeners/SpecReporter.js +15 -17
  131. package/runners/jest/testEnvironment/listeners/WorkerAssignReporter.js +3 -7
  132. package/runners/jest/testEnvironment/utils/assertJestCircus27.js +17 -3
  133. package/scripts/build_framework.ios.sh +26 -60
  134. package/scripts/build_local_framework.ios.sh +62 -0
  135. package/scripts/build_local_xcuitest.ios.sh +53 -0
  136. package/scripts/build_xcuitest.ios.sh +23 -0
  137. package/scripts/pack_ios.sh +14 -5
  138. package/scripts/postinstall.js +10 -4
  139. package/src/DetoxWorker.js +112 -64
  140. package/src/android/actions/native.js +16 -0
  141. package/src/android/core/NativeElement.js +72 -20
  142. package/src/android/core/NativeExpect.js +28 -9
  143. package/src/android/core/NativeMatcher.js +31 -10
  144. package/src/android/core/NativeWaitFor.js +8 -0
  145. package/src/android/espressoapi/DetoxAction.js +37 -0
  146. package/src/android/espressoapi/DetoxMatcher.js +24 -0
  147. package/src/android/espressoapi/EspressoDetox.js +1 -1
  148. package/src/android/espressoapi/web/WebElement.js +1 -1
  149. package/src/android/interactions/native.js +25 -18
  150. package/src/android/matchers/index.js +2 -2
  151. package/src/android/matchers/native.js +10 -3
  152. package/src/artifacts/ArtifactsManager.js +14 -47
  153. package/src/artifacts/instruments/ios/SimulatorInstrumentsRecording.js +3 -3
  154. package/src/artifacts/log/android/ADBLogcatRecording.js +11 -28
  155. package/src/artifacts/log/ios/SimulatorLogRecording.js +1 -1
  156. package/src/artifacts/screenshot/SimulatorScreenshotPlugin.js +1 -1
  157. package/src/artifacts/templates/artifact/Artifact.js +1 -1
  158. package/src/artifacts/templates/plugin/ArtifactPlugin.js +2 -2
  159. package/src/artifacts/templates/plugin/TwoSnapshotsPerTestPlugin.js +2 -1
  160. package/src/artifacts/templates/plugin/WholeTestRecorderPlugin.js +3 -2
  161. package/src/artifacts/timeline/TimelineContextTypes.js +7 -0
  162. package/src/artifacts/utils/temporaryPath.js +47 -8
  163. package/src/artifacts/video/SimulatorRecordVideoPlugin.js +1 -1
  164. package/src/client/AsyncWebSocket.js +11 -19
  165. package/src/client/Client.js +35 -3
  166. package/src/client/actions/SyncStatusSchema.json +21 -0
  167. package/src/client/actions/actions.js +38 -0
  168. package/src/client/actions/formatters/SyncStatusFormatter.js +2 -0
  169. package/src/client/actions/formatters/sync-resources/BgThreadFormatter.js +5 -0
  170. package/src/client/actions/formatters/sync-resources/NetworkFormatter.js +1 -1
  171. package/src/configuration/collectCliConfig.js +3 -13
  172. package/src/configuration/composeAppsConfig.js +5 -1
  173. package/src/configuration/composeDeviceConfig.js +1 -1
  174. package/src/configuration/composeLoggerConfig.js +20 -10
  175. package/src/configuration/composeRunnerConfig.js +62 -9
  176. package/src/configuration/index.js +14 -9
  177. package/src/configuration/loadExternalConfig.js +1 -1
  178. package/src/devices/allocation/DeviceAllocator.js +15 -2
  179. package/src/devices/allocation/drivers/AllocationDriverBase.js +10 -2
  180. package/src/devices/allocation/drivers/android/attached/AttachedAndroidAllocDriver.js +10 -1
  181. package/src/devices/allocation/drivers/android/emulator/AVDValidator.js +5 -5
  182. package/src/devices/allocation/drivers/android/emulator/EmulatorAllocDriver.js +28 -29
  183. package/src/devices/allocation/drivers/android/emulator/EmulatorAllocationHelper.js +1 -1
  184. package/src/devices/allocation/drivers/android/emulator/EmulatorLauncher.js +6 -5
  185. package/src/devices/allocation/drivers/android/emulator/EmulatorVersionResolver.js +4 -6
  186. package/src/devices/allocation/drivers/android/emulator/launchEmulatorProcess.js +4 -17
  187. package/src/devices/allocation/drivers/android/genycloud/GenyAllocDriver.js +27 -18
  188. package/src/devices/allocation/drivers/android/genycloud/GenyInstanceAllocationHelper.js +1 -1
  189. package/src/devices/allocation/drivers/ios/SimulatorAllocDriver.js +12 -7
  190. package/src/devices/allocation/factories/base.js +1 -1
  191. package/src/devices/common/drivers/android/exec/ADB.js +9 -0
  192. package/src/devices/common/drivers/android/genycloud/exec/GenyCloudExec.js +1 -1
  193. package/src/devices/common/drivers/android/genycloud/services/GenyInstanceNaming.js +3 -3
  194. package/src/devices/common/drivers/android/genycloud/services/GenyRecipesService.js +1 -1
  195. package/src/devices/common/drivers/android/tools/AppInstallHelper.js +4 -4
  196. package/src/devices/common/drivers/android/tools/EmulatorTelnet.js +1 -1
  197. package/src/devices/common/drivers/android/tools/{FileXfer.js → FileTransfer.js} +2 -2
  198. package/src/devices/common/drivers/android/tools/FreeDeviceFinder.js +1 -1
  199. package/src/devices/common/drivers/android/tools/MonitoredInstrumentation.js +1 -1
  200. package/src/devices/common/drivers/android/tools/TempFileTransfer.js +14 -0
  201. package/src/devices/common/drivers/ios/tools/AppleSimUtils.js +21 -4
  202. package/src/devices/lifecycle/GenyGlobalLifecycleHandler.js +13 -15
  203. package/src/devices/runtime/RuntimeDevice.js +24 -12
  204. package/src/devices/runtime/drivers/DeviceDriverBase.js +2 -1
  205. package/src/devices/runtime/drivers/android/AndroidDriver.js +17 -8
  206. package/src/devices/runtime/drivers/ios/SimulatorDriver.js +42 -2
  207. package/src/devices/runtime/drivers/ios/XCUITestUtils.js +209 -0
  208. package/src/devices/runtime/drivers/ios/allowNetworkPermissionsXCUITest.scpt +14 -0
  209. package/src/devices/runtime/factories/android.js +6 -5
  210. package/src/devices/runtime/factories/base.js +3 -2
  211. package/src/errors/DetoxConfigErrorComposer.js +18 -3
  212. package/src/errors/DetoxError.js +5 -1
  213. package/src/ios/expectTwo.js +199 -78
  214. package/src/ipc/IPCClient.js +36 -27
  215. package/src/ipc/IPCServer.js +40 -21
  216. package/src/ipc/SessionState.js +60 -0
  217. package/src/logger/DetoxLogger.js +287 -154
  218. package/src/logger/index.js +5 -0
  219. package/src/logger/utils/BunyanLogger.js +105 -0
  220. package/src/logger/utils/CategoryThreadDispatcher.js +37 -0
  221. package/src/logger/utils/DetoxLogFinalizer.js +166 -0
  222. package/src/logger/utils/MessageStack.js +35 -0
  223. package/src/logger/utils/ThreadDispatcher.js +61 -0
  224. package/src/logger/{customConsoleLogger.js → utils/customConsoleLogger.js} +23 -6
  225. package/src/logger/utils/getMainCategory.js +5 -0
  226. package/src/logger/utils/sanitizeBunyanContext.js +30 -0
  227. package/src/logger/utils/streams/BunyanTransformer.js +72 -0
  228. package/src/logger/utils/streams/ChromeTraceTransformer.js +132 -0
  229. package/src/logger/utils/streams/DetoxJSONLParser.js +31 -0
  230. package/src/logger/utils/streams/JSONLStringer.js +55 -0
  231. package/src/logger/utils/streams/index.js +7 -0
  232. package/src/logger/utils/streams/transformers.js +39 -0
  233. package/src/logger/utils/tracerLegacy.js +37 -0
  234. package/src/realms/DetoxContext.js +83 -66
  235. package/src/realms/DetoxInternalsFacade.js +9 -13
  236. package/src/realms/DetoxPrimaryContext.js +117 -74
  237. package/src/realms/DetoxSecondaryContext.js +32 -35
  238. package/src/{symbols.js → realms/symbols.js} +16 -22
  239. package/src/server/DetoxConnection.js +18 -23
  240. package/src/server/DetoxServer.js +7 -10
  241. package/src/server/DetoxSession.js +9 -6
  242. package/src/server/DetoxSessionManager.js +2 -1
  243. package/src/server/handlers/AnonymousConnectionHandler.js +1 -0
  244. package/src/server/handlers/RegisteredConnectionHandler.js +1 -2
  245. package/src/servicelocator/android/index.js +2 -2
  246. package/src/utils/ExclusiveLockfile.js +1 -0
  247. package/src/utils/Timer.js +59 -36
  248. package/src/utils/argparse.js +11 -27
  249. package/src/utils/childProcess/exec.js +4 -2
  250. package/src/utils/childProcess/spawn.js +1 -1
  251. package/src/utils/dateUtils.js +5 -0
  252. package/src/utils/environment.js +55 -16
  253. package/src/utils/errorUtils.js +24 -3
  254. package/src/utils/invocationTraceDescriptions.js +44 -0
  255. package/src/utils/isPromise.js +8 -1
  256. package/src/utils/logger.js +2 -2
  257. package/src/utils/pathUtils.js +11 -0
  258. package/src/utils/shellUtils.js +17 -0
  259. package/src/utils/traceInvocationCall.js +21 -0
  260. package/src/utils/traceMethods.js +15 -0
  261. package/src/validation/ios/IosSimulatorEnvValidator.js +7 -4
  262. package/Detox-android/com/wix/detox/21.0.0-breaking.new-global-lifecycle.0/detox-21.0.0-breaking.new-global-lifecycle.0-javadoc.jar.md5 +0 -1
  263. package/Detox-android/com/wix/detox/21.0.0-breaking.new-global-lifecycle.0/detox-21.0.0-breaking.new-global-lifecycle.0-javadoc.jar.sha1 +0 -1
  264. package/Detox-android/com/wix/detox/21.0.0-breaking.new-global-lifecycle.0/detox-21.0.0-breaking.new-global-lifecycle.0-javadoc.jar.sha256 +0 -1
  265. package/Detox-android/com/wix/detox/21.0.0-breaking.new-global-lifecycle.0/detox-21.0.0-breaking.new-global-lifecycle.0-javadoc.jar.sha512 +0 -1
  266. package/Detox-android/com/wix/detox/21.0.0-breaking.new-global-lifecycle.0/detox-21.0.0-breaking.new-global-lifecycle.0-sources.jar.md5 +0 -1
  267. package/Detox-android/com/wix/detox/21.0.0-breaking.new-global-lifecycle.0/detox-21.0.0-breaking.new-global-lifecycle.0-sources.jar.sha1 +0 -1
  268. package/Detox-android/com/wix/detox/21.0.0-breaking.new-global-lifecycle.0/detox-21.0.0-breaking.new-global-lifecycle.0-sources.jar.sha256 +0 -1
  269. package/Detox-android/com/wix/detox/21.0.0-breaking.new-global-lifecycle.0/detox-21.0.0-breaking.new-global-lifecycle.0-sources.jar.sha512 +0 -1
  270. package/Detox-android/com/wix/detox/21.0.0-breaking.new-global-lifecycle.0/detox-21.0.0-breaking.new-global-lifecycle.0.aar +0 -0
  271. package/Detox-android/com/wix/detox/21.0.0-breaking.new-global-lifecycle.0/detox-21.0.0-breaking.new-global-lifecycle.0.aar.md5 +0 -1
  272. package/Detox-android/com/wix/detox/21.0.0-breaking.new-global-lifecycle.0/detox-21.0.0-breaking.new-global-lifecycle.0.aar.sha1 +0 -1
  273. package/Detox-android/com/wix/detox/21.0.0-breaking.new-global-lifecycle.0/detox-21.0.0-breaking.new-global-lifecycle.0.aar.sha256 +0 -1
  274. package/Detox-android/com/wix/detox/21.0.0-breaking.new-global-lifecycle.0/detox-21.0.0-breaking.new-global-lifecycle.0.aar.sha512 +0 -1
  275. package/Detox-android/com/wix/detox/21.0.0-breaking.new-global-lifecycle.0/detox-21.0.0-breaking.new-global-lifecycle.0.pom.md5 +0 -1
  276. package/Detox-android/com/wix/detox/21.0.0-breaking.new-global-lifecycle.0/detox-21.0.0-breaking.new-global-lifecycle.0.pom.sha1 +0 -1
  277. package/Detox-android/com/wix/detox/21.0.0-breaking.new-global-lifecycle.0/detox-21.0.0-breaking.new-global-lifecycle.0.pom.sha256 +0 -1
  278. package/Detox-android/com/wix/detox/21.0.0-breaking.new-global-lifecycle.0/detox-21.0.0-breaking.new-global-lifecycle.0.pom.sha512 +0 -1
  279. package/Detox-ios.tbz +0 -0
  280. package/android/detox/src/full/java/com/wix/detox/espresso/registry/IRStatusInquirer.kt +0 -24
  281. package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/DescriptiveIdlingResource.kt +0 -10
  282. package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/IdlingResourceDescription.kt +0 -20
  283. package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/timers/DefaultIdleInterrogationStrategy.kt +0 -84
  284. package/android/detox/src/main/java/com/wix/detox/espresso/action/AdjustSliderToPositionAction.kt +0 -36
  285. package/android/detox/src/testFull/java/com/wix/detox/espresso/action/AdjustSliderToPositionActionTest.kt +0 -59
  286. package/android/detox/src/testFull/java/com/wix/detox/reactnative/idlingresources/timers/DefaultIdleInterrogationStrategySpec.kt +0 -115
  287. package/local-cli/build.test.js +0 -104
  288. package/local-cli/run-server.test.js +0 -23
  289. package/local-cli/test.test.js +0 -515
  290. package/runners/jest/deprecation.js +0 -25
  291. package/runners/jest/testEnvironment/utils/assertJestCircus27.test.js +0 -23
  292. package/scripts/build_universal_framework.sh +0 -14
  293. package/scripts/build_universal_framework_legacy.sh +0 -76
  294. package/scripts/build_universal_framework_modern.sh +0 -28
  295. package/src/configuration/utils/warnings.js +0 -12
  296. package/src/devices/common/drivers/android/tools/TempFileXfer.js +0 -16
  297. package/src/ipc/state.js +0 -76
  298. package/src/logger/DetoxTraceEventBuilder.js +0 -21
  299. package/src/logger/DetoxTracer.js +0 -133
  300. package/src/logger/TraceThreadDispatcher.js +0 -52
  301. package/src/realms/index.js +0 -10
  302. package/src/utils/ChromeTracingExporter.js +0 -53
  303. package/src/utils/streamUtils.js +0 -214
  304. package/src/utils/trace.js +0 -19
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": "21.0.0-breaking.new-global-lifecycle.0",
4
+ "version": "21.0.1-rc.0",
5
5
  "bin": {
6
6
  "detox": "local-cli/cli.js"
7
7
  },
@@ -24,6 +24,8 @@
24
24
  "build:android-native": "cd android && ./gradlew publish -Dversion=999.999.999 -DbuildFlavour=coreNative -DforceLocal=true && cd ..",
25
25
  "lint": "eslint .",
26
26
  "unit": "jest --coverage --verbose",
27
+ "unit:android-debug": "cd android && ./gradlew testFullDebug",
28
+ "unit:android-release": "cd android && ./gradlew testFullRelease",
27
29
  "pretest": "npm run lint",
28
30
  "test": "npm run unit",
29
31
  "posttest": "cp coverage/lcov.info coverage/unit.lcov",
@@ -35,21 +37,23 @@
35
37
  "@types/bunyan": "^1.8.8",
36
38
  "@types/child-process-promise": "^2.2.1",
37
39
  "@types/fs-extra": "^9.0.13",
38
- "@types/jest": "^27.0.3",
39
- "@types/node": "^12.20.37",
40
+ "@types/jest": "^28.1.8",
41
+ "@types/node": "^14.18.33",
40
42
  "@types/node-ipc": "^9.2.0",
41
43
  "@types/ws": "^7.4.0",
42
44
  "@typescript-eslint/eslint-plugin": "^5.4.0",
43
45
  "@typescript-eslint/parser": "^5.4.0",
46
+ "cross-env": "^7.0.3",
44
47
  "eslint": "^8.3.0",
45
48
  "eslint-plugin-import": "^2.23.3",
46
49
  "eslint-plugin-no-only-tests": "^2.6.0",
47
50
  "eslint-plugin-node": "^11.1.0",
48
51
  "eslint-plugin-unicorn": "^39.0.0",
49
- "jest": "^27.5.1",
52
+ "jest": "^28.1.3",
53
+ "jest-allure2-reporter": "^1.2.1",
50
54
  "mockdate": "^2.0.1",
51
55
  "prettier": "1.7.0",
52
- "react-native": "0.67.2",
56
+ "react-native": "0.70.7",
53
57
  "react-native-codegen": "^0.0.8",
54
58
  "typescript": "^4.5.2",
55
59
  "wtfnode": "^0.9.1"
@@ -57,20 +61,22 @@
57
61
  "dependencies": {
58
62
  "ajv": "^8.6.3",
59
63
  "bunyan": "^1.8.12",
60
- "bunyan-debug-stream": "^3.0.2",
61
- "chalk": "^2.4.2",
64
+ "bunyan-debug-stream": "^3.1.0",
65
+ "caf": "^15.0.1",
66
+ "chalk": "^4.0.0",
62
67
  "child-process-promise": "^2.2.0",
63
- "duplexify": "^4.1.2",
64
- "find-up": "^4.1.0",
65
- "fs-extra": "^4.0.2",
66
- "funpermaproxy": "^1.0.1",
68
+ "execa": "^5.1.1",
69
+ "find-up": "^5.0.0",
70
+ "fs-extra": "^11.0.0",
71
+ "funpermaproxy": "^1.1.0",
72
+ "glob": "^8.0.3",
67
73
  "ini": "^1.3.4",
68
74
  "json-cycle": "^1.3.0",
69
- "lodash": "^4.17.5",
70
- "minimist": "^1.2.0",
75
+ "lodash": "^4.17.11",
71
76
  "multi-sort-stream": "^1.0.3",
72
77
  "multipipe": "^4.0.0",
73
- "node-ipc": "^9.2.1",
78
+ "node-ipc": "9.2.1",
79
+ "node-osascript": "^2.1.0",
74
80
  "proper-lockfile": "^3.0.2",
75
81
  "resolve-from": "^5.0.0",
76
82
  "sanitize-filename": "^1.6.1",
@@ -80,18 +86,17 @@
80
86
  "signal-exit": "^3.0.3",
81
87
  "stream-json": "^1.7.4",
82
88
  "strip-ansi": "^6.0.1",
83
- "tail": "^2.0.0",
84
89
  "telnet-client": "1.2.8",
85
90
  "tempfile": "^2.0.0",
86
- "trace-event-lib": "^1.1.0",
91
+ "trace-event-lib": "^1.3.1",
87
92
  "which": "^1.3.1",
88
93
  "ws": "^7.0.0",
89
- "yargs": "^16.0.3",
90
- "yargs-parser": "^20.2.9",
94
+ "yargs": "^17.0.0",
95
+ "yargs-parser": "^21.0.0",
91
96
  "yargs-unparser": "^2.0.0"
92
97
  },
93
98
  "peerDependencies": {
94
- "jest": "28.x.x || ^27.2.5"
99
+ "jest": "29.x.x || 28.x.x || ^27.2.5"
95
100
  },
96
101
  "peerDependenciesMeta": {
97
102
  "jest": {
@@ -99,7 +104,7 @@
99
104
  }
100
105
  },
101
106
  "engines": {
102
- "node": ">=12.10.0"
107
+ "node": ">=14.5.0"
103
108
  },
104
109
  "jest": {
105
110
  "setupFiles": [
@@ -122,6 +127,8 @@
122
127
  "__tests__",
123
128
  ".test.js$",
124
129
  ".mock.js$",
130
+ "index.js",
131
+ "internals.js",
125
132
  "local-cli/utils",
126
133
  "src/environmentFactory",
127
134
  "src/android/espressoapi",
@@ -158,10 +165,23 @@
158
165
  "src/utils/pipeCommands.js",
159
166
  "src/utils/pressAnyKey.js",
160
167
  "src/utils/shellUtils.js",
161
- "runners/jest/.*.js"
168
+ "runners/jest/reporters",
169
+ "runners/jest/testEnvironment",
170
+ "src/DetoxWorker.js",
171
+ "src/logger/utils/streamUtils.js",
172
+ "src/realms"
162
173
  ],
163
174
  "resetMocks": true,
164
175
  "resetModules": true,
176
+ "reporters": [
177
+ "default",
178
+ [
179
+ "jest-allure2-reporter",
180
+ {
181
+ "getEnvironmentInfo": false
182
+ }
183
+ ]
184
+ ],
165
185
  "coverageReporters": [
166
186
  "html",
167
187
  "json",
@@ -176,12 +196,12 @@
176
196
  ],
177
197
  "coverageThreshold": {
178
198
  "global": {
179
- "statements": 0,
180
- "branches": 0,
181
- "functions": 0,
182
- "lines": 0
199
+ "statements": 100,
200
+ "branches": 100,
201
+ "functions": 100,
202
+ "lines": 100
183
203
  }
184
204
  }
185
205
  },
186
- "gitHead": "5c9f55d001261c12376998bce4d3221540a52cc4"
206
+ "gitHead": "4715e6e5c52ec2414a3a44f66bd9c3f16579fd0e"
187
207
  }
@@ -1,47 +1,45 @@
1
1
  const chalk = require('chalk');
2
2
 
3
3
  // @ts-ignore
4
- console.error(chalk.yellow(`
5
- ========================= THE NEW JOURNEY BEGINS =============================
6
-
7
- https://github.com/wix/Detox/blob/master/docs/Guide.Jest.md
8
-
9
- _.-;-._ Sorry, traveler from the lands of Detox 19!
10
- ;_.JL___;
11
- F"-/\\_-7L Detox 20 comes without old adapters for Jest
12
- | a/ e | \\ and Mocha test runners. You have to rearrange
13
- ,L,c;,.='/;, your init code before you can continue your
14
- _,-;;S:;:S;;:' '--._ journey.
15
- ;. \\;;s:::s;;: .' /\\
16
- / \\ ;::::;; / / \\ Navigate to the link above and follow the
17
- / , k ;S';;'S.' j __,l migration guide steps.
18
- ,---/| / /S /S '. |' ;
19
- ,Ljjj |/|.' s .' s \\ L | Sincerely yours,
20
- LL,_ ]( \\ / '. '.|| ; Detox team.
21
- ||\\ > / ;-.'_.-.___\\.-'(|=="(
22
- JJ," / |_ [ ] _]| /
23
- LL\\/ ,' '--'-'-----' \\ (
24
- || ; | | >
25
- JJ | |\\ |,/
26
- LL | || ' |
27
- || | || . |
28
- JJ /_ || ;_|
29
- LL L "==='|i======='_|
30
- || i----' '-------';
31
- JJ ';-----.------,-'
32
- LL L_.__J,'---;'
33
- || | ,| (
34
- JJ .'= (| ,_|
35
- LL / .'L_ \\
36
- snd || '---' '.___>
37
- Credit: "Gimli" by Shanaka Dias
38
-
39
- https://github.com/wix/Detox/blob/master/docs/Guide.Jest.md
40
-
41
- ========================= THE NEW JOURNEY BEGINS =============================
42
-
43
- `));
44
-
45
- throw Object.assign(new Error(
46
- '\n\nPlease follow the new Jest setup guide:\nhttps://github.com/wix/Detox/blob/master/docs/Guide.Jest.md\n\n'
47
- ), { stack: '' });
4
+ const bold = chalk.bold;
5
+
6
+ function getMaxWidth(text) {
7
+ const lines = text.split('\n');
8
+ return lines.reduce((acc, line) => Math.max(acc, line.length), 0);
9
+ }
10
+
11
+ function centerText(text, maxWidth = getMaxWidth(text)) {
12
+ return text
13
+ .split('\n')
14
+ .map(line => {
15
+ const padStart = Math.max(0, Math.floor((maxWidth - line.length) / 2));
16
+ const padEnd = Math.max(0, maxWidth - line.length - padStart);
17
+ return ' '.repeat(padStart) + line + ' '.repeat(padEnd);
18
+ })
19
+ .join('\n');
20
+ }
21
+
22
+ const header = `\
23
+ ========================= THE NEW JOURNEY BEGINS =============================`;
24
+
25
+ console.error(centerText(`\
26
+
27
+ ${bold(header)}
28
+
29
+ https://wix.github.io/Detox/docs/guide/migration
30
+
31
+ Sorry to say that Detox 20 comes without old adapters for Jest.
32
+ You have to rearrange your init code before you can continue your journey.
33
+
34
+ Navigate to the link and follow the migration guide steps.
35
+
36
+ Sincerely yours,
37
+ Detox team.
38
+
39
+ ${bold(header)}
40
+
41
+ `, header.length));
42
+
43
+ const error = new Error('\nPlease follow the migration guide:\nhttps://wix.github.io/Detox/docs/guide/migration\n\n');
44
+ error.stack = '';
45
+ throw error;
@@ -1 +1 @@
1
- module.exports = async () => require('../../internals').globalSetup();
1
+ module.exports = async () => require('../../internals').init({ workerId: null });
@@ -1 +1 @@
1
- module.exports = async () => require('../../internals').globalTeardown();
1
+ module.exports = async () => require('../../internals').cleanup();
@@ -0,0 +1,61 @@
1
+ declare module 'detox/runners/jest' {
2
+ import type NodeEnvironment from 'jest-environment-node';
3
+
4
+ export function globalSetup(): Promise<void>;
5
+ export function globalTeardown(): Promise<void>;
6
+
7
+ export type DetoxCircusListenerConstructorOpts = {
8
+ readonly env: DetoxCircusEnvironment;
9
+ }
10
+
11
+ /**
12
+ * @example
13
+ * class CustomListener implements DetoxCircusListener {
14
+ * constructor(opts: DetoxCircusListenerConstructorOpts) {
15
+ * console.log('Current test path is:', opts.env.testPath);
16
+ * }
17
+ * }
18
+ */
19
+ export interface DetoxCircusListener {
20
+ start_describe_definition?(event: unknown, state: unknown): void;
21
+ finish_describe_definition?(event: unknown, state: unknown): void;
22
+ add_hook?(event: unknown, state: unknown): void;
23
+ add_test?(event: unknown, state: unknown): void;
24
+ error?(event: unknown, state: unknown): void;
25
+
26
+ setup?(event: unknown, state: unknown): void | Promise<void>;
27
+ include_test_location_in_result?(event: unknown, state: unknown): void | Promise<void>;
28
+ hook_start?(event: unknown, state: unknown): void | Promise<void>;
29
+ hook_success?(event: unknown, state: unknown): void | Promise<void>;
30
+ hook_failure?(event: unknown, state: unknown): void | Promise<void>;
31
+ test_fn_start?(event: unknown, state: unknown): void | Promise<void>;
32
+ test_fn_success?(event: unknown, state: unknown): void | Promise<void>;
33
+ test_fn_failure?(event: unknown, state: unknown): void | Promise<void>;
34
+ test_retry?(event: unknown, state: unknown): void | Promise<void>;
35
+ test_start?(event: unknown, state: unknown): void | Promise<void>;
36
+ test_skip?(event: unknown, state: unknown): void | Promise<void>;
37
+ test_todo?(event: unknown, state: unknown): void | Promise<void>;
38
+ test_done?(event: unknown, state: unknown): void | Promise<void>;
39
+ run_describe_start?(event: unknown, state: unknown): void | Promise<void>;
40
+ run_describe_finish?(event: unknown, state: unknown): void | Promise<void>;
41
+ run_start?(event: unknown, state: unknown): void | Promise<void>;
42
+ run_finish?(event: unknown, state: unknown): void | Promise<void>;
43
+ teardown?(event: unknown, state: unknown): void | Promise<void>;
44
+ }
45
+
46
+ export interface DetoxListenerFactory {
47
+ new (opts: DetoxCircusListenerConstructorOpts): DetoxCircusListener;
48
+ }
49
+
50
+ export class DetoxCircusEnvironment extends NodeEnvironment {
51
+ public readonly testPath: string;
52
+
53
+ public handleTestEvent(event: unknown, state: unknown): void | Promise<void>;
54
+
55
+ protected registerListeners(map: Record<string, DetoxListenerFactory>): void;
56
+ protected setupTimeout: number;
57
+ protected teardownTimeout: number;
58
+ protected initDetox(): Promise<DetoxInternals.Worker>;
59
+ protected cleanupDetox(): Promise<void>;
60
+ }
61
+ }
@@ -1,14 +1,11 @@
1
- module.exports = {
2
- //#region *** Runner Realm ***
1
+ // Lazy require() is used to avoid initializing a bare Detox context when it is not needed.
2
+ // At the moment, this safety measure is not really needed, but it's better to be on the safe side.
3
3
 
4
+ module.exports = {
4
5
  get DetoxCircusEnvironment() {
5
6
  return require('./testEnvironment');
6
7
  },
7
8
 
8
- //#endregion
9
-
10
- //#region *** Worker Realm ***
11
-
12
9
  get globalSetup() {
13
10
  return require('./globalSetup');
14
11
  },
@@ -16,6 +13,4 @@ module.exports = {
16
13
  get globalTeardown() {
17
14
  return require('./globalTeardown');
18
15
  },
19
-
20
- //#endregion
21
16
  };
@@ -1,5 +1,36 @@
1
- const { VerboseReporter: JestVerboseReporter } = require('@jest/reporters'); // eslint-disable-line node/no-extraneous-require
1
+ const resolveFrom = require('resolve-from');
2
+ /** @type {typeof import('@jest/reporters').VerboseReporter} */
3
+ const JestVerboseReporter = require(resolveFrom(process.cwd(), '@jest/reporters')).VerboseReporter;
2
4
 
3
- class DetoxReporter extends JestVerboseReporter {}
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
+ }
4
35
 
5
36
  module.exports = DetoxReporter;
@@ -1,9 +1,11 @@
1
- // @ts-nocheck
2
- const maybeNodeEnvironment = require('jest-environment-node'); // eslint-disable-line node/no-extraneous-require
1
+ const path = require('path');
2
+
3
+ const resolveFrom = require('resolve-from');
4
+ const maybeNodeEnvironment = require(resolveFrom(process.cwd(), 'jest-environment-node'));
5
+ /** @type {typeof import('@jest/environment').JestEnvironment} */
3
6
  const NodeEnvironment = maybeNodeEnvironment.default || maybeNodeEnvironment;
4
7
 
5
8
  const detox = require('../../../internals');
6
- const { DetoxError } = require('../../../src/errors');
7
9
  const Timer = require('../../../src/utils/Timer');
8
10
 
9
11
  const {
@@ -24,6 +26,8 @@ const SYNC_CIRCUS_EVENTS = new Set([
24
26
  'error',
25
27
  ]);
26
28
 
29
+ const log = detox.log.child({ cat: 'lifecycle,jest-environment' });
30
+
27
31
  /**
28
32
  * @see https://www.npmjs.com/package/jest-circus#overview
29
33
  */
@@ -32,98 +36,93 @@ class DetoxCircusEnvironment extends NodeEnvironment {
32
36
  super(assertJestCircus27(config), assertExistingContext(context));
33
37
 
34
38
  /** @private */
35
- this._timer = null;
39
+ this._shouldManageDetox = detox.getStatus() === 'inactive';
36
40
  /** @private */
37
- this._listenerFactories = {
41
+ this._timer = new Timer();
42
+
43
+ /** @internal */
44
+ this.testPath = path.relative(process.cwd(), context.testPath);
45
+ /** @protected */
46
+ this.testEventListeners = [];
47
+ /** @protected */
48
+ this.setupTimeout = detox.config.testRunner.jest.setupTimeout;
49
+ /** @protected */
50
+ this.teardownTimeout = detox.config.testRunner.jest.teardownTimeout;
51
+
52
+ log.trace.begin(this.testPath);
53
+
54
+ this.handleTestEvent = this.handleTestEvent.bind(this);
55
+ this.setup = this._wrapSetup(this.setup);
56
+ this.teardown = this._wrapTeardown(this.teardown);
57
+
58
+ this.registerListeners({
38
59
  DetoxInitErrorListener,
39
60
  DetoxPlatformFilterListener,
40
61
  DetoxCoreListener,
41
62
  SpecReporter,
42
63
  WorkerAssignReporter,
43
- };
44
- /** @protected */
45
- this.testPath = context.testPath;
46
- /** @protected */
47
- this.testEventListeners = [];
48
- /** @protected */
49
- this.initTimeout = detox.config.runnerConfig.jest.initTimeout;
64
+ });
50
65
  }
51
66
 
52
67
  /** @override */
53
68
  async setup() {
54
69
  await super.setup();
55
-
56
- await Timer.run({
57
- description: `setting up Detox environment`,
58
- timeout: this.initTimeout,
59
- fn: async () => {
60
- await this.initDetox();
61
- this._instantiateListeners();
62
- },
63
- });
70
+ await this.initDetox();
64
71
  }
65
72
 
66
- /** @override */
67
73
  async handleTestEvent(event, state) {
68
- const { name } = event;
74
+ this._timer.schedule(state.testTimeout != null ? state.testTimeout : this.setupTimeout);
69
75
 
70
- if (SYNC_CIRCUS_EVENTS.has(name)) {
71
- return this._handleTestEventSync(event, state);
72
- }
73
-
74
- this._timer = new Timer({
75
- description: `handling jest-circus "${name}" event`,
76
- timeout: state.testTimeout != null ? state.testTimeout : this.initTimeout,
77
- });
78
-
79
- try {
80
- for (const listener of this.testEventListeners) {
81
- if (typeof listener[name] !== 'function') {
82
- continue;
83
- }
84
-
85
- try {
86
- await this._timer.run(() => listener[name](event, state));
87
- } catch (listenerError) {
88
- this._logError(listenerError);
89
- break;
90
- }
91
- }
92
- } finally {
93
- this._timer.dispose();
94
- this._timer = null;
76
+ if (SYNC_CIRCUS_EVENTS.has(event.name)) {
77
+ this._handleTestEventSync(event, state);
78
+ } else {
79
+ await this._handleTestEventAsync(event, state);
95
80
  }
96
81
  }
97
82
 
98
83
  /** @override */
99
84
  async teardown() {
100
- await Timer.run({
101
- description: `tearing down Detox environment`,
102
- timeout: this.initTimeout,
103
- fn: async () => {
104
- await this.cleanupDetox();
105
- },
106
- });
85
+ try {
86
+ await this.cleanupDetox();
87
+ } finally {
88
+ await super.teardown();
89
+ }
107
90
  }
108
91
 
109
92
  /** @protected */
110
93
  registerListeners(map) {
111
- Object.assign(this._listenerFactories, map);
94
+ for (const Listener of Object.values(map)) {
95
+ this.testEventListeners.push(new Listener({
96
+ env: this,
97
+ }));
98
+ }
112
99
  }
113
100
 
114
101
  /**
115
102
  * @protected
116
103
  */
117
104
  async initDetox() {
118
- await detox.setup({
105
+ const opts = {
119
106
  global: this.global,
120
- workerId: +process.env.JEST_WORKER_ID,
121
- });
107
+ workerId: `w${process.env.JEST_WORKER_ID}`,
108
+ };
109
+
110
+ if (this._shouldManageDetox) {
111
+ await detox.init(opts);
112
+ } else {
113
+ await detox.installWorker(opts);
114
+ }
115
+
116
+ return detox.worker;
122
117
  }
123
118
 
124
119
  /** @protected */
125
120
  async cleanupDetox() {
126
- await detox.teardown();
121
+ if (this._shouldManageDetox) {
122
+ await detox.cleanup();
123
+ } else {
124
+ await detox.uninstallWorker();
125
+ }
127
126
  }
128
127
 
129
128
  /** @private */
@@ -138,17 +137,69 @@ class DetoxCircusEnvironment extends NodeEnvironment {
138
137
  }
139
138
 
140
139
  /** @private */
141
- _instantiateListeners() {
142
- for (const Listener of Object.values(this._listenerFactories)) {
143
- this.testEventListeners.push(new Listener({
144
- env: this,
145
- }));
140
+ async _handleTestEventAsync(event, state = null) {
141
+ const description = `handling ${state ? 'jest-circus' : 'jest-environment'} "${event.name}" event`;
142
+
143
+ for (const listener of this.testEventListeners) {
144
+ if (typeof listener[event.name] !== 'function') {
145
+ continue;
146
+ }
147
+
148
+ try {
149
+ await this._timer.run(description, () => listener[event.name](event, state));
150
+ } catch (listenerError) {
151
+ log.error(listenerError);
152
+ if (this._timer.expired) {
153
+ break;
154
+ }
155
+ }
146
156
  }
147
157
  }
148
158
 
149
- /** @private */
150
- _logError(e) {
151
- detox.log.error(DetoxError.format(e));
159
+ _wrapSetup(fn) {
160
+ const _setup = fn.bind(this);
161
+
162
+ return async () => {
163
+ await log.trace.complete('set up environment', async () => {
164
+ try {
165
+ this._timer.schedule(this.setupTimeout);
166
+ await this._handleTestEventAsync({ name: 'environment_setup_start' });
167
+ await this._timer.run(`setting up Detox environment`, _setup);
168
+ await this._handleTestEventAsync({ name: 'environment_setup_success' });
169
+ } catch (error) {
170
+ this._timer.schedule(this.teardownTimeout);
171
+ await this._handleTestEventAsync({ name: 'environment_setup_failure', error });
172
+ throw error;
173
+ } finally {
174
+ this._timer.clear();
175
+ }
176
+ });
177
+ };
178
+ }
179
+
180
+ _wrapTeardown(fn) {
181
+ const _teardown = fn.bind(this);
182
+
183
+ return async () => {
184
+ await log.trace.complete('tear down environment', async () => {
185
+ try {
186
+ this._timer.schedule(this.teardownTimeout);
187
+ await this._handleTestEventAsync({ name: 'environment_teardown_start' });
188
+ await this._timer.run(`tearing down Detox environment`, _teardown);
189
+ await this._handleTestEventAsync({ name: 'environment_teardown_success' });
190
+ } catch (error) {
191
+ if (this._timer.expired) {
192
+ this._timer.schedule(this.teardownTimeout);
193
+ }
194
+
195
+ await this._handleTestEventAsync({ name: 'environment_teardown_failure', error });
196
+ throw error;
197
+ } finally {
198
+ this._timer.clear();
199
+ log.trace.end();
200
+ }
201
+ });
202
+ };
152
203
  }
153
204
  }
154
205