Skip to content

Commit c0ba648

Browse files
committed
Fix compile crash, use InMemoryLogging
1 parent 7e285dd commit c0ba648

4 files changed

Lines changed: 42 additions & 239 deletions

File tree

Package.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ let package = Package(
4747
.package(url: "https://github.com/apple/swift-atomics.git", from: "1.1.0"),
4848
.package(url: "https://github.com/apple/swift-crypto.git", "1.0.0"..<"5.0.0"),
4949
.package(url: "https://github.com/apple/swift-distributed-tracing.git", from: "1.3.0"),
50-
.package(url: "https://github.com/apple/swift-log.git", from: "1.4.0"),
50+
.package(url: "https://github.com/apple/swift-log.git", from: "1.8.0"),
5151
.package(url: "https://github.com/apple/swift-metrics.git", "1.0.0"..<"3.0.0"),
5252
.package(url: "https://github.com/apple/swift-nio-ssl.git", from: "2.7.2"),
5353
.package(url: "https://github.com/apple/swift-nio-transport-services.git", from: "1.13.1"),
@@ -133,6 +133,7 @@ let package = Package(
133133
.byName(name: "SotoTestUtils"),
134134
.product(name: "NIOPosix", package: "swift-nio"),
135135
.product(name: "InMemoryTracing", package: "swift-distributed-tracing"),
136+
.product(name: "InMemoryLogging", package: "swift-log"),
136137
],
137138
resources: [
138139
.copy("Resources/credential-process-test-helper.sh")

Package@swift-6.0.swift

Lines changed: 0 additions & 137 deletions
This file was deleted.

Tests/SotoCoreTests/LoggingTests.swift

Lines changed: 39 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
//
1313
//===----------------------------------------------------------------------===//
1414

15+
import InMemoryLogging
1516
import Logging
1617
import NIOConcurrencyHelpers
1718
import SotoTestUtils
@@ -21,8 +22,9 @@ import XCTest
2122

2223
class 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
}

Tests/SotoCoreTests/TimeStampTests.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
//
1313
//===----------------------------------------------------------------------===//
1414

15+
import Foundation
1516
import NIOHTTP1
1617
import SotoTestUtils
1718
import SotoXML

0 commit comments

Comments
 (0)