From 26556450b4f8b1f3df235bccf7ee10c8ca11ef0d Mon Sep 17 00:00:00 2001 From: Marvin Liu Date: Tue, 13 Feb 2024 01:49:34 -0800 Subject: [PATCH] fix: storage instance issue (#118) --- .../Utilities/OutputFileStream.swift | 9 ++++++- .../Storages/PersistentStorageTests.swift | 27 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/Sources/Amplitude/Utilities/OutputFileStream.swift b/Sources/Amplitude/Utilities/OutputFileStream.swift index 62b9f0cf..347abd4c 100644 --- a/Sources/Amplitude/Utilities/OutputFileStream.swift +++ b/Sources/Amplitude/Utilities/OutputFileStream.swift @@ -50,6 +50,13 @@ internal class OutputFileStream { if fileHandle != nil { return } do { fileHandle = try FileHandle(forWritingTo: fileURL) + if #available(macOS 10.15.4, iOS 13.4, macCatalyst 13.4, tvOS 13.4, watchOS 6.2, *) { + _ = try? fileHandle?.seekToEnd() + } else if #available(tvOS 13.0, *) { + try? fileHandle?.seek(toOffset: .max) + } else { + fileHandle?.seekToEndOfFile() + } } catch { throw OutputStreamError.unableToOpen(fileURL.path) } @@ -57,7 +64,7 @@ internal class OutputFileStream { func write(_ data: Data) throws { guard data.isEmpty == false else { return } - if #available(macOS 10.15.4, iOS 13.4, macCatalyst 13.4, tvOS 13.4, watchOS 13.4, *) { + if #available(macOS 10.15.4, iOS 13.4, macCatalyst 13.4, tvOS 13.4, watchOS 6.2, *) { do { try fileHandle?.write(contentsOf: data) } catch { diff --git a/Tests/AmplitudeTests/Storages/PersistentStorageTests.swift b/Tests/AmplitudeTests/Storages/PersistentStorageTests.swift index 2a60bf8f..7facc1af 100644 --- a/Tests/AmplitudeTests/Storages/PersistentStorageTests.swift +++ b/Tests/AmplitudeTests/Storages/PersistentStorageTests.swift @@ -50,6 +50,33 @@ final class PersistentStorageTests: XCTestCase { persistentStorage.reset() } + func testWriteWithTwoInstances() { + let persistentStorage1 = PersistentStorage(storagePrefix: "xxx-instance") + try? persistentStorage1.write( + key: StorageKey.EVENTS, + value: BaseEvent(eventType: "test1") + ) + let persistentStorage2 = PersistentStorage(storagePrefix: "xxx-instance") + try? persistentStorage2.write( + key: StorageKey.EVENTS, + value: BaseEvent(eventType: "test2") + ) + // Only read from second instance, reading from first instance insert the "]" at the wrong cursor. + let eventFiles2: [URL]? = persistentStorage2.read(key: StorageKey.EVENTS) + XCTAssertEqual(eventFiles2?[0].absoluteString.contains("xxx-instance.events.index"), true) + XCTAssertNotEqual(eventFiles2?[0].pathExtension, PersistentStorage.TEMP_FILE_EXTENSION) + + XCTAssertEqual(eventFiles2?.count, 1) + + let eventString2 = persistentStorage2.getEventsString(eventBlock: (eventFiles2?[0])!) + let decodedEvents = BaseEvent.fromArrayString(jsonString: eventString2!) + XCTAssertEqual(decodedEvents!.count, 2) + XCTAssertEqual(decodedEvents![0].eventType, "test1") + XCTAssertEqual(decodedEvents![1].eventType, "test2") + persistentStorage1.reset() + persistentStorage2.reset() + } + #if os(macOS) func testMacOsStorageDirectorySandboxedWhenAppSandboxDisabled() { let persistentStorage = PersistentStorage(storagePrefix: "mac-instance")