From a127f3caf9784e3894aa6d37b9533e5ac72cac47 Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Wed, 5 Oct 2022 01:31:13 +0200
Subject: [PATCH] Add MessengerStartLogging function

---
 .../Functions/MessengerStartLogging.swift     | 29 ++++++++++++++++++
 .../Messenger/Messenger.swift                 |  7 +++--
 .../Messenger/MessengerEnvironment.swift      | 11 ++++++-
 .../MessengerStartLoggingTests.swift          | 30 +++++++++++++++++++
 4 files changed, 74 insertions(+), 3 deletions(-)
 create mode 100644 Sources/XXMessengerClient/Messenger/Functions/MessengerStartLogging.swift
 create mode 100644 Tests/XXMessengerClientTests/Messenger/Functions/MessengerStartLoggingTests.swift

diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerStartLogging.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerStartLogging.swift
new file mode 100644
index 00000000..d073ee41
--- /dev/null
+++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerStartLogging.swift
@@ -0,0 +1,29 @@
+import Foundation
+import Logging
+import XCTestDynamicOverlay
+import XXClient
+
+public struct MessengerStartLogging {
+  public var run: () -> Void
+
+  public func callAsFunction() -> Void {
+    run()
+  }
+}
+
+extension MessengerStartLogging {
+  public static func live(_ env: MessengerEnvironment) -> MessengerStartLogging {
+    return MessengerStartLogging {
+      env.registerLogWriter(.init { messageString in
+        let message = LogMessage.parse(messageString)
+        env.log(message)
+      })
+    }
+  }
+}
+
+extension MessengerStartLogging {
+  public static let unimplemented = MessengerStartLogging(
+    run: XCTUnimplemented("\(Self.self)")
+  )
+}
diff --git a/Sources/XXMessengerClient/Messenger/Messenger.swift b/Sources/XXMessengerClient/Messenger/Messenger.swift
index 168cd84a..22f11030 100644
--- a/Sources/XXMessengerClient/Messenger/Messenger.swift
+++ b/Sources/XXMessengerClient/Messenger/Messenger.swift
@@ -39,6 +39,7 @@ public struct Messenger {
   public var backupParams: MessengerBackupParams
   public var stopBackup: MessengerStopBackup
   public var setLogLevel: MessengerSetLogLevel
+  public var startLogging: MessengerStartLogging
 }
 
 extension Messenger {
@@ -81,7 +82,8 @@ extension Messenger {
       resumeBackup: .live(env),
       backupParams: .live(env),
       stopBackup: .live(env),
-      setLogLevel: .live(env)
+      setLogLevel: .live(env),
+      startLogging: .live(env)
     )
   }
 }
@@ -125,6 +127,7 @@ extension Messenger {
     resumeBackup: .unimplemented,
     backupParams: .unimplemented,
     stopBackup: .unimplemented,
-    setLogLevel: .unimplemented
+    setLogLevel: .unimplemented,
+    startLogging: .unimplemented
   )
 }
diff --git a/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift b/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift
index bb26093a..a98e76f0 100644
--- a/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift
+++ b/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift
@@ -1,4 +1,5 @@
 import Foundation
+import Logging
 import XXClient
 import XCTestDynamicOverlay
 
@@ -18,6 +19,7 @@ public struct MessengerEnvironment {
   public var isListeningForMessages: Stored<Bool>
   public var isRegisteredWithUD: IsRegisteredWithUD
   public var loadCMix: LoadCMix
+  public var log: (LogMessage) -> Void
   public var login: Login
   public var lookupUD: LookupUD
   public var messageListeners: ListenersRegistry
@@ -29,6 +31,7 @@ public struct MessengerEnvironment {
   public var newUdManagerFromBackup: NewUdManagerFromBackup
   public var passwordStorage: PasswordStorage
   public var registerForNotifications: RegisterForNotifications
+  public var registerLogWriter: RegisterLogWriter
   public var resumeBackup: ResumeBackup
   public var searchUD: SearchUD
   public var setLogLevel: SetLogLevel
@@ -48,7 +51,9 @@ extension MessengerEnvironment {
     .path
 
   public static func live() -> MessengerEnvironment {
-    MessengerEnvironment(
+    let logger = Logger(label: "xx.network.client")
+
+    return MessengerEnvironment(
       authCallbacks: .live(),
       backup: .inMemory(),
       backupCallbacks: .live(),
@@ -64,6 +69,7 @@ extension MessengerEnvironment {
       isListeningForMessages: .inMemory(false),
       isRegisteredWithUD: .live,
       loadCMix: .live,
+      log: { logger.log(level: $0.level, .init(stringLiteral: $0.text)) },
       login: .live,
       lookupUD: .live,
       messageListeners: .live(),
@@ -75,6 +81,7 @@ extension MessengerEnvironment {
       newUdManagerFromBackup: .live,
       passwordStorage: .keychain,
       registerForNotifications: .live,
+      registerLogWriter: .live,
       resumeBackup: .live,
       searchUD: .live,
       setLogLevel: .live,
@@ -105,6 +112,7 @@ extension MessengerEnvironment {
     isListeningForMessages: .unimplemented(placeholder: false),
     isRegisteredWithUD: .unimplemented,
     loadCMix: .unimplemented,
+    log: XCTUnimplemented("\(Self.self).log"),
     login: .unimplemented,
     lookupUD: .unimplemented,
     messageListeners: .unimplemented,
@@ -116,6 +124,7 @@ extension MessengerEnvironment {
     newUdManagerFromBackup: .unimplemented,
     passwordStorage: .unimplemented,
     registerForNotifications: .unimplemented,
+    registerLogWriter: .unimplemented,
     resumeBackup: .unimplemented,
     searchUD: .unimplemented,
     setLogLevel: .unimplemented,
diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerStartLoggingTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerStartLoggingTests.swift
new file mode 100644
index 00000000..b0d0a7c3
--- /dev/null
+++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerStartLoggingTests.swift
@@ -0,0 +1,30 @@
+import CustomDump
+import XCTest
+import XXClient
+@testable import XXMessengerClient
+
+final class MessengerStartLoggingTests: XCTestCase {
+  func testStartLogging() {
+    var registeredLogWriters: [LogWriter] = []
+    var logMessages: [LogMessage] = []
+
+    var env: MessengerEnvironment = .unimplemented
+    env.registerLogWriter.run = { writer in
+      registeredLogWriters.append(writer)
+    }
+    env.log = { message in
+      logMessages.append(message)
+    }
+    let start: MessengerStartLogging = .live(env)
+
+    start()
+
+    XCTAssertNoDifference(registeredLogWriters.count, 1)
+
+    registeredLogWriters.first?.handle("DEBUG Hello, World!")
+
+    XCTAssertNoDifference(logMessages, [
+      .init(level: .debug, text: "Hello, World!"),
+    ])
+  }
+}
-- 
GitLab