@cucumber/cucumber 7.3.2 → 8.0.0-rc.3
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.
- package/README.md +88 -51
- package/api/index.d.ts +6 -0
- package/lib/api/convert_configuration.d.ts +4 -0
- package/lib/api/convert_configuration.js +64 -0
- package/lib/api/convert_configuration.js.map +1 -0
- package/lib/api/environment.d.ts +2 -0
- package/lib/api/environment.js +13 -0
- package/lib/api/environment.js.map +1 -0
- package/lib/api/formatters.d.ts +16 -0
- package/lib/api/formatters.js +72 -0
- package/lib/api/formatters.js.map +1 -0
- package/lib/api/gherkin.d.ts +21 -0
- package/lib/api/gherkin.js +65 -0
- package/lib/api/gherkin.js.map +1 -0
- package/lib/api/index.d.ts +11 -0
- package/lib/api/index.js +24 -0
- package/lib/api/index.js.map +1 -0
- package/lib/api/load_configuration.d.ts +9 -0
- package/lib/api/load_configuration.js +32 -0
- package/lib/api/load_configuration.js.map +1 -0
- package/lib/api/load_sources.d.ts +9 -0
- package/lib/api/load_sources.js +53 -0
- package/lib/api/load_sources.js.map +1 -0
- package/lib/api/load_support.d.ts +10 -0
- package/lib/api/load_support.js +28 -0
- package/lib/api/load_support.js.map +1 -0
- package/lib/api/paths.d.ts +7 -0
- package/lib/api/paths.js +99 -0
- package/lib/api/paths.js.map +1 -0
- package/lib/api/run_cucumber.d.ts +11 -0
- package/lib/api/run_cucumber.js +108 -0
- package/lib/api/run_cucumber.js.map +1 -0
- package/lib/api/runtime.d.ts +20 -0
- package/lib/api/runtime.js +36 -0
- package/lib/api/runtime.js.map +1 -0
- package/lib/api/support.d.ts +9 -0
- package/lib/api/support.js +21 -0
- package/lib/api/support.js.map +1 -0
- package/lib/api/types.d.ts +168 -0
- package/lib/api/types.js +3 -0
- package/lib/api/types.js.map +1 -0
- package/lib/api/wrapper.mjs +6 -0
- package/lib/cli/helpers.d.ts +16 -9
- package/lib/cli/helpers.js +49 -32
- package/lib/cli/helpers.js.map +1 -1
- package/lib/cli/i18n.js +7 -7
- package/lib/cli/i18n.js.map +1 -1
- package/lib/cli/index.d.ts +6 -23
- package/lib/cli/index.js +38 -197
- package/lib/cli/index.js.map +1 -1
- package/lib/cli/install_validator.js +1 -1
- package/lib/cli/install_validator.js.map +1 -1
- package/lib/cli/publish_banner.js +6 -6
- package/lib/cli/publish_banner.js.map +1 -1
- package/lib/cli/run.js +15 -7
- package/lib/cli/run.js.map +1 -1
- package/lib/cli/validate_node_engine_version.d.ts +7 -0
- package/lib/cli/validate_node_engine_version.js +20 -0
- package/lib/cli/validate_node_engine_version.js.map +1 -0
- package/lib/configuration/argv_parser.d.ts +20 -0
- package/lib/{cli → configuration}/argv_parser.js +52 -53
- package/lib/configuration/argv_parser.js.map +1 -0
- package/lib/configuration/check_schema.d.ts +2 -0
- package/lib/configuration/check_schema.js +56 -0
- package/lib/configuration/check_schema.js.map +1 -0
- package/lib/configuration/default_configuration.d.ts +2 -0
- package/lib/configuration/default_configuration.js +27 -0
- package/lib/configuration/default_configuration.js.map +1 -0
- package/lib/configuration/from_file.d.ts +2 -0
- package/lib/configuration/from_file.js +68 -0
- package/lib/configuration/from_file.js.map +1 -0
- package/lib/configuration/helpers.d.ts +1 -0
- package/lib/configuration/helpers.js +11 -0
- package/lib/configuration/helpers.js.map +1 -0
- package/lib/configuration/index.d.ts +7 -0
- package/lib/configuration/index.js +25 -0
- package/lib/configuration/index.js.map +1 -0
- package/lib/configuration/locate_file.d.ts +1 -0
- package/lib/configuration/locate_file.js +19 -0
- package/lib/configuration/locate_file.js.map +1 -0
- package/lib/configuration/merge_configurations.d.ts +2 -0
- package/lib/configuration/merge_configurations.js +48 -0
- package/lib/configuration/merge_configurations.js.map +1 -0
- package/lib/configuration/option_splitter.d.ts +3 -0
- package/lib/{cli → configuration}/option_splitter.js +3 -2
- package/lib/configuration/option_splitter.js.map +1 -0
- package/lib/configuration/types.d.ts +25 -0
- package/lib/configuration/types.js +3 -0
- package/lib/configuration/types.js.map +1 -0
- package/lib/configuration/validate_configuration.d.ts +2 -0
- package/lib/configuration/validate_configuration.js +10 -0
- package/lib/configuration/validate_configuration.js.map +1 -0
- package/lib/formatter/builder.d.ts +7 -7
- package/lib/formatter/builder.js +48 -55
- package/lib/formatter/builder.js.map +1 -1
- package/lib/formatter/get_color_fns.js +15 -16
- package/lib/formatter/get_color_fns.js.map +1 -1
- package/lib/formatter/helpers/event_data_collector.d.ts +2 -1
- package/lib/formatter/helpers/event_data_collector.js +16 -15
- package/lib/formatter/helpers/event_data_collector.js.map +1 -1
- package/lib/formatter/helpers/formatters.d.ts +6 -0
- package/lib/formatter/helpers/formatters.js +41 -0
- package/lib/formatter/helpers/formatters.js.map +1 -0
- package/lib/formatter/helpers/gherkin_document_parser.js +29 -42
- package/lib/formatter/helpers/gherkin_document_parser.js.map +1 -1
- package/lib/formatter/helpers/issue_helpers.d.ts +4 -4
- package/lib/formatter/helpers/issue_helpers.js +8 -9
- package/lib/formatter/helpers/issue_helpers.js.map +1 -1
- package/lib/formatter/helpers/keyword_type.js +2 -6
- package/lib/formatter/helpers/keyword_type.js.map +1 -1
- package/lib/formatter/helpers/location_helpers.js +1 -1
- package/lib/formatter/helpers/location_helpers.js.map +1 -1
- package/lib/formatter/helpers/pickle_parser.js +9 -18
- package/lib/formatter/helpers/pickle_parser.js.map +1 -1
- package/lib/formatter/helpers/step_argument_formatter.js +1 -1
- package/lib/formatter/helpers/step_argument_formatter.js.map +1 -1
- package/lib/formatter/helpers/summary_helpers.js +8 -7
- package/lib/formatter/helpers/summary_helpers.js.map +1 -1
- package/lib/formatter/helpers/test_case_attempt_formatter.d.ts +2 -2
- package/lib/formatter/helpers/test_case_attempt_formatter.js +20 -19
- package/lib/formatter/helpers/test_case_attempt_formatter.js.map +1 -1
- package/lib/formatter/helpers/test_case_attempt_parser.d.ts +1 -2
- package/lib/formatter/helpers/test_case_attempt_parser.js +18 -21
- package/lib/formatter/helpers/test_case_attempt_parser.js.map +1 -1
- package/lib/formatter/helpers/usage_helpers/index.d.ts +1 -2
- package/lib/formatter/helpers/usage_helpers/index.js +29 -43
- package/lib/formatter/helpers/usage_helpers/index.js.map +1 -1
- package/lib/formatter/html_formatter.d.ts +1 -0
- package/lib/formatter/html_formatter.js +5 -4
- package/lib/formatter/html_formatter.js.map +1 -1
- package/lib/formatter/http_stream.js +7 -7
- package/lib/formatter/http_stream.js.map +1 -1
- package/lib/formatter/index.d.ts +15 -2
- package/lib/formatter/index.js +2 -0
- package/lib/formatter/index.js.map +1 -1
- package/lib/formatter/json_formatter.d.ts +1 -0
- package/lib/formatter/json_formatter.js +25 -20
- package/lib/formatter/json_formatter.js.map +1 -1
- package/lib/formatter/message_formatter.d.ts +1 -0
- package/lib/formatter/message_formatter.js +1 -0
- package/lib/formatter/message_formatter.js.map +1 -1
- package/lib/formatter/progress_bar_formatter.d.ts +1 -0
- package/lib/formatter/progress_bar_formatter.js +18 -17
- package/lib/formatter/progress_bar_formatter.js.map +1 -1
- package/lib/formatter/progress_formatter.d.ts +1 -0
- package/lib/formatter/progress_formatter.js +3 -2
- package/lib/formatter/progress_formatter.js.map +1 -1
- package/lib/formatter/publish.d.ts +1 -0
- package/lib/formatter/publish.js +5 -0
- package/lib/formatter/publish.js.map +1 -0
- package/lib/formatter/rerun_formatter.d.ts +1 -0
- package/lib/formatter/rerun_formatter.js +15 -11
- package/lib/formatter/rerun_formatter.js.map +1 -1
- package/lib/formatter/snippets_formatter.d.ts +1 -0
- package/lib/formatter/snippets_formatter.js +3 -3
- package/lib/formatter/snippets_formatter.js.map +1 -1
- package/lib/formatter/step_definition_snippet_builder/index.js +2 -2
- package/lib/formatter/step_definition_snippet_builder/index.js.map +1 -1
- package/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.js +3 -0
- package/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.js.map +1 -1
- package/lib/formatter/step_definition_snippet_builder/snippet_syntax.d.ts +1 -1
- package/lib/formatter/step_definition_snippet_builder/snippet_syntax.js.map +1 -1
- package/lib/formatter/summary_formatter.d.ts +1 -0
- package/lib/formatter/summary_formatter.js +11 -11
- package/lib/formatter/summary_formatter.js.map +1 -1
- package/lib/formatter/usage_formatter.d.ts +1 -0
- package/lib/formatter/usage_formatter.js +9 -10
- package/lib/formatter/usage_formatter.js.map +1 -1
- package/lib/formatter/usage_json_formatter.d.ts +1 -0
- package/lib/formatter/usage_json_formatter.js +3 -3
- package/lib/formatter/usage_json_formatter.js.map +1 -1
- package/lib/importer.js +13 -0
- package/lib/index.d.ts +4 -0
- package/lib/index.js +9 -1
- package/lib/index.js.map +1 -1
- package/lib/models/data_table.js +9 -7
- package/lib/models/data_table.js.map +1 -1
- package/lib/models/pickle_order.d.ts +1 -0
- package/lib/models/pickle_order.js +3 -0
- package/lib/models/pickle_order.js.map +1 -0
- package/lib/models/step_definition.js +4 -5
- package/lib/models/step_definition.js.map +1 -1
- package/lib/pickle_filter.js +13 -13
- package/lib/pickle_filter.js.map +1 -1
- package/lib/runtime/assemble_test_cases.js +3 -3
- package/lib/runtime/assemble_test_cases.js.map +1 -1
- package/lib/runtime/attachment_manager/index.js +4 -4
- package/lib/runtime/attachment_manager/index.js.map +1 -1
- package/lib/runtime/helpers.d.ts +1 -0
- package/lib/runtime/helpers.js +42 -4
- package/lib/runtime/helpers.js.map +1 -1
- package/lib/runtime/index.d.ts +7 -7
- package/lib/runtime/index.js +12 -65
- package/lib/runtime/index.js.map +1 -1
- package/lib/runtime/parallel/command_types.d.ts +3 -2
- package/lib/runtime/parallel/command_types.js.map +1 -1
- package/lib/runtime/parallel/coordinator.d.ts +32 -12
- package/lib/runtime/parallel/coordinator.js +82 -38
- package/lib/runtime/parallel/coordinator.js.map +1 -1
- package/lib/runtime/parallel/run_worker.js +1 -1
- package/lib/runtime/parallel/run_worker.js.map +1 -1
- package/lib/runtime/parallel/worker.d.ts +2 -4
- package/lib/runtime/parallel/worker.js +18 -33
- package/lib/runtime/parallel/worker.js.map +1 -1
- package/lib/runtime/run_test_run_hooks.d.ts +3 -0
- package/lib/runtime/run_test_run_hooks.js +28 -0
- package/lib/runtime/run_test_run_hooks.js.map +1 -0
- package/lib/runtime/step_runner.js +5 -7
- package/lib/runtime/step_runner.js.map +1 -1
- package/lib/runtime/stopwatch.js +4 -4
- package/lib/runtime/stopwatch.js.map +1 -1
- package/lib/runtime/test_case_runner.d.ts +3 -3
- package/lib/runtime/test_case_runner.js +19 -28
- package/lib/runtime/test_case_runner.js.map +1 -1
- package/lib/stack_trace_filter.js +6 -7
- package/lib/stack_trace_filter.js.map +1 -1
- package/lib/step_arguments.js +2 -2
- package/lib/step_arguments.js.map +1 -1
- package/lib/support_code_library_builder/{build_helpers.d.ts → build_parameter_type.d.ts} +0 -2
- package/lib/support_code_library_builder/build_parameter_type.js +13 -0
- package/lib/support_code_library_builder/build_parameter_type.js.map +1 -0
- package/lib/support_code_library_builder/get_definition_line_and_uri.d.ts +3 -0
- package/lib/support_code_library_builder/get_definition_line_and_uri.js +30 -0
- package/lib/support_code_library_builder/get_definition_line_and_uri.js.map +1 -0
- package/lib/support_code_library_builder/index.d.ts +4 -2
- package/lib/support_code_library_builder/index.js +43 -34
- package/lib/support_code_library_builder/index.js.map +1 -1
- package/lib/support_code_library_builder/parallel_can_assign_helpers.d.ts +2 -0
- package/lib/support_code_library_builder/parallel_can_assign_helpers.js +16 -0
- package/lib/support_code_library_builder/parallel_can_assign_helpers.js.map +1 -0
- package/lib/support_code_library_builder/types.d.ts +10 -0
- package/lib/support_code_library_builder/types.js.map +1 -1
- package/lib/support_code_library_builder/validate_arguments.js +14 -19
- package/lib/support_code_library_builder/validate_arguments.js.map +1 -1
- package/lib/time.d.ts +1 -0
- package/lib/time.js +17 -2
- package/lib/time.js.map +1 -1
- package/lib/user_code_runner.js +10 -17
- package/lib/user_code_runner.js.map +1 -1
- package/lib/value_checker.d.ts +2 -2
- package/lib/value_checker.js.map +1 -1
- package/lib/version.d.ts +1 -0
- package/lib/version.js +6 -0
- package/lib/version.js.map +1 -0
- package/lib/wrapper.mjs +42 -0
- package/package.json +98 -70
- package/lib/cli/argv_parser.d.ts +0 -51
- package/lib/cli/argv_parser.js.map +0 -1
- package/lib/cli/configuration_builder.d.ts +0 -46
- package/lib/cli/configuration_builder.js +0 -161
- package/lib/cli/configuration_builder.js.map +0 -1
- package/lib/cli/option_splitter.d.ts +0 -4
- package/lib/cli/option_splitter.js.map +0 -1
- package/lib/cli/profile_loader.d.ts +0 -6
- package/lib/cli/profile_loader.js +0 -42
- package/lib/cli/profile_loader.js.map +0 -1
- package/lib/support_code_library_builder/build_helpers.js +0 -41
- package/lib/support_code_library_builder/build_helpers.js.map +0 -1
- package/lib/support_code_library_builder/finalize_helpers.d.ts +0 -10
- package/lib/support_code_library_builder/finalize_helpers.js +0 -26
- package/lib/support_code_library_builder/finalize_helpers.js.map +0 -1
package/lib/runtime/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"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","sourcesContent":["import * as messages from '@cucumber/messages'\nimport { IdGenerator } from '@cucumber/messages'\nimport { EventEmitter } from 'events'\nimport { EventDataCollector } from '../formatter/helpers'\nimport StackTraceFilter from '../stack_trace_filter'\nimport { ISupportCodeLibrary } from '../support_code_library_builder/types'\nimport { assembleTestCases } from './assemble_test_cases'\nimport { retriesForPickle, shouldCauseFailure } from './helpers'\nimport { makeRunTestRunHooks, RunsTestRunHooks } from './run_test_run_hooks'\nimport { ITestRunStopwatch, RealTestRunStopwatch } from './stopwatch'\nimport TestCaseRunner from './test_case_runner'\n\nexport interface IRuntime {\n start: () => Promise<boolean>\n}\n\nexport interface INewRuntimeOptions {\n eventBroadcaster: EventEmitter\n eventDataCollector: EventDataCollector\n newId: IdGenerator.NewId\n options: IRuntimeOptions\n pickleIds: string[]\n supportCodeLibrary: ISupportCodeLibrary\n}\n\nexport interface IRuntimeOptions {\n dryRun: boolean\n failFast: boolean\n filterStacktraces: boolean\n retry: number\n retryTagFilter: string\n strict: boolean\n worldParameters: any\n}\n\nexport default class Runtime implements IRuntime {\n private readonly eventBroadcaster: EventEmitter\n private readonly eventDataCollector: EventDataCollector\n private readonly stopwatch: ITestRunStopwatch\n private readonly newId: IdGenerator.NewId\n private readonly options: IRuntimeOptions\n private readonly pickleIds: string[]\n private readonly stackTraceFilter: StackTraceFilter\n private readonly supportCodeLibrary: ISupportCodeLibrary\n private success: boolean\n private runTestRunHooks: RunsTestRunHooks\n\n constructor({\n eventBroadcaster,\n eventDataCollector,\n newId,\n options,\n pickleIds,\n supportCodeLibrary,\n }: INewRuntimeOptions) {\n this.eventBroadcaster = eventBroadcaster\n this.eventDataCollector = eventDataCollector\n this.stopwatch = new RealTestRunStopwatch()\n this.newId = newId\n this.options = options\n this.pickleIds = pickleIds\n this.stackTraceFilter = new StackTraceFilter()\n this.supportCodeLibrary = supportCodeLibrary\n this.success = true\n this.runTestRunHooks = makeRunTestRunHooks(\n this.options.dryRun,\n this.supportCodeLibrary.defaultTimeout,\n (name, location) => `${name} hook errored, process exiting: ${location}`\n )\n }\n\n async runTestCase(\n pickleId: string,\n testCase: messages.TestCase\n ): Promise<void> {\n const pickle = this.eventDataCollector.getPickle(pickleId)\n const retries = retriesForPickle(pickle, this.options)\n const skip = this.options.dryRun || (this.options.failFast && !this.success)\n const testCaseRunner = new TestCaseRunner({\n eventBroadcaster: this.eventBroadcaster,\n stopwatch: this.stopwatch,\n gherkinDocument: this.eventDataCollector.getGherkinDocument(pickle.uri),\n newId: this.newId,\n pickle,\n testCase,\n retries,\n skip,\n supportCodeLibrary: this.supportCodeLibrary,\n worldParameters: this.options.worldParameters,\n })\n const status = await testCaseRunner.run()\n if (shouldCauseFailure(status, this.options)) {\n this.success = false\n }\n }\n\n async start(): Promise<boolean> {\n if (this.options.filterStacktraces) {\n this.stackTraceFilter.filter()\n }\n const testRunStarted: messages.Envelope = {\n testRunStarted: {\n timestamp: this.stopwatch.timestamp(),\n },\n }\n this.eventBroadcaster.emit('envelope', testRunStarted)\n this.stopwatch.start()\n await this.runTestRunHooks(\n this.supportCodeLibrary.beforeTestRunHookDefinitions,\n 'a BeforeAll'\n )\n const 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 for (const pickleId of this.pickleIds) {\n await this.runTestCase(pickleId, assembledTestCases[pickleId])\n }\n await this.runTestRunHooks(\n this.supportCodeLibrary.afterTestRunHookDefinitions.slice(0).reverse(),\n 'an AfterAll'\n )\n this.stopwatch.stop()\n const testRunFinished: messages.Envelope = {\n testRunFinished: {\n timestamp: this.stopwatch.timestamp(),\n success: this.success,\n },\n }\n this.eventBroadcaster.emit('envelope', testRunFinished)\n if (this.options.filterStacktraces) {\n this.stackTraceFilter.unfilter()\n }\n return this.success\n }\n}\n"]}
|
|
@@ -7,8 +7,9 @@ export interface IWorkerCommand {
|
|
|
7
7
|
}
|
|
8
8
|
export interface IWorkerCommandInitialize {
|
|
9
9
|
filterStacktraces: boolean;
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
requireModules: string[];
|
|
11
|
+
requirePaths: string[];
|
|
12
|
+
importPaths: string[];
|
|
12
13
|
supportCodeIds?: ICanonicalSupportCodeIds;
|
|
13
14
|
options: IRuntimeOptions;
|
|
14
15
|
}
|
|
@@ -1 +1 @@
|
|
|
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
|
|
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 requireModules: string[]\n requirePaths: string[]\n importPaths: 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"]}
|
|
@@ -3,48 +3,68 @@ import { ChildProcess } from 'child_process';
|
|
|
3
3
|
import * as messages from '@cucumber/messages';
|
|
4
4
|
import { EventEmitter } from 'events';
|
|
5
5
|
import { EventDataCollector } from '../../formatter/helpers';
|
|
6
|
-
import { IRuntimeOptions } from '..';
|
|
6
|
+
import { IRuntime, IRuntimeOptions } from '..';
|
|
7
7
|
import { ISupportCodeLibrary } from '../../support_code_library_builder/types';
|
|
8
8
|
import { ICoordinatorReport } from './command_types';
|
|
9
9
|
import { IdGenerator } from '@cucumber/messages';
|
|
10
10
|
export interface INewCoordinatorOptions {
|
|
11
11
|
cwd: string;
|
|
12
|
+
logger: Console;
|
|
12
13
|
eventBroadcaster: EventEmitter;
|
|
13
14
|
eventDataCollector: EventDataCollector;
|
|
14
15
|
options: IRuntimeOptions;
|
|
15
16
|
newId: IdGenerator.NewId;
|
|
16
17
|
pickleIds: string[];
|
|
17
18
|
supportCodeLibrary: ISupportCodeLibrary;
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
requireModules: string[];
|
|
20
|
+
requirePaths: string[];
|
|
21
|
+
importPaths: string[];
|
|
22
|
+
numberOfWorkers: number;
|
|
23
|
+
}
|
|
24
|
+
declare const enum WorkerState {
|
|
25
|
+
'idle' = 0,
|
|
26
|
+
'closed' = 1,
|
|
27
|
+
'running' = 2,
|
|
28
|
+
'new' = 3
|
|
20
29
|
}
|
|
21
30
|
interface IWorker {
|
|
22
|
-
|
|
31
|
+
state: WorkerState;
|
|
23
32
|
process: ChildProcess;
|
|
33
|
+
id: string;
|
|
34
|
+
}
|
|
35
|
+
interface IPicklePlacement {
|
|
36
|
+
index: number;
|
|
37
|
+
pickle: messages.Pickle;
|
|
24
38
|
}
|
|
25
|
-
export default class Coordinator {
|
|
39
|
+
export default class Coordinator implements IRuntime {
|
|
26
40
|
private readonly cwd;
|
|
27
41
|
private readonly eventBroadcaster;
|
|
28
42
|
private readonly eventDataCollector;
|
|
29
43
|
private readonly stopwatch;
|
|
30
44
|
private onFinish;
|
|
31
|
-
private nextPickleIdIndex;
|
|
32
45
|
private readonly options;
|
|
33
46
|
private readonly newId;
|
|
34
47
|
private readonly pickleIds;
|
|
35
48
|
private assembledTestCases;
|
|
49
|
+
private inProgressPickles;
|
|
36
50
|
private workers;
|
|
37
51
|
private readonly supportCodeLibrary;
|
|
38
|
-
private readonly
|
|
39
|
-
private readonly
|
|
52
|
+
private readonly requireModules;
|
|
53
|
+
private readonly requirePaths;
|
|
54
|
+
private readonly importPaths;
|
|
55
|
+
private readonly numberOfWorkers;
|
|
56
|
+
private readonly logger;
|
|
40
57
|
private success;
|
|
41
|
-
|
|
58
|
+
private idleInterventions;
|
|
59
|
+
constructor({ cwd, logger, eventBroadcaster, eventDataCollector, pickleIds, options, newId, supportCodeLibrary, requireModules, requirePaths, importPaths, numberOfWorkers, }: INewCoordinatorOptions);
|
|
42
60
|
parseWorkerMessage(worker: IWorker, message: ICoordinatorReport): void;
|
|
61
|
+
awakenWorkers(triggeringWorker: IWorker): void;
|
|
43
62
|
startWorker(id: string, total: number): void;
|
|
44
63
|
onWorkerProcessClose(exitCode: number): void;
|
|
45
64
|
parseTestCaseResult(testCaseFinished: messages.TestCaseFinished): void;
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
65
|
+
start(): Promise<boolean>;
|
|
66
|
+
nextPicklePlacement(): IPicklePlacement;
|
|
67
|
+
placementAt(index: number): IPicklePlacement;
|
|
68
|
+
giveWork(worker: IWorker, force?: boolean): void;
|
|
49
69
|
}
|
|
50
70
|
export {};
|
|
@@ -22,7 +22,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
22
22
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
23
|
};
|
|
24
24
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
-
const lodash_1 = __importDefault(require("lodash"));
|
|
26
25
|
const child_process_1 = require("child_process");
|
|
27
26
|
const path_1 = __importDefault(require("path"));
|
|
28
27
|
const helpers_1 = require("../helpers");
|
|
@@ -32,31 +31,35 @@ const stopwatch_1 = require("../stopwatch");
|
|
|
32
31
|
const assemble_test_cases_1 = require("../assemble_test_cases");
|
|
33
32
|
const runWorkerPath = path_1.default.resolve(__dirname, 'run_worker.js');
|
|
34
33
|
class Coordinator {
|
|
35
|
-
constructor({ cwd, eventBroadcaster, eventDataCollector, pickleIds, options, newId, supportCodeLibrary,
|
|
34
|
+
constructor({ cwd, logger, eventBroadcaster, eventDataCollector, pickleIds, options, newId, supportCodeLibrary, requireModules, requirePaths, importPaths, numberOfWorkers, }) {
|
|
36
35
|
this.cwd = cwd;
|
|
36
|
+
this.logger = logger;
|
|
37
37
|
this.eventBroadcaster = eventBroadcaster;
|
|
38
38
|
this.eventDataCollector = eventDataCollector;
|
|
39
|
-
this.stopwatch =
|
|
40
|
-
? new stopwatch_1.PredictableTestRunStopwatch()
|
|
41
|
-
: new stopwatch_1.RealTestRunStopwatch();
|
|
39
|
+
this.stopwatch = new stopwatch_1.RealTestRunStopwatch();
|
|
42
40
|
this.options = options;
|
|
43
41
|
this.newId = newId;
|
|
44
42
|
this.supportCodeLibrary = supportCodeLibrary;
|
|
45
|
-
this.
|
|
46
|
-
this.
|
|
47
|
-
this.
|
|
48
|
-
this.
|
|
43
|
+
this.requireModules = requireModules;
|
|
44
|
+
this.requirePaths = requirePaths;
|
|
45
|
+
this.importPaths = importPaths;
|
|
46
|
+
this.pickleIds = Array.from(pickleIds);
|
|
47
|
+
this.numberOfWorkers = numberOfWorkers;
|
|
49
48
|
this.success = true;
|
|
50
49
|
this.workers = {};
|
|
50
|
+
this.inProgressPickles = {};
|
|
51
|
+
this.idleInterventions = 0;
|
|
51
52
|
}
|
|
52
53
|
parseWorkerMessage(worker, message) {
|
|
53
54
|
if (message.ready) {
|
|
54
|
-
|
|
55
|
+
worker.state = 0 /* idle */;
|
|
56
|
+
this.awakenWorkers(worker);
|
|
55
57
|
}
|
|
56
|
-
else if (value_checker_1.doesHaveValue(message.jsonEnvelope)) {
|
|
58
|
+
else if ((0, value_checker_1.doesHaveValue)(message.jsonEnvelope)) {
|
|
57
59
|
const envelope = messages.parseEnvelope(message.jsonEnvelope);
|
|
58
60
|
this.eventBroadcaster.emit('envelope', envelope);
|
|
59
|
-
if (value_checker_1.doesHaveValue(envelope.testCaseFinished)) {
|
|
61
|
+
if ((0, value_checker_1.doesHaveValue)(envelope.testCaseFinished)) {
|
|
62
|
+
delete this.inProgressPickles[worker.id];
|
|
60
63
|
this.parseTestCaseResult(envelope.testCaseFinished);
|
|
61
64
|
}
|
|
62
65
|
}
|
|
@@ -64,30 +67,45 @@ class Coordinator {
|
|
|
64
67
|
throw new Error(`Unexpected message from worker: ${JSON.stringify(message)}`);
|
|
65
68
|
}
|
|
66
69
|
}
|
|
70
|
+
awakenWorkers(triggeringWorker) {
|
|
71
|
+
Object.values(this.workers).forEach((worker) => {
|
|
72
|
+
if (worker.state === 0 /* idle */) {
|
|
73
|
+
this.giveWork(worker);
|
|
74
|
+
}
|
|
75
|
+
return worker.state !== 0 /* idle */;
|
|
76
|
+
});
|
|
77
|
+
if (Object.keys(this.inProgressPickles).length == 0 &&
|
|
78
|
+
this.pickleIds.length > 0) {
|
|
79
|
+
this.giveWork(triggeringWorker, true);
|
|
80
|
+
this.idleInterventions++;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
67
83
|
startWorker(id, total) {
|
|
68
|
-
const workerProcess = child_process_1.fork(runWorkerPath, [], {
|
|
84
|
+
const workerProcess = (0, child_process_1.fork)(runWorkerPath, [], {
|
|
69
85
|
cwd: this.cwd,
|
|
70
|
-
env:
|
|
86
|
+
env: {
|
|
87
|
+
...process.env,
|
|
71
88
|
CUCUMBER_PARALLEL: 'true',
|
|
72
|
-
CUCUMBER_TOTAL_WORKERS: total,
|
|
89
|
+
CUCUMBER_TOTAL_WORKERS: total.toString(),
|
|
73
90
|
CUCUMBER_WORKER_ID: id,
|
|
74
|
-
}
|
|
91
|
+
},
|
|
75
92
|
stdio: ['inherit', 'inherit', 'inherit', 'ipc'],
|
|
76
93
|
});
|
|
77
|
-
const worker = {
|
|
94
|
+
const worker = { state: 3 /* new */, process: workerProcess, id };
|
|
78
95
|
this.workers[id] = worker;
|
|
79
96
|
worker.process.on('message', (message) => {
|
|
80
97
|
this.parseWorkerMessage(worker, message);
|
|
81
98
|
});
|
|
82
99
|
worker.process.on('close', (exitCode) => {
|
|
83
|
-
worker.
|
|
100
|
+
worker.state = 1 /* closed */;
|
|
84
101
|
this.onWorkerProcessClose(exitCode);
|
|
85
102
|
});
|
|
86
103
|
const initializeCommand = {
|
|
87
104
|
initialize: {
|
|
88
105
|
filterStacktraces: this.options.filterStacktraces,
|
|
89
|
-
|
|
90
|
-
|
|
106
|
+
requireModules: this.requireModules,
|
|
107
|
+
requirePaths: this.requirePaths,
|
|
108
|
+
importPaths: this.importPaths,
|
|
91
109
|
supportCodeIds: {
|
|
92
110
|
stepDefinitionIds: this.supportCodeLibrary.stepDefinitions.map((s) => s.id),
|
|
93
111
|
beforeTestCaseHookDefinitionIds: this.supportCodeLibrary.beforeTestCaseHookDefinitions.map((h) => h.id),
|
|
@@ -103,7 +121,7 @@ class Coordinator {
|
|
|
103
121
|
if (!success) {
|
|
104
122
|
this.success = false;
|
|
105
123
|
}
|
|
106
|
-
if (
|
|
124
|
+
if (Object.values(this.workers).every((x) => x.state === 1 /* closed */)) {
|
|
107
125
|
const envelope = {
|
|
108
126
|
testRunFinished: {
|
|
109
127
|
timestamp: this.stopwatch.timestamp(),
|
|
@@ -116,12 +134,12 @@ class Coordinator {
|
|
|
116
134
|
}
|
|
117
135
|
parseTestCaseResult(testCaseFinished) {
|
|
118
136
|
const { worstTestStepResult } = this.eventDataCollector.getTestCaseAttempt(testCaseFinished.testCaseStartedId);
|
|
119
|
-
if (!
|
|
120
|
-
|
|
137
|
+
if (!testCaseFinished.willBeRetried &&
|
|
138
|
+
(0, helpers_1.shouldCauseFailure)(worstTestStepResult.status, this.options)) {
|
|
121
139
|
this.success = false;
|
|
122
140
|
}
|
|
123
141
|
}
|
|
124
|
-
async
|
|
142
|
+
async start() {
|
|
125
143
|
const envelope = {
|
|
126
144
|
testRunStarted: {
|
|
127
145
|
timestamp: this.stopwatch.timestamp(),
|
|
@@ -129,29 +147,58 @@ class Coordinator {
|
|
|
129
147
|
};
|
|
130
148
|
this.eventBroadcaster.emit('envelope', envelope);
|
|
131
149
|
this.stopwatch.start();
|
|
132
|
-
this.assembledTestCases = await assemble_test_cases_1.assembleTestCases({
|
|
150
|
+
this.assembledTestCases = await (0, assemble_test_cases_1.assembleTestCases)({
|
|
133
151
|
eventBroadcaster: this.eventBroadcaster,
|
|
134
152
|
newId: this.newId,
|
|
135
153
|
pickles: this.pickleIds.map((pickleId) => this.eventDataCollector.getPickle(pickleId)),
|
|
136
154
|
supportCodeLibrary: this.supportCodeLibrary,
|
|
137
155
|
});
|
|
138
156
|
return await new Promise((resolve) => {
|
|
139
|
-
|
|
140
|
-
|
|
157
|
+
for (let i = 0; i < this.numberOfWorkers; i++) {
|
|
158
|
+
this.startWorker(i.toString(), this.numberOfWorkers);
|
|
159
|
+
}
|
|
160
|
+
this.onFinish = (status) => {
|
|
161
|
+
if (this.idleInterventions > 0) {
|
|
162
|
+
this.logger.warn(`WARNING: All workers went idle ${this.idleInterventions} time(s). Consider revising handler passed to setParallelCanAssign.`);
|
|
163
|
+
}
|
|
164
|
+
resolve(status);
|
|
165
|
+
};
|
|
141
166
|
});
|
|
142
167
|
}
|
|
143
|
-
|
|
144
|
-
|
|
168
|
+
nextPicklePlacement() {
|
|
169
|
+
for (let index = 0; index < this.pickleIds.length; index++) {
|
|
170
|
+
const placement = this.placementAt(index);
|
|
171
|
+
if (this.supportCodeLibrary.parallelCanAssign(placement.pickle, Object.values(this.inProgressPickles))) {
|
|
172
|
+
return placement;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return null;
|
|
176
|
+
}
|
|
177
|
+
placementAt(index) {
|
|
178
|
+
return {
|
|
179
|
+
index,
|
|
180
|
+
pickle: this.eventDataCollector.getPickle(this.pickleIds[index]),
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
giveWork(worker, force = false) {
|
|
184
|
+
if (this.pickleIds.length < 1) {
|
|
145
185
|
const finalizeCommand = { finalize: true };
|
|
186
|
+
worker.state = 2 /* running */;
|
|
146
187
|
worker.process.send(finalizeCommand);
|
|
147
188
|
return;
|
|
148
189
|
}
|
|
149
|
-
const
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
190
|
+
const picklePlacement = force
|
|
191
|
+
? this.placementAt(0)
|
|
192
|
+
: this.nextPicklePlacement();
|
|
193
|
+
if (picklePlacement === null) {
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
const { index: nextPickleIndex, pickle } = picklePlacement;
|
|
197
|
+
this.pickleIds.splice(nextPickleIndex, 1);
|
|
198
|
+
this.inProgressPickles[worker.id] = pickle;
|
|
199
|
+
const testCase = this.assembledTestCases[pickle.id];
|
|
153
200
|
const gherkinDocument = this.eventDataCollector.getGherkinDocument(pickle.uri);
|
|
154
|
-
const retries = helpers_1.retriesForPickle(pickle, this.options);
|
|
201
|
+
const retries = (0, helpers_1.retriesForPickle)(pickle, this.options);
|
|
155
202
|
const skip = this.options.dryRun || (this.options.failFast && !this.success);
|
|
156
203
|
const runCommand = {
|
|
157
204
|
run: {
|
|
@@ -163,12 +210,9 @@ class Coordinator {
|
|
|
163
210
|
gherkinDocument,
|
|
164
211
|
},
|
|
165
212
|
};
|
|
213
|
+
worker.state = 2 /* running */;
|
|
166
214
|
worker.process.send(runCommand);
|
|
167
215
|
}
|
|
168
|
-
shouldCauseFailure(status) {
|
|
169
|
-
return (lodash_1.default.includes(['AMBIGUOUS', 'FAILED', 'UNDEFINED'], status) ||
|
|
170
|
-
(status === 'PENDING' && this.options.strict));
|
|
171
|
-
}
|
|
172
216
|
}
|
|
173
217
|
exports.default = Coordinator;
|
|
174
218
|
//# 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 _ from 'lodash'\nimport { ChildProcess, fork } from 'child_process'\nimport path from 'path'\nimport { retriesForPickle } 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 {\n ITestRunStopwatch,\n PredictableTestRunStopwatch,\n RealTestRunStopwatch,\n} 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 = options.predictableIds\n ? new PredictableTestRunStopwatch()\n : 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: _.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 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 (_.every(this.workers, '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 !worstTestStepResult.willBeRetried &&\n this.shouldCauseFailure(worstTestStepResult.status)\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 _.times(numberOfWorkers, (id) =>\n this.startWorker(id.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 shouldCauseFailure(status: messages.TestStepResultStatus): boolean {\n return (\n _.includes(['AMBIGUOUS', 'FAILED', 'UNDEFINED'], status) ||\n (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 { IRuntime, 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 logger: Console\n eventBroadcaster: EventEmitter\n eventDataCollector: EventDataCollector\n options: IRuntimeOptions\n newId: IdGenerator.NewId\n pickleIds: string[]\n supportCodeLibrary: ISupportCodeLibrary\n requireModules: string[]\n requirePaths: string[]\n importPaths: string[]\n numberOfWorkers: number\n}\n\nconst enum WorkerState {\n 'idle',\n 'closed',\n 'running',\n 'new',\n}\n\ninterface IWorker {\n state: WorkerState\n process: ChildProcess\n id: string\n}\n\ninterface IPicklePlacement {\n index: number\n pickle: messages.Pickle\n}\n\nexport default class Coordinator implements IRuntime {\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 readonly options: IRuntimeOptions\n private readonly newId: IdGenerator.NewId\n private readonly pickleIds: string[]\n private assembledTestCases: IAssembledTestCases\n private inProgressPickles: Record<string, messages.Pickle>\n private workers: Record<string, IWorker>\n private readonly supportCodeLibrary: ISupportCodeLibrary\n private readonly requireModules: string[]\n private readonly requirePaths: string[]\n private readonly importPaths: string[]\n private readonly numberOfWorkers: number\n private readonly logger: Console\n private success: boolean\n private idleInterventions: number\n\n constructor({\n cwd,\n logger,\n eventBroadcaster,\n eventDataCollector,\n pickleIds,\n options,\n newId,\n supportCodeLibrary,\n requireModules,\n requirePaths,\n importPaths,\n numberOfWorkers,\n }: INewCoordinatorOptions) {\n this.cwd = cwd\n this.logger = logger\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.requireModules = requireModules\n this.requirePaths = requirePaths\n this.importPaths = importPaths\n this.pickleIds = Array.from(pickleIds)\n this.numberOfWorkers = numberOfWorkers\n this.success = true\n this.workers = {}\n this.inProgressPickles = {}\n this.idleInterventions = 0\n }\n\n parseWorkerMessage(worker: IWorker, message: ICoordinatorReport): void {\n if (message.ready) {\n worker.state = WorkerState.idle\n this.awakenWorkers(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 delete this.inProgressPickles[worker.id]\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 awakenWorkers(triggeringWorker: IWorker): void {\n Object.values(this.workers).forEach((worker) => {\n if (worker.state === WorkerState.idle) {\n this.giveWork(worker)\n }\n return worker.state !== WorkerState.idle\n })\n\n if (\n Object.keys(this.inProgressPickles).length == 0 &&\n this.pickleIds.length > 0\n ) {\n this.giveWork(triggeringWorker, true)\n this.idleInterventions++\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 = { state: WorkerState.new, process: workerProcess, id }\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.state = WorkerState.closed\n this.onWorkerProcessClose(exitCode)\n })\n const initializeCommand: IWorkerCommand = {\n initialize: {\n filterStacktraces: this.options.filterStacktraces,\n requireModules: this.requireModules,\n requirePaths: this.requirePaths,\n importPaths: this.importPaths,\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\n if (\n Object.values(this.workers).every((x) => x.state === WorkerState.closed)\n ) {\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 start(): 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 < this.numberOfWorkers; i++) {\n this.startWorker(i.toString(), this.numberOfWorkers)\n }\n this.onFinish = (status) => {\n if (this.idleInterventions > 0) {\n this.logger.warn(\n `WARNING: All workers went idle ${this.idleInterventions} time(s). Consider revising handler passed to setParallelCanAssign.`\n )\n }\n\n resolve(status)\n }\n })\n }\n\n nextPicklePlacement(): IPicklePlacement {\n for (let index = 0; index < this.pickleIds.length; index++) {\n const placement = this.placementAt(index)\n if (\n this.supportCodeLibrary.parallelCanAssign(\n placement.pickle,\n Object.values(this.inProgressPickles)\n )\n ) {\n return placement\n }\n }\n\n return null\n }\n\n placementAt(index: number): IPicklePlacement {\n return {\n index,\n pickle: this.eventDataCollector.getPickle(this.pickleIds[index]),\n }\n }\n\n giveWork(worker: IWorker, force: boolean = false): void {\n if (this.pickleIds.length < 1) {\n const finalizeCommand: IWorkerCommand = { finalize: true }\n worker.state = WorkerState.running\n worker.process.send(finalizeCommand)\n return\n }\n\n const picklePlacement = force\n ? this.placementAt(0)\n : this.nextPicklePlacement()\n\n if (picklePlacement === null) {\n return\n }\n\n const { index: nextPickleIndex, pickle } = picklePlacement\n\n this.pickleIds.splice(nextPickleIndex, 1)\n this.inProgressPickles[worker.id] = pickle\n const testCase = this.assembledTestCases[pickle.id]\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.state = WorkerState.running\n worker.process.send(runCommand)\n }\n}\n"]}
|
|
@@ -8,7 +8,7 @@ const verror_1 = __importDefault(require("verror"));
|
|
|
8
8
|
const value_checker_1 = require("../../value_checker");
|
|
9
9
|
function run() {
|
|
10
10
|
const exit = (exitCode, error, message) => {
|
|
11
|
-
if (value_checker_1.doesHaveValue(error)) {
|
|
11
|
+
if ((0, value_checker_1.doesHaveValue)(error)) {
|
|
12
12
|
console.error(verror_1.default.fullStack(new verror_1.default(error, message))); // eslint-disable-line no-console
|
|
13
13
|
}
|
|
14
14
|
process.exit(exitCode);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run_worker.js","sourceRoot":"","sources":["../../../src/runtime/parallel/run_worker.ts"],"names":[],"mappings":";;;;;AAAA,sDAA6B;AAC7B,oDAA2B;AAC3B,uDAAmD;AAEnD,SAAS,GAAG;IACV,MAAM,IAAI,GAAG,CAAC,QAAgB,EAAE,KAAa,EAAE,OAAgB,EAAQ,EAAE;QACvE,IAAI,6BAAa,
|
|
1
|
+
{"version":3,"file":"run_worker.js","sourceRoot":"","sources":["../../../src/runtime/parallel/run_worker.ts"],"names":[],"mappings":";;;;;AAAA,sDAA6B;AAC7B,oDAA2B;AAC3B,uDAAmD;AAEnD,SAAS,GAAG;IACV,MAAM,IAAI,GAAG,CAAC,QAAgB,EAAE,KAAa,EAAE,OAAgB,EAAQ,EAAE;QACvE,IAAI,IAAA,6BAAa,EAAC,KAAK,CAAC,EAAE;YACxB,OAAO,CAAC,KAAK,CAAC,gBAAM,CAAC,SAAS,CAAC,IAAI,gBAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA,CAAC,iCAAiC;SAC9F;QACD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACxB,CAAC,CAAA;IACD,MAAM,MAAM,GAAG,IAAI,gBAAM,CAAC;QACxB,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB;QAClC,WAAW,EAAE,CAAC,OAAY,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;QACpD,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;QAClB,IAAI;KACL,CAAC,CAAA;IACF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,CAAM,EAAQ,EAAE;QACrC,MAAM;aACH,cAAc,CAAC,CAAC,CAAC;aACjB,KAAK,CAAC,CAAC,KAAY,EAAE,EAAE,CACtB,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,2CAA2C,CAAC,CAC5D,CAAA;IACL,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,GAAG,EAAE,CAAA","sourcesContent":["import Worker from './worker'\nimport VError from 'verror'\nimport { doesHaveValue } from '../../value_checker'\n\nfunction run(): void {\n const exit = (exitCode: number, error?: Error, message?: string): void => {\n if (doesHaveValue(error)) {\n console.error(VError.fullStack(new VError(error, message))) // eslint-disable-line no-console\n }\n process.exit(exitCode)\n }\n const worker = new Worker({\n id: process.env.CUCUMBER_WORKER_ID,\n sendMessage: (message: any) => process.send(message),\n cwd: process.cwd(),\n exit,\n })\n process.on('message', (m: any): void => {\n worker\n .receiveMessage(m)\n .catch((error: Error) =>\n exit(1, error, 'Unexpected error on worker.receiveMessage')\n )\n })\n}\n\nrun()\n"]}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { ICoordinatorReport, IWorkerCommand, IWorkerCommandInitialize, IWorkerCommandRun } from './command_types';
|
|
2
|
-
import TestRunHookDefinition from '../../models/test_run_hook_definition';
|
|
3
2
|
declare type IExitFunction = (exitCode: number, error?: Error, message?: string) => void;
|
|
4
3
|
declare type IMessageSender = (command: ICoordinatorReport) => void;
|
|
5
4
|
export default class Worker {
|
|
@@ -13,17 +12,16 @@ export default class Worker {
|
|
|
13
12
|
private readonly stackTraceFilter;
|
|
14
13
|
private supportCodeLibrary;
|
|
15
14
|
private worldParameters;
|
|
16
|
-
private
|
|
15
|
+
private runTestRunHooks;
|
|
17
16
|
constructor({ cwd, exit, id, sendMessage, }: {
|
|
18
17
|
cwd: string;
|
|
19
18
|
exit: IExitFunction;
|
|
20
19
|
id: string;
|
|
21
20
|
sendMessage: IMessageSender;
|
|
22
21
|
});
|
|
23
|
-
initialize({ filterStacktraces,
|
|
22
|
+
initialize({ filterStacktraces, requireModules, requirePaths, importPaths, supportCodeIds, options, }: IWorkerCommandInitialize): Promise<void>;
|
|
24
23
|
finalize(): Promise<void>;
|
|
25
24
|
receiveMessage(message: IWorkerCommand): Promise<void>;
|
|
26
25
|
runTestCase({ gherkinDocument, pickle, testCase, elapsed, retries, skip, }: IWorkerCommandRun): Promise<void>;
|
|
27
|
-
runTestRunHooks(testRunHookDefinitions: TestRunHookDefinition[], name: string): Promise<void>;
|
|
28
26
|
}
|
|
29
27
|
export {};
|
|
@@ -3,17 +3,18 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const
|
|
6
|
+
const messages_1 = require("@cucumber/messages");
|
|
7
|
+
const durations_1 = require("durations");
|
|
7
8
|
const events_1 = require("events");
|
|
8
|
-
const
|
|
9
|
+
const url_1 = require("url");
|
|
9
10
|
const stack_trace_filter_1 = __importDefault(require("../../stack_trace_filter"));
|
|
10
11
|
const support_code_library_builder_1 = __importDefault(require("../../support_code_library_builder"));
|
|
11
|
-
const test_case_runner_1 = __importDefault(require("../test_case_runner"));
|
|
12
|
-
const user_code_runner_1 = __importDefault(require("../../user_code_runner"));
|
|
13
|
-
const messages_1 = require("@cucumber/messages");
|
|
14
12
|
const value_checker_1 = require("../../value_checker");
|
|
13
|
+
const run_test_run_hooks_1 = require("../run_test_run_hooks");
|
|
15
14
|
const stopwatch_1 = require("../stopwatch");
|
|
16
|
-
const
|
|
15
|
+
const test_case_runner_1 = __importDefault(require("../test_case_runner"));
|
|
16
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
17
|
+
const { importer } = require('../../importer');
|
|
17
18
|
const { uuid } = messages_1.IdGenerator;
|
|
18
19
|
class Worker {
|
|
19
20
|
constructor({ cwd, exit, id, sendMessage, }) {
|
|
@@ -30,17 +31,20 @@ class Worker {
|
|
|
30
31
|
});
|
|
31
32
|
});
|
|
32
33
|
}
|
|
33
|
-
async initialize({ filterStacktraces,
|
|
34
|
-
supportCodeRequiredModules.map((module) => require(module));
|
|
34
|
+
async initialize({ filterStacktraces, requireModules, requirePaths, importPaths, supportCodeIds, options, }) {
|
|
35
35
|
support_code_library_builder_1.default.reset(this.cwd, this.newId);
|
|
36
|
-
|
|
36
|
+
requireModules.map((module) => require(module));
|
|
37
|
+
requirePaths.map((module) => require(module));
|
|
38
|
+
for (const path of importPaths) {
|
|
39
|
+
await importer((0, url_1.pathToFileURL)(path));
|
|
40
|
+
}
|
|
37
41
|
this.supportCodeLibrary = support_code_library_builder_1.default.finalize(supportCodeIds);
|
|
38
42
|
this.worldParameters = options.worldParameters;
|
|
39
|
-
this.options = options;
|
|
40
43
|
this.filterStacktraces = filterStacktraces;
|
|
41
44
|
if (this.filterStacktraces) {
|
|
42
45
|
this.stackTraceFilter.filter();
|
|
43
46
|
}
|
|
47
|
+
this.runTestRunHooks = (0, run_test_run_hooks_1.makeRunTestRunHooks)(options.dryRun, this.supportCodeLibrary.defaultTimeout, (name, location) => `${name} hook errored on worker ${this.id}, process exiting: ${location}`);
|
|
44
48
|
await this.runTestRunHooks(this.supportCodeLibrary.beforeTestRunHookDefinitions, 'a BeforeAll');
|
|
45
49
|
this.sendMessage({ ready: true });
|
|
46
50
|
}
|
|
@@ -52,21 +56,19 @@ class Worker {
|
|
|
52
56
|
this.exit(0);
|
|
53
57
|
}
|
|
54
58
|
async receiveMessage(message) {
|
|
55
|
-
if (value_checker_1.doesHaveValue(message.initialize)) {
|
|
59
|
+
if ((0, value_checker_1.doesHaveValue)(message.initialize)) {
|
|
56
60
|
await this.initialize(message.initialize);
|
|
57
61
|
}
|
|
58
62
|
else if (message.finalize) {
|
|
59
63
|
await this.finalize();
|
|
60
64
|
}
|
|
61
|
-
else if (value_checker_1.doesHaveValue(message.run)) {
|
|
65
|
+
else if ((0, value_checker_1.doesHaveValue)(message.run)) {
|
|
62
66
|
await this.runTestCase(message.run);
|
|
63
67
|
}
|
|
64
68
|
}
|
|
65
69
|
async runTestCase({ gherkinDocument, pickle, testCase, elapsed, retries, skip, }) {
|
|
66
|
-
const stopwatch =
|
|
67
|
-
|
|
68
|
-
: new stopwatch_1.RealTestRunStopwatch();
|
|
69
|
-
stopwatch.from(durations_1.duration(elapsed));
|
|
70
|
+
const stopwatch = new stopwatch_1.RealTestRunStopwatch();
|
|
71
|
+
stopwatch.from((0, durations_1.duration)(elapsed));
|
|
70
72
|
const testCaseRunner = new test_case_runner_1.default({
|
|
71
73
|
eventBroadcaster: this.eventBroadcaster,
|
|
72
74
|
stopwatch,
|
|
@@ -82,23 +84,6 @@ class Worker {
|
|
|
82
84
|
await testCaseRunner.run();
|
|
83
85
|
this.sendMessage({ ready: true });
|
|
84
86
|
}
|
|
85
|
-
async runTestRunHooks(testRunHookDefinitions, name) {
|
|
86
|
-
if (this.options.dryRun) {
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
await bluebird_1.default.each(testRunHookDefinitions, async (hookDefinition) => {
|
|
90
|
-
const { error } = await user_code_runner_1.default.run({
|
|
91
|
-
argsArray: [],
|
|
92
|
-
fn: hookDefinition.code,
|
|
93
|
-
thisArg: null,
|
|
94
|
-
timeoutInMilliseconds: value_checker_1.valueOrDefault(hookDefinition.options.timeout, this.supportCodeLibrary.defaultTimeout),
|
|
95
|
-
});
|
|
96
|
-
if (value_checker_1.doesHaveValue(error)) {
|
|
97
|
-
const location = helpers_1.formatLocation(hookDefinition);
|
|
98
|
-
this.exit(1, error, `${name} hook errored on worker ${this.id}, process exiting: ${location}`);
|
|
99
|
-
}
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
87
|
}
|
|
103
88
|
exports.default = Worker;
|
|
104
89
|
//# sourceMappingURL=worker.js.map
|