From 9f3282773c363182faf9d54b5af60313e766c83c Mon Sep 17 00:00:00 2001 From: Vlad Velicu Date: Wed, 5 Nov 2025 17:37:15 +0000 Subject: [PATCH 1/5] expose Log._log for RN testing --- Swift/Collection.swift | 2 +- Swift/Log.swift | 5 ++- Swift/Tests/LogSinkTest.swift | 84 ++++++++++++++++++++++------------- 3 files changed, 58 insertions(+), 33 deletions(-) diff --git a/Swift/Collection.swift b/Swift/Collection.swift index 453688708..07064ae95 100644 --- a/Swift/Collection.swift +++ b/Swift/Collection.swift @@ -425,7 +425,7 @@ public final class Collection: CollectionChangeObservable, Indexable, Equatable, { let token = impl.addDocumentChangeListener(withID: id, queue: queue) { [weak self] change in guard let self = self else { - Log.log(domain: .database, level: .warning, message: "Unable to notify changes as the collection object was released") + Log._log(domain: .database, level: .warning, message: "Unable to notify changes as the collection object was released") return } listener(DocumentChange(documentID: change.documentID, diff --git a/Swift/Log.swift b/Swift/Log.swift index 979e46a0c..23b6a20a8 100644 --- a/Swift/Log.swift +++ b/Swift/Log.swift @@ -20,9 +20,10 @@ import Foundation import CouchbaseLiteSwift_Private -internal class Log { +class Log { /// Writes a log message to all the enabled log sinks. - internal static func log(domain: LogDomain, level: LogLevel, message: String) { + /// - Note: `Unsupported API` Internal used for testing purpose. + static func _log(domain: LogDomain, level: LogLevel, message: String) { let cDomain = CBLLogDomain.init(rawValue: domain.rawValue) let cLevel = CBLLogLevel(rawValue: UInt(level.rawValue))! CBLLog.writeSwiftLog(cDomain, level: cLevel, message: message) diff --git a/Swift/Tests/LogSinkTest.swift b/Swift/Tests/LogSinkTest.swift index 14b79d3e2..0848c54cb 100644 --- a/Swift/Tests/LogSinkTest.swift +++ b/Swift/Tests/LogSinkTest.swift @@ -70,21 +70,21 @@ class LogSinkTest: CBLTestCase { func writeOneKiloByteOfLog() { let message = "11223344556677889900" // 44Byte line for _ in 0..<23 { // 1012 Bytes - Log.log(domain: .database, level: .error, message: "\(message)") - Log.log(domain: .database, level: .warning, message: "\(message)") - Log.log(domain: .database, level: .info, message: "\(message)") - Log.log(domain: .database, level: .verbose, message: "\(message)") - Log.log(domain: .database, level: .debug, message: "\(message)") + Log._log(domain: .database, level: .error, message: "\(message)") + Log._log(domain: .database, level: .warning, message: "\(message)") + Log._log(domain: .database, level: .info, message: "\(message)") + Log._log(domain: .database, level: .verbose, message: "\(message)") + Log._log(domain: .database, level: .debug, message: "\(message)") } writeAllLogs("1") // ~25Bytes } func writeAllLogs(_ message: String) { - Log.log(domain: .database, level: .error, message: message) - Log.log(domain: .database, level: .warning, message: message) - Log.log(domain: .database, level: .info, message: message) - Log.log(domain: .database, level: .verbose, message: message) - Log.log(domain: .database, level: .debug, message: message) + Log._log(domain: .database, level: .error, message: message) + Log._log(domain: .database, level: .warning, message: message) + Log._log(domain: .database, level: .info, message: message) + Log._log(domain: .database, level: .verbose, message: message) + Log._log(domain: .database, level: .debug, message: message) } func isKeywordPresentInAnyLog(_ keyword: String, path: String) throws -> Bool { @@ -126,10 +126,10 @@ class LogSinkTest: CBLTestCase { for i in (1...5).reversed() { let level = LogLevel(rawValue: UInt8(i))! LogSinks.file = FileLogSink(level: level, directory: logFileDirectory, usePlainText: true) - Log.log(domain: .database, level: .verbose, message: "TEST VERBOSE") - Log.log(domain: .database, level: .info, message: "TEST INFO") - Log.log(domain: .database, level: .warning, message: "TEST WARNING") - Log.log(domain: .database, level: .error, message: "TEST ERROR") + Log._log(domain: .database, level: .verbose, message: "TEST VERBOSE") + Log._log(domain: .database, level: .info, message: "TEST INFO") + Log._log(domain: .database, level: .warning, message: "TEST WARNING") + Log._log(domain: .database, level: .error, message: "TEST ERROR") } let files = try FileManager.default.contentsOfDirectory(atPath: logFileDirectory) @@ -158,7 +158,7 @@ class LogSinkTest: CBLTestCase { func testFileLogSinkBinaryFormat() throws { LogSinks.file = FileLogSink(level: .info, directory: logFileDirectory, usePlainText: false) - Log.log(domain: .database, level: .info, message: "TEST INFO") + Log._log(domain: .database, level: .info, message: "TEST INFO") let files = try getLogsInDirectory(logFileDirectory, properties: [.contentModificationDateKey], @@ -193,7 +193,7 @@ class LogSinkTest: CBLTestCase { LogSinks.file = FileLogSink(level: .info, directory: logFileDirectory, usePlainText: true) let inputString = "SOME TEST INFO" - Log.log(domain: .database, level: .info, message: inputString) + Log._log(domain: .database, level: .info, message: inputString) let files = try getLogsInDirectory(logFileDirectory, properties: [.contentModificationDateKey], @@ -338,31 +338,31 @@ class LogSinkTest: CBLTestCase { func testEnableDisableCustomLogSink() throws { var logSink = TestCustomLogSink() LogSinks.custom = CustomLogSink(level: .verbose, logSink: logSink) - Log.log(domain: .database, level: .verbose, message: "TEST VERBOSE") - Log.log(domain: .database, level: .info, message: "TEST INFO") - Log.log(domain: .database, level: .warning, message: "TEST WARNING") - Log.log(domain: .database, level: .error, message: "TEST ERROR") + Log._log(domain: .database, level: .verbose, message: "TEST VERBOSE") + Log._log(domain: .database, level: .info, message: "TEST INFO") + Log._log(domain: .database, level: .warning, message: "TEST WARNING") + Log._log(domain: .database, level: .error, message: "TEST ERROR") XCTAssertEqual(logSink.lines.count, 4) logSink = TestCustomLogSink() LogSinks.custom = CustomLogSink(level: .none, logSink: logSink) - Log.log(domain: .database, level: .verbose, message: "TEST VERBOSE") - Log.log(domain: .database, level: .info, message: "TEST INFO") - Log.log(domain: .database, level: .warning, message: "TEST WARNING") - Log.log(domain: .database, level: .error, message: "TEST ERROR") + Log._log(domain: .database, level: .verbose, message: "TEST VERBOSE") + Log._log(domain: .database, level: .info, message: "TEST INFO") + Log._log(domain: .database, level: .warning, message: "TEST WARNING") + Log._log(domain: .database, level: .error, message: "TEST ERROR") XCTAssertEqual(logSink.lines.count, 0) } func testCustomLogSinkLevels() throws { - Log.log(domain: .database, level: .info, message: "IGNORE") + Log._log(domain: .database, level: .info, message: "IGNORE") for i in (1...5).reversed() { let level = LogLevel(rawValue: UInt8(i))! let logSink = TestCustomLogSink() LogSinks.custom = CustomLogSink(level: level, logSink: logSink) - Log.log(domain: .database, level: .verbose, message: "TEST VERBOSE") - Log.log(domain: .database, level: .info, message: "TEST INFO") - Log.log(domain: .database, level: .warning, message: "TEST WARNING") - Log.log(domain: .database, level: .error, message: "TEST ERROR") + Log._log(domain: .database, level: .verbose, message: "TEST VERBOSE") + Log._log(domain: .database, level: .info, message: "TEST INFO") + Log._log(domain: .database, level: .warning, message: "TEST WARNING") + Log._log(domain: .database, level: .error, message: "TEST ERROR") XCTAssertEqual(logSink.lines.count, 5 - i) } } @@ -376,7 +376,15 @@ class LogSinkTest: CBLTestCase { let logSink = TestCustomLogSink() LogSinks.custom = CustomLogSink(level: .debug, domains: domains[i], logSink: logSink) for j in 0..>>>>>> Stashed changes +>>>>>>> Stashed changes } XCTAssertEqual(logSink.lines.count, 1) XCTAssertEqual(logSink.lines[0], names[i]) @@ -392,7 +400,15 @@ class LogSinkTest: CBLTestCase { let logSink = TestCustomLogSink() LogSinks.custom = CustomLogSink(level: .debug, domains: combined, logSink: logSink) for j in 0..>>>>>> Stashed changes +>>>>>>> Stashed changes } XCTAssertEqual(logSink.lines.count, i + 1) @@ -405,7 +421,15 @@ class LogSinkTest: CBLTestCase { let logSink = TestCustomLogSink() LogSinks.custom = CustomLogSink(level: .debug, domains: .all, logSink: logSink) for i in 0..>>>>>> Stashed changes +>>>>>>> Stashed changes } XCTAssertEqual(logSink.lines.count, names.count) for i in 0.. Date: Wed, 5 Nov 2025 17:39:53 +0000 Subject: [PATCH 2/5] fix stash --- Swift/Tests/LogSinkTest.swift | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/Swift/Tests/LogSinkTest.swift b/Swift/Tests/LogSinkTest.swift index 0848c54cb..296092944 100644 --- a/Swift/Tests/LogSinkTest.swift +++ b/Swift/Tests/LogSinkTest.swift @@ -376,15 +376,7 @@ class LogSinkTest: CBLTestCase { let logSink = TestCustomLogSink() LogSinks.custom = CustomLogSink(level: .debug, domains: domains[i], logSink: logSink) for j in 0..>>>>>> Stashed changes ->>>>>>> Stashed changes } XCTAssertEqual(logSink.lines.count, 1) XCTAssertEqual(logSink.lines[0], names[i]) @@ -400,15 +392,7 @@ class LogSinkTest: CBLTestCase { let logSink = TestCustomLogSink() LogSinks.custom = CustomLogSink(level: .debug, domains: combined, logSink: logSink) for j in 0..>>>>>> Stashed changes ->>>>>>> Stashed changes } XCTAssertEqual(logSink.lines.count, i + 1) @@ -421,15 +405,7 @@ class LogSinkTest: CBLTestCase { let logSink = TestCustomLogSink() LogSinks.custom = CustomLogSink(level: .debug, domains: .all, logSink: logSink) for i in 0..>>>>>> Stashed changes ->>>>>>> Stashed changes } XCTAssertEqual(logSink.lines.count, names.count) for i in 0.. Date: Wed, 5 Nov 2025 18:00:55 +0000 Subject: [PATCH 3/5] make Log final --- Swift/Log.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Swift/Log.swift b/Swift/Log.swift index 23b6a20a8..f8f6c0aee 100644 --- a/Swift/Log.swift +++ b/Swift/Log.swift @@ -20,7 +20,7 @@ import Foundation import CouchbaseLiteSwift_Private -class Log { +public final class Log { /// Writes a log message to all the enabled log sinks. /// - Note: `Unsupported API` Internal used for testing purpose. static func _log(domain: LogDomain, level: LogLevel, message: String) { From 744bb8a8af334973806ac814e8efefe3f9569f84 Mon Sep 17 00:00:00 2001 From: Vlad Velicu Date: Thu, 6 Nov 2025 16:13:56 +0000 Subject: [PATCH 4/5] remove _ --- Swift/Collection.swift | 2 +- Swift/Log.swift | 2 +- Swift/Tests/LogSinkTest.swift | 66 +++++++++++++++++------------------ 3 files changed, 35 insertions(+), 35 deletions(-) diff --git a/Swift/Collection.swift b/Swift/Collection.swift index 07064ae95..453688708 100644 --- a/Swift/Collection.swift +++ b/Swift/Collection.swift @@ -425,7 +425,7 @@ public final class Collection: CollectionChangeObservable, Indexable, Equatable, { let token = impl.addDocumentChangeListener(withID: id, queue: queue) { [weak self] change in guard let self = self else { - Log._log(domain: .database, level: .warning, message: "Unable to notify changes as the collection object was released") + Log.log(domain: .database, level: .warning, message: "Unable to notify changes as the collection object was released") return } listener(DocumentChange(documentID: change.documentID, diff --git a/Swift/Log.swift b/Swift/Log.swift index f8f6c0aee..0dd0b0b50 100644 --- a/Swift/Log.swift +++ b/Swift/Log.swift @@ -23,7 +23,7 @@ import CouchbaseLiteSwift_Private public final class Log { /// Writes a log message to all the enabled log sinks. /// - Note: `Unsupported API` Internal used for testing purpose. - static func _log(domain: LogDomain, level: LogLevel, message: String) { + static func log(domain: LogDomain, level: LogLevel, message: String) { let cDomain = CBLLogDomain.init(rawValue: domain.rawValue) let cLevel = CBLLogLevel(rawValue: UInt(level.rawValue))! CBLLog.writeSwiftLog(cDomain, level: cLevel, message: message) diff --git a/Swift/Tests/LogSinkTest.swift b/Swift/Tests/LogSinkTest.swift index 296092944..14b79d3e2 100644 --- a/Swift/Tests/LogSinkTest.swift +++ b/Swift/Tests/LogSinkTest.swift @@ -70,21 +70,21 @@ class LogSinkTest: CBLTestCase { func writeOneKiloByteOfLog() { let message = "11223344556677889900" // 44Byte line for _ in 0..<23 { // 1012 Bytes - Log._log(domain: .database, level: .error, message: "\(message)") - Log._log(domain: .database, level: .warning, message: "\(message)") - Log._log(domain: .database, level: .info, message: "\(message)") - Log._log(domain: .database, level: .verbose, message: "\(message)") - Log._log(domain: .database, level: .debug, message: "\(message)") + Log.log(domain: .database, level: .error, message: "\(message)") + Log.log(domain: .database, level: .warning, message: "\(message)") + Log.log(domain: .database, level: .info, message: "\(message)") + Log.log(domain: .database, level: .verbose, message: "\(message)") + Log.log(domain: .database, level: .debug, message: "\(message)") } writeAllLogs("1") // ~25Bytes } func writeAllLogs(_ message: String) { - Log._log(domain: .database, level: .error, message: message) - Log._log(domain: .database, level: .warning, message: message) - Log._log(domain: .database, level: .info, message: message) - Log._log(domain: .database, level: .verbose, message: message) - Log._log(domain: .database, level: .debug, message: message) + Log.log(domain: .database, level: .error, message: message) + Log.log(domain: .database, level: .warning, message: message) + Log.log(domain: .database, level: .info, message: message) + Log.log(domain: .database, level: .verbose, message: message) + Log.log(domain: .database, level: .debug, message: message) } func isKeywordPresentInAnyLog(_ keyword: String, path: String) throws -> Bool { @@ -126,10 +126,10 @@ class LogSinkTest: CBLTestCase { for i in (1...5).reversed() { let level = LogLevel(rawValue: UInt8(i))! LogSinks.file = FileLogSink(level: level, directory: logFileDirectory, usePlainText: true) - Log._log(domain: .database, level: .verbose, message: "TEST VERBOSE") - Log._log(domain: .database, level: .info, message: "TEST INFO") - Log._log(domain: .database, level: .warning, message: "TEST WARNING") - Log._log(domain: .database, level: .error, message: "TEST ERROR") + Log.log(domain: .database, level: .verbose, message: "TEST VERBOSE") + Log.log(domain: .database, level: .info, message: "TEST INFO") + Log.log(domain: .database, level: .warning, message: "TEST WARNING") + Log.log(domain: .database, level: .error, message: "TEST ERROR") } let files = try FileManager.default.contentsOfDirectory(atPath: logFileDirectory) @@ -158,7 +158,7 @@ class LogSinkTest: CBLTestCase { func testFileLogSinkBinaryFormat() throws { LogSinks.file = FileLogSink(level: .info, directory: logFileDirectory, usePlainText: false) - Log._log(domain: .database, level: .info, message: "TEST INFO") + Log.log(domain: .database, level: .info, message: "TEST INFO") let files = try getLogsInDirectory(logFileDirectory, properties: [.contentModificationDateKey], @@ -193,7 +193,7 @@ class LogSinkTest: CBLTestCase { LogSinks.file = FileLogSink(level: .info, directory: logFileDirectory, usePlainText: true) let inputString = "SOME TEST INFO" - Log._log(domain: .database, level: .info, message: inputString) + Log.log(domain: .database, level: .info, message: inputString) let files = try getLogsInDirectory(logFileDirectory, properties: [.contentModificationDateKey], @@ -338,31 +338,31 @@ class LogSinkTest: CBLTestCase { func testEnableDisableCustomLogSink() throws { var logSink = TestCustomLogSink() LogSinks.custom = CustomLogSink(level: .verbose, logSink: logSink) - Log._log(domain: .database, level: .verbose, message: "TEST VERBOSE") - Log._log(domain: .database, level: .info, message: "TEST INFO") - Log._log(domain: .database, level: .warning, message: "TEST WARNING") - Log._log(domain: .database, level: .error, message: "TEST ERROR") + Log.log(domain: .database, level: .verbose, message: "TEST VERBOSE") + Log.log(domain: .database, level: .info, message: "TEST INFO") + Log.log(domain: .database, level: .warning, message: "TEST WARNING") + Log.log(domain: .database, level: .error, message: "TEST ERROR") XCTAssertEqual(logSink.lines.count, 4) logSink = TestCustomLogSink() LogSinks.custom = CustomLogSink(level: .none, logSink: logSink) - Log._log(domain: .database, level: .verbose, message: "TEST VERBOSE") - Log._log(domain: .database, level: .info, message: "TEST INFO") - Log._log(domain: .database, level: .warning, message: "TEST WARNING") - Log._log(domain: .database, level: .error, message: "TEST ERROR") + Log.log(domain: .database, level: .verbose, message: "TEST VERBOSE") + Log.log(domain: .database, level: .info, message: "TEST INFO") + Log.log(domain: .database, level: .warning, message: "TEST WARNING") + Log.log(domain: .database, level: .error, message: "TEST ERROR") XCTAssertEqual(logSink.lines.count, 0) } func testCustomLogSinkLevels() throws { - Log._log(domain: .database, level: .info, message: "IGNORE") + Log.log(domain: .database, level: .info, message: "IGNORE") for i in (1...5).reversed() { let level = LogLevel(rawValue: UInt8(i))! let logSink = TestCustomLogSink() LogSinks.custom = CustomLogSink(level: level, logSink: logSink) - Log._log(domain: .database, level: .verbose, message: "TEST VERBOSE") - Log._log(domain: .database, level: .info, message: "TEST INFO") - Log._log(domain: .database, level: .warning, message: "TEST WARNING") - Log._log(domain: .database, level: .error, message: "TEST ERROR") + Log.log(domain: .database, level: .verbose, message: "TEST VERBOSE") + Log.log(domain: .database, level: .info, message: "TEST INFO") + Log.log(domain: .database, level: .warning, message: "TEST WARNING") + Log.log(domain: .database, level: .error, message: "TEST ERROR") XCTAssertEqual(logSink.lines.count, 5 - i) } } @@ -376,7 +376,7 @@ class LogSinkTest: CBLTestCase { let logSink = TestCustomLogSink() LogSinks.custom = CustomLogSink(level: .debug, domains: domains[i], logSink: logSink) for j in 0.. Date: Mon, 10 Nov 2025 16:03:51 +0000 Subject: [PATCH 5/5] public* --- Swift/Log.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Swift/Log.swift b/Swift/Log.swift index 0dd0b0b50..fbf86beae 100644 --- a/Swift/Log.swift +++ b/Swift/Log.swift @@ -23,7 +23,7 @@ import CouchbaseLiteSwift_Private public final class Log { /// Writes a log message to all the enabled log sinks. /// - Note: `Unsupported API` Internal used for testing purpose. - static func log(domain: LogDomain, level: LogLevel, message: String) { + public static func log(domain: LogDomain, level: LogLevel, message: String) { let cDomain = CBLLogDomain.init(rawValue: domain.rawValue) let cLevel = CBLLogLevel(rawValue: UInt(level.rawValue))! CBLLog.writeSwiftLog(cDomain, level: cLevel, message: message)