@cucumber/cucumber 7.2.1 → 8.0.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/README.md +11 -4
  2. package/lib/cli/argv_parser.d.ts +1 -2
  3. package/lib/cli/argv_parser.js +8 -12
  4. package/lib/cli/argv_parser.js.map +1 -1
  5. package/lib/cli/configuration_builder.d.ts +0 -1
  6. package/lib/cli/configuration_builder.js +20 -21
  7. package/lib/cli/configuration_builder.js.map +1 -1
  8. package/lib/cli/helpers.d.ts +1 -0
  9. package/lib/cli/helpers.js +49 -22
  10. package/lib/cli/helpers.js.map +1 -1
  11. package/lib/cli/i18n.js +6 -6
  12. package/lib/cli/i18n.js.map +1 -1
  13. package/lib/cli/index.d.ts +1 -1
  14. package/lib/cli/index.js +35 -29
  15. package/lib/cli/index.js.map +1 -1
  16. package/lib/cli/profile_loader.d.ts +3 -3
  17. package/lib/cli/profile_loader.js +17 -10
  18. package/lib/cli/profile_loader.js.map +1 -1
  19. package/lib/cli/publish_banner.js +1 -1
  20. package/lib/cli/publish_banner.js.map +1 -1
  21. package/lib/formatter/builder.d.ts +5 -4
  22. package/lib/formatter/builder.js +38 -52
  23. package/lib/formatter/builder.js.map +1 -1
  24. package/lib/formatter/get_color_fns.d.ts +6 -2
  25. package/lib/formatter/get_color_fns.js +18 -12
  26. package/lib/formatter/get_color_fns.js.map +1 -1
  27. package/lib/formatter/helpers/event_data_collector.d.ts +15 -17
  28. package/lib/formatter/helpers/event_data_collector.js +19 -12
  29. package/lib/formatter/helpers/event_data_collector.js.map +1 -1
  30. package/lib/formatter/helpers/formatters.d.ts +6 -0
  31. package/lib/formatter/helpers/formatters.js +41 -0
  32. package/lib/formatter/helpers/formatters.js.map +1 -0
  33. package/lib/formatter/helpers/gherkin_document_parser.d.ts +5 -6
  34. package/lib/formatter/helpers/gherkin_document_parser.js +24 -40
  35. package/lib/formatter/helpers/gherkin_document_parser.js.map +1 -1
  36. package/lib/formatter/helpers/issue_helpers.d.ts +6 -6
  37. package/lib/formatter/helpers/issue_helpers.js +6 -8
  38. package/lib/formatter/helpers/issue_helpers.js.map +1 -1
  39. package/lib/formatter/helpers/keyword_type.js +1 -5
  40. package/lib/formatter/helpers/keyword_type.js.map +1 -1
  41. package/lib/formatter/helpers/pickle_parser.d.ts +9 -10
  42. package/lib/formatter/helpers/pickle_parser.js +8 -17
  43. package/lib/formatter/helpers/pickle_parser.js.map +1 -1
  44. package/lib/formatter/helpers/step_argument_formatter.d.ts +2 -2
  45. package/lib/formatter/helpers/step_argument_formatter.js.map +1 -1
  46. package/lib/formatter/helpers/summary_helpers.d.ts +2 -2
  47. package/lib/formatter/helpers/summary_helpers.js +39 -20
  48. package/lib/formatter/helpers/summary_helpers.js.map +1 -1
  49. package/lib/formatter/helpers/test_case_attempt_formatter.js +34 -15
  50. package/lib/formatter/helpers/test_case_attempt_formatter.js.map +1 -1
  51. package/lib/formatter/helpers/test_case_attempt_parser.d.ts +5 -5
  52. package/lib/formatter/helpers/test_case_attempt_parser.js +30 -15
  53. package/lib/formatter/helpers/test_case_attempt_parser.js.map +1 -1
  54. package/lib/formatter/helpers/usage_helpers/index.d.ts +3 -3
  55. package/lib/formatter/helpers/usage_helpers/index.js +48 -45
  56. package/lib/formatter/helpers/usage_helpers/index.js.map +1 -1
  57. package/lib/formatter/html_formatter.d.ts +1 -0
  58. package/lib/formatter/html_formatter.js +2 -1
  59. package/lib/formatter/html_formatter.js.map +1 -1
  60. package/lib/formatter/http_stream.js +1 -1
  61. package/lib/formatter/http_stream.js.map +1 -1
  62. package/lib/formatter/index.d.ts +1 -0
  63. package/lib/formatter/index.js.map +1 -1
  64. package/lib/formatter/json_formatter.d.ts +22 -27
  65. package/lib/formatter/json_formatter.js +62 -30
  66. package/lib/formatter/json_formatter.js.map +1 -1
  67. package/lib/formatter/message_formatter.d.ts +1 -0
  68. package/lib/formatter/message_formatter.js +2 -1
  69. package/lib/formatter/message_formatter.js.map +1 -1
  70. package/lib/formatter/progress_bar_formatter.d.ts +7 -6
  71. package/lib/formatter/progress_bar_formatter.js +5 -4
  72. package/lib/formatter/progress_bar_formatter.js.map +1 -1
  73. package/lib/formatter/progress_formatter.d.ts +3 -2
  74. package/lib/formatter/progress_formatter.js +30 -10
  75. package/lib/formatter/progress_formatter.js.map +1 -1
  76. package/lib/formatter/rerun_formatter.d.ts +1 -0
  77. package/lib/formatter/rerun_formatter.js +33 -11
  78. package/lib/formatter/rerun_formatter.js.map +1 -1
  79. package/lib/formatter/snippets_formatter.d.ts +1 -0
  80. package/lib/formatter/snippets_formatter.js +22 -2
  81. package/lib/formatter/snippets_formatter.js.map +1 -1
  82. package/lib/formatter/step_definition_snippet_builder/index.d.ts +3 -3
  83. package/lib/formatter/step_definition_snippet_builder/index.js.map +1 -1
  84. package/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.js +3 -0
  85. package/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.js.map +1 -1
  86. package/lib/formatter/step_definition_snippet_builder/snippet_syntax.d.ts +1 -1
  87. package/lib/formatter/step_definition_snippet_builder/snippet_syntax.js.map +1 -1
  88. package/lib/formatter/summary_formatter.d.ts +3 -2
  89. package/lib/formatter/summary_formatter.js +4 -4
  90. package/lib/formatter/summary_formatter.js.map +1 -1
  91. package/lib/formatter/usage_formatter.d.ts +1 -0
  92. package/lib/formatter/usage_formatter.js +24 -5
  93. package/lib/formatter/usage_formatter.js.map +1 -1
  94. package/lib/formatter/usage_json_formatter.d.ts +1 -0
  95. package/lib/formatter/usage_json_formatter.js +1 -0
  96. package/lib/formatter/usage_json_formatter.js.map +1 -1
  97. package/lib/importer.js +13 -0
  98. package/lib/index.d.ts +15 -12
  99. package/lib/index.js +6 -3
  100. package/lib/index.js.map +1 -1
  101. package/lib/models/data_table.d.ts +3 -4
  102. package/lib/models/data_table.js +9 -7
  103. package/lib/models/data_table.js.map +1 -1
  104. package/lib/models/definition.d.ts +2 -2
  105. package/lib/models/definition.js.map +1 -1
  106. package/lib/models/step_definition.js +1 -2
  107. package/lib/models/step_definition.js.map +1 -1
  108. package/lib/models/test_case_hook_definition.d.ts +2 -2
  109. package/lib/models/test_case_hook_definition.js.map +1 -1
  110. package/lib/models/test_step_hook_definition.d.ts +2 -2
  111. package/lib/models/test_step_hook_definition.js.map +1 -1
  112. package/lib/pickle_filter.d.ts +9 -11
  113. package/lib/pickle_filter.js +9 -9
  114. package/lib/pickle_filter.js.map +1 -1
  115. package/lib/runtime/assemble_test_cases.d.ts +13 -0
  116. package/lib/runtime/assemble_test_cases.js +88 -0
  117. package/lib/runtime/assemble_test_cases.js.map +1 -0
  118. package/lib/runtime/attachment_manager/index.d.ts +2 -2
  119. package/lib/runtime/attachment_manager/index.js +23 -4
  120. package/lib/runtime/attachment_manager/index.js.map +1 -1
  121. package/lib/runtime/helpers.d.ts +3 -2
  122. package/lib/runtime/helpers.js +36 -1
  123. package/lib/runtime/helpers.js.map +1 -1
  124. package/lib/runtime/index.d.ts +3 -4
  125. package/lib/runtime/index.js +27 -43
  126. package/lib/runtime/index.js.map +1 -1
  127. package/lib/runtime/parallel/command_types.d.ts +10 -9
  128. package/lib/runtime/parallel/command_types.js.map +1 -1
  129. package/lib/runtime/parallel/coordinator.d.ts +9 -9
  130. package/lib/runtime/parallel/coordinator.js +62 -55
  131. package/lib/runtime/parallel/coordinator.js.map +1 -1
  132. package/lib/runtime/parallel/worker.d.ts +2 -2
  133. package/lib/runtime/parallel/worker.js +23 -21
  134. package/lib/runtime/parallel/worker.js.map +1 -1
  135. package/lib/runtime/step_runner.d.ts +3 -3
  136. package/lib/runtime/step_runner.js +16 -14
  137. package/lib/runtime/step_runner.js.map +1 -1
  138. package/lib/runtime/stopwatch.d.ts +4 -4
  139. package/lib/runtime/stopwatch.js +21 -2
  140. package/lib/runtime/stopwatch.js.map +1 -1
  141. package/lib/runtime/test_case_runner.d.ts +51 -0
  142. package/lib/runtime/test_case_runner.js +253 -0
  143. package/lib/runtime/test_case_runner.js.map +1 -0
  144. package/lib/stack_trace_filter.js +4 -5
  145. package/lib/stack_trace_filter.js.map +1 -1
  146. package/lib/step_arguments.d.ts +4 -4
  147. package/lib/step_arguments.js.map +1 -1
  148. package/lib/support_code_library_builder/build_helpers.js +14 -10
  149. package/lib/support_code_library_builder/build_helpers.js.map +1 -1
  150. package/lib/support_code_library_builder/index.d.ts +9 -7
  151. package/lib/support_code_library_builder/index.js +10 -24
  152. package/lib/support_code_library_builder/index.js.map +1 -1
  153. package/lib/support_code_library_builder/types.d.ts +22 -23
  154. package/lib/support_code_library_builder/types.js.map +1 -1
  155. package/lib/support_code_library_builder/validate_arguments.js +14 -19
  156. package/lib/support_code_library_builder/validate_arguments.js.map +1 -1
  157. package/lib/support_code_library_builder/world.d.ts +7 -1
  158. package/lib/support_code_library_builder/world.js.map +1 -1
  159. package/lib/time.d.ts +3 -10
  160. package/lib/time.js +39 -48
  161. package/lib/time.js.map +1 -1
  162. package/lib/user_code_runner.js +7 -14
  163. package/lib/user_code_runner.js.map +1 -1
  164. package/lib/value_checker.d.ts +2 -2
  165. package/lib/value_checker.js.map +1 -1
  166. package/lib/wrapper.mjs +38 -0
  167. package/package.json +73 -64
  168. package/CHANGELOG.md +0 -1881
  169. package/lib/runtime/pickle_runner.d.ts +0 -67
  170. package/lib/runtime/pickle_runner.js +0 -305
  171. package/lib/runtime/pickle_runner.js.map +0 -1
  172. package/lib/status.d.ts +0 -3
  173. package/lib/status.js +0 -5
  174. package/lib/status.js.map +0 -1
  175. package/lib/support_code_library_builder/finalize_helpers.d.ts +0 -10
  176. package/lib/support_code_library_builder/finalize_helpers.js +0 -26
  177. package/lib/support_code_library_builder/finalize_helpers.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { messages } from '@cucumber/messages';
