detox 20.0.1-breaking.new-global-lifecycle.0 → 20.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (180) hide show
  1. package/Detox-android/com/wix/detox/{20.0.1-breaking.new-global-lifecycle.0/detox-20.0.1-breaking.new-global-lifecycle.0-javadoc.jar → 20.0.1/detox-20.0.1-javadoc.jar} +0 -0
  2. package/Detox-android/com/wix/detox/20.0.1/detox-20.0.1-javadoc.jar.md5 +1 -0
  3. package/Detox-android/com/wix/detox/20.0.1/detox-20.0.1-javadoc.jar.sha1 +1 -0
  4. package/Detox-android/com/wix/detox/20.0.1/detox-20.0.1-javadoc.jar.sha256 +1 -0
  5. package/Detox-android/com/wix/detox/20.0.1/detox-20.0.1-javadoc.jar.sha512 +1 -0
  6. package/Detox-android/com/wix/detox/{20.0.1-breaking.new-global-lifecycle.0/detox-20.0.1-breaking.new-global-lifecycle.0-sources.jar → 20.0.1/detox-20.0.1-sources.jar} +0 -0
  7. package/Detox-android/com/wix/detox/20.0.1/detox-20.0.1-sources.jar.md5 +1 -0
  8. package/Detox-android/com/wix/detox/20.0.1/detox-20.0.1-sources.jar.sha1 +1 -0
  9. package/Detox-android/com/wix/detox/20.0.1/detox-20.0.1-sources.jar.sha256 +1 -0
  10. package/Detox-android/com/wix/detox/20.0.1/detox-20.0.1-sources.jar.sha512 +1 -0
  11. package/Detox-android/com/wix/detox/20.0.1/detox-20.0.1.aar +0 -0
  12. package/Detox-android/com/wix/detox/20.0.1/detox-20.0.1.aar.md5 +1 -0
  13. package/Detox-android/com/wix/detox/20.0.1/detox-20.0.1.aar.sha1 +1 -0
  14. package/Detox-android/com/wix/detox/20.0.1/detox-20.0.1.aar.sha256 +1 -0
  15. package/Detox-android/com/wix/detox/20.0.1/detox-20.0.1.aar.sha512 +1 -0
  16. package/Detox-android/com/wix/detox/{20.0.1-breaking.new-global-lifecycle.0/detox-20.0.1-breaking.new-global-lifecycle.0.pom → 20.0.1/detox-20.0.1.pom} +1 -7
  17. package/Detox-android/com/wix/detox/20.0.1/detox-20.0.1.pom.md5 +1 -0
  18. package/Detox-android/com/wix/detox/20.0.1/detox-20.0.1.pom.sha1 +1 -0
  19. package/Detox-android/com/wix/detox/20.0.1/detox-20.0.1.pom.sha256 +1 -0
  20. package/Detox-android/com/wix/detox/20.0.1/detox-20.0.1.pom.sha512 +1 -0
  21. package/Detox-android/com/wix/detox/maven-metadata.xml +4 -4
  22. package/Detox-android/com/wix/detox/maven-metadata.xml.md5 +1 -1
  23. package/Detox-android/com/wix/detox/maven-metadata.xml.sha1 +1 -1
  24. package/Detox-android/com/wix/detox/maven-metadata.xml.sha256 +1 -1
  25. package/Detox-android/com/wix/detox/maven-metadata.xml.sha512 +1 -1
  26. package/Detox-ios-src.tbz +0 -0
  27. package/Detox-ios.tbz +0 -0
  28. package/README.md +1 -1
  29. package/android/build.gradle +12 -7
  30. package/android/detox/build.gradle +13 -9
  31. package/android/detox/proguard-rules-app.pro +6 -0
  32. package/android/detox/proguard-rules.pro +3 -0
  33. package/android/detox/publishing.gradle +27 -27
  34. package/android/detox/src/full/java/com/wix/detox/DetoxCrashHandler.kt +1 -1
  35. package/android/detox/src/full/java/com/wix/detox/LaunchArgs.java +9 -0
  36. package/android/detox/src/full/java/com/wix/detox/TestEngineFacade.kt +1 -1
  37. package/android/detox/src/full/java/com/wix/detox/reactnative/ReactNativeExtension.kt +15 -2
  38. package/android/detox/src/full/java/com/wix/detox/reactnative/ReactNativeIdlingResources.kt +43 -38
  39. package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/IdlingResourceDescription.kt +19 -13
  40. package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/NetworkIdlingResource.java +33 -30
  41. package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/timers/DelegatedIdleInterrogationStrategy.kt +7 -27
  42. package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/timers/IdleInterrogationStrategy.kt +1 -11
  43. package/android/detox/src/main/java/com/wix/detox/common/TextFileReader.kt +1 -1
  44. package/android/detox/src/testFull/java/com/wix/detox/espresso/action/DetoxMultiTapSpec.kt +4 -3
  45. package/android/detox/src/testFull/java/com/wix/detox/reactnative/idlingresources/NetworkIdlingResourcesTest.kt +61 -0
  46. package/android/detox/src/testFull/java/com/wix/detox/reactnative/idlingresources/timers/DelegatedIdleInterrogationStrategySpec.kt +3 -11
  47. package/index.d.ts +198 -57
  48. package/internals.d.ts +219 -45
  49. package/local-cli/build.js +2 -2
  50. package/local-cli/build.test.js +14 -14
  51. package/local-cli/cli.js +8 -6
  52. package/local-cli/init.js +61 -21
  53. package/local-cli/rebuild-framework-cache.js +1 -1
  54. package/local-cli/reset-lock-file.js +16 -0
  55. package/local-cli/templates/jest.js +13 -10
  56. package/local-cli/test.js +14 -8
  57. package/local-cli/test.test.js +148 -61
  58. package/local-cli/testCommand/TestRunnerCommand.js +78 -72
  59. package/local-cli/testCommand/builder.js +0 -1
  60. package/local-cli/testCommand/middlewares.js +4 -13
  61. package/local-cli/testCommand/warnings.js +0 -3
  62. package/local-cli/utils/jestInternals.js +4 -1
  63. package/package.json +23 -16
  64. package/runners/deprecation.js +42 -44
  65. package/runners/jest/globalSetup.js +1 -1
  66. package/runners/jest/globalTeardown.js +1 -1
  67. package/runners/jest/index.d.ts +60 -0
  68. package/runners/jest/index.js +3 -8
  69. package/runners/jest/index.test.js +13 -0
  70. package/runners/jest/reporters/DetoxReporter.js +33 -2
  71. package/runners/jest/testEnvironment/index.js +119 -69
  72. package/runners/jest/testEnvironment/listeners/DetoxCoreListener.js +94 -51
  73. package/runners/jest/testEnvironment/listeners/DetoxPlatformFilterListener.js +1 -1
  74. package/runners/jest/testEnvironment/listeners/SpecReporter.js +14 -16
  75. package/runners/jest/testEnvironment/listeners/WorkerAssignReporter.js +2 -6
  76. package/runners/jest/testEnvironment/utils/assertJestCircus27.js +17 -3
  77. package/runners/jest/testEnvironment/utils/assertJestCircus27.test.js +0 -1
  78. package/src/DetoxWorker.js +105 -62
  79. package/src/android/core/NativeElement.js +56 -20
  80. package/src/android/core/NativeExpect.js +28 -9
  81. package/src/android/interactions/native.js +25 -18
  82. package/src/artifacts/ArtifactsManager.js +14 -47
  83. package/src/artifacts/instruments/ios/SimulatorInstrumentsRecording.js +3 -3
  84. package/src/artifacts/log/ios/SimulatorLogRecording.js +1 -1
  85. package/src/artifacts/screenshot/SimulatorScreenshotPlugin.js +1 -1
  86. package/src/artifacts/templates/artifact/Artifact.js +1 -1
  87. package/src/artifacts/templates/plugin/ArtifactPlugin.js +1 -1
  88. package/src/artifacts/timeline/TimelineContextTypes.js +7 -0
  89. package/src/artifacts/utils/temporaryPath.js +18 -7
  90. package/src/artifacts/video/SimulatorRecordVideoPlugin.js +1 -1
  91. package/src/client/AsyncWebSocket.js +8 -17
  92. package/src/client/Client.js +19 -2
  93. package/src/client/actions/formatters/sync-resources/NetworkFormatter.js +1 -1
  94. package/src/configuration/collectCliConfig.js +1 -12
  95. package/src/configuration/composeAppsConfig.js +4 -0
  96. package/src/configuration/composeDeviceConfig.js +1 -1
  97. package/src/configuration/composeLoggerConfig.js +19 -10
  98. package/src/configuration/composeRunnerConfig.js +62 -9
  99. package/src/configuration/index.js +14 -9
  100. package/src/configuration/loadExternalConfig.js +1 -1
  101. package/src/devices/allocation/DeviceAllocator.js +3 -2
  102. package/src/devices/allocation/drivers/android/emulator/AVDValidator.js +5 -5
  103. package/src/devices/allocation/drivers/android/emulator/EmulatorAllocDriver.js +4 -3
  104. package/src/devices/allocation/drivers/android/emulator/EmulatorAllocationHelper.js +1 -1
  105. package/src/devices/allocation/drivers/android/emulator/EmulatorLauncher.js +3 -2
  106. package/src/devices/allocation/drivers/android/emulator/EmulatorVersionResolver.js +4 -6
  107. package/src/devices/allocation/drivers/android/emulator/launchEmulatorProcess.js +1 -1
  108. package/src/devices/allocation/drivers/android/genycloud/GenyInstanceAllocationHelper.js +1 -1
  109. package/src/devices/common/drivers/android/genycloud/services/GenyInstanceNaming.js +3 -3
  110. package/src/devices/common/drivers/android/genycloud/services/GenyRecipesService.js +1 -1
  111. package/src/devices/common/drivers/android/tools/EmulatorTelnet.js +1 -1
  112. package/src/devices/common/drivers/android/tools/FreeDeviceFinder.js +1 -1
  113. package/src/devices/common/drivers/android/tools/MonitoredInstrumentation.js +1 -1
  114. package/src/devices/common/drivers/ios/tools/AppleSimUtils.js +29 -3
  115. package/src/devices/lifecycle/GenyGlobalLifecycleHandler.js +13 -15
  116. package/src/devices/runtime/RuntimeDevice.js +19 -12
  117. package/src/devices/runtime/drivers/DeviceDriverBase.js +1 -1
  118. package/src/devices/runtime/drivers/android/AndroidDriver.js +10 -2
  119. package/src/devices/runtime/drivers/ios/SimulatorDriver.js +1 -1
  120. package/src/errors/DetoxConfigErrorComposer.js +17 -2
  121. package/src/ios/expectTwo.js +153 -67
  122. package/src/ipc/IPCClient.js +12 -12
  123. package/src/ipc/IPCServer.js +29 -18
  124. package/src/ipc/{state.js → SessionState.js} +26 -40
  125. package/src/logger/DetoxLogger.js +261 -157
  126. package/src/logger/index.js +5 -0
  127. package/src/logger/utils/BunyanLogger.js +76 -0
  128. package/src/logger/utils/CategoryThreadDispatcher.js +36 -0
  129. package/src/logger/utils/DetoxLogFinalizer.js +140 -0
  130. package/src/logger/utils/MessageStack.js +24 -0
  131. package/src/logger/utils/ThreadDispatcher.js +61 -0
  132. package/src/logger/{customConsoleLogger.js → utils/customConsoleLogger.js} +5 -4
  133. package/src/logger/utils/sanitizeBunyanContext.js +30 -0
  134. package/src/{utils → logger/utils}/streamUtils.js +51 -17
  135. package/src/logger/utils/tracerLegacy.js +37 -0
  136. package/src/realms/DetoxContext.js +78 -65
  137. package/src/realms/DetoxInternalsFacade.js +8 -12
  138. package/src/realms/DetoxPrimaryContext.js +104 -72
  139. package/src/realms/DetoxSecondaryContext.js +29 -32
  140. package/src/server/DetoxConnection.js +18 -23
  141. package/src/server/DetoxServer.js +7 -10
  142. package/src/server/DetoxSession.js +6 -6
  143. package/src/server/DetoxSessionManager.js +1 -1
  144. package/src/server/handlers/RegisteredConnectionHandler.js +1 -2
  145. package/src/symbols.js +16 -22
  146. package/src/utils/Timer.js +55 -38
  147. package/src/utils/argparse.js +11 -0
  148. package/src/utils/childProcess/exec.js +1 -1
  149. package/src/utils/childProcess/spawn.js +1 -1
  150. package/src/utils/errorUtils.js +24 -3
  151. package/src/utils/invocationTraceDescriptions.js +43 -0
  152. package/src/utils/logger.js +1 -1
  153. package/src/utils/traceInvocationCall.js +21 -0
  154. package/src/utils/traceMethods.js +15 -0
  155. package/Detox-android/com/wix/detox/20.0.1-breaking.new-global-lifecycle.0/detox-20.0.1-breaking.new-global-lifecycle.0-javadoc.jar.md5 +0 -1
  156. package/Detox-android/com/wix/detox/20.0.1-breaking.new-global-lifecycle.0/detox-20.0.1-breaking.new-global-lifecycle.0-javadoc.jar.sha1 +0 -1
  157. package/Detox-android/com/wix/detox/20.0.1-breaking.new-global-lifecycle.0/detox-20.0.1-breaking.new-global-lifecycle.0-javadoc.jar.sha256 +0 -1
  158. package/Detox-android/com/wix/detox/20.0.1-breaking.new-global-lifecycle.0/detox-20.0.1-breaking.new-global-lifecycle.0-javadoc.jar.sha512 +0 -1
  159. package/Detox-android/com/wix/detox/20.0.1-breaking.new-global-lifecycle.0/detox-20.0.1-breaking.new-global-lifecycle.0-sources.jar.md5 +0 -1
  160. package/Detox-android/com/wix/detox/20.0.1-breaking.new-global-lifecycle.0/detox-20.0.1-breaking.new-global-lifecycle.0-sources.jar.sha1 +0 -1
  161. package/Detox-android/com/wix/detox/20.0.1-breaking.new-global-lifecycle.0/detox-20.0.1-breaking.new-global-lifecycle.0-sources.jar.sha256 +0 -1
  162. package/Detox-android/com/wix/detox/20.0.1-breaking.new-global-lifecycle.0/detox-20.0.1-breaking.new-global-lifecycle.0-sources.jar.sha512 +0 -1
  163. package/Detox-android/com/wix/detox/20.0.1-breaking.new-global-lifecycle.0/detox-20.0.1-breaking.new-global-lifecycle.0.aar +0 -0
  164. package/Detox-android/com/wix/detox/20.0.1-breaking.new-global-lifecycle.0/detox-20.0.1-breaking.new-global-lifecycle.0.aar.md5 +0 -1
  165. package/Detox-android/com/wix/detox/20.0.1-breaking.new-global-lifecycle.0/detox-20.0.1-breaking.new-global-lifecycle.0.aar.sha1 +0 -1
  166. package/Detox-android/com/wix/detox/20.0.1-breaking.new-global-lifecycle.0/detox-20.0.1-breaking.new-global-lifecycle.0.aar.sha256 +0 -1
  167. package/Detox-android/com/wix/detox/20.0.1-breaking.new-global-lifecycle.0/detox-20.0.1-breaking.new-global-lifecycle.0.aar.sha512 +0 -1
  168. package/Detox-android/com/wix/detox/20.0.1-breaking.new-global-lifecycle.0/detox-20.0.1-breaking.new-global-lifecycle.0.pom.md5 +0 -1
  169. package/Detox-android/com/wix/detox/20.0.1-breaking.new-global-lifecycle.0/detox-20.0.1-breaking.new-global-lifecycle.0.pom.sha1 +0 -1
  170. package/Detox-android/com/wix/detox/20.0.1-breaking.new-global-lifecycle.0/detox-20.0.1-breaking.new-global-lifecycle.0.pom.sha256 +0 -1
  171. package/Detox-android/com/wix/detox/20.0.1-breaking.new-global-lifecycle.0/detox-20.0.1-breaking.new-global-lifecycle.0.pom.sha512 +0 -1
  172. package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/timers/DefaultIdleInterrogationStrategy.kt +0 -84
  173. package/android/detox/src/testFull/java/com/wix/detox/reactnative/idlingresources/timers/DefaultIdleInterrogationStrategySpec.kt +0 -115
  174. package/runners/jest/deprecation.js +0 -25
  175. package/src/configuration/utils/warnings.js +0 -12
  176. package/src/logger/DetoxTraceEventBuilder.js +0 -21
  177. package/src/logger/DetoxTracer.js +0 -133
  178. package/src/logger/TraceThreadDispatcher.js +0 -52
  179. package/src/utils/ChromeTracingExporter.js +0 -54
  180. package/src/utils/trace.js +0 -19
