Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ let package = Package(
.package(url: "https://github.com/apple/swift-nio-http2.git", from: "1.36.0"),
.package(url: "https://github.com/apple/swift-nio-extras.git", from: "1.26.0"),
.package(url: "https://github.com/apple/swift-nio-transport-services.git", from: "1.24.0"),
.package(url: "https://github.com/apple/swift-log.git", from: "1.6.0"),
.package(url: "https://github.com/apple/swift-log.git", from: "1.7.1"),
.package(url: "https://github.com/apple/swift-atomics.git", from: "1.0.2"),
.package(url: "https://github.com/apple/swift-algorithms.git", from: "1.0.0"),
.package(url: "https://github.com/apple/swift-distributed-tracing.git", from: "1.3.0"),
Expand Down Expand Up @@ -92,6 +92,7 @@ let package = Package(
.product(name: "Algorithms", package: "swift-algorithms"),
// Observability support
.product(name: "Logging", package: "swift-log"),
.product(name: "InMemoryLogging", package: "swift-log"),
.product(name: "Tracing", package: "swift-distributed-tracing"),
.product(name: "InMemoryTracing", package: "swift-distributed-tracing"),
],
Expand Down
13 changes: 4 additions & 9 deletions Tests/AsyncHTTPClientTests/HTTPClient+SOCKSTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
//===----------------------------------------------------------------------===//

import AsyncHTTPClient // NOT @testable - tests that need @testable go into HTTPClientInternalTests.swift
import InMemoryLogging
import Logging
import NIOCore
import NIOHTTP1
Expand All @@ -27,7 +28,7 @@ class HTTPClientSOCKSTests: XCTestCase {
var serverGroup: EventLoopGroup!
var defaultHTTPBin: HTTPBin<HTTPBinHandler>!
var defaultClient: HTTPClient!
var backgroundLogStore: CollectEverythingLogHandler.LogStore!
var backgroundLogStore: InMemoryLogHandler!

var defaultHTTPBinURLPrefix: String {
"http://localhost:\(self.defaultHTTPBin.port)/"
Expand All @@ -43,14 +44,8 @@ class HTTPClientSOCKSTests: XCTestCase {
self.clientGroup = getDefaultEventLoopGroup(numberOfThreads: 1)
self.serverGroup = MultiThreadedEventLoopGroup(numberOfThreads: 1)
self.defaultHTTPBin = HTTPBin()
self.backgroundLogStore = CollectEverythingLogHandler.LogStore()
var backgroundLogger = Logger(
label: "\(#function)",
factory: { _ in
CollectEverythingLogHandler(logStore: self.backgroundLogStore!)
}
)
backgroundLogger.logLevel = .trace
let (backgroundLogStore, backgroundLogger) = InMemoryLogHandler.makeLogger(logLevel: .trace)
self.backgroundLogStore = backgroundLogStore
self.defaultClient = HTTPClient(
eventLoopGroupProvider: .shared(self.clientGroup),
backgroundActivityLogger: backgroundLogger
Expand Down
13 changes: 4 additions & 9 deletions Tests/AsyncHTTPClientTests/HTTPClientBase.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

import AsyncHTTPClient
import Atomics
import InMemoryLogging
import Logging
import NIOConcurrencyHelpers
import NIOCore
Expand All @@ -37,7 +38,7 @@ class XCTestCaseHTTPClientTestsBaseClass: XCTestCase {
var serverGroup: EventLoopGroup!
var defaultHTTPBin: HTTPBin<HTTPBinHandler>!
var defaultClient: HTTPClient!
var backgroundLogStore: CollectEverythingLogHandler.LogStore!
var backgroundLogStore: InMemoryLogHandler!

var defaultHTTPBinURLPrefix: String {
self.defaultHTTPBin.baseURL
Expand All @@ -53,14 +54,8 @@ class XCTestCaseHTTPClientTestsBaseClass: XCTestCase {
self.clientGroup = getDefaultEventLoopGroup(numberOfThreads: 1)
self.serverGroup = MultiThreadedEventLoopGroup(numberOfThreads: 1)
self.defaultHTTPBin = HTTPBin()
self.backgroundLogStore = CollectEverythingLogHandler.LogStore()
var backgroundLogger = Logger(
label: "\(#function)",
factory: { _ in
CollectEverythingLogHandler(logStore: self.backgroundLogStore!)
}
)
backgroundLogger.logLevel = .trace
let (backgroundLogStore, backgroundLogger) = InMemoryLogHandler.makeLogger(logLevel: .trace)
self.backgroundLogStore = backgroundLogStore

self.defaultClient = HTTPClient(
eventLoopGroupProvider: .shared(self.clientGroup),
Expand Down
73 changes: 15 additions & 58 deletions Tests/AsyncHTTPClientTests/HTTPClientTestUtils.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

import Atomics
import Foundation
import InMemoryLogging
import Logging
import NIOConcurrencyHelpers
import NIOCore
Expand Down Expand Up @@ -1290,65 +1291,21 @@ extension EventLoopFuture where Value: Sendable {
}
}

struct CollectEverythingLogHandler: LogHandler {
var metadata: Logger.Metadata = [:]
var logLevel: Logger.Level = .info
let logStore: LogStore

final class LogStore: Sendable {
struct Entry {
var level: Logger.Level
var message: String
var metadata: [String: String]
}

private let logs = NIOLockedValueBox<[Entry]>([])

var allEntries: [Entry] {
get {
self.logs.withLockedValue { $0 }
}
set {
self.logs.withLockedValue { $0 = newValue }
extension InMemoryLogHandler {
static func makeLogger(
logLevel: Logger.Level = .info,
function: String = #function
) -> (InMemoryLogHandler, Logger) {
let handler = InMemoryLogHandler()

var logger = Logger(
label: "\(function)",
factory: { _ in
handler
}
}

func append(level: Logger.Level, message: Logger.Message, metadata: Logger.Metadata?) {
self.logs.withLockedValue {
$0.append(
Entry(
level: level,
message: message.description,
metadata: metadata?.mapValues { $0.description } ?? [:]
)
)
}
}
}

init(logStore: LogStore) {
self.logStore = logStore
}

func log(
level: Logger.Level,
message: Logger.Message,
metadata: Logger.Metadata?,
source: String,
file: String,
function: String,
line: UInt
) {
self.logStore.append(level: level, message: message, metadata: self.metadata.merging(metadata ?? [:]) { $1 })
}

subscript(metadataKey key: String) -> Logger.Metadata.Value? {
get {
self.metadata[key]
}
set {
self.metadata[key] = newValue
}
)
logger.logLevel = logLevel
return (handler, logger)
}
}

Expand Down
Loading