6
import LocalHostDeterminer
7
import MetricsExtensions
15
public final class DumpCommand: Command {
16
public let name = "dump"
17
public let description = "Performs test discovery and dumps information about discovered tests into JSON file"
18
public let arguments: Arguments = [
19
ArgumentDescriptions.emceeVersion.asOptional,
20
ArgumentDescriptions.output.asRequired,
21
ArgumentDescriptions.tempFolder.asRequired,
22
ArgumentDescriptions.testArgFile.asRequired,
23
ArgumentDescriptions.remoteCacheConfig.asOptional,
24
ArgumentDescriptions.hostname.asOptional,
28
private let encoder = JSONEncoder.pretty()
30
public init(di: DI) throws {
34
public func run(payload: CommandPayload) throws {
35
let hostname: String = try payload.optionalSingleTypedValue(argumentName: ArgumentDescriptions.hostname.name) ?? LocalHostDeterminer.currentHostAddress
36
try HostnameSetup.update(hostname: hostname, di: di)
38
let testArgFile = try ArgumentsReader.testArgFile(try payload.expectedSingleTypedValue(argumentName: ArgumentDescriptions.testArgFile.name))
39
let remoteCacheConfig = try ArgumentsReader.remoteCacheConfig(
40
try payload.optionalSingleTypedValue(argumentName: ArgumentDescriptions.remoteCacheConfig.name)
42
let tempFolder = try TemporaryFolder(
43
containerPath: try payload.expectedSingleTypedValue(argumentName: ArgumentDescriptions.tempFolder.name)
45
let outputPath: AbsolutePath = try payload.expectedSingleTypedValue(argumentName: ArgumentDescriptions.output.name)
46
let emceeVersion: Version = try payload.optionalSingleTypedValue(argumentName: ArgumentDescriptions.emceeVersion.name) ?? EmceeVersion.version
48
try di.get(GlobalMetricRecorder.self).set(analyticsConfiguration: testArgFile.prioritizedJob.analyticsConfiguration)
49
if let kibanaConfiguration = testArgFile.prioritizedJob.analyticsConfiguration.kibanaConfiguration {
50
try di.get(LoggingSetup.self).set(kibanaConfiguration: kibanaConfiguration)
53
try di.get(ContextualLogger.self).with(
54
analyticsConfiguration: testArgFile.prioritizedJob.analyticsConfiguration
58
let logger = try di.get(ContextualLogger.self)
60
let onDemandSimulatorPool = try OnDemandSimulatorPoolFactory.create(
64
tempFolder: tempFolder,
67
defer { onDemandSimulatorPool.deleteSimulators() }
69
di.set(onDemandSimulatorPool, for: OnDemandSimulatorPool.self)
71
SignalHandling.addSignalHandler(signals: [.term, .int]) { [logger] signal in
72
logger.trace("Got signal: \(signal)")
73
onDemandSimulatorPool.deleteSimulators()
77
TestDiscoveryQuerierImpl(
78
dateProvider: try di.get(),
79
developerDirLocator: try di.get(),
80
fileSystem: try di.get(),
82
globalMetricRecorder: try di.get(),
83
specificMetricRecorderProvider: try di.get(),
84
onDemandSimulatorPool: try di.get(),
85
pluginEventBusProvider: try di.get(),
86
processControllerProvider: try di.get(),
87
resourceLocationResolver: try di.get(),
88
runnerWasteCollectorProvider: try di.get(),
89
tempFolder: tempFolder,
90
testRunnerProvider: try di.get(),
91
uniqueIdentifierGenerator: try di.get(),
92
version: emceeVersion,
95
for: TestDiscoveryQuerier.self
98
let discoverer = PipelinedTestDiscoverer(
99
runtimeDumpRemoteCacheProvider: try di.get(),
100
testDiscoveryQuerier: try di.get(),
101
urlResource: try di.get()
104
let dumpedTests = try discoverer.performTestDiscovery(
106
testArgFile: testArgFile,
107
remoteCacheConfig: remoteCacheConfig
111
let encodedResult = try encoder.encode(dumpedTests)
112
try encodedResult.write(to: outputPath.fileUrl, options: [.atomic])
113
logger.info("Wrote test discovery result into \(outputPath)")
115
logger.error("Failed to write output: \(error)")