1
+ import * as messages from '@cucumber/messages';
2
2
  import { IRuntimeOptions } from '../index';
3
3
  export interface IWorkerCommand {
4
4
  initialize?: IWorkerCommandInitialize;
@@ -9,22 +9,23 @@ export interface IWorkerCommandInitialize {
9
9
  filterStacktraces: boolean;
10
10
  supportCodePaths: string[];
11
11
  supportCodeRequiredModules: string[];
12
+ supportCodeIds?: ICanonicalSupportCodeIds;
12
13
  options: IRuntimeOptions;
13
14
  }
15
+ export interface ICanonicalSupportCodeIds {
16
+ stepDefinitionIds: string[];
17
+ beforeTestCaseHookDefinitionIds: string[];
18
+ afterTestCaseHookDefinitionIds: string[];
19
+ }
14
20
  export interface IWorkerCommandRun {
15
21
  retries: number;
16
22
  skip: boolean;
17
23
  elapsed: number;
18
- pickle: messages.IPickle;
19
- gherkinDocument: messages.IGherkinDocument;
24
+ pickle: messages.Pickle;
25
+ testCase: messages.TestCase;
26
+ gherkinDocument: messages.GherkinDocument;
20
27
  }
21
28
  export interface ICoordinatorReport {
22
29
  jsonEnvelope?: string;
23
30
  ready?: boolean;
24
- supportCodeIds?: ICoordinatorReportSupportCodeIds;
25
- }
26
- export interface ICoordinatorReportSupportCodeIds {
27
- stepDefinitionIds: string[];
28
- beforeTestCaseHookDefinitionIds: string[];
29
- afterTestCaseHookDefinitionIds: string[];
30
31
  }
@@ -1 +1 @@
1
- {"version":3,"file":"command_types.js","sourceRoot":"","sources":["../../../src/runtime/parallel/command_types.ts"],"names":[],"mappings":"","sourcesContent":["import { messages } from '@cucumber/messages'\nimport { IRuntimeOptions } from '../index'\n\n// Messages from Coordinator to Worker\n\nexport interface IWorkerCommand {\n initialize?: IWorkerCommandInitialize\n run?: IWorkerCommandRun\n finalize?: boolean\n}\n\nexport interface IWorkerCommandInitialize {\n filterStacktraces: boolean\n supportCodePaths: string[]\n supportCodeRequiredModules: string[]\n options: IRuntimeOptions\n}\n\nexport interface IWorkerCommandRun {\n retries: number\n skip: boolean\n elapsed: number\n pickle: messages.IPickle\n gherkinDocument: messages.IGherkinDocument\n}\n\n// Messages from Worker to Coordinator\n\nexport interface ICoordinatorReport {\n jsonEnvelope?: string\n ready?: boolean\n supportCodeIds?: ICoordinatorReportSupportCodeIds\n}\n\nexport interface ICoordinatorReportSupportCodeIds {\n stepDefinitionIds: string[]\n beforeTestCaseHookDefinitionIds: string[]\n afterTestCaseHookDefinitionIds: string[]\n}\n"]}
1
+ {"version":3,"file":"command_types.js","sourceRoot":"","sources":["../../../src/runtime/parallel/command_types.ts"],"names":[],"mappings":"","sourcesContent":["import * as messages from '@cucumber/messages'\nimport { IRuntimeOptions } from '../index'\n\n// Messages from Coordinator to Worker\n\nexport interface IWorkerCommand {\n initialize?: IWorkerCommandInitialize\n run?: IWorkerCommandRun\n finalize?: boolean\n}\n\nexport interface IWorkerCommandInitialize {\n filterStacktraces: boolean\n supportCodePaths: string[]\n supportCodeRequiredModules: string[]\n supportCodeIds?: ICanonicalSupportCodeIds\n options: IRuntimeOptions\n}\n\nexport interface ICanonicalSupportCodeIds {\n stepDefinitionIds: string[]\n beforeTestCaseHookDefinitionIds: string[]\n afterTestCaseHookDefinitionIds: string[]\n}\n\nexport interface IWorkerCommandRun {\n retries: number\n skip: boolean\n elapsed: number\n pickle: messages.Pickle\n testCase: messages.TestCase\n gherkinDocument: messages.GherkinDocument\n}\n\n// Messages from Worker to Coordinator\n\nexport interface ICoordinatorReport {\n jsonEnvelope?: string\n ready?: boolean\n}\n"]}
@@ -1,16 +1,18 @@
1
1
  /// <reference types="node" />
2
2
  import { ChildProcess } from 'child_process';
3
- import { messages } from '@cucumber/messages';
3
+ import * as messages from '@cucumber/messages';
4
4
  import { EventEmitter } from 'events';
5
5
  import { EventDataCollector } from '../../formatter/helpers';
6
6
  import { IRuntimeOptions } from '..';
7
7
  import { ISupportCodeLibrary } from '../../support_code_library_builder/types';
8
- import { ICoordinatorReport, ICoordinatorReportSupportCodeIds } from './command_types';
8
+ import { ICoordinatorReport } from './command_types';
9
+ import { IdGenerator } from '@cucumber/messages';
9
10
  export interface INewCoordinatorOptions {
10
11
  cwd: string;
11
12
  eventBroadcaster: EventEmitter;
12
13
  eventDataCollector: EventDataCollector;
13
14
  options: IRuntimeOptions;
15
+ newId: IdGenerator.NewId;
14
16
  pickleIds: string[];
15
17
  supportCodeLibrary: ISupportCodeLibrary;
16
18
  supportCodePaths: string[];
@@ -28,22 +30,20 @@ export default class Coordinator {
28
30
  private onFinish;
29
31
  private nextPickleIdIndex;
30
32
  private readonly options;
33
+ private readonly newId;
31
34
  private readonly pickleIds;
35
+ private assembledTestCases;
32
36
  private workers;
33
- private supportCodeIdMap;
34
37
  private readonly supportCodeLibrary;
35
38
  private readonly supportCodePaths;
36
39
  private readonly supportCodeRequiredModules;
37
40
  private success;
38
- constructor({ cwd, eventBroadcaster, eventDataCollector, pickleIds, options, supportCodeLibrary, supportCodePaths, supportCodeRequiredModules, }: INewCoordinatorOptions);
41
+ constructor({ cwd, eventBroadcaster, eventDataCollector, pickleIds, options, newId, supportCodeLibrary, supportCodePaths, supportCodeRequiredModules, }: INewCoordinatorOptions);
39
42
  parseWorkerMessage(worker: IWorker, message: ICoordinatorReport): void;
40
- saveDefinitionIdMapping(message: ICoordinatorReportSupportCodeIds): void;
41
- remapDefinitionIds(testCase: messages.ITestCase): void;
42
43
  startWorker(id: string, total: number): void;
43
44
  onWorkerProcessClose(exitCode: number): void;
44
- parseTestCaseResult(testCaseFinished: messages.ITestCaseFinished): void;
45
- run(numberOfWorkers: number, done: (success: boolean) => void): void;
45
+ parseTestCaseResult(testCaseFinished: messages.TestCaseFinished): void;
46
+ run(numberOfWorkers: number): Promise<boolean>;
46
47
  giveWork(worker: IWorker): void;
47
- shouldCauseFailure(status: messages.TestStepFinished.TestStepResult.Status): boolean;
48
48
  }
49
49
  export {};
@@ -1,26 +1,43 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
2
21
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
22
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
23
  };
5
24
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const lodash_1 = __importDefault(require("lodash"));
7
25
  const child_process_1 = require("child_process");
8
26
  const path_1 = __importDefault(require("path"));
9
- const status_1 = __importDefault(require("../../status"));
10
27
  const helpers_1 = require("../helpers");
11
- const messages_1 = require("@cucumber/messages");
28
+ const messages = __importStar(require("@cucumber/messages"));
12
29
  const value_checker_1 = require("../../value_checker");
13
30
  const stopwatch_1 = require("../stopwatch");
31
+ const assemble_test_cases_1 = require("../assemble_test_cases");
14
32
  const runWorkerPath = path_1.default.resolve(__dirname, 'run_worker.js');
15
33
  class Coordinator {
16
- constructor({ cwd, eventBroadcaster, eventDataCollector, pickleIds, options, supportCodeLibrary, supportCodePaths, supportCodeRequiredModules, }) {
34
+ constructor({ cwd, eventBroadcaster, eventDataCollector, pickleIds, options, newId, supportCodeLibrary, supportCodePaths, supportCodeRequiredModules, }) {
17
35
  this.cwd = cwd;
18
36
  this.eventBroadcaster = eventBroadcaster;
19
37
  this.eventDataCollector = eventDataCollector;
20
- this.stopwatch = options.predictableIds
21
- ? new stopwatch_1.PredictableTestRunStopwatch()
22
- : new stopwatch_1.RealTestRunStopwatch();
38
+ this.stopwatch = new stopwatch_1.RealTestRunStopwatch();
23
39
  this.options = options;
40
+ this.newId = newId;
24
41
  this.supportCodeLibrary = supportCodeLibrary;
25
42
  this.supportCodePaths = supportCodePaths;
26
43
  this.supportCodeRequiredModules = supportCodeRequiredModules;
@@ -28,21 +45,14 @@ class Coordinator {
28
45
  this.nextPickleIdIndex = 0;
29
46
  this.success = true;
30
47
  this.workers = {};
31
- this.supportCodeIdMap = {};
32
48
  }
33
49
  parseWorkerMessage(worker, message) {
34
- if (value_checker_1.doesHaveValue(message.supportCodeIds)) {
35
- this.saveDefinitionIdMapping(message.supportCodeIds);
36
- }
37
- else if (message.ready) {
50
+ if (message.ready) {
38
51
  this.giveWork(worker);
39
52
  }
40
53
  else if (value_checker_1.doesHaveValue(message.jsonEnvelope)) {
41
- const envelope = messages_1.messages.Envelope.fromObject(JSON.parse(message.jsonEnvelope));
54
+ const envelope = messages.parseEnvelope(message.jsonEnvelope);
42
55
  this.eventBroadcaster.emit('envelope', envelope);
43
- if (value_checker_1.doesHaveValue(envelope.testCase)) {
44
- this.remapDefinitionIds(envelope.testCase);
45
- }
46
56
  if (value_checker_1.doesHaveValue(envelope.testCaseFinished)) {
47
57
  this.parseTestCaseResult(envelope.testCaseFinished);
48
58
  }
@@ -51,35 +61,15 @@ class Coordinator {
51
61
  throw new Error(`Unexpected message from worker: ${JSON.stringify(message)}`);
52
62
  }
53
63
  }
54
- saveDefinitionIdMapping(message) {
55
- lodash_1.default.each(message.stepDefinitionIds, (id, index) => {
56
- this.supportCodeIdMap[id] = this.supportCodeLibrary.stepDefinitions[index].id;
57
- });
58
- lodash_1.default.each(message.beforeTestCaseHookDefinitionIds, (id, index) => {
59
- this.supportCodeIdMap[id] = this.supportCodeLibrary.beforeTestCaseHookDefinitions[index].id;
60
- });
61
- lodash_1.default.each(message.afterTestCaseHookDefinitionIds, (id, index) => {
62
- this.supportCodeIdMap[id] = this.supportCodeLibrary.afterTestCaseHookDefinitions[index].id;
63
- });
64
- }
65
- remapDefinitionIds(testCase) {
66
- for (const testStep of testCase.testSteps) {
67
- if (testStep.hookId !== '') {
68
- testStep.hookId = this.supportCodeIdMap[testStep.hookId];
69
- }
70
- if (value_checker_1.doesHaveValue(testStep.stepDefinitionIds)) {
71
- testStep.stepDefinitionIds = testStep.stepDefinitionIds.map((id) => this.supportCodeIdMap[id]);
72
- }
73
- }
74
- }
75
64
  startWorker(id, total) {
76
65
  const workerProcess = child_process_1.fork(runWorkerPath, [], {
77
66
  cwd: this.cwd,
78
- env: lodash_1.default.assign({}, process.env, {
67
+ env: {
68
+ ...process.env,
79
69
  CUCUMBER_PARALLEL: 'true',
80
- CUCUMBER_TOTAL_WORKERS: total,
70
+ CUCUMBER_TOTAL_WORKERS: total.toString(),
81
71
  CUCUMBER_WORKER_ID: id,
82
- }),
72
+ },
83
73
  stdio: ['inherit', 'inherit', 'inherit', 'ipc'],
84
74
  });
85
75
  const worker = { closed: false, process: workerProcess };
@@ -96,40 +86,59 @@ class Coordinator {
96
86
  filterStacktraces: this.options.filterStacktraces,
97
87
  supportCodePaths: this.supportCodePaths,
98
88
  supportCodeRequiredModules: this.supportCodeRequiredModules,
89
+ supportCodeIds: {
90
+ stepDefinitionIds: this.supportCodeLibrary.stepDefinitions.map((s) => s.id),
91
+ beforeTestCaseHookDefinitionIds: this.supportCodeLibrary.beforeTestCaseHookDefinitions.map((h) => h.id),
92
+ afterTestCaseHookDefinitionIds: this.supportCodeLibrary.afterTestCaseHookDefinitions.map((h) => h.id),
93
+ },
99
94
  options: this.options,
100
95
  },
101
96
  };
102
97
  worker.process.send(initializeCommand);
103
98
  }
104
99
  onWorkerProcessClose(exitCode) {
105
- if (exitCode !== 0) {
100
+ const success = exitCode === 0;
101
+ if (!success) {
106
102
  this.success = false;
107
103
  }
108
- if (lodash_1.default.every(this.workers, 'closed')) {
109
- this.eventBroadcaster.emit('envelope', messages_1.messages.Envelope.fromObject({
104
+ if (Object.values(this.workers).every((x) => x.closed)) {
105
+ const envelope = {
110
106
  testRunFinished: {
111
107
  timestamp: this.stopwatch.timestamp(),
108
+ success,
112
109
  },
113
- }));
110
+ };
111
+ this.eventBroadcaster.emit('envelope', envelope);
114
112
  this.onFinish(this.success);
115
113
  }
116
114
  }
117
115
  parseTestCaseResult(testCaseFinished) {
118
116
  const { worstTestStepResult } = this.eventDataCollector.getTestCaseAttempt(testCaseFinished.testCaseStartedId);
119
- if (!worstTestStepResult.willBeRetried &&
120
- this.shouldCauseFailure(worstTestStepResult.status)) {
117
+ if (!testCaseFinished.willBeRetried &&
118
+ helpers_1.shouldCauseFailure(worstTestStepResult.status, this.options)) {
121
119
  this.success = false;
122
120
  }
123
121
  }
124
- run(numberOfWorkers, done) {
125
- this.eventBroadcaster.emit('envelope', new messages_1.messages.Envelope({
122
+ async run(numberOfWorkers) {
123
+ const envelope = {
126
124
  testRunStarted: {
127
125
  timestamp: this.stopwatch.timestamp(),
128
126
  },
129
- }));
127
+ };
128
+ this.eventBroadcaster.emit('envelope', envelope);
130
129
  this.stopwatch.start();
131
- lodash_1.default.times(numberOfWorkers, (id) => this.startWorker(id.toString(), numberOfWorkers));
132
- this.onFinish = done;
130
+ this.assembledTestCases = await assemble_test_cases_1.assembleTestCases({
131
+ eventBroadcaster: this.eventBroadcaster,
132
+ newId: this.newId,
133
+ pickles: this.pickleIds.map((pickleId) => this.eventDataCollector.getPickle(pickleId)),
134
+ supportCodeLibrary: this.supportCodeLibrary,
135
+ });
136
+ return await new Promise((resolve) => {
137
+ for (let i = 0; i <= numberOfWorkers; i++) {
138
+ this.startWorker(i.toString(), numberOfWorkers);
139
+ }
140
+ this.onFinish = resolve;
141
+ });
133
142
  }
134
143
  giveWork(worker) {
135
144
  if (this.nextPickleIdIndex === this.pickleIds.length) {
@@ -140,6 +149,7 @@ class Coordinator {
140
149
  const pickleId = this.pickleIds[this.nextPickleIdIndex];
141
150
  this.nextPickleIdIndex += 1;
142
151
  const pickle = this.eventDataCollector.getPickle(pickleId);
152
+ const testCase = this.assembledTestCases[pickleId];
143
153
  const gherkinDocument = this.eventDataCollector.getGherkinDocument(pickle.uri);
144
154
  const retries = helpers_1.retriesForPickle(pickle, this.options);
145
155
  const skip = this.options.dryRun || (this.options.failFast && !this.success);
@@ -149,15 +159,12 @@ class Coordinator {
149
159
  skip,
150
160
  elapsed: this.stopwatch.duration().nanos(),
151
161
  pickle,
162
+ testCase,
152
163
  gherkinDocument,
153
164
  },
154
165
  };
155
166
  worker.process.send(runCommand);
156
167
  }
157
- shouldCauseFailure(status) {
158
- return (lodash_1.default.includes([status_1.default.AMBIGUOUS, status_1.default.FAILED, status_1.default.UNDEFINED], status) ||
159
- (status === status_1.default.PENDING && this.options.strict));
160
- }
161
168
  }
162
169
  exports.default = Coordinator;
163
170
  //# sourceMappingURL=coordinator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../../../src/runtime/parallel/coordinator.ts"],"names":[],"mappings":"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","sourcesContent":["import _, { Dictionary } from 'lodash'\nimport { ChildProcess, fork } from 'child_process'\nimport path from 'path'\nimport Status from '../../status'\nimport { retriesForPickle } from '../helpers'\nimport { messages } from '@cucumber/messages'\nimport { EventEmitter } from 'events'\nimport { EventDataCollector } from '../../formatter/helpers'\nimport { IRuntimeOptions } from '..'\nimport { ISupportCodeLibrary } from '../../support_code_library_builder/types'\nimport {\n ICoordinatorReport,\n ICoordinatorReportSupportCodeIds,\n IWorkerCommand,\n} from './command_types'\nimport { doesHaveValue } from '../../value_checker'\nimport {\n ITestRunStopwatch,\n PredictableTestRunStopwatch,\n RealTestRunStopwatch,\n} from '../stopwatch'\n\nconst runWorkerPath = path.resolve(__dirname, 'run_worker.js')\n\nexport interface INewCoordinatorOptions {\n cwd: string\n eventBroadcaster: EventEmitter\n eventDataCollector: EventDataCollector\n options: IRuntimeOptions\n pickleIds: string[]\n supportCodeLibrary: ISupportCodeLibrary\n supportCodePaths: string[]\n supportCodeRequiredModules: string[]\n}\n\ninterface IWorker {\n closed: boolean\n process: ChildProcess\n}\n\nexport default class Coordinator {\n private readonly cwd: string\n private readonly eventBroadcaster: EventEmitter\n private readonly eventDataCollector: EventDataCollector\n private readonly stopwatch: ITestRunStopwatch\n private onFinish: (success: boolean) => void\n private nextPickleIdIndex: number\n private readonly options: IRuntimeOptions\n private readonly pickleIds: string[]\n private workers: Dictionary<IWorker>\n private supportCodeIdMap: Dictionary<string>\n private readonly supportCodeLibrary: ISupportCodeLibrary\n private readonly supportCodePaths: string[]\n private readonly supportCodeRequiredModules: string[]\n private success: boolean\n\n constructor({\n cwd,\n eventBroadcaster,\n eventDataCollector,\n pickleIds,\n options,\n supportCodeLibrary,\n supportCodePaths,\n supportCodeRequiredModules,\n }: INewCoordinatorOptions) {\n this.cwd = cwd\n this.eventBroadcaster = eventBroadcaster\n this.eventDataCollector = eventDataCollector\n this.stopwatch = options.predictableIds\n ? new PredictableTestRunStopwatch()\n : new RealTestRunStopwatch()\n this.options = options\n this.supportCodeLibrary = supportCodeLibrary\n this.supportCodePaths = supportCodePaths\n this.supportCodeRequiredModules = supportCodeRequiredModules\n this.pickleIds = pickleIds\n this.nextPickleIdIndex = 0\n this.success = true\n this.workers = {}\n this.supportCodeIdMap = {}\n }\n\n parseWorkerMessage(worker: IWorker, message: ICoordinatorReport): void {\n if (doesHaveValue(message.supportCodeIds)) {\n this.saveDefinitionIdMapping(message.supportCodeIds)\n } else if (message.ready) {\n this.giveWork(worker)\n } else if (doesHaveValue(message.jsonEnvelope)) {\n const envelope = messages.Envelope.fromObject(\n JSON.parse(message.jsonEnvelope)\n )\n this.eventBroadcaster.emit('envelope', envelope)\n if (doesHaveValue(envelope.testCase)) {\n this.remapDefinitionIds(envelope.testCase)\n }\n if (doesHaveValue(envelope.testCaseFinished)) {\n this.parseTestCaseResult(envelope.testCaseFinished)\n }\n } else {\n throw new Error(\n `Unexpected message from worker: ${JSON.stringify(message)}`\n )\n }\n }\n\n saveDefinitionIdMapping(message: ICoordinatorReportSupportCodeIds): void {\n _.each(message.stepDefinitionIds, (id: string, index: number) => {\n this.supportCodeIdMap[id] = this.supportCodeLibrary.stepDefinitions[\n index\n ].id\n })\n _.each(\n message.beforeTestCaseHookDefinitionIds,\n (id: string, index: number) => {\n this.supportCodeIdMap[\n id\n ] = this.supportCodeLibrary.beforeTestCaseHookDefinitions[index].id\n }\n )\n _.each(\n message.afterTestCaseHookDefinitionIds,\n (id: string, index: number) => {\n this.supportCodeIdMap[\n id\n ] = this.supportCodeLibrary.afterTestCaseHookDefinitions[index].id\n }\n )\n }\n\n remapDefinitionIds(testCase: messages.ITestCase): void {\n for (const testStep of testCase.testSteps) {\n if (testStep.hookId !== '') {\n testStep.hookId = this.supportCodeIdMap[testStep.hookId]\n }\n if (doesHaveValue(testStep.stepDefinitionIds)) {\n testStep.stepDefinitionIds = testStep.stepDefinitionIds.map(\n (id) => this.supportCodeIdMap[id]\n )\n }\n }\n }\n\n startWorker(id: string, total: number): void {\n const workerProcess = fork(runWorkerPath, [], {\n cwd: this.cwd,\n env: _.assign({}, process.env, {\n CUCUMBER_PARALLEL: 'true',\n CUCUMBER_TOTAL_WORKERS: total,\n CUCUMBER_WORKER_ID: id,\n }),\n stdio: ['inherit', 'inherit', 'inherit', 'ipc'],\n })\n const worker = { closed: false, process: workerProcess }\n this.workers[id] = worker\n worker.process.on('message', (message: ICoordinatorReport) => {\n this.parseWorkerMessage(worker, message)\n })\n worker.process.on('close', (exitCode) => {\n worker.closed = true\n this.onWorkerProcessClose(exitCode)\n })\n const initializeCommand: IWorkerCommand = {\n initialize: {\n filterStacktraces: this.options.filterStacktraces,\n supportCodePaths: this.supportCodePaths,\n supportCodeRequiredModules: this.supportCodeRequiredModules,\n options: this.options,\n },\n }\n worker.process.send(initializeCommand)\n }\n\n onWorkerProcessClose(exitCode: number): void {\n if (exitCode !== 0) {\n this.success = false\n }\n if (_.every(this.workers, 'closed')) {\n this.eventBroadcaster.emit(\n 'envelope',\n messages.Envelope.fromObject({\n testRunFinished: {\n timestamp: this.stopwatch.timestamp(),\n },\n })\n )\n this.onFinish(this.success)\n }\n }\n\n parseTestCaseResult(testCaseFinished: messages.ITestCaseFinished): void {\n const { worstTestStepResult } = this.eventDataCollector.getTestCaseAttempt(\n testCaseFinished.testCaseStartedId\n )\n if (\n !worstTestStepResult.willBeRetried &&\n this.shouldCauseFailure(worstTestStepResult.status)\n ) {\n this.success = false\n }\n }\n\n run(numberOfWorkers: number, done: (success: boolean) => void): void {\n this.eventBroadcaster.emit(\n 'envelope',\n new messages.Envelope({\n testRunStarted: {\n timestamp: this.stopwatch.timestamp(),\n },\n })\n )\n this.stopwatch.start()\n _.times(numberOfWorkers, (id) =>\n this.startWorker(id.toString(), numberOfWorkers)\n )\n this.onFinish = done\n }\n\n giveWork(worker: IWorker): void {\n if (this.nextPickleIdIndex === this.pickleIds.length) {\n const finalizeCommand: IWorkerCommand = { finalize: true }\n worker.process.send(finalizeCommand)\n return\n }\n const pickleId = this.pickleIds[this.nextPickleIdIndex]\n this.nextPickleIdIndex += 1\n const pickle = this.eventDataCollector.getPickle(pickleId)\n const gherkinDocument = this.eventDataCollector.getGherkinDocument(\n pickle.uri\n )\n const retries = retriesForPickle(pickle, this.options)\n const skip = this.options.dryRun || (this.options.failFast && !this.success)\n const runCommand: IWorkerCommand = {\n run: {\n retries,\n skip,\n elapsed: this.stopwatch.duration().nanos(),\n pickle,\n gherkinDocument,\n },\n }\n worker.process.send(runCommand)\n }\n\n shouldCauseFailure(\n status: messages.TestStepFinished.TestStepResult.Status\n ): boolean {\n return (\n _.includes([Status.AMBIGUOUS, Status.FAILED, Status.UNDEFINED], status) ||\n (status === Status.PENDING && this.options.strict)\n )\n }\n}\n"]}
1
+ {"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../../../src/runtime/parallel/coordinator.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChildProcess, fork } from 'child_process'\nimport path from 'path'\nimport { retriesForPickle, shouldCauseFailure } from '../helpers'\nimport * as messages from '@cucumber/messages'\nimport { EventEmitter } from 'events'\nimport { EventDataCollector } from '../../formatter/helpers'\nimport { IRuntimeOptions } from '..'\nimport { ISupportCodeLibrary } from '../../support_code_library_builder/types'\nimport { ICoordinatorReport, IWorkerCommand } from './command_types'\nimport { doesHaveValue } from '../../value_checker'\nimport { ITestRunStopwatch, RealTestRunStopwatch } from '../stopwatch'\nimport { assembleTestCases, IAssembledTestCases } from '../assemble_test_cases'\nimport { IdGenerator } from '@cucumber/messages'\n\nconst runWorkerPath = path.resolve(__dirname, 'run_worker.js')\n\nexport interface INewCoordinatorOptions {\n cwd: string\n eventBroadcaster: EventEmitter\n eventDataCollector: EventDataCollector\n options: IRuntimeOptions\n newId: IdGenerator.NewId\n pickleIds: string[]\n supportCodeLibrary: ISupportCodeLibrary\n supportCodePaths: string[]\n supportCodeRequiredModules: string[]\n}\n\ninterface IWorker {\n closed: boolean\n process: ChildProcess\n}\n\nexport default class Coordinator {\n private readonly cwd: string\n private readonly eventBroadcaster: EventEmitter\n private readonly eventDataCollector: EventDataCollector\n private readonly stopwatch: ITestRunStopwatch\n private onFinish: (success: boolean) => void\n private nextPickleIdIndex: number\n private readonly options: IRuntimeOptions\n private readonly newId: IdGenerator.NewId\n private readonly pickleIds: string[]\n private assembledTestCases: IAssembledTestCases\n private workers: Record<string, IWorker>\n private readonly supportCodeLibrary: ISupportCodeLibrary\n private readonly supportCodePaths: string[]\n private readonly supportCodeRequiredModules: string[]\n private success: boolean\n\n constructor({\n cwd,\n eventBroadcaster,\n eventDataCollector,\n pickleIds,\n options,\n newId,\n supportCodeLibrary,\n supportCodePaths,\n supportCodeRequiredModules,\n }: INewCoordinatorOptions) {\n this.cwd = cwd\n this.eventBroadcaster = eventBroadcaster\n this.eventDataCollector = eventDataCollector\n this.stopwatch = new RealTestRunStopwatch()\n this.options = options\n this.newId = newId\n this.supportCodeLibrary = supportCodeLibrary\n this.supportCodePaths = supportCodePaths\n this.supportCodeRequiredModules = supportCodeRequiredModules\n this.pickleIds = pickleIds\n this.nextPickleIdIndex = 0\n this.success = true\n this.workers = {}\n }\n\n parseWorkerMessage(worker: IWorker, message: ICoordinatorReport): void {\n if (message.ready) {\n this.giveWork(worker)\n } else if (doesHaveValue(message.jsonEnvelope)) {\n const envelope = messages.parseEnvelope(message.jsonEnvelope)\n this.eventBroadcaster.emit('envelope', envelope)\n if (doesHaveValue(envelope.testCaseFinished)) {\n this.parseTestCaseResult(envelope.testCaseFinished)\n }\n } else {\n throw new Error(\n `Unexpected message from worker: ${JSON.stringify(message)}`\n )\n }\n }\n\n startWorker(id: string, total: number): void {\n const workerProcess = fork(runWorkerPath, [], {\n cwd: this.cwd,\n env: {\n ...process.env,\n CUCUMBER_PARALLEL: 'true',\n CUCUMBER_TOTAL_WORKERS: total.toString(),\n CUCUMBER_WORKER_ID: id,\n },\n stdio: ['inherit', 'inherit', 'inherit', 'ipc'],\n })\n const worker = { closed: false, process: workerProcess }\n this.workers[id] = worker\n worker.process.on('message', (message: ICoordinatorReport) => {\n this.parseWorkerMessage(worker, message)\n })\n worker.process.on('close', (exitCode) => {\n worker.closed = true\n this.onWorkerProcessClose(exitCode)\n })\n const initializeCommand: IWorkerCommand = {\n initialize: {\n filterStacktraces: this.options.filterStacktraces,\n supportCodePaths: this.supportCodePaths,\n supportCodeRequiredModules: this.supportCodeRequiredModules,\n supportCodeIds: {\n stepDefinitionIds: this.supportCodeLibrary.stepDefinitions.map(\n (s) => s.id\n ),\n beforeTestCaseHookDefinitionIds:\n this.supportCodeLibrary.beforeTestCaseHookDefinitions.map(\n (h) => h.id\n ),\n afterTestCaseHookDefinitionIds:\n this.supportCodeLibrary.afterTestCaseHookDefinitions.map(\n (h) => h.id\n ),\n },\n options: this.options,\n },\n }\n worker.process.send(initializeCommand)\n }\n\n onWorkerProcessClose(exitCode: number): void {\n const success = exitCode === 0\n if (!success) {\n this.success = false\n }\n if (Object.values(this.workers).every((x) => x.closed)) {\n const envelope: messages.Envelope = {\n testRunFinished: {\n timestamp: this.stopwatch.timestamp(),\n success,\n },\n }\n this.eventBroadcaster.emit('envelope', envelope)\n this.onFinish(this.success)\n }\n }\n\n parseTestCaseResult(testCaseFinished: messages.TestCaseFinished): void {\n const { worstTestStepResult } = this.eventDataCollector.getTestCaseAttempt(\n testCaseFinished.testCaseStartedId\n )\n if (\n !testCaseFinished.willBeRetried &&\n shouldCauseFailure(worstTestStepResult.status, this.options)\n ) {\n this.success = false\n }\n }\n\n async run(numberOfWorkers: number): Promise<boolean> {\n const envelope: messages.Envelope = {\n testRunStarted: {\n timestamp: this.stopwatch.timestamp(),\n },\n }\n this.eventBroadcaster.emit('envelope', envelope)\n this.stopwatch.start()\n this.assembledTestCases = await assembleTestCases({\n eventBroadcaster: this.eventBroadcaster,\n newId: this.newId,\n pickles: this.pickleIds.map((pickleId) =>\n this.eventDataCollector.getPickle(pickleId)\n ),\n supportCodeLibrary: this.supportCodeLibrary,\n })\n return await new Promise<boolean>((resolve) => {\n for (let i = 0; i <= numberOfWorkers; i++) {\n this.startWorker(i.toString(), numberOfWorkers)\n }\n this.onFinish = resolve\n })\n }\n\n giveWork(worker: IWorker): void {\n if (this.nextPickleIdIndex === this.pickleIds.length) {\n const finalizeCommand: IWorkerCommand = { finalize: true }\n worker.process.send(finalizeCommand)\n return\n }\n const pickleId = this.pickleIds[this.nextPickleIdIndex]\n this.nextPickleIdIndex += 1\n const pickle = this.eventDataCollector.getPickle(pickleId)\n const testCase = this.assembledTestCases[pickleId]\n const gherkinDocument = this.eventDataCollector.getGherkinDocument(\n pickle.uri\n )\n const retries = retriesForPickle(pickle, this.options)\n const skip = this.options.dryRun || (this.options.failFast && !this.success)\n const runCommand: IWorkerCommand = {\n run: {\n retries,\n skip,\n elapsed: this.stopwatch.duration().nanos(),\n pickle,\n testCase,\n gherkinDocument,\n },\n }\n worker.process.send(runCommand)\n }\n}\n"]}
@@ -20,10 +20,10 @@ export default class Worker {
20
20
  id: string;
21
21
  sendMessage: IMessageSender;
22
22
  });
23
- initialize({ filterStacktraces, supportCodeRequiredModules, supportCodePaths, options, }: IWorkerCommandInitialize): Promise<void>;
23
+ initialize({ filterStacktraces, supportCodeRequiredModules, supportCodePaths, supportCodeIds, options, }: IWorkerCommandInitialize): Promise<void>;
24
24
  finalize(): Promise<void>;
25
25
  receiveMessage(message: IWorkerCommand): Promise<void>;
26
- runTestCase({ gherkinDocument, pickle, elapsed, retries, skip, }: IWorkerCommandRun): Promise<void>;
26
+ runTestCase({ gherkinDocument, pickle, testCase, elapsed, retries, skip, }: IWorkerCommandRun): Promise<void>;
27
27
  runTestRunHooks(testRunHookDefinitions: TestRunHookDefinition[], name: string): Promise<void>;
28
28
  }
29
29
  export {};
@@ -5,15 +5,18 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const helpers_1 = require("../../formatter/helpers");
7
7
  const events_1 = require("events");
8
- const bluebird_1 = __importDefault(require("bluebird"));
9
8
  const stack_trace_filter_1 = __importDefault(require("../../stack_trace_filter"));
10
9
  const support_code_library_builder_1 = __importDefault(require("../../support_code_library_builder"));
11
- const pickle_runner_1 = __importDefault(require("../pickle_runner"));
10
+ const test_case_runner_1 = __importDefault(require("../test_case_runner"));
12
11
  const user_code_runner_1 = __importDefault(require("../../user_code_runner"));
13
12
  const messages_1 = require("@cucumber/messages");
14
13
  const value_checker_1 = require("../../value_checker");
15
14
  const stopwatch_1 = require("../stopwatch");
16
15
  const durations_1 = require("durations");
16
+ const url_1 = require("url");
17
+ const helpers_2 = require("../../cli/helpers");
18
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
19
+ const { importer } = require('../../importer');
17
20
  const { uuid } = messages_1.IdGenerator;
18
21
  class Worker {
19
22
  constructor({ cwd, exit, id, sendMessage, }) {
@@ -26,22 +29,22 @@ class Worker {
26
29
  this.stackTraceFilter = new stack_trace_filter_1.default();
27
30
  this.eventBroadcaster.on('envelope', (envelope) => {
28
31
  this.sendMessage({
29
- jsonEnvelope: JSON.stringify(envelope.toJSON()),
32
+ jsonEnvelope: JSON.stringify(envelope),
30
33
  });
31
34
  });
32
35
  }
33
- async initialize({ filterStacktraces, supportCodeRequiredModules, supportCodePaths, options, }) {
36
+ async initialize({ filterStacktraces, supportCodeRequiredModules, supportCodePaths, supportCodeIds, options, }) {
34
37
  supportCodeRequiredModules.map((module) => require(module));
35
38
  support_code_library_builder_1.default.reset(this.cwd, this.newId);
36
- supportCodePaths.forEach((codePath) => require(codePath));
37
- this.supportCodeLibrary = support_code_library_builder_1.default.finalize();
38
- this.sendMessage({
39
- supportCodeIds: {
40
- stepDefinitionIds: this.supportCodeLibrary.stepDefinitions.map((s) => s.id),
41
- beforeTestCaseHookDefinitionIds: this.supportCodeLibrary.beforeTestCaseHookDefinitions.map((h) => h.id),
42
- afterTestCaseHookDefinitionIds: this.supportCodeLibrary.afterTestCaseHookDefinitions.map((h) => h.id),
43
- },
44
- });
39
+ for (const codePath of supportCodePaths) {
40
+ if (supportCodeRequiredModules.length || !helpers_2.isJavaScript(codePath)) {
41
+ require(codePath);
42
+ }
43
+ else {
44
+ await importer(url_1.pathToFileURL(codePath));
45
+ }
46
+ }
47
+ this.supportCodeLibrary = support_code_library_builder_1.default.finalize(supportCodeIds);
45
48
  this.worldParameters = options.worldParameters;
46
49
  this.options = options;
47
50
  this.filterStacktraces = filterStacktraces;
@@ -69,30 +72,29 @@ class Worker {
69
72
  await this.runTestCase(message.run);
70
73
  }
71
74
  }
72
- async runTestCase({ gherkinDocument, pickle, elapsed, retries, skip, }) {
73
- const stopwatch = this.options.predictableIds
74
- ? new stopwatch_1.PredictableTestRunStopwatch()
75
- : new stopwatch_1.RealTestRunStopwatch();
75
+ async runTestCase({ gherkinDocument, pickle, testCase, elapsed, retries, skip, }) {
76
+ const stopwatch = new stopwatch_1.RealTestRunStopwatch();
76
77
  stopwatch.from(durations_1.duration(elapsed));
77
- const pickleRunner = new pickle_runner_1.default({
78
+ const testCaseRunner = new test_case_runner_1.default({
78
79
  eventBroadcaster: this.eventBroadcaster,
79
80
  stopwatch,
80
81
  gherkinDocument,
81
82
  newId: this.newId,
82
83
  pickle,
84
+ testCase,
83
85
  retries,
84
86
  skip,
85
87
  supportCodeLibrary: this.supportCodeLibrary,
86
88
  worldParameters: this.worldParameters,
87
89
  });
88
- await pickleRunner.run();
90
+ await testCaseRunner.run();
89
91
  this.sendMessage({ ready: true });
90
92
  }
91
93
  async runTestRunHooks(testRunHookDefinitions, name) {
92
94
  if (this.options.dryRun) {
93
95
  return;
94
96
  }
95
- await bluebird_1.default.each(testRunHookDefinitions, async (hookDefinition) => {
97
+ for (const hookDefinition of testRunHookDefinitions) {
96
98
  const { error } = await user_code_runner_1.default.run({
97
99
  argsArray: [],
98
100
  fn: hookDefinition.code,
@@ -103,7 +105,7 @@ class Worker {
103
105
  const location = helpers_1.formatLocation(hookDefinition);
104
106
  this.exit(1, error, `${name} hook errored on worker ${this.id}, process exiting: ${location}`);
105
107
  }
106
- });
108
+ }
107
109
  }
108
110
  }
109
111
  exports.default = Worker;
@@ -1 +1 @@
1
- {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/runtime/parallel/worker.ts"],"names":[],"mappings":"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","sourcesContent":["import { formatLocation } from '../../formatter/helpers'\nimport {\n ICoordinatorReport,\n IWorkerCommand,\n IWorkerCommandInitialize,\n IWorkerCommandRun,\n} from './command_types'\nimport { EventEmitter } from 'events'\nimport bluebird from 'bluebird'\nimport StackTraceFilter from '../../stack_trace_filter'\nimport supportCodeLibraryBuilder from '../../support_code_library_builder'\nimport PickleRunner from '../pickle_runner'\nimport UserCodeRunner from '../../user_code_runner'\nimport { IdGenerator, messages } from '@cucumber/messages'\nimport TestRunHookDefinition from '../../models/test_run_hook_definition'\nimport { ISupportCodeLibrary } from '../../support_code_library_builder/types'\nimport { doesHaveValue, valueOrDefault } from '../../value_checker'\nimport { IRuntimeOptions } from '../index'\nimport { PredictableTestRunStopwatch, RealTestRunStopwatch } from '../stopwatch'\nimport { duration } from 'durations'\n\nconst { uuid } = IdGenerator\n\ntype IExitFunction = (exitCode: number, error?: Error, message?: string) => void\ntype IMessageSender = (command: ICoordinatorReport) => void\n\nexport default class Worker {\n private readonly cwd: string\n private readonly exit: IExitFunction\n\n private readonly id: string\n private readonly eventBroadcaster: EventEmitter\n private filterStacktraces: boolean\n private readonly newId: IdGenerator.NewId\n private readonly sendMessage: IMessageSender\n private readonly stackTraceFilter: StackTraceFilter\n private supportCodeLibrary: ISupportCodeLibrary\n private worldParameters: any\n private options: IRuntimeOptions\n\n constructor({\n cwd,\n exit,\n id,\n sendMessage,\n }: {\n cwd: string\n exit: IExitFunction\n id: string\n sendMessage: IMessageSender\n }) {\n this.id = id\n this.newId = uuid()\n this.cwd = cwd\n this.exit = exit\n this.sendMessage = sendMessage\n this.eventBroadcaster = new EventEmitter()\n this.stackTraceFilter = new StackTraceFilter()\n this.eventBroadcaster.on('envelope', (envelope: messages.Envelope) => {\n this.sendMessage({\n jsonEnvelope: JSON.stringify(envelope.toJSON()),\n })\n })\n }\n\n async initialize({\n filterStacktraces,\n supportCodeRequiredModules,\n supportCodePaths,\n options,\n }: IWorkerCommandInitialize): Promise<void> {\n supportCodeRequiredModules.map((module) => require(module))\n supportCodeLibraryBuilder.reset(this.cwd, this.newId)\n supportCodePaths.forEach((codePath) => require(codePath))\n this.supportCodeLibrary = supportCodeLibraryBuilder.finalize()\n this.sendMessage({\n supportCodeIds: {\n stepDefinitionIds: this.supportCodeLibrary.stepDefinitions.map(\n (s) => s.id\n ),\n beforeTestCaseHookDefinitionIds: this.supportCodeLibrary.beforeTestCaseHookDefinitions.map(\n (h) => h.id\n ),\n afterTestCaseHookDefinitionIds: this.supportCodeLibrary.afterTestCaseHookDefinitions.map(\n (h) => h.id\n ),\n },\n })\n this.worldParameters = options.worldParameters\n this.options = options\n this.filterStacktraces = filterStacktraces\n if (this.filterStacktraces) {\n this.stackTraceFilter.filter()\n }\n await this.runTestRunHooks(\n this.supportCodeLibrary.beforeTestRunHookDefinitions,\n 'a BeforeAll'\n )\n this.sendMessage({ ready: true })\n }\n\n async finalize(): Promise<void> {\n await this.runTestRunHooks(\n this.supportCodeLibrary.afterTestRunHookDefinitions,\n 'an AfterAll'\n )\n if (this.filterStacktraces) {\n this.stackTraceFilter.unfilter()\n }\n this.exit(0)\n }\n\n async receiveMessage(message: IWorkerCommand): Promise<void> {\n if (doesHaveValue(message.initialize)) {\n await this.initialize(message.initialize)\n } else if (message.finalize) {\n await this.finalize()\n } else if (doesHaveValue(message.run)) {\n await this.runTestCase(message.run)\n }\n }\n\n async runTestCase({\n gherkinDocument,\n pickle,\n elapsed,\n retries,\n skip,\n }: IWorkerCommandRun): Promise<void> {\n const stopwatch = this.options.predictableIds\n ? new PredictableTestRunStopwatch()\n : new RealTestRunStopwatch()\n stopwatch.from(duration(elapsed))\n const pickleRunner = new PickleRunner({\n eventBroadcaster: this.eventBroadcaster,\n stopwatch,\n gherkinDocument,\n newId: this.newId,\n pickle,\n retries,\n skip,\n supportCodeLibrary: this.supportCodeLibrary,\n worldParameters: this.worldParameters,\n })\n await pickleRunner.run()\n this.sendMessage({ ready: true })\n }\n\n async runTestRunHooks(\n testRunHookDefinitions: TestRunHookDefinition[],\n name: string\n ): Promise<void> {\n if (this.options.dryRun) {\n return\n }\n await bluebird.each(testRunHookDefinitions, async (hookDefinition) => {\n const { error } = await UserCodeRunner.run({\n argsArray: [],\n fn: hookDefinition.code,\n thisArg: null,\n timeoutInMilliseconds: valueOrDefault(\n hookDefinition.options.timeout,\n this.supportCodeLibrary.defaultTimeout\n ),\n })\n if (doesHaveValue(error)) {\n const location = formatLocation(hookDefinition)\n this.exit(\n 1,\n error,\n `${name} hook errored on worker ${this.id}, process exiting: ${location}`\n )\n }\n })\n }\n}\n"]}
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/runtime/parallel/worker.ts"],"names":[],"mappings":"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","sourcesContent":["import { formatLocation } from '../../formatter/helpers'\nimport {\n ICoordinatorReport,\n IWorkerCommand,\n IWorkerCommandInitialize,\n IWorkerCommandRun,\n} from './command_types'\nimport { EventEmitter } from 'events'\nimport StackTraceFilter from '../../stack_trace_filter'\nimport supportCodeLibraryBuilder from '../../support_code_library_builder'\nimport TestCaseRunner from '../test_case_runner'\nimport UserCodeRunner from '../../user_code_runner'\nimport { IdGenerator } from '@cucumber/messages'\nimport * as messages from '@cucumber/messages'\nimport TestRunHookDefinition from '../../models/test_run_hook_definition'\nimport { ISupportCodeLibrary } from '../../support_code_library_builder/types'\nimport { doesHaveValue, valueOrDefault } from '../../value_checker'\nimport { IRuntimeOptions } from '../index'\nimport { RealTestRunStopwatch } from '../stopwatch'\nimport { duration } from 'durations'\nimport { pathToFileURL } from 'url'\nimport { isJavaScript } from '../../cli/helpers'\n\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst { importer } = require('../../importer')\nconst { uuid } = IdGenerator\n\ntype IExitFunction = (exitCode: number, error?: Error, message?: string) => void\ntype IMessageSender = (command: ICoordinatorReport) => void\n\nexport default class Worker {\n private readonly cwd: string\n private readonly exit: IExitFunction\n\n private readonly id: string\n private readonly eventBroadcaster: EventEmitter\n private filterStacktraces: boolean\n private readonly newId: IdGenerator.NewId\n private readonly sendMessage: IMessageSender\n private readonly stackTraceFilter: StackTraceFilter\n private supportCodeLibrary: ISupportCodeLibrary\n private worldParameters: any\n private options: IRuntimeOptions\n\n constructor({\n cwd,\n exit,\n id,\n sendMessage,\n }: {\n cwd: string\n exit: IExitFunction\n id: string\n sendMessage: IMessageSender\n }) {\n this.id = id\n this.newId = uuid()\n this.cwd = cwd\n this.exit = exit\n this.sendMessage = sendMessage\n this.eventBroadcaster = new EventEmitter()\n this.stackTraceFilter = new StackTraceFilter()\n this.eventBroadcaster.on('envelope', (envelope: messages.Envelope) => {\n this.sendMessage({\n jsonEnvelope: JSON.stringify(envelope),\n })\n })\n }\n\n async initialize({\n filterStacktraces,\n supportCodeRequiredModules,\n supportCodePaths,\n supportCodeIds,\n options,\n }: IWorkerCommandInitialize): Promise<void> {\n supportCodeRequiredModules.map((module) => require(module))\n supportCodeLibraryBuilder.reset(this.cwd, this.newId)\n for (const codePath of supportCodePaths) {\n if (supportCodeRequiredModules.length || !isJavaScript(codePath)) {\n require(codePath)\n } else {\n await importer(pathToFileURL(codePath))\n }\n }\n this.supportCodeLibrary = supportCodeLibraryBuilder.finalize(supportCodeIds)\n\n this.worldParameters = options.worldParameters\n this.options = options\n this.filterStacktraces = filterStacktraces\n if (this.filterStacktraces) {\n this.stackTraceFilter.filter()\n }\n await this.runTestRunHooks(\n this.supportCodeLibrary.beforeTestRunHookDefinitions,\n 'a BeforeAll'\n )\n this.sendMessage({ ready: true })\n }\n\n async finalize(): Promise<void> {\n await this.runTestRunHooks(\n this.supportCodeLibrary.afterTestRunHookDefinitions,\n 'an AfterAll'\n )\n if (this.filterStacktraces) {\n this.stackTraceFilter.unfilter()\n }\n this.exit(0)\n }\n\n async receiveMessage(message: IWorkerCommand): Promise<void> {\n if (doesHaveValue(message.initialize)) {\n await this.initialize(message.initialize)\n } else if (message.finalize) {\n await this.finalize()\n } else if (doesHaveValue(message.run)) {\n await this.runTestCase(message.run)\n }\n }\n\n async runTestCase({\n gherkinDocument,\n pickle,\n testCase,\n elapsed,\n retries,\n skip,\n }: IWorkerCommandRun): Promise<void> {\n const stopwatch = new RealTestRunStopwatch()\n stopwatch.from(duration(elapsed))\n const testCaseRunner = new TestCaseRunner({\n eventBroadcaster: this.eventBroadcaster,\n stopwatch,\n gherkinDocument,\n newId: this.newId,\n pickle,\n testCase,\n retries,\n skip,\n supportCodeLibrary: this.supportCodeLibrary,\n worldParameters: this.worldParameters,\n })\n await testCaseRunner.run()\n this.sendMessage({ ready: true })\n }\n\n async runTestRunHooks(\n testRunHookDefinitions: TestRunHookDefinition[],\n name: string\n ): Promise<void> {\n if (this.options.dryRun) {\n return\n }\n for (const hookDefinition of testRunHookDefinitions) {\n const { error } = await UserCodeRunner.run({\n argsArray: [],\n fn: hookDefinition.code,\n thisArg: null,\n timeoutInMilliseconds: valueOrDefault(\n hookDefinition.options.timeout,\n this.supportCodeLibrary.defaultTimeout\n ),\n })\n if (doesHaveValue(error)) {\n const location = formatLocation(hookDefinition)\n this.exit(\n 1,\n error,\n `${name} hook errored on worker ${this.id}, process exiting: ${location}`\n )\n }\n }\n }\n}\n"]}
@@ -1,14 +1,14 @@
1
- import { messages } from '@cucumber/messages';
1
+ import * as messages from '@cucumber/messages';
2
2
  import { ITestCaseHookParameter } from '../support_code_library_builder/types';
3
3
  import { IDefinition } from '../models/definition';
4
4
  export interface IRunOptions {
5
5
  defaultTimeout: number;
6
6
  hookParameter: ITestCaseHookParameter;
7
- step: messages.Pickle.IPickleStep;
7
+ step: messages.PickleStep;
8
8
  stepDefinition: IDefinition;
9
9
  world: any;
10
10
  }
11
- export declare function run({ defaultTimeout, hookParameter, step, stepDefinition, world, }: IRunOptions): Promise<messages.TestStepFinished.ITestStepResult>;
11
+ export declare function run({ defaultTimeout, hookParameter, step, stepDefinition, world, }: IRunOptions): Promise<messages.TestStepResult>;
12
12
  declare const _default: {
13
13
  run: typeof run;
14
14
  };
@@ -23,11 +23,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
23
23
  };
24
24
  Object.defineProperty(exports, "__esModule", { value: true });
25
25
  exports.run = void 0;
26
- const lodash_1 = __importDefault(require("lodash"));
27
- const status_1 = __importDefault(require("../status"));
28
- const time_1 = __importStar(require("../time"));
26
+ const time_1 = __importDefault(require("../time"));
29
27
  const user_code_runner_1 = __importDefault(require("../user_code_runner"));
30
- const messages_1 = require("@cucumber/messages");
28
+ const messages = __importStar(require("@cucumber/messages"));
31
29
  const assertion_error_formatter_1 = require("assertion-error-formatter");
32
30
  const value_checker_1 = require("../value_checker");
33
31
  const { beginTiming, endTiming } = time_1.default;
@@ -46,7 +44,7 @@ async function run({ defaultTimeout, hookParameter, step, stepDefinition, world,
46
44
  }
47
45
  if (value_checker_1.doesNotHaveValue(error)) {
48
46
  const timeoutInMilliseconds = value_checker_1.valueOrDefault(stepDefinition.options.timeout, defaultTimeout);
49
- if (lodash_1.default.includes(invocationData.validCodeLengths, stepDefinition.code.length)) {
47
+ if (invocationData.validCodeLengths.includes(stepDefinition.code.length)) {
50
48
  const data = await user_code_runner_1.default.run({
51
49
  argsArray: invocationData.parameters,
52
50
  fn: stepDefinition.code,
@@ -60,23 +58,27 @@ async function run({ defaultTimeout, hookParameter, step, stepDefinition, world,
60
58
  error = invocationData.getInvalidCodeLengthMessage();
61
59
  }
62
60
  }
63
- const testStepResult = messages_1.messages.TestStepFinished.TestStepResult.fromObject({
64
- duration: time_1.millisecondsToDuration(endTiming()),
65
- });
61
+ const duration = messages.TimeConversion.millisecondsToDuration(endTiming());
62
+ let status;
63
+ let message;
66
64
  if (result === 'skipped') {
67
- testStepResult.status = status_1.default.SKIPPED;
65
+ status = messages.TestStepResultStatus.SKIPPED;
68
66
  }
69
67
  else if (result === 'pending') {
70
- testStepResult.status = status_1.default.PENDING;
68
+ status = messages.TestStepResultStatus.PENDING;
71
69
  }
72
70
  else if (value_checker_1.doesHaveValue(error)) {
73
- testStepResult.message = assertion_error_formatter_1.format(error);
74
- testStepResult.status = status_1.default.FAILED;
71
+ message = assertion_error_formatter_1.format(error);
72
+ status = messages.TestStepResultStatus.FAILED;
75
73
  }
76
74
  else {
77
- testStepResult.status = status_1.default.PASSED;
75
+ status = messages.TestStepResultStatus.PASSED;
78
76
  }
79
- return testStepResult;
77
+ return {
78
+ duration,
79
+ status,
80
+ message,
81
+ };
80
82
  }
81
83
  exports.run = run;
82
84
  exports.default = { run };