@@ -1,14 +1,13 @@
1
1
  const EventEmitter = require('events');
2
2
  const path = require('path');
3
- const util = require('util');
4
3
 
5
4
  const fs = require('fs-extra');
6
5
  const _ = require('lodash');
7
6
 
8
7
  const DetoxRuntimeError = require('../errors/DetoxRuntimeError');
9
- const log = require('../utils/logger').child({ __filename });
8
+ const log = require('../utils/logger').child({ cat: 'artifacts-manager,artifact' });
10
9
  const resolveModuleFromPath = require('../utils/resolveModuleFromPath');
11
- const { traceMethods } = require('../utils/trace');
10
+ const traceMethods = require('../utils/traceMethods');
12
11
 
13
12
  const FileArtifact = require('./templates/artifact/FileArtifact');
14
13
  const ArtifactPathBuilder = require('./utils/ArtifactPathBuilder');
@@ -23,7 +22,7 @@ class ArtifactsManager extends EventEmitter {
23
22
  this._artifactPlugins = {};
24
23
  this._pathBuilder = this._resolveArtifactsPathBuilder(pathBuilder, rootDir);
25
24
 
26
- traceMethods(this, 'artifacts-manager,artifacts', [
25
+ traceMethods(log, this, [
27
26
  'onAppReady',
28
27
  'onBeforeCleanup',
29
28
  'onBeforeLaunchApp',
@@ -33,19 +32,13 @@ class ArtifactsManager extends EventEmitter {
33
32
  'onBootDevice',
34
33
  'onCreateExternalArtifact',
35
34
  'onHookFailure',
36
- 'onHookStart',
37
- 'onHookSuccess',
38
35
  'onLaunchApp',
39
36
  'onRunDescribeFinish',
40
37
  'onRunDescribeStart',
41
- 'onRunFinish',
42
- 'onRunStart',
43
38
  'onShutdownDevice',
44
39
  'onTerminateApp',
45
40
  'onTestDone',
46
41
  'onTestFnFailure',
47
- 'onTestFnStart',
48
- 'onTestFnSuccess',
49
42
  'onTestStart',
50
43
  ]);
51
44
  }
@@ -53,13 +46,13 @@ class ArtifactsManager extends EventEmitter {
53
46
  _resolveArtifactsPathBuilder(pathBuilder, rootDir) {
54
47
  if (typeof pathBuilder === 'string') {
55
48
  pathBuilder = resolveModuleFromPath(pathBuilder);
49
+ }
56
50
 
57
- if (typeof pathBuilder === 'function') {
58
- try {
59
- pathBuilder = pathBuilder({ rootDir });
60
- } catch (e) {
61
- pathBuilder = new pathBuilder({ rootDir });
62
- }
51
+ if (typeof pathBuilder === 'function') {
52
+ try {
53
+ pathBuilder = pathBuilder({ rootDir });
54
+ } catch (e) {
55
+ pathBuilder = new pathBuilder({ rootDir });
63
56
  }
64
57
  }
65
58
 
@@ -186,8 +179,6 @@ class ArtifactsManager extends EventEmitter {
186
179
  });
187
180
  }
188
181
 
189
- async onRunStart() {}
190
-
191
182
  async onRunDescribeStart(suite) {
192
183
  await this._callPlugins('ascending', 'onRunDescribeStart', suite);
193
184
  }
@@ -196,22 +187,14 @@ class ArtifactsManager extends EventEmitter {
196
187
  await this._callPlugins('ascending', 'onTestStart', testSummary);
197
188
  }
198
189
 
199
- async onHookStart() {}
200
-
201
190
  async onHookFailure(testSummary) {
202
191
  await this._callPlugins('plain', 'onHookFailure', testSummary);
203
192
  }
204
193
 
205
- async onHookSuccess() {}
206
-
207
- async onTestFnStart() {}
208
-
209
194
  async onTestFnFailure(testSummary) {
210
195
  await this._callPlugins('plain', 'onTestFnFailure', testSummary);
211
196
  }
212
197
 
213
- async onTestFnSuccess() {}
214
-
215
198
  async onTestDone(testSummary) {
216
199
  await this._callPlugins('descending', 'onTestDone', testSummary);
217
200
  }
@@ -220,35 +203,27 @@ class ArtifactsManager extends EventEmitter {
220
203
  await this._callPlugins('descending', 'onRunDescribeFinish', suite);
221
204
  }
222
205
 
223
- async onRunFinish() {}
224
-
225
206
  async onBeforeCleanup() {
226
207
  await this._callPlugins('descending', 'onBeforeCleanup');
227
208
  await this._idlePromise;
228
209
  }
229
210
 
230
211
  async _callSinglePlugin(pluginId, methodName, ...args) {
231
- const callSignature = this._composeCallSignature('artifactsManager', methodName, args);
232
- log.trace(Object.assign({ event: 'ARTIFACTS_LIFECYCLE', fn: methodName }, ...args), callSignature);
233
-
234
212
  const plugin = this._artifactPlugins[pluginId];
235
213
  try {
236
214
  await plugin[methodName](...args);
237
215
  } catch (e) {
238
- this._unhandledPluginExceptionHandler(e, { plugin, methodName, args });
216
+ this._unhandledPluginExceptionHandler(e, { plugin, methodName });
239
217
  }
240
218
  }
241
219
 
242
220
  async _callPlugins(strategy, methodName, ...args) {
243
- const callSignature = this._composeCallSignature('artifactsManager', methodName, args);
244
- log.trace(Object.assign({ event: 'ARTIFACTS_LIFECYCLE', fn: methodName }, ...args), callSignature);
245
-
246
221
  for (const pluginGroup of this._groupPlugins(strategy)) {
247
222
  await Promise.all(pluginGroup.map(async (plugin) => {
248
223
  try {
249
224
  await plugin[methodName](...args);
250
225
  } catch (e) {
251
- this._unhandledPluginExceptionHandler(e, { plugin, methodName, args });
226
+ this._unhandledPluginExceptionHandler(e, { plugin, methodName });
252
227
  }
253
228
  }));
254
229
  }
@@ -278,28 +253,20 @@ class ArtifactsManager extends EventEmitter {
278
253
  }
279
254
  }
280
255
 
281
- _composeCallSignature(object, methodName, args) {
282
- const argsString = args.map(arg => util.inspect(arg)).join(', ');
283
- return `${object}.${methodName}(${argsString})`;
284
- }
285
-
286
- _unhandledPluginExceptionHandler(err, { plugin, methodName, args }) {
256
+ _unhandledPluginExceptionHandler(err, { plugin, methodName }) {
287
257
  const logObject = {
288
- event: 'ERROR',
289
258
  plugin: plugin.name,
290
- err,
291
259
  methodName,
260
+ err,
292
261
  };
293
262
 
294
- const callSignature = this._composeCallSignature(plugin.name, methodName, args);
295
- log.warn(logObject, `Suppressed error inside function call: ${callSignature}`);
263
+ log.warn(logObject, `Suppressed error inside function call.`);
296
264
  }
297
265
 
298
266
  _idleCallbackErrorHandle(err, caller) {
299
267
  this._unhandledPluginExceptionHandler(err, {
300
268
  plugin: caller,
301
269
  methodName: 'onIdleCallback',
302
- args: []
303
270
  });
304
271
  }
305
272
  }
@@ -2,7 +2,7 @@
2
2
  const fs = require('fs-extra');
3
3
  const _ = require('lodash');
4
4
 
5
- const log = require('../../../utils/logger').child({ __filename });
5
+ const log = require('../../../utils/logger').child({ cat: 'artifact' });
6
6
  const FileArtifact = require('../../templates/artifact/FileArtifact');
7
7
  const InstrumentsArtifactRecording = require('../InstrumentsArtifactRecording');
8
8
 
@@ -37,9 +37,9 @@ class SimulatorInstrumentsRecording extends InstrumentsArtifactRecording {
37
37
  SimulatorInstrumentsRecording.hintAboutDetoxInstruments = _.once(() => {
38
38
  log.warn(`Make sure either:
39
39
  1. You have installed Detox Instruments:
40
- https://github.com/wix/DetoxInstruments#installation
40
+ https://github.com/wix/DetoxInstruments#installation
41
41
  2. You have integrated Detox Instruments in your app:
42
- https://github.com/wix/DetoxInstruments/blob/master/Documentation/XcodeIntegrationGuide.md
42
+ https://github.com/wix/DetoxInstruments/blob/master/Documentation/XcodeIntegrationGuide.md
43
43
  3. You have set the environment variable with your custom Detox Instruments location:
44
44
  export DETOX_INSTRUMENTS_PATH="/path/to/Detox Instruments.app"`);
45
45
  });
@@ -2,7 +2,7 @@
2
2
  const fs = require('fs-extra');
3
3
 
4
4
  const childProcess = require('../../../utils/childProcess');
5
- const log = require('../../../utils/logger').child({ __filename });
5
+ const log = require('../../../utils/logger').child({ cat: 'artifact' });
6
6
  const sleep = require('../../../utils/sleep');
7
7
  const Artifact = require('../../templates/artifact/Artifact');
8
8
  const FileArtifact = require('../../templates/artifact/FileArtifact');
@@ -1,7 +1,7 @@
1
1
  const path = require('path');
2
2
 
3
3
  const fs = require('../../utils/fsext');
4
- const log = require('../../utils/logger').child({ __filename });
4
+ const log = require('../../utils/logger').child({ cat: 'artifacts-plugin,artifacts' });
5
5
  const FileArtifact = require('../templates/artifact/FileArtifact');
6
6
  const temporaryPath = require('../utils/temporaryPath');
7
7
 
@@ -1,5 +1,5 @@
1
1
  // @ts-nocheck
2
- const log = require('../../../utils/logger').child({ __filename });
2
+ const log = require('../../../utils/logger').child({ cat: 'artifact' });
3
3
 
4
4
  class Artifact {
5
5
  constructor(template) {
@@ -3,7 +3,7 @@
3
3
 
4
4
  const _ = require('lodash');
5
5
 
6
- const log = require('../../../utils/logger').child({ __filename });
6
+ const log = require('../../../utils/logger').child({ cat: 'artifacts-plugin,artifacts' });
7
7
 
8
8
  /***
9
9
  * Almost non-opinionated building block for any artifact type
@@ -0,0 +1,7 @@
1
+ const TIMELINE_CONTEXT_TYPES = {
2
+ TEST: 'test',
3
+ DESCRIBE: 'describe',
4
+ INVOCATION: 'invocation'
5
+ };
6
+
7
+ module.exports = TIMELINE_CONTEXT_TYPES;
@@ -2,15 +2,26 @@ const path = require('path');
2
2
 
3
3
  const tempfile = require('tempfile');
4
4
 
5
+ function createTempFileBuilderFn(fileExtension) {
6
+ /**
7
+ * @param {string} [basename]
8
+ */
9
+ return (basename) => {
10
+ return basename
11
+ ? path.join(path.dirname(tempfile()), `${basename}.detox.${fileExtension}`)
12
+ : tempfile(`.detox.${fileExtension}`);
13
+ };
14
+ }
15
+
5
16
  module.exports = {
6
17
  for: {
7
- json: () => tempfile('.detox.json'),
8
- jsonl: () => tempfile('.detox.jsonl'),
9
- png: () => tempfile('.detox.png'),
10
- log: () => tempfile('.detox.log'),
11
- mp4: () => tempfile('.detox.mp4'),
12
- dtxrec: () => tempfile('.detox.dtxrec'),
13
- viewhierarchy: () => tempfile('.detox.viewhierarchy'),
18
+ json: createTempFileBuilderFn('json'),
19
+ jsonl: createTempFileBuilderFn('jsonl'),
20
+ png: createTempFileBuilderFn('png'),
21
+ log: createTempFileBuilderFn('log'),
22
+ mp4: createTempFileBuilderFn('mp4'),
23
+ dtxrec: createTempFileBuilderFn('dtxrec'),
24
+ viewhierarchy: createTempFileBuilderFn('viewhierarchy'),
14
25
  },
15
26
  mask: () => path.join(tempfile(), '..') + path.sep + '*.detox.*',
16
27
  };
@@ -1,7 +1,7 @@
1
1
  const fs = require('fs-extra');
2
2
 
3
3
  const { interruptProcess } = require('../../utils/childProcess');
4
- const log = require('../../utils/logger').child({ __filename });
4
+ const log = require('../../utils/logger').child({ cat: 'artifacts-plugin,artifact' });
5
5
  const Artifact = require('../templates/artifact/Artifact');
6
6
  const FileArtifact = require('../templates/artifact/FileArtifact');
7
7
  const temporaryPath = require('../utils/temporaryPath');
@@ -5,25 +5,16 @@ const WebSocket = require('ws');
5
5
  const DetoxInternalError = require('../errors/DetoxInternalError');
6
6
  const DetoxRuntimeError = require('../errors/DetoxRuntimeError');
7
7
  const Deferred = require('../utils/Deferred');
8
- const log = require('../utils/logger').child({ __filename, cat: 'ws-client,ws' });
8
+ const log = require('../utils/logger').child({ cat: 'ws-client,ws' });
9
9
 
10
10
  const InflightRequest = require('./InflightRequest');
11
11
 
12
- const EVENTS = {
13
- OPEN: Object.freeze({ event: 'WS_OPEN' }),
14
- ERROR: Object.freeze({ event: 'WS_ERROR' }),
15
- MESSAGE: Object.freeze({ event: 'WS_MESSAGE' }),
16
- SEND: Object.freeze({ event: 'WS_SEND' }),
17
- LATE_RESPONSE: Object.freeze({ event: 'WS_LATE_RESPONSE' }),
18
- };
19
-
20
12
  const DEFAULT_SEND_OPTIONS = {
21
13
  timeout: 0,
22
14
  };
23
15
 
24
16
  class AsyncWebSocket {
25
17
  constructor(url) {
26
- this._log = log.child({ url });
27
18
  this._url = url;
28
19
  this._ws = null;
29
20
  this._eventCallbacks = {};
@@ -99,9 +90,9 @@ class AsyncWebSocket {
99
90
 
100
91
  this.handleMultipleNonAtomicPendingActions();
101
92
 
102
- const messageAsString = JSON.stringify(message);
103
- this._log.trace(EVENTS.SEND, messageAsString);
104
- this._ws.send(messageAsString);
93
+ const payload = JSON.stringify(message);
94
+ log.trace({ data: payload }, 'send message');
95
+ this._ws.send(payload);
105
96
 
106
97
  return inFlight.promise;
107
98
  }
@@ -157,7 +148,7 @@ class AsyncWebSocket {
157
148
  }
158
149
 
159
150
  if (!hasPendingActions) {
160
- log.error(EVENTS.ERROR, DetoxRuntimeError.format(error));
151
+ log.error({ error });
161
152
  }
162
153
  }
163
154
 
@@ -186,7 +177,7 @@ class AsyncWebSocket {
186
177
  * @private
187
178
  */
188
179
  _onOpen(event) { // eslint-disable-line no-unused-vars
189
- this._log.trace(EVENTS.OPEN, `opened web socket to: ${this._url}`);
180
+ log.trace(`opened web socket to: ${this._url}`);
190
181
  this._opening.resolve();
191
182
  this._opening = null;
192
183
  }
@@ -234,7 +225,7 @@ class AsyncWebSocket {
234
225
  const data = event && event.data || null;
235
226
 
236
227
  try {
237
- this._log.trace(EVENTS.MESSAGE, data);
228
+ log.trace({ data }, 'get message');
238
229
 
239
230
  const json = JSON.parse(data);
240
231
  if (!json || !json.type) {
@@ -259,7 +250,7 @@ class AsyncWebSocket {
259
250
 
260
251
  if (!handled) {
261
252
  if (this._abortedMessageIds.has(json.messageId)) {
262
- log.debug(EVENTS.LATE_RESPONSE, `Received late response for messageId=${json.messageId}`);
253
+ log.debug({ messageId: json.messageId }, `late response`);
263
254
  } else {
264
255
  throw new DetoxRuntimeError('Unexpected message received over the web socket: ' + json.type);
265
256
  }
@@ -9,7 +9,7 @@ const DetoxRuntimeError = require('../errors/DetoxRuntimeError');
9
9
  const failedToReachTheApp = require('../errors/longreads/failedToReachTheApp');
10
10
  const Deferred = require('../utils/Deferred');
11
11
  const { asError, createErrorWithUserStack, replaceErrorStack } = require('../utils/errorUtils');
12
- const log = require('../utils/logger').child({ __filename });
12
+ const log = require('../utils/logger').child({ cat: 'ws-client,ws' });
13
13
 
14
14
  const AsyncWebSocket = require('./AsyncWebSocket');
15
15
  const actions = require('./actions/actions');
@@ -34,6 +34,7 @@ class Client {
34
34
  this._slowInvocationStatusHandle = null;
35
35
  this._whenAppIsConnected = this._invalidState('before connecting to the app');
36
36
  this._whenAppIsReady = this._whenAppIsConnected;
37
+ this._whenAppDisconnected = Deferred.resolved();
37
38
  this._isCleaningUp = false;
38
39
  this._pendingAppCrash = null;
39
40
  this._appTerminationHandle = null;
@@ -201,6 +202,11 @@ class Client {
201
202
  }
202
203
  }
203
204
 
205
+ /** @async */
206
+ waitUntilDisconnected() {
207
+ return this._whenAppDisconnected.promise;
208
+ }
209
+
204
210
  async waitForBackground() {
205
211
  await this.sendAction(new actions.WaitForBackground());
206
212
  }
@@ -301,6 +307,8 @@ class Client {
301
307
  } else {
302
308
  this._whenAppIsConnected = Deferred.resolved();
303
309
  }
310
+
311
+ this._whenAppDisconnected = new Deferred();
304
312
  }
305
313
 
306
314
  _onAppReady() {
@@ -320,6 +328,10 @@ class Client {
320
328
  }
321
329
 
322
330
  _onBeforeAppCrash({ params }) {
331
+ if (this._pendingAppCrash) {
332
+ return;
333
+ }
334
+
323
335
  this._pendingAppCrash = new DetoxRuntimeError({
324
336
  message: 'The app has crashed, see the details below:',
325
337
  debugInfo: params.errorDetails,
@@ -338,10 +350,15 @@ class Client {
338
350
  this._whenAppIsReady = this._whenAppIsConnected;
339
351
 
340
352
  if (this._pendingAppCrash) {
353
+ this._whenAppDisconnected.reject(this._pendingAppCrash);
341
354
  this._asyncWebSocket.rejectAll(this._pendingAppCrash);
342
355
  this._pendingAppCrash = null;
343
356
  } else if (this._asyncWebSocket.hasPendingActions()) {
344
- this._asyncWebSocket.rejectAll(new DetoxRuntimeError('The app has unexpectedly disconnected from Detox server.'));
357
+ const error = new DetoxRuntimeError('The app has unexpectedly disconnected from Detox server.');
358
+ this._asyncWebSocket.rejectAll(error);
359
+ this._whenAppDisconnected.resolve();
360
+ } else {
361
+ this._whenAppDisconnected.resolve();
345
362
  }
346
363
  }
347
364
 
@@ -1,7 +1,7 @@
1
1
  const { makeResourceTitle, makeResourceSubTitle } = require('./utils');
2
2
 
3
3
  function makeURLDescription(url, urlCount) {
4
- return makeResourceSubTitle(`URL #${urlCount}: ${url}.`);
4
+ return makeResourceSubTitle(`URL #${urlCount}: ${url}`);
5
5
  }
6
6
 
7
7
  module.exports = function(properties) {
@@ -1,9 +1,6 @@
1
1
  const _ = require('lodash');
2
2
 
3
3
  const argparse = require('../utils/argparse');
4
- const log = require('../utils/logger').child({ __filename });
5
-
6
- const { DEVICE_LAUNCH_ARGS_GENERIC_DEPRECATION } = require('./utils/warnings');
7
4
 
8
5
  const asBoolean = (value) => {
9
6
  if (typeof value === 'boolean') {
@@ -25,14 +22,6 @@ const asNumber = (value) => {
25
22
  : undefined;
26
23
  };
27
24
 
28
- const deprecateDeviceLaunchArgs = (value) => {
29
- if (value) {
30
- log.warn(DEVICE_LAUNCH_ARGS_GENERIC_DEPRECATION);
31
- }
32
-
33
- return value;
34
- };
35
-
36
25
  function collectCliConfig({ argv }) {
37
26
  const env = (key) => argparse.getArgValue(key);
38
27
  const get = (key, fallback) => {
@@ -51,7 +40,7 @@ function collectCliConfig({ argv }) {
51
40
  configPath: get('config-path'),
52
41
  configuration: get('configuration'),
53
42
  debugSynchronization: asNumber(get('debug-synchronization')),
54
- deviceBootArgs: get('device-boot-args', deprecateDeviceLaunchArgs(argparse.getEnvValue('device-launch-args'))),
43
+ deviceBootArgs: get('device-boot-args'),
55
44
  appLaunchArgs: get('app-launch-args'),
56
45
  deviceName: get('device-name'),
57
46
  forceAdbInstall: asBoolean(get('force-adb-install')),
@@ -144,6 +144,10 @@ function validateAppConfig({ appConfig, appPath, deviceConfig, errorComposer })
144
144
  if (appConfig.launchArgs && !_.isObject(appConfig.launchArgs)) {
145
145
  throw errorComposer.malformedAppLaunchArgs(appPath);
146
146
  }
147
+
148
+ if (appConfig.type !== 'android.apk' && appConfig.reversePorts) {
149
+ throw errorComposer.unsupportedReversePorts(appPath);
150
+ }
147
151
  }
148
152
 
149
153
  module.exports = composeAppsConfig;
@@ -2,7 +2,7 @@
2
2
  const _ = require('lodash');
3
3
 
4
4
  const environmentFactory = require('../environmentFactory');
5
- const log = require('../utils/logger').child({ __filename });
5
+ const log = require('../utils/logger').child({ cat: 'config' });
6
6
 
7
7
  /**
8
8
  * @param {DetoxConfigErrorComposer} opts.errorComposer
@@ -7,25 +7,34 @@ const { castLevel, defaultOptions } = require('../logger/DetoxLogger');
7
7
  * @param {Detox.DetoxConfig} opts.globalConfig
8
8
  * @param {Detox.DetoxConfiguration} opts.localConfig
9
9
  * @param {*} opts.cliConfig
10
- * @returns {Detox.DetoxLoggerConfig}
11
10
  */
12
11
  function composeLoggerConfig(opts) {
13
12
  const { globalConfig, localConfig, cliConfig } = opts;
14
13
 
15
- return _.merge(
14
+ const items = [
16
15
  {
17
16
  level: 'info',
18
- overrideConsole: 'sandbox',
19
- options: {
20
- ...defaultOptions,
21
- prefixers: {
22
- ...defaultOptions.prefixers,
23
- },
24
- },
17
+ overrideConsole: true,
18
+ options: defaultOptions,
25
19
  },
26
20
  globalConfig.logger,
27
21
  localConfig.logger,
28
22
  adaptCLI(cliConfig),
23
+ ];
24
+
25
+ return items.reduce(
26
+ /**
27
+ * @param {Partial<Detox.DetoxLoggerConfig>} acc
28
+ * @param config
29
+ */
30
+ (acc, config) => {
31
+ if (!config) return acc;
32
+ const { options } = config;
33
+ return _.merge(acc, {
34
+ options: typeof options === 'function' ? options(acc) : options
35
+ });
36
+ },
37
+ items.reduce((a, b) => _.merge(a, _.omit(b, 'options')))
29
38
  );
30
39
  }
31
40
 
@@ -37,7 +46,7 @@ function adaptCLI(cliConfig) {
37
46
  }
38
47
 
39
48
  if (cliConfig.useCustomLogger !== undefined) {
40
- result.overrideConsole = cliConfig.useCustomLogger ? 'all' : 'none';
49
+ result.overrideConsole = cliConfig.useCustomLogger;
41
50
  }
42
51
 
43
52
  if (cliConfig.noColor) {
@@ -2,17 +2,19 @@ const os = require('os');
2
2
 
3
3
  const _ = require('lodash');
4
4
 
5
+ const log = require('../utils/logger');
6
+
5
7
  /**
6
8
  * @param {object} opts
7
9
  * @param {Detox.DetoxConfig} opts.globalConfig
8
10
  * @param {Detox.DetoxConfiguration} opts.localConfig
9
- * @param {DetoxInternals.DetoxCLIConfig} opts.cliConfig
11
+ * @param {DetoxInternals.CLIConfig} opts.cliConfig
10
12
  * @param {Record<string, any>} opts.testRunnerArgv
11
13
  * @param {import('../errors/DetoxConfigErrorComposer')} opts.errorComposer
12
14
  * @returns {Detox.DetoxTestRunnerConfig} opts.testRunnerArgv
13
15
  */
14
16
  function composeRunnerConfig(opts) {
15
- const globalConfig = opts.globalConfig.testRunner;
17
+ const globalConfig = adaptLegacyRunnerConfig(opts.globalConfig);
16
18
  if (globalConfig != null && typeof globalConfig !== 'object') {
17
19
  throw opts.errorComposer.invalidTestRunnerProperty(true);
18
20
  }
@@ -29,8 +31,12 @@ function composeRunnerConfig(opts) {
29
31
  {
30
32
  retries: 0,
31
33
  inspectBrk: inspectBrkHookDefault,
34
+ forwardEnv: false,
35
+ bail: false,
32
36
  jest: {
33
- initTimeout: 300000,
37
+ setupTimeout: 300000,
38
+ teardownTimeout: 30000,
39
+ retryAfterCircusRetries: false,
34
40
  reportSpecs: undefined,
35
41
  reportWorkerAssign: true,
36
42
  },
@@ -50,16 +56,62 @@ function composeRunnerConfig(opts) {
50
56
 
51
57
  if (typeof merged.inspectBrk === 'function') {
52
58
  if (cliConfig.inspectBrk) {
59
+ merged.retries = 0;
60
+ merged.forwardEnv = true;
53
61
  merged.inspectBrk(merged);
54
- merged.inspectBrk = true;
55
- } else {
56
- merged.inspectBrk = false;
57
62
  }
63
+
64
+ delete merged.inspectBrk;
58
65
  }
59
66
 
60
67
  return merged;
61
68
  }
62
69
 
70
+ function adaptLegacyRunnerConfig(globalConfig) {
71
+ let isLegacy = false;
72
+
73
+ const runnerConfigKey = 'runnerConfig' in globalConfig ? 'runnerConfig' : 'runner-config';
74
+ if (_.isString(globalConfig[runnerConfigKey])) {
75
+ isLegacy = true;
76
+ log.warn(`Detected a deprecated "${runnerConfigKey}" property (string).`);
77
+ }
78
+
79
+ const testRunnerKey = 'testRunner' in globalConfig ? 'testRunner' : 'test-runner';
80
+ if (_.isString(globalConfig[testRunnerKey])) {
81
+ isLegacy = true;
82
+ log.warn(`Detected a deprecated "${testRunnerKey}" property (string).`);
83
+ }
84
+
85
+ if (globalConfig.specs != null) {
86
+ isLegacy = true;
87
+ log.warn(`Detected a deprecated "specs" property.`);
88
+ }
89
+
90
+ if (!isLegacy) {
91
+ return globalConfig.testRunner;
92
+ }
93
+
94
+ log.warn(`Please migrate your Detox config according to the guide:\nhttps://wix.github.io/Detox/docs/guide/migration\n`);
95
+ const testRunner = globalConfig[testRunnerKey];
96
+ const runnerConfig = globalConfig[runnerConfigKey];
97
+ const specs = globalConfig.specs != null ? String(globalConfig.specs) : undefined;
98
+
99
+ const args = {};
100
+ if (_.isString(testRunner)) {
101
+ args.$0 = testRunner;
102
+ }
103
+
104
+ if (_.isString(runnerConfig)) {
105
+ args.config = runnerConfig;
106
+ }
107
+
108
+ if (specs) {
109
+ args._ = [specs];
110
+ }
111
+
112
+ return { args };
113
+ }
114
+
63
115
  function hasEmptyPositionalArgs(value, key) {
64
116
  return key === '_' ? _.isEmpty(value) : false;
65
117
  }
@@ -68,9 +120,10 @@ function hasEmptyPositionalArgs(value, key) {
68
120
  * @param {Detox.DetoxTestRunnerConfig} config
69
121
  */
70
122
  function inspectBrkHookDefault(config) {
71
- config.args.$0 = /* istanbul ignore if */ os.platform() === 'win32'
72
- ? `node --inspect-brk ./node_modules/jest/bin/jest.js`
73
- : `node --inspect-brk ./node_modules/.bin/jest`;
123
+ /* istanbul ignore next */
124
+ config.args.$0 = os.platform() !== 'win32'
125
+ ? `node --inspect-brk ./node_modules/.bin/jest`
126
+ : `node --inspect-brk ./node_modules/jest/bin/jest.js`;
74
127
  config.args.runInBand = true;
75
128
  delete config.args.w;
76
129
  delete config.args.workers;