detox 20.0.4-breaking.new-global-lifecycle.0 → 20.0.7-prerelease.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (137) hide show
  1. package/Detox-android/com/wix/detox/{20.0.4-breaking.new-global-lifecycle.0/detox-20.0.4-breaking.new-global-lifecycle.0-javadoc.jar → 20.0.7-prerelease.0/detox-20.0.7-prerelease.0-javadoc.jar} +0 -0
  2. package/Detox-android/com/wix/detox/20.0.7-prerelease.0/detox-20.0.7-prerelease.0-javadoc.jar.md5 +1 -0
  3. package/Detox-android/com/wix/detox/20.0.7-prerelease.0/detox-20.0.7-prerelease.0-javadoc.jar.sha1 +1 -0
  4. package/Detox-android/com/wix/detox/20.0.7-prerelease.0/detox-20.0.7-prerelease.0-javadoc.jar.sha256 +1 -0
  5. package/Detox-android/com/wix/detox/20.0.7-prerelease.0/detox-20.0.7-prerelease.0-javadoc.jar.sha512 +1 -0
  6. package/Detox-android/com/wix/detox/{20.0.4-breaking.new-global-lifecycle.0/detox-20.0.4-breaking.new-global-lifecycle.0-sources.jar → 20.0.7-prerelease.0/detox-20.0.7-prerelease.0-sources.jar} +0 -0
  7. package/Detox-android/com/wix/detox/20.0.7-prerelease.0/detox-20.0.7-prerelease.0-sources.jar.md5 +1 -0
  8. package/Detox-android/com/wix/detox/20.0.7-prerelease.0/detox-20.0.7-prerelease.0-sources.jar.sha1 +1 -0
  9. package/Detox-android/com/wix/detox/20.0.7-prerelease.0/detox-20.0.7-prerelease.0-sources.jar.sha256 +1 -0
  10. package/Detox-android/com/wix/detox/20.0.7-prerelease.0/detox-20.0.7-prerelease.0-sources.jar.sha512 +1 -0
  11. package/Detox-android/com/wix/detox/20.0.7-prerelease.0/detox-20.0.7-prerelease.0.aar +0 -0
  12. package/Detox-android/com/wix/detox/20.0.7-prerelease.0/detox-20.0.7-prerelease.0.aar.md5 +1 -0
  13. package/Detox-android/com/wix/detox/20.0.7-prerelease.0/detox-20.0.7-prerelease.0.aar.sha1 +1 -0
  14. package/Detox-android/com/wix/detox/20.0.7-prerelease.0/detox-20.0.7-prerelease.0.aar.sha256 +1 -0
  15. package/Detox-android/com/wix/detox/20.0.7-prerelease.0/detox-20.0.7-prerelease.0.aar.sha512 +1 -0
  16. package/Detox-android/com/wix/detox/{20.0.4-breaking.new-global-lifecycle.0/detox-20.0.4-breaking.new-global-lifecycle.0.pom → 20.0.7-prerelease.0/detox-20.0.7-prerelease.0.pom} +1 -1
  17. package/Detox-android/com/wix/detox/20.0.7-prerelease.0/detox-20.0.7-prerelease.0.pom.md5 +1 -0
  18. package/Detox-android/com/wix/detox/20.0.7-prerelease.0/detox-20.0.7-prerelease.0.pom.sha1 +1 -0
  19. package/Detox-android/com/wix/detox/20.0.7-prerelease.0/detox-20.0.7-prerelease.0.pom.sha256 +1 -0
  20. package/Detox-android/com/wix/detox/20.0.7-prerelease.0/detox-20.0.7-prerelease.0.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/android/detox/proguard-rules-app.pro +4 -0
  29. package/android/detox/src/full/java/com/wix/detox/DetoxCrashHandler.kt +1 -1
  30. package/android/detox/src/full/java/com/wix/detox/LaunchArgs.java +9 -0
  31. package/android/detox/src/full/java/com/wix/detox/TestEngineFacade.kt +1 -1
  32. package/android/detox/src/full/java/com/wix/detox/reactnative/ReactNativeExtension.kt +15 -2
  33. package/android/detox/src/full/java/com/wix/detox/reactnative/ReactNativeIdlingResources.kt +43 -38
  34. package/index.d.ts +58 -40
  35. package/internals.d.ts +63 -15
  36. package/local-cli/cli.js +1 -1
  37. package/local-cli/rebuild-framework-cache.js +1 -1
  38. package/local-cli/test.js +3 -2
  39. package/local-cli/test.test.js +1 -1
  40. package/local-cli/testCommand/TestRunnerCommand.js +10 -7
  41. package/package.json +5 -4
  42. package/runners/jest/globalSetup.js +1 -1
  43. package/runners/jest/globalTeardown.js +1 -1
  44. package/runners/jest/testEnvironment/index.js +36 -18
  45. package/runners/jest/testEnvironment/listeners/DetoxCoreListener.js +76 -41
  46. package/runners/jest/testEnvironment/listeners/SpecReporter.js +1 -1
  47. package/runners/jest/testEnvironment/listeners/WorkerAssignReporter.js +1 -1
  48. package/src/DetoxWorker.js +4 -7
  49. package/src/android/core/NativeElement.js +56 -20
  50. package/src/android/core/NativeExpect.js +28 -9
  51. package/src/android/interactions/native.js +24 -18
  52. package/src/artifacts/ArtifactsManager.js +8 -23
  53. package/src/artifacts/instruments/ios/SimulatorInstrumentsRecording.js +3 -3
  54. package/src/artifacts/log/ios/SimulatorLogRecording.js +1 -1
  55. package/src/artifacts/screenshot/SimulatorScreenshotPlugin.js +1 -1
  56. package/src/artifacts/templates/artifact/Artifact.js +1 -1
  57. package/src/artifacts/templates/plugin/ArtifactPlugin.js +1 -1
  58. package/src/artifacts/timeline/TimelineContextTypes.js +7 -0
  59. package/src/artifacts/utils/temporaryPath.js +18 -7
  60. package/src/artifacts/video/SimulatorRecordVideoPlugin.js +1 -1
  61. package/src/client/AsyncWebSocket.js +8 -17
  62. package/src/client/Client.js +19 -2
  63. package/src/configuration/collectCliConfig.js +1 -1
  64. package/src/configuration/composeDeviceConfig.js +1 -1
  65. package/src/configuration/composeLoggerConfig.js +17 -8
  66. package/src/configuration/composeRunnerConfig.js +1 -1
  67. package/src/configuration/index.js +5 -1
  68. package/src/configuration/loadExternalConfig.js +1 -1
  69. package/src/devices/allocation/DeviceAllocator.js +3 -2
  70. package/src/devices/allocation/drivers/android/emulator/AVDValidator.js +1 -1
  71. package/src/devices/allocation/drivers/android/emulator/EmulatorAllocDriver.js +3 -2
  72. package/src/devices/allocation/drivers/android/emulator/EmulatorAllocationHelper.js +1 -1
  73. package/src/devices/allocation/drivers/android/emulator/EmulatorLauncher.js +3 -2
  74. package/src/devices/allocation/drivers/android/emulator/EmulatorVersionResolver.js +4 -6
  75. package/src/devices/allocation/drivers/android/emulator/launchEmulatorProcess.js +1 -1
  76. package/src/devices/allocation/drivers/android/genycloud/GenyInstanceAllocationHelper.js +1 -1
  77. package/src/devices/common/drivers/android/genycloud/services/GenyInstanceNaming.js +3 -3
  78. package/src/devices/common/drivers/android/genycloud/services/GenyRecipesService.js +1 -1
  79. package/src/devices/common/drivers/android/tools/EmulatorTelnet.js +1 -1
  80. package/src/devices/common/drivers/android/tools/FreeDeviceFinder.js +1 -1
  81. package/src/devices/common/drivers/android/tools/MonitoredInstrumentation.js +1 -1
  82. package/src/devices/common/drivers/ios/tools/AppleSimUtils.js +4 -2
  83. package/src/devices/lifecycle/GenyGlobalLifecycleHandler.js +9 -13
  84. package/src/devices/runtime/RuntimeDevice.js +9 -12
  85. package/src/devices/runtime/drivers/DeviceDriverBase.js +1 -1
  86. package/src/devices/runtime/drivers/android/AndroidDriver.js +10 -2
  87. package/src/devices/runtime/drivers/ios/SimulatorDriver.js +1 -1
  88. package/src/ios/expectTwo.js +152 -67
  89. package/src/ipc/IPCClient.js +3 -8
  90. package/src/ipc/IPCServer.js +11 -11
  91. package/src/ipc/{state.js → SessionState.js} +23 -50
  92. package/src/logger/DetoxLogger.js +268 -155
  93. package/src/logger/index.js +4 -0
  94. package/src/logger/utils/BunyanLogger.js +72 -0
  95. package/src/logger/utils/CategoryThreadDispatcher.js +58 -0
  96. package/src/logger/utils/MessageStack.js +24 -0
  97. package/src/logger/{TraceThreadDispatcher.js → utils/ThreadDispatcher.js} +34 -5
  98. package/src/logger/{customConsoleLogger.js → utils/customConsoleLogger.js} +4 -4
  99. package/src/logger/utils/sanitizeBunyanContext.js +28 -0
  100. package/src/logger/utils/tracerLegacy.js +48 -0
  101. package/src/realms/DetoxContext.js +65 -57
  102. package/src/realms/DetoxInternalsFacade.js +7 -5
  103. package/src/realms/DetoxPrimaryContext.js +125 -40
  104. package/src/realms/DetoxSecondaryContext.js +24 -29
  105. package/src/server/DetoxConnection.js +18 -23
  106. package/src/server/DetoxServer.js +7 -10
  107. package/src/server/DetoxSession.js +6 -6
  108. package/src/server/DetoxSessionManager.js +1 -1
  109. package/src/server/handlers/RegisteredConnectionHandler.js +1 -2
  110. package/src/symbols.js +12 -8
  111. package/src/utils/childProcess/exec.js +1 -1
  112. package/src/utils/childProcess/spawn.js +1 -1
  113. package/src/utils/errorUtils.js +4 -3
  114. package/src/utils/invocationTraceDescriptions.js +43 -0
  115. package/src/utils/streamUtils.js +10 -11
  116. package/src/utils/trace.js +2 -18
  117. package/src/utils/traceMethods.js +15 -0
  118. package/Detox-android/com/wix/detox/20.0.4-breaking.new-global-lifecycle.0/detox-20.0.4-breaking.new-global-lifecycle.0-javadoc.jar.md5 +0 -1
  119. package/Detox-android/com/wix/detox/20.0.4-breaking.new-global-lifecycle.0/detox-20.0.4-breaking.new-global-lifecycle.0-javadoc.jar.sha1 +0 -1
  120. package/Detox-android/com/wix/detox/20.0.4-breaking.new-global-lifecycle.0/detox-20.0.4-breaking.new-global-lifecycle.0-javadoc.jar.sha256 +0 -1
  121. package/Detox-android/com/wix/detox/20.0.4-breaking.new-global-lifecycle.0/detox-20.0.4-breaking.new-global-lifecycle.0-javadoc.jar.sha512 +0 -1
  122. package/Detox-android/com/wix/detox/20.0.4-breaking.new-global-lifecycle.0/detox-20.0.4-breaking.new-global-lifecycle.0-sources.jar.md5 +0 -1
  123. package/Detox-android/com/wix/detox/20.0.4-breaking.new-global-lifecycle.0/detox-20.0.4-breaking.new-global-lifecycle.0-sources.jar.sha1 +0 -1
  124. package/Detox-android/com/wix/detox/20.0.4-breaking.new-global-lifecycle.0/detox-20.0.4-breaking.new-global-lifecycle.0-sources.jar.sha256 +0 -1
  125. package/Detox-android/com/wix/detox/20.0.4-breaking.new-global-lifecycle.0/detox-20.0.4-breaking.new-global-lifecycle.0-sources.jar.sha512 +0 -1
  126. package/Detox-android/com/wix/detox/20.0.4-breaking.new-global-lifecycle.0/detox-20.0.4-breaking.new-global-lifecycle.0.aar +0 -0
  127. package/Detox-android/com/wix/detox/20.0.4-breaking.new-global-lifecycle.0/detox-20.0.4-breaking.new-global-lifecycle.0.aar.md5 +0 -1
  128. package/Detox-android/com/wix/detox/20.0.4-breaking.new-global-lifecycle.0/detox-20.0.4-breaking.new-global-lifecycle.0.aar.sha1 +0 -1
  129. package/Detox-android/com/wix/detox/20.0.4-breaking.new-global-lifecycle.0/detox-20.0.4-breaking.new-global-lifecycle.0.aar.sha256 +0 -1
  130. package/Detox-android/com/wix/detox/20.0.4-breaking.new-global-lifecycle.0/detox-20.0.4-breaking.new-global-lifecycle.0.aar.sha512 +0 -1
  131. package/Detox-android/com/wix/detox/20.0.4-breaking.new-global-lifecycle.0/detox-20.0.4-breaking.new-global-lifecycle.0.pom.md5 +0 -1
  132. package/Detox-android/com/wix/detox/20.0.4-breaking.new-global-lifecycle.0/detox-20.0.4-breaking.new-global-lifecycle.0.pom.sha1 +0 -1
  133. package/Detox-android/com/wix/detox/20.0.4-breaking.new-global-lifecycle.0/detox-20.0.4-breaking.new-global-lifecycle.0.pom.sha256 +0 -1
  134. package/Detox-android/com/wix/detox/20.0.4-breaking.new-global-lifecycle.0/detox-20.0.4-breaking.new-global-lifecycle.0.pom.sha512 +0 -1
  135. package/src/logger/DetoxTraceEventBuilder.js +0 -21
  136. package/src/logger/DetoxTracer.js +0 -133
  137. package/src/utils/ChromeTracingExporter.js +0 -54
@@ -0,0 +1,58 @@
1
+ const _ = require('lodash');
2
+
3
+ const ThreadDispatcher = require('./ThreadDispatcher');
4
+
5
+ class CategoryThreadDispatcher {
6
+ /**
7
+ * @param {object} config
8
+ * @param {Record<string, [number, number?]>} config.categories
9
+ * @param {Detox.Logger} config.logger
10
+ */
11
+ constructor(config) {
12
+ this.categories = config.categories;
13
+ this.dispatchers = _.mapValues(this.categories, (range, name) => {
14
+ return new ThreadDispatcher({
15
+ name,
16
+ logger: config.logger,
17
+ min: range[0],
18
+ max: range[1] || range[0],
19
+ });
20
+ });
21
+ }
22
+
23
+ /**
24
+ * @param {'B' | 'E' | 'i'} ph
25
+ * @param {string[] | undefined} cat
26
+ * @param {string | number} id
27
+ * @returns {number}
28
+ */
29
+ resolve(ph, cat, id) {
30
+ const dispatcher = this._resolveDispatcher(cat);
31
+
32
+ switch (ph) {
33
+ case 'B': return dispatcher.begin(id);
34
+ case 'E': return dispatcher.end(id);
35
+ default: return dispatcher.resolve(id);
36
+ }
37
+ }
38
+
39
+ /** @returns {ThreadDispatcher} */
40
+ _resolveDispatcher(cat) {
41
+ const mainCategory = cat ? cat.split(',', 1)[0] : '';
42
+ return this.dispatchers[mainCategory] || this.dispatchers.default;
43
+ }
44
+
45
+ categorize(tid) {
46
+ return _.findKey(this.categories, ([min, max]) => min <= tid && tid <= max) || 'default';
47
+ }
48
+
49
+ threadize(cat) {
50
+ if (!cat) {
51
+ return this.categories.default[0];
52
+ }
53
+
54
+ return _.find(this.categories, (_, key) => key === cat[0]);
55
+ }
56
+ }
57
+
58
+ module.exports = CategoryThreadDispatcher;
@@ -0,0 +1,24 @@
1
+ class MessageStack {
2
+ constructor() {
3
+ this._map = {};
4
+ }
5
+
6
+ push(tid, msg) {
7
+ if (this._map[tid] == null) {
8
+ this._map[tid] = [];
9
+ }
10
+
11
+ return this._map[tid].push(msg);
12
+ }
13
+
14
+ pop(tid) {
15
+ const stack = this._map[tid];
16
+ if (stack == null || stack.length === 0) {
17
+ return ['<no begin message>'];
18
+ }
19
+
20
+ return stack.pop();
21
+ }
22
+ }
23
+
24
+ module.exports = MessageStack;
@@ -1,6 +1,6 @@
1
1
  const isUndefined = (x) => x === undefined;
2
2
 
3
- class TraceThreadDispatcher {
3
+ class ThreadDispatcher {
4
4
  /**
5
5
  * @param {object} options
6
6
  * @param {Detox.Logger} options.logger
@@ -17,14 +17,31 @@ class TraceThreadDispatcher {
17
17
  this.threads = [];
18
18
  }
19
19
 
20
- begin(id = 0) {
20
+ /**
21
+ * @param {string | number} [id]
22
+ * @returns {number}
23
+ */
24
+ begin(id) {
21
25
  const tid = this._findTID(id);
22
26
  this.threads[tid] = id;
23
27
  this.stacks[tid] = (this.stacks[tid] || 0) + 1;
24
28
  return this._transpose(tid);
25
29
  }
26
30
 
27
- end(id = 0) {
31
+ /**
32
+ * @param {string | number} [id]
33
+ * @returns {number}
34
+ */
35
+ resolve(id) {
36
+ const tid = this._findTID(id);
37
+ return this._transpose(tid);
38
+ }
39
+
40
+ /**
41
+ * @param {string | number} [id]
42
+ * @returns {number}
43
+ */
44
+ end(id) {
28
45
  const tid = this._findTID(id);
29
46
  if (this.stacks[tid] && --this.stacks[tid] === 0) {
30
47
  delete this.threads[tid];
@@ -32,9 +49,17 @@ class TraceThreadDispatcher {
32
49
  return this._transpose(tid);
33
50
  }
34
51
 
52
+ /**
53
+ * @param {string | number | undefined} id
54
+ * @returns {number}
55
+ * @private
56
+ *
57
+ * Memory-efficient finder of a free item index in the threads array.
58
+ */
35
59
  _findTID(id) {
36
60
  let tid = this.threads.indexOf(id);
37
61
  if (tid === -1) {
62
+ // Try to find a recently released slot in the array:
38
63
  tid = this.threads.findIndex(isUndefined);
39
64
  }
40
65
  return tid === -1 ? this.threads.length : tid;
@@ -43,10 +68,14 @@ class TraceThreadDispatcher {
43
68
  _transpose(id) {
44
69
  const result = this.min + id;
45
70
  if (result > this.max) {
46
- this.logger.warn({ event: 'THREAD_DISPATCHER' }, `${this.name} trace thread dispatcher has run out of available thread IDs: ${this.min}..${this.max}`);
71
+ this.logger.warn(
72
+ { cat: ['logger', 'thread-dispatcher'] },
73
+ `${this.name} trace thread dispatcher has run out of available thread IDs: ${this.min}..${this.max}`
74
+ );
47
75
  }
76
+
48
77
  return Math.min(result, this.max);
49
78
  }
50
79
  }
51
80
 
52
- module.exports = TraceThreadDispatcher;
81
+ module.exports = ThreadDispatcher;
@@ -1,6 +1,6 @@
1
1
  const util = require('util');
2
2
 
3
- const callsites = require('../utils/callsites');
3
+ const callsites = require('../../utils/callsites');
4
4
 
5
5
  const USER_STACK_FRAME_INDEX = 2;
6
6
 
@@ -25,20 +25,20 @@ function getStackDump() {
25
25
 
26
26
  function proxyLog(bunyanLoggerFn) {
27
27
  return (...args) => {
28
- bunyanLoggerFn({ event: 'USER_LOG' }, getOrigin(), '\n', util.format(...args));
28
+ bunyanLoggerFn({ origin: getOrigin() }, util.format(...args));
29
29
  };
30
30
  }
31
31
 
32
32
  function proxyTracing(bunyanLoggerFn) {
33
33
  return (...args) => {
34
- bunyanLoggerFn({ event: 'USER_LOG' }, getOrigin(), '\n Trace:', util.format(...args), '\n\r' + getStackDump());
34
+ bunyanLoggerFn({ origin: getOrigin(), stack: getStackDump() }, util.format(...args));
35
35
  };
36
36
  }
37
37
 
38
38
  function proxyAssert(bunyanLoggerFn) {
39
39
  return (condition, ...args) => {
40
40
  if (!condition) {
41
- bunyanLoggerFn({ event: 'USER_LOG' }, getOrigin(), '\n AssertionError:', util.format(...args));
41
+ bunyanLoggerFn({ origin: getOrigin() }, 'AssertionError:', util.format(...args));
42
42
  }
43
43
  };
44
44
  }
@@ -0,0 +1,28 @@
1
+ const _ = require('lodash');
2
+
3
+ const RESERVED_PROPERTIES = [
4
+ 'hostname',
5
+ 'level',
6
+ 'msg',
7
+ 'name',
8
+ 'pid',
9
+ 'time',
10
+ ];
11
+
12
+ function hasProperty(p) {
13
+ return _.has(this, p);
14
+ }
15
+
16
+ function hasReservedProperties(o) {
17
+ return RESERVED_PROPERTIES.some(hasProperty, o); // eslint-disable-line unicorn/no-array-method-this-argument
18
+ }
19
+
20
+ function escapeCallback(value, key) {
21
+ return RESERVED_PROPERTIES.includes(key) ? `${key}$` : key;
22
+ }
23
+
24
+ function sanitizeBunyanContext(context) {
25
+ return hasReservedProperties(context) ? _.mapKeys(context, escapeCallback) : context;
26
+ }
27
+
28
+ module.exports = sanitizeBunyanContext;
@@ -0,0 +1,48 @@
1
+ const methods = {
2
+ startSection(logger) {
3
+ return (msg, args) => logger.trace.begin(args, msg);
4
+ },
5
+
6
+ endSection(logger) {
7
+ return (msg, args) => logger.trace.end(args);
8
+ },
9
+
10
+ traceCall(logger) {
11
+ return (name, action, args = {}) => logger.trace.complete(args, name, action);
12
+ },
13
+
14
+ invocationCall(logger) {
15
+ return (sectionName, invocation, action) => {
16
+ return logger.trace.complete({
17
+ cat: 'ws-client,ws-client-invocation',
18
+ data: invocation,
19
+ stack: _getCallStackTrace(),
20
+ }, sectionName, action);
21
+ };
22
+ },
23
+ };
24
+
25
+ function _getCallStackTrace() {
26
+ return new Error().stack
27
+ .split('\n')
28
+ .slice(1) // Ignore Error message
29
+ .map(line => line
30
+ .replace(/^\s*at\s+/, '')
31
+ .replace(process.cwd(), '')
32
+ )
33
+ .filter(line => !line.includes('/detox/src')) // Ignore detox internal calls
34
+ .join('\n');
35
+ }
36
+
37
+ function installLegacyTracerInterface(logger, target) {
38
+ target.traceCall = methods.traceCall(logger);
39
+ target.trace = Object.freeze({
40
+ startSection: methods.startSection(logger),
41
+ endSection: methods.endSection(logger),
42
+ invocationCall: methods.invocationCall(logger),
43
+ });
44
+
45
+ return this;
46
+ }
47
+
48
+ module.exports = { install: installLegacyTracerInterface };
@@ -1,48 +1,63 @@
1
1
  const funpermaproxy = require('funpermaproxy');
2
2
 
3
+ const temporary = require('../artifacts/utils/temporaryPath');
3
4
  const { DetoxRuntimeError } = require('../errors');
4
- const DetoxLogger = require('../logger/DetoxLogger');
5
- const DetoxTracer = require('../logger/DetoxTracer');
5
+ const { DetoxLogger, installLegacyTracerInterface } = require('../logger');
6
6
  const symbols = require('../symbols');
7
7
 
8
8
  const DetoxConstants = require('./DetoxConstants');
9
9
 
10
10
  const $cleanup = Symbol('cleanup');
11
- const $logger = Symbol('logger');
12
11
  const $restoreSessionState = Symbol('restoreSessionState');
13
12
  const $sessionState = Symbol('restoreSessionState');
14
- const $tracer = Symbol('tracer');
15
-
16
- const _worker = Symbol('worker');
13
+ const $status = Symbol('status');
14
+ const $worker = Symbol('worker');
17
15
 
18
16
  class DetoxContext {
19
17
  constructor() {
20
- this[symbols.globalSetup] = this[symbols.globalSetup].bind(this);
21
- this[symbols.globalTeardown] = this[symbols.globalTeardown].bind(this);
18
+ /** @type {DetoxInternals.DetoxStatus} */
19
+ this[$status] = 'inactive';
20
+
21
+ const _init = this[symbols.init].bind(this);
22
+ this[symbols.init] = async (opts) => {
23
+ this[$status] = 'init';
24
+ await _init(opts);
25
+ this[$status] = 'active';
26
+ };
27
+
28
+ const _cleanup = this[symbols.cleanup].bind(this);
29
+ this[symbols.cleanup] = async () => {
30
+ this[$status] = 'cleanup';
31
+ try {
32
+ await _cleanup();
33
+ } finally {
34
+ this[$status] = 'inactive';
35
+ }
36
+ };
37
+
38
+ this[symbols.getStatus] = this[symbols.getStatus].bind(this);
22
39
  this[symbols.reportFailedTests] = this[symbols.reportFailedTests].bind(this);
23
40
  this[symbols.resolveConfig] = this[symbols.resolveConfig].bind(this);
24
- this[symbols.setup] = this[symbols.setup].bind(this);
25
- this[symbols.teardown] = this[symbols.teardown].bind(this);
41
+ this[symbols.installWorker] = this[symbols.installWorker].bind(this);
42
+ this[symbols.uninstallWorker] = this[symbols.uninstallWorker].bind(this);
26
43
 
27
44
  this[$sessionState] = this[$restoreSessionState]();
28
45
 
29
- const loggerConfig = this[$sessionState].detoxConfig
30
- ? this[$sessionState].detoxConfig.logger
31
- : undefined;
32
-
33
46
  /**
34
- * @protected
35
47
  * @type {DetoxLogger & Detox.Logger}
36
48
  */
37
- this[$logger] = new DetoxLogger(loggerConfig);
38
- /** @protected */
39
- this[$tracer] = DetoxTracer.default({
40
- logger: this[$logger],
49
+ this[symbols.logger] = new DetoxLogger({
50
+ file: temporary.for.jsonl(`${this[$sessionState].id}.${process.pid}`),
51
+ userConfig: this[$sessionState].detoxConfig
52
+ ? this[$sessionState].detoxConfig.logger
53
+ : null,
41
54
  });
42
- /** @deprecated */
43
- this.traceCall = this[$tracer].bind(this[$tracer]);
55
+
56
+ this.log = this[symbols.logger].child({ cat: 'user' });
57
+ installLegacyTracerInterface(this.log, this);
58
+
44
59
  /** @type {import('../DetoxWorker') | null} */
45
- this[_worker] = null;
60
+ this[$worker] = null;
46
61
  }
47
62
 
48
63
  //#region Public members
@@ -62,19 +77,6 @@ class DetoxContext {
62
77
  return DetoxConstants;
63
78
  }
64
79
 
65
- /**
66
- * @returns {Detox.Logger}
67
- */
68
- get log() {
69
- return this[$logger];
70
- }
71
-
72
- /**
73
- * @returns {Detox.Tracer}
74
- */
75
- get trace() {
76
- return this[$tracer];
77
- }
78
80
  //#endregion
79
81
 
80
82
  //#region Internal members
@@ -96,57 +98,63 @@ class DetoxContext {
96
98
  [symbols.reportFailedTests](_testFilePaths, _permanent) {}
97
99
  /**
98
100
  * @abstract
99
- * @param {Partial<DetoxInternals.DetoxGlobalSetupOptions>} _opts
101
+ * @param {Partial<DetoxInternals.DetoxInitOptions>} _opts
100
102
  * @returns {Promise<DetoxInternals.RuntimeConfig>}
101
103
  */
102
104
  async [symbols.resolveConfig](_opts) { return null; }
103
105
 
106
+ [symbols.getStatus]() {
107
+ return this[$status];
108
+ }
109
+
104
110
  get [symbols.worker]() {
105
- if (!this[_worker]) {
111
+ if (!this[$worker]) {
106
112
  throw new DetoxRuntimeError({
107
- message: `Detox worker instance has not been initialized in this context (${this.constructor.name}).`,
108
- hint: DetoxRuntimeError.reportIssueIfJest + '\n' + 'Otherwise, make sure you call detox.setup() beforehand.',
113
+ message: `Detox worker instance has not been installed in this context (${this.constructor.name}).`,
114
+ hint: DetoxRuntimeError.reportIssueIfJest + '\n' + 'Otherwise, make sure you call detox.installWorker() beforehand.',
109
115
  });
110
116
  }
111
117
 
112
- return this[_worker];
118
+ return this[$worker];
113
119
  }
114
120
 
115
121
  /**
116
122
  * @abstract
117
- * @param {Partial<DetoxInternals.DetoxGlobalSetupOptions>} [_opts]
123
+ * @param {Partial<DetoxInternals.DetoxInitOptions>} [_opts]
118
124
  * @returns {Promise<void>}
119
125
  */
120
- async [symbols.globalSetup](_opts = {}) {}
126
+ async [symbols.init](_opts = {}) {}
121
127
 
122
128
  /**
123
- * @param {Partial<DetoxInternals.DetoxConfigurationSetupOptions>} [opts]
129
+ * @param {Partial<DetoxInternals.DetoxInstallWorkerOptions>} [opts]
124
130
  */
125
- async [symbols.setup](opts) {
126
- const theGlobal = opts.global || global;
127
- theGlobal['__detox__'] = this;
128
- this[$logger].overrideConsole(theGlobal);
131
+ async [symbols.installWorker](opts) {
132
+ if (opts.global) {
133
+ opts.global['__detox__'] = this;
134
+ this.log.overrideConsole(opts.global);
135
+ }
129
136
 
130
137
  const DetoxWorker = require('../DetoxWorker');
131
- DetoxWorker.global = theGlobal;
132
- this[_worker] = new DetoxWorker(this);
133
- await this[_worker].init();
138
+ DetoxWorker.global = opts.global || global;
139
+ this[$worker] = new DetoxWorker(this);
140
+ this[$worker].id = opts.workerId;
141
+ await this[$worker].init();
134
142
  }
135
143
 
136
- async [symbols.teardown]() {
144
+ async [symbols.uninstallWorker]() {
137
145
  try {
138
- if (this[_worker]) {
139
- await this[_worker].cleanup();
146
+ if (this[$worker]) {
147
+ await this[$worker].cleanup();
140
148
  }
141
149
  } finally {
142
- this[_worker] = null;
150
+ this[$worker] = null;
143
151
  }
144
152
  }
145
153
 
146
154
  /**
147
155
  * @abstract
148
156
  */
149
- async [symbols.globalTeardown]() {}
157
+ async [symbols.cleanup]() {}
150
158
  //#endregion
151
159
 
152
160
  //#region Protected members
@@ -163,8 +171,8 @@ class DetoxContext {
163
171
  module.exports = DetoxContext;
164
172
  module.exports.protected = {
165
173
  $cleanup,
166
- $logger,
167
174
  $restoreSessionState,
175
+ $status,
168
176
  $sessionState,
169
- $tracer,
177
+ $worker,
170
178
  };
@@ -8,11 +8,12 @@ class DetoxInternalsFacade {
8
8
  */
9
9
  constructor(context) {
10
10
  this.config = context[symbols.config];
11
- this.globalSetup = context[symbols.globalSetup];
12
- this.globalTeardown = context[symbols.globalTeardown];
13
- this.log = context.log;
14
- this.setup = context[symbols.setup];
15
- this.teardown = context[symbols.teardown];
11
+ this.getStatus = context[symbols.getStatus];
12
+ this.init = context[symbols.init];
13
+ this.cleanup = context[symbols.cleanup];
14
+ this.log = context[symbols.logger];
15
+ this.installWorker = context[symbols.installWorker];
16
+ this.uninstallWorker = context[symbols.uninstallWorker];
16
17
  this.onHookFailure = context[symbols.onHookFailure];
17
18
  this.onHookStart = context[symbols.onHookStart];
18
19
  this.onHookSuccess = context[symbols.onHookSuccess];
@@ -28,6 +29,7 @@ class DetoxInternalsFacade {
28
29
  this.reportFailedTests = context[symbols.reportFailedTests];
29
30
  this.resolveConfig = context[symbols.resolveConfig];
30
31
  this.session = context[symbols.session];
32
+ this.trace = context.trace;
31
33
  this.worker = funpermaproxy(() => context[symbols.worker]);
32
34
  }
33
35
  }