1515//===----------------------------------------------------------------------===//
1616
1717import AsyncHTTPClient
18+ import ContainerLog
1819import ContainerResource
1920import Containerization
2021import ContainerizationOS
2122import Foundation
23+ import Logging
24+ import Synchronization
25+ import SystemPackage
2226import Testing
2327
2428class CLITest {
29+ private static let commandSeq = Mutex < Int > ( 0 )
2530 struct Image : Codable {
2631 let reference : String
2732 }
@@ -46,14 +51,35 @@ class CLITest {
4651 let status : NetworkStatus ?
4752 }
4853
49- init ( ) throws { }
50-
51- let testUUID = UUID ( ) . uuidString
54+ let testName : String
55+ let testSuite : String
56+ var log : Logger
57+
58+ init ( ) throws {
59+ let name = Test . current. map { $0. name. hasSuffix ( " () " ) ? String ( $0. name. dropLast ( 2 ) ) : $0. name } ?? UUID ( ) . uuidString
60+ let suite = " \( type ( of: self ) ) "
61+ self . testName = name
62+ self . testSuite = suite
63+ let logger = Logger ( label: " com.apple.container.test " ) { label in
64+ if let logRootString = ProcessInfo . processInfo. environment [ " CLITEST_LOG_ROOT " ] ,
65+ !logRootString. isEmpty
66+ {
67+ let logPath = FilePath ( logRootString) . appending ( " clitests " ) . appending ( suite) . appending ( name + " .log " )
68+ if let handler = try ? FileLogHandler ( label: label, category: " clitests " , path: logPath) {
69+ return handler
70+ }
71+ }
72+ return StderrLogHandler ( )
73+ }
74+ self . log = logger
75+ self . log [ metadataKey: " testID " ] = " \( name) "
76+ self . log [ metadataKey: " suite " ] = " \( suite) "
77+ }
5278
5379 var testDir : URL ! {
5480 let tempDir = URL ( fileURLWithPath: FileManager . default. currentDirectoryPath)
5581 . appendingPathComponent ( " .clitests " )
56- . appendingPathComponent ( testUUID )
82+ . appendingPathComponent ( testName )
5783 try ! FileManager . default. createDirectory ( at: tempDir, withIntermediateDirectories: true )
5884 return tempDir
5985 }
@@ -110,6 +136,18 @@ class CLITest {
110136 }
111137
112138 func run( arguments: [ String ] , stdin: Data ? = nil , currentDirectory: URL ? = nil ) throws -> ( outputData: Data , output: String , error: String , status: Int32 ) {
139+ let seq = CLITest . commandSeq. withLock { counter in
140+ defer { counter += 1 }
141+ return counter
142+ }
143+ log. info (
144+ " command start " ,
145+ metadata: [
146+ " seq " : " \( seq) " ,
147+ " args " : " \( arguments. joined ( separator: " " ) ) " ,
148+ ]
149+ )
150+
113151 let process = Process ( )
114152 process. executableURL = try executablePath
115153 process. arguments = arguments
@@ -142,6 +180,16 @@ class CLITest {
142180 let output = String ( data: outputData, encoding: . utf8) ?? " "
143181 let error = String ( data: errorData, encoding: . utf8) ?? " "
144182
183+ log. info (
184+ " command end " ,
185+ metadata: [
186+ " seq " : " \( seq) " ,
187+ " status " : " \( process. terminationStatus) " ,
188+ " stdout " : " \( String ( output. prefix ( 64 ) ) . debugDescription) " ,
189+ " stderr " : " \( String ( error. prefix ( 64 ) ) . debugDescription) " ,
190+ ]
191+ )
192+
145193 return ( outputData: outputData, output: output, error: error, status: process. terminationStatus)
146194 }
147195
0 commit comments