5
import DeveloperDirLocator
12
import HostnameProvider
13
import LocalHostDeterminer
15
import MetricsExtensions
18
import ProcessController
21
import ResourceLocationResolver
24
import SynchronousWaiter
27
import UniqueIdentifierGenerator
31
public final class InProcessMain {
34
public func run() throws {
38
FilePropertiesProviderImpl(),
39
for: FilePropertiesProvider.self
42
LocalFileSystemProvider().create(),
47
for: DateProvider.self
50
SpecificMetricRecorderProviderImpl(
51
mutableMetricRecorderProvider: MutableMetricRecorderProviderImpl(
53
label: "MutableMetricRecorderProvider.queue",
54
attributes: .concurrent,
59
for: SpecificMetricRecorderProvider.self
62
// global metric recorder to be configured after obtaining analytics configuration
64
GlobalMetricRecorderImpl(),
65
for: GlobalMetricRecorder.self
68
let globalMetricRecorder: GlobalMetricRecorder = try di.get()
69
let specificMetricRecorderProvider: SpecificMetricRecorderProvider = try di.get()
71
let logsTimeToLive = TimeUnit.days(5)
73
let logCleaningQueue = OperationQueue()
74
let loggingSetup = LoggingSetup(
75
dateProvider: try di.get(),
76
fileSystem: try di.get()
80
let logger = try setupLogging(di: di, logsTimeToLive: logsTimeToLive, queue: logCleaningQueue)
81
.withMetadata(key: .emceeVersion, value: EmceeVersion.version.value)
82
.withMetadata(key: .processId, value: "\(ProcessInfo.processInfo.processIdentifier)")
83
.withMetadata(key: .processName, value: ProcessInfo.processInfo.processName)
84
.withMetadata(key: .hostname, value: LocalHostDeterminer.currentHostAddress)
88
let timeout: TimeInterval = 10
89
loggingSetup.tearDown(timeout: timeout)
90
specificMetricRecorderProvider.tearDown(timeout: timeout)
91
globalMetricRecorder.tearDown(timeout: timeout)
92
logCleaningQueue.waitUntilAllOperationsAreFinished()
95
logger.trace("Arguments: \(ProcessInfo.processInfo.arguments)")
98
try DetailedActivityLoggableProcessControllerProvider(di: di),
99
for: ProcessControllerProvider.self
103
SubprocessSSHClientProvider(
104
processControllerProvider: try di.get()
106
for: SSHClientProvider.self
110
DefaultDeveloperDirLocator(
111
processControllerProvider: try di.get()
113
for: DeveloperDirLocator.self
117
DefaultRequestSenderProvider(
120
for: RequestSenderProvider.self
124
DefaultRuntimeDumpRemoteCacheProvider(
125
senderProvider: try di.get()
127
for: RuntimeDumpRemoteCacheProvider.self
131
try FileCache.fileCacheInDefaultLocation(
132
dateProvider: try di.get(),
133
fileSystem: try di.get()
140
fileCache: try di.get(),
142
urlSession: URLSession.shared
144
for: URLResource.self
148
DefaultCommonlyUsedPathsProvider(
149
fileManager: FileManager()
151
for: CommonlyUsedPathsProvider.self
155
ResourceLocationResolverImpl(
156
fileSystem: try di.get(),
158
urlResource: try di.get(),
159
processControllerProvider: try di.get(),
160
commonlyUsedPathsProvider: try di.get()
162
for: ResourceLocationResolver.self
166
RunnerWasteCollectorProviderImpl(),
167
for: RunnerWasteCollectorProvider.self
171
MutableHostnameProviderImpl(
172
hostname: LocalHostDeterminer.currentHostAddress
174
for: MutableHostnameProvider.self
177
try di.get(MutableHostnameProvider.self),
178
for: HostnameProvider.self
182
PluginEventBusProviderImpl(
184
hostnameProvider: try di.get(),
185
processControllerProvider: try di.get(),
186
resourceLocationResolver: try di.get()
188
for: PluginEventBusProvider.self
192
UuidBasedUniqueIdentifierGenerator(),
193
for: UniqueIdentifierGenerator.self
198
dateProvider: try di.get(),
200
processControllerProvider: try di.get()
202
for: XcResultTool.self
206
DefaultTestRunnerProvider(
207
dateProvider: try di.get(),
208
fileSystem: try di.get(),
209
hostnameProvider: try di.get(),
210
processControllerProvider: try di.get(),
211
resourceLocationResolver: try di.get(),
212
version: EmceeVersion.version,
213
xcResultTool: try di.get()
215
for: TestRunnerProvider.self
224
processControllerProvider: try di.get()
226
for: ZipCompressor.self
230
dateProvider: try di.get(),
231
developerDirLocator: try di.get(),
232
fileSystem: try di.get(),
233
hostnameProvider: try di.get(),
234
logger: try di.get(),
235
pluginEventBusProvider: try di.get(),
236
runnerWasteCollectorProvider: try di.get(),
237
testRunnerProvider: try di.get(),
238
uniqueIdentifierGenerator: try di.get(),
241
for: AppleRunnerProvider.self
244
MyAddressFetcherProviderImpl(
245
requestSenderProvider: try di.get()
247
for: MyAddressFetcherProvider.self
250
SynchronousMyAddressFetcherProviderImpl(
251
myAddressFetcherProvider: try di.get(),
254
for: SynchronousMyAddressFetcherProvider.self
257
let commandInvoker = CommandInvoker(
259
try DistWorkCommand(di: di),
260
try DumpCommand(di: di),
261
try RunTestsOnRemoteQueueCommand(di: di),
262
try StartQueueServerCommand(di: di),
263
try KickstartCommand(di: di),
264
try EnableWorkerCommand(di: di),
265
try DisableWorkerCommand(di: di),
266
try ToggleWorkersSharingCommand(di: di),
267
try InitTestArgFileCommand(di: di),
268
try InitQueueServerConfigCommand(di: di),
269
try RunTestsCommand(di: di),
272
helpCommandType: .generateAutomatically
274
let invokableCommand = try commandInvoker.invokableCommand()
277
try di.get(ContextualLogger.self)
278
.withMetadata(key: .emceeCommand, value: invokableCommand.command.name)
281
try invokableCommand.invoke()
284
private func setupLogging(di: DI, logsTimeToLive: TimeUnit, queue: OperationQueue) throws -> ContextualLogger {
285
let loggingSetup: LoggingSetup = try di.get()
286
let logger = try loggingSetup.setupLogging(
287
stderrVerbosity: .info,
288
detailedLogVerbosity: .debug
291
try loggingSetup.cleanUpLogs(
293
olderThan: try di.get(DateProvider.self).currentDate().addingTimeInterval(-logsTimeToLive.timeInterval),
295
completion: { error in
296
if let error = error {
297
logger.error("Failed to clean up old logs: \(error)")