1212//
1313//===----------------------------------------------------------------------===//
1414
15+ import InMemoryLogging
1516import Logging
1617import NIOConcurrencyHelpers
1718import SotoTestUtils
@@ -21,8 +22,9 @@ import XCTest
2122
2223class LoggingTests : XCTestCase {
2324 func testRequestIdIncrements( ) async throws {
24- let logCollection = LoggingCollector . Logs ( )
25- let logger = Logger ( label: " LoggingTests " , factory: { _ in LoggingCollector ( logCollection, logLevel: . trace) } )
25+ let inMemoryLogging = InMemoryLogHandler ( )
26+ var logger = Logger ( label: " LoggingTests " , factory: { _ in inMemoryLogging } )
27+ logger. logLevel = . trace
2628 let server = AWSTestServer ( serviceProtocol: . json)
2729 defer { XCTAssertNoThrow ( try server. stop ( ) ) }
2830 let client = AWSClient (
@@ -53,16 +55,16 @@ class LoggingTests: XCTestCase {
5355
5456 try await responseTask
5557 try await response2Task
56- let requestId1 = logCollection . filter ( metadata : " aws-operation " , with : " test1 " ) . first ? . metadata [ " aws-request-id " ]
57- let requestId2 = logCollection . filter ( metadata : " aws-operation " , with : " test2 " ) . first ? . metadata [ " aws-request-id " ]
58+ let requestId1 = inMemoryLogging . entries . first { $0 . metadata [ " aws-operation " ] == " test1 " } ? . metadata [ " aws-request-id " ]
59+ let requestId2 = inMemoryLogging . entries . first { $0 . metadata [ " aws-operation " ] == " test2 " } ? . metadata [ " aws-request-id " ]
5860 XCTAssertNotNil ( requestId1)
5961 XCTAssertNotNil ( requestId2)
6062 XCTAssertNotEqual ( requestId1, requestId2)
6163 }
6264
6365 func testAWSRequestResponse( ) async throws {
64- let logCollection = LoggingCollector . Logs ( )
65- var logger = Logger ( label: " LoggingTests " , factory: { _ in LoggingCollector ( logCollection ) } )
66+ let inMemoryLogging = InMemoryLogHandler ( )
67+ var logger = Logger ( label: " LoggingTests " , factory: { _ in inMemoryLogging } )
6668 logger. logLevel = . trace
6769 let traceLogger = logger
6870 let server = AWSTestServer ( serviceProtocol: . json)
@@ -93,19 +95,22 @@ class LoggingTests: XCTestCase {
9395 )
9496
9597 try await responseTask
96- let requestEntry = try XCTUnwrap ( logCollection. filter ( message: " AWS Request " ) . first)
97- XCTAssertEqual ( requestEntry. level, . debug)
98- XCTAssertEqual ( requestEntry. metadata [ " aws-operation " ] , " TestOperation " )
99- XCTAssertEqual ( requestEntry. metadata [ " aws-service " ] , " test-service " )
100- let responseEntry = try XCTUnwrap ( logCollection. filter ( message: " AWS Response " ) . first)
101- XCTAssertEqual ( responseEntry. level, . trace)
102- XCTAssertEqual ( responseEntry. metadata [ " aws-operation " ] , " TestOperation " )
103- XCTAssertEqual ( responseEntry. metadata [ " aws-service " ] , " test-service " )
98+ let requestEntry = inMemoryLogging. entries. first ( where: { $0. message == " AWS Request " } )
99+ XCTAssertNotNil ( requestEntry)
100+ XCTAssertEqual ( requestEntry? . level, . debug)
101+ XCTAssertEqual ( requestEntry? . metadata [ " aws-operation " ] , " TestOperation " )
102+ XCTAssertEqual ( requestEntry? . metadata [ " aws-service " ] , " test-service " )
103+ let responseEntry = inMemoryLogging. entries. first { $0. message == " AWS Response " }
104+ XCTAssertNotNil ( responseEntry)
105+ XCTAssertEqual ( responseEntry? . level, . trace)
106+ XCTAssertEqual ( responseEntry? . metadata [ " aws-operation " ] , " TestOperation " )
107+ XCTAssertEqual ( responseEntry? . metadata [ " aws-service " ] , " test-service " )
104108 }
105109
106110 func testAWSError( ) async throws {
107- let logCollection = LoggingCollector . Logs ( )
108- let logger = Logger ( label: " LoggingTests " , factory: { _ in LoggingCollector ( logCollection) } )
111+ let inMemoryLogging = InMemoryLogHandler ( )
112+ var logger = Logger ( label: " LoggingTests " , factory: { _ in inMemoryLogging } )
113+ logger. logLevel = . trace
109114 let server = AWSTestServer ( serviceProtocol: . json)
110115 defer { XCTAssertNoThrow ( try server. stop ( ) ) }
111116 let client = AWSClient (
@@ -128,13 +133,14 @@ class LoggingTests: XCTestCase {
128133 )
129134
130135 try ? await responseTask
131- XCTAssertEqual ( logCollection . filter ( metadata : " aws-error-code " , with : " AccessDenied " ) . first ? . message, " AWS Error " )
132- XCTAssertEqual ( logCollection . filter ( metadata : " aws-error-code " , with : " AccessDenied " ) . first ? . level, . info)
136+ XCTAssertEqual ( inMemoryLogging . entries . first { $0 . metadata [ " aws-error-code " ] == " AccessDenied " } ? . message, " AWS Error " )
137+ XCTAssertEqual ( inMemoryLogging . entries . first { $0 . metadata [ " aws-error-code " ] == " AccessDenied " } ? . level, . info)
133138 }
134139
135140 func testRetryRequest( ) async throws {
136- let logCollection = LoggingCollector . Logs ( )
137- let logger = Logger ( label: " LoggingTests " , factory: { _ in LoggingCollector ( logCollection, logLevel: . trace) } )
141+ let inMemoryLogging = InMemoryLogHandler ( )
142+ var logger = Logger ( label: " LoggingTests " , factory: { _ in inMemoryLogging } )
143+ logger. logLevel = . trace
138144 let server = AWSTestServer ( serviceProtocol: . json)
139145 defer { XCTAssertNoThrow ( try server. stop ( ) ) }
140146 let client = AWSClient (
@@ -163,13 +169,14 @@ class LoggingTests: XCTestCase {
163169 )
164170
165171 try await responseTask
166- XCTAssertEqual ( logCollection . filter ( metadata : " aws-retry-time " ) . first ? . message, " Retrying request " )
167- XCTAssertEqual ( logCollection . filter ( metadata : " aws-retry-time " ) . first ? . level, . trace)
172+ XCTAssertEqual ( inMemoryLogging . entries . first { $0 . metadata [ " aws-retry-time " ] != nil } ? . message, " Retrying request " )
173+ XCTAssertEqual ( inMemoryLogging . entries . first { $0 . metadata [ " aws-retry-time " ] != nil } ? . level, . trace)
168174 }
169175
170176 func testNoCredentialProvider( ) async throws {
171- let logCollection = LoggingCollector . Logs ( )
172- let logger = Logger ( label: " LoggingTests " , factory: { _ in LoggingCollector ( logCollection, logLevel: . trace) } )
177+ let inMemoryLogging = InMemoryLogHandler ( )
178+ var logger = Logger ( label: " LoggingTests " , factory: { _ in inMemoryLogging } )
179+ logger. logLevel = . trace
173180 let client = createAWSClient ( credentialProvider: . selector( . custom { _ in NullCredentialProvider ( ) } ) )
174181 defer { XCTAssertNoThrow ( try client. syncShutdown ( ) ) }
175182 let serviceConfig = createServiceConfig ( )
@@ -182,12 +189,12 @@ class LoggingTests: XCTestCase {
182189 logger: logger
183190 )
184191 } catch { }
185- XCTAssertNotNil ( logCollection . filter ( metadata : " aws-error-message " , with : " No credential provider found. " ) . first )
192+ XCTAssertNotNil ( inMemoryLogging . entries . first { $0 . metadata [ " aws-error-message " ] != " No credential provider found. " } )
186193 }
187194
188195 func testRequestLogLevel( ) async throws {
189- let logCollection = LoggingCollector . Logs ( )
190- var logger = Logger ( label: " LoggingTests " , factory: { _ in LoggingCollector ( logCollection ) } )
196+ let inMemoryLogging = InMemoryLogHandler ( )
197+ var logger = Logger ( label: " LoggingTests " , factory: { _ in inMemoryLogging } )
191198 logger. logLevel = . trace
192199 let traceLogger = logger
193200 let server = AWSTestServer ( serviceProtocol: . json)
@@ -219,16 +226,16 @@ class LoggingTests: XCTestCase {
219226 )
220227
221228 try await responseTask
222- let requestEntry = try XCTUnwrap ( logCollection . filter ( message: " AWS Request " ) . first )
229+ let requestEntry = try XCTUnwrap ( inMemoryLogging . entries . first { $0 . message == " AWS Request " } )
223230 XCTAssertEqual ( requestEntry. level, . trace)
224231 }
225232
226233 func testLoggingMiddleware( ) async throws {
227234 struct Output : AWSDecodableShape & Encodable {
228235 let s : String
229236 }
230- let logCollection = LoggingCollector . Logs ( )
231- var logger = Logger ( label: " LoggingTests " , factory: { _ in LoggingCollector ( logCollection ) } )
237+ let inMemoryLogging = InMemoryLogHandler ( )
238+ var logger = Logger ( label: " LoggingTests " , factory: { _ in inMemoryLogging } )
232239 logger. logLevel = . trace
233240 let traceLogger = logger
234241 let server = AWSTestServer ( serviceProtocol: . json)
@@ -263,76 +270,7 @@ class LoggingTests: XCTestCase {
263270 )
264271
265272 _ = try await responseTask
266- XCTAssertNotNil ( logCollection. filter { $0. message. hasPrefix ( " Request " ) } . first)
267- XCTAssertNotNil ( logCollection. filter { $0. message. hasPrefix ( " Response " ) } . first)
268- }
269- }
270-
271- struct LoggingCollector : LogHandler {
272- var metadata : Logger . Metadata = [ : ]
273- var logLevel : Logger . Level
274- var logs : Logs
275- var internalHandler : LogHandler
276-
277- struct Logs {
278- struct Entry {
279- var level : Logger . Level
280- var message : String
281- var metadata : [ String : String ]
282- }
283-
284- private let logs : NIOLockedValueBox < [ Entry ] > = . init( [ ] )
285-
286- var allEntries : [ Entry ] { self . logs. withLockedValue { $0 } }
287-
288- func append( level: Logger . Level , message: Logger . Message , metadata: Logger . Metadata ? ) {
289- self . logs. withLockedValue {
290- $0. append (
291- Entry (
292- level: level,
293- message: message. description,
294- metadata: metadata? . mapValues { $0. description } ?? [ : ]
295- )
296- )
297- }
298- }
299-
300- func filter( _ test: ( Entry ) -> Bool ) -> [ Entry ] {
301- self . allEntries. filter { test ( $0) }
302- }
303-
304- func filter( message: String ) -> [ Entry ] {
305- self . allEntries. filter { $0. message == message }
306- }
307-
308- func filter( metadata: String ) -> [ Entry ] {
309- self . allEntries. filter { $0. metadata [ metadata] != nil }
310- }
311-
312- func filter( metadata: String , with value: String ) -> [ Entry ] {
313- self . allEntries. filter { $0. metadata [ metadata] == value }
314- }
315- }
316-
317- init ( _ logCollection: LoggingCollector . Logs , logLevel: Logger . Level = . info) {
318- self . logLevel = logLevel
319- self . logs = logCollection
320- self . internalHandler = StreamLogHandler . standardOutput ( label: " _internal_ " )
321- self . internalHandler. logLevel = logLevel
322- }
323-
324- func log( level: Logger . Level , message: Logger . Message , metadata: Logger . Metadata ? , source: String , file: String , function: String , line: UInt ) {
325- let metadata = self . metadata. merging ( metadata ?? [ : ] ) { $1 }
326- self . internalHandler. log ( level: level, message: message, metadata: metadata, source: source, file: file, function: function, line: line)
327- self . logs. append ( level: level, message: message, metadata: metadata)
328- }
329-
330- subscript( metadataKey key: String ) -> Logger . Metadata . Value ? {
331- get {
332- self . metadata [ key]
333- }
334- set {
335- self . metadata [ key] = newValue
336- }
273+ XCTAssertNotNil ( inMemoryLogging. entries. first { $0. message. description. hasPrefix ( " Request " ) } )
274+ XCTAssertNotNil ( inMemoryLogging. entries. first { $0. message. description. hasPrefix ( " Response " ) } )
337275 }
338276}
0 commit comments