summaryrefslogtreecommitdiffhomepage
path: root/ios
diff options
context:
space:
mode:
authorAndrew Bulhak <andrew.bulhak@mullvad.net>2024-04-11 12:55:52 +0200
committerBug Magnet <marco.nikic@mullvad.net>2024-04-17 12:40:40 +0200
commit6cd934154cda7e4e33b6a62dbdec982a96a219c8 (patch)
tree38602dbd862aa10ae0aad5f852e23bdcb82963ef /ios
parent4654acb952e4b4024329f99bb0b4f780154bdd12 (diff)
downloadmullvadvpn-6cd934154cda7e4e33b6a62dbdec982a96a219c8.tar.xz
mullvadvpn-6cd934154cda7e4e33b6a62dbdec982a96a219c8.zip
Move log file header writing to LogFileOutputStream
Diffstat (limited to 'ios')
-rw-r--r--ios/MullvadLogging/LogFileOutputStream.swift25
-rw-r--r--ios/MullvadLogging/Logging.swift10
-rw-r--r--ios/MullvadVPN/AppDelegate.swift6
-rw-r--r--ios/MullvadVPNTests/LoggingTests.swift22
-rw-r--r--ios/PacketTunnel/PacketTunnelProvider/PacketTunnelProvider.swift4
5 files changed, 39 insertions, 28 deletions
diff --git a/ios/MullvadLogging/LogFileOutputStream.swift b/ios/MullvadLogging/LogFileOutputStream.swift
index a3b7ca4caa..26b059638e 100644
--- a/ios/MullvadLogging/LogFileOutputStream.swift
+++ b/ios/MullvadLogging/LogFileOutputStream.swift
@@ -19,6 +19,7 @@ class LogFileOutputStream: TextOutputStream {
private let fileURL: URL
private let encoding: String.Encoding
private let maxBufferCapacity: Int
+ private let fileHeader: String
private var state: State = .closed {
didSet {
@@ -44,10 +45,11 @@ class LogFileOutputStream: TextOutputStream {
case waitingToReopen
}
- init(fileURL: URL, encoding: String.Encoding = .utf8, maxBufferCapacity: Int = 16 * 1024) {
+ init(fileURL: URL, header: String, encoding: String.Encoding = .utf8, maxBufferCapacity: Int = 16 * 1024) {
self.fileURL = fileURL
self.encoding = encoding
self.maxBufferCapacity = maxBufferCapacity
+ self.fileHeader = header
}
deinit {
@@ -66,7 +68,7 @@ class LogFileOutputStream: TextOutputStream {
switch state {
case .closed:
do {
- let fileHandle = try openFile()
+ let fileHandle = try openFileWithHeader(fileHeader)
state = .opened(fileHandle)
try write(fileHandle: fileHandle, data: data)
} catch {
@@ -137,15 +139,22 @@ class LogFileOutputStream: TextOutputStream {
timer = nil
}
+ private func openFileWithHeader(_ header: String) throws -> FileHandle {
+ let fileHandle = try openFile()
+
+ let messageData =
+ "\(header)\n"
+ .data(using: encoding, allowLossyConversion: true)!
+ try write(fileHandle: fileHandle, data: messageData)
+
+ return fileHandle
+ }
+
private func reopenFile() {
do {
- let fileHandle = try openFile()
-
// Write a message indicating that the file was reopened.
- let messageData =
- "<Log file re-opened after failure. Buffered \(buffer.count) bytes of messages>\n"
- .data(using: encoding, allowLossyConversion: true)!
- try write(fileHandle: fileHandle, data: messageData)
+ let fileHandle =
+ try openFileWithHeader("<Log file re-opened after failure. Buffered \(buffer.count) bytes of messages>")
// Write all buffered messages.
if !buffer.isEmpty {
diff --git a/ios/MullvadLogging/Logging.swift b/ios/MullvadLogging/Logging.swift
index c6d86a549b..b8ad66c191 100644
--- a/ios/MullvadLogging/Logging.swift
+++ b/ios/MullvadLogging/Logging.swift
@@ -21,8 +21,11 @@ public struct LoggerBuilder {
public var metadata: Logger.Metadata = [:]
public var logLevel: Logger.Level = .debug
+ public var header: String
- public init() {}
+ public init(header: String) {
+ self.header = header
+ }
public mutating func addFileOutput(fileURL: URL) {
let logsDirectoryURL = fileURL.deletingLastPathComponent()
@@ -42,19 +45,18 @@ public struct LoggerBuilder {
logRotationErrors.append(error)
}
- outputs.append(.fileOutput(LogFileOutputStream(fileURL: fileURL)))
+ outputs.append(.fileOutput(LogFileOutputStream(fileURL: fileURL, header: header)))
}
public mutating func addOSLogOutput(subsystem: String) {
outputs.append(.osLogOutput(subsystem))
}
- public func install(header: String) {
+ public func install() {
LoggingSystem.bootstrap { label -> LogHandler in
let logHandlers: [LogHandler] = outputs.map { output in
switch output {
case let .fileOutput(stream):
- stream.write("\(header)\n")
return CustomFormatLogHandler(label: label, streams: [stream])
case let .osLogOutput(subsystem):
diff --git a/ios/MullvadVPN/AppDelegate.swift b/ios/MullvadVPN/AppDelegate.swift
index e79a1226a8..88c9b0e4e6 100644
--- a/ios/MullvadVPN/AppDelegate.swift
+++ b/ios/MullvadVPN/AppDelegate.swift
@@ -352,12 +352,12 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
// MARK: - Private
private func configureLogging() {
- var loggerBuilder = LoggerBuilder()
- loggerBuilder.addFileOutput(fileURL: ApplicationConfiguration.newLogFileURL(for: .mainApp))
+ var loggerBuilder = LoggerBuilder(header: "MullvadVPN version \(Bundle.main.productVersion)")
+ loggerBuilder.addFileOutput(fileURL: ApplicationConfiguration.logFileURL(for: .mainApp))
#if DEBUG
loggerBuilder.addOSLogOutput(subsystem: ApplicationTarget.mainApp.bundleIdentifier)
#endif
- loggerBuilder.install(header: "MullvadVPN version \(Bundle.main.productVersion)")
+ loggerBuilder.install()
logger = Logger(label: "AppDelegate")
diff --git a/ios/MullvadVPNTests/LoggingTests.swift b/ios/MullvadVPNTests/LoggingTests.swift
index be21d14b7c..e422f3d605 100644
--- a/ios/MullvadVPNTests/LoggingTests.swift
+++ b/ios/MullvadVPNTests/LoggingTests.swift
@@ -7,18 +7,16 @@
//
import Foundation
-import XCTest
@testable import MullvadLogging
+import XCTest
class MullvadLoggingTests: XCTestCase {
-
func temporaryFileURL() -> URL {
-
// Create a URL for an unique file in the system's temporary directory.
let directory = NSTemporaryDirectory()
let filename = UUID().uuidString
let fileURL = URL(fileURLWithPath: directory).appendingPathComponent(filename)
-
+
// Add a teardown block to delete any file at `fileURL`.
addTeardownBlock {
do {
@@ -33,22 +31,24 @@ class MullvadLoggingTests: XCTestCase {
XCTFail("Error while deleting temporary file: \(error)")
}
}
-
+
// Return the temporary file URL for use in a test method.
return fileURL
}
func testLogHeader() {
let expectedHeader = "Header of a log file"
-
- var builder = LoggerBuilder()
+
+ var builder = LoggerBuilder(header: expectedHeader)
let fileURL = temporaryFileURL()
builder.addFileOutput(fileURL: fileURL)
-
- builder.install(header: expectedHeader)
-
+
+ builder.install()
+
+ Logger(label: "test").info(":-P")
+
let contents = String(decoding: try! Data(contentsOf: fileURL), as: UTF8.self)
-
+
XCTAssert(contents.hasPrefix(expectedHeader))
}
}
diff --git a/ios/PacketTunnel/PacketTunnelProvider/PacketTunnelProvider.swift b/ios/PacketTunnel/PacketTunnelProvider/PacketTunnelProvider.swift
index 7cdc357150..628828f528 100644
--- a/ios/PacketTunnel/PacketTunnelProvider/PacketTunnelProvider.swift
+++ b/ios/PacketTunnel/PacketTunnelProvider/PacketTunnelProvider.swift
@@ -160,14 +160,14 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
extension PacketTunnelProvider {
private static func configureLogging() {
- var loggerBuilder = LoggerBuilder()
+ var loggerBuilder = LoggerBuilder(header: "PacketTunnel version \(Bundle.main.productVersion)")
let pid = ProcessInfo.processInfo.processIdentifier
loggerBuilder.metadata["pid"] = .string("\(pid)")
loggerBuilder.addFileOutput(fileURL: ApplicationConfiguration.newLogFileURL(for: .packetTunnel))
#if DEBUG
loggerBuilder.addOSLogOutput(subsystem: ApplicationTarget.packetTunnel.bundleIdentifier)
#endif
- loggerBuilder.install(header: "PacketTunnel version \(Bundle.main.productVersion)")
+ loggerBuilder.install()
}
private func parseStartOptions(_ options: [String: NSObject]) -> StartOptions {