summaryrefslogtreecommitdiffhomepage
path: root/ios/MullvadVPNTests/MullvadLogging/LoggingTests.swift
blob: 238ed9aef5311df4c074d7bcbfadfc09d2f55cb7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
//
//  LoggingTests.swift
//  MullvadVPNTests
//
//  Created by Emils on 04/04/2024.
//  Copyright © 2025 Mullvad VPN AB. All rights reserved.
//

import Foundation
import XCTest

@testable import MullvadLogging

class LoggingTests: XCTestCase {
    let fileManager = FileManager.default
    var directoryPath: URL!

    override func setUpWithError() throws {
        directoryPath = FileManager.default.temporaryDirectory.appendingPathComponent("LoggingTests", isDirectory: true)

        try fileManager.createDirectory(
            at: directoryPath,
            withIntermediateDirectories: true
        )
    }

    override func tearDownWithError() throws {
        try fileManager.removeItem(at: directoryPath)
    }

    func testLogFileOutputStreamWritesHeader() throws {
        let headerText = "This is a header"
        let logMessage = "And this is a log message\n"
        let fileURL = directoryPath.appendingPathComponent(UUID().uuidString)
        let stream = LogFileOutputStream(fileURL: fileURL, header: headerText)
        stream.write(logMessage)
        stream.synchronize()

        let contents = try XCTUnwrap(String(contentsOf: fileURL))
        XCTAssertEqual(contents, "\(headerText)\n\(logMessage)")
    }

    func testLogHeader() throws {
        let expectedHeader = "Header of a log file"

        var builder = LoggerBuilder(header: expectedHeader)
        let fileURL = directoryPath.appendingPathComponent(UUID().uuidString)
        builder.addFileOutput(fileURL: fileURL)

        builder.install()

        Logger(label: "test").info(":-P")

        sync()

        let contents = try XCTUnwrap(String(contentsOf: fileURL))

        XCTAssert(contents.hasPrefix(expectedHeader))
    }

    func testGettingLogFilesByApplicationTarget() async throws {
        let mainTargetLog = ApplicationConfiguration.newLogFileURL(for: .mainApp, in: directoryPath)
        let packetTunnelTargetLog = ApplicationConfiguration.newLogFileURL(for: .packetTunnel, in: directoryPath)

        let logPaths = [
            directoryPath.appendingPathComponent("test1.log"),
            directoryPath.appendingPathComponent("test2.log"),
            mainTargetLog,
            packetTunnelTargetLog,
        ]

        logPaths.forEach { url in
            let stream = LogFileOutputStream(fileURL: url, header: "")
            stream.write("test")
            stream.synchronize()
        }

        var urls = ApplicationConfiguration.logFileURLs(for: .mainApp, in: directoryPath)
        XCTAssertEqual(urls.count, 1)
        XCTAssertEqual(urls.first, mainTargetLog)

        urls = ApplicationConfiguration.logFileURLs(for: .packetTunnel, in: directoryPath)
        XCTAssertEqual(urls.count, 1)
        XCTAssertEqual(urls.first, packetTunnelTargetLog)
    }
}