@@ -471,6 +471,29 @@ final class FileStorageTests: XCTestCase {
471471 await fulfillment ( of: [ publisherExpectation] , timeout: 1 )
472472 }
473473 }
474+
475+ @MainActor
476+ func testMultipleMutations( ) async throws {
477+ try ? FileManager . default. removeItem ( at: . documentsDirectory. appending ( component: " counts.json " ) )
478+
479+ try await withDependencies {
480+ $0. defaultFileStorage = . fileSystem
481+ } operation: {
482+ @Shared ( . counts) var counts
483+ let delay = 0.5
484+ let time = 5.0
485+ let limit = Int ( time / delay)
486+ while counts. count1 < limit {
487+ try await Task . sleep ( for: . seconds( delay) )
488+ $counts. withLock { $0. count1 += 1 }
489+ $counts. withLock { $0. count2 += 1 }
490+ $counts. withLock { $0. count3 += 1 }
491+ }
492+ XCTAssertEqual ( counts. count1, limit)
493+ XCTAssertEqual ( counts. count2, limit)
494+ XCTAssertEqual ( counts. count3, limit)
495+ }
496+ }
474497}
475498
476499extension PersistenceReaderKey
@@ -513,3 +536,19 @@ extension [URL: Data] {
513536 return try JSONDecoder ( ) . decode ( [ User ] . self, from: data)
514537 }
515538}
539+
540+ private struct Counts : Equatable , Codable {
541+ var count1 = 0
542+ var count2 = 0
543+ var count3 = 0
544+ }
545+
546+ extension PersistenceReaderKey
547+ where Self == PersistenceKeyDefault < FileStorageKey < Counts > > {
548+ fileprivate static var counts : Self {
549+ PersistenceKeyDefault (
550+ . fileStorage( . documentsDirectory. appending ( component: " counts.json " ) ) ,
551+ Counts ( )
552+ )
553+ }
554+ }
0 commit comments