Skip to content

Commit

Permalink
Test observations in HybridStorage and Storage
Browse files Browse the repository at this point in the history
  • Loading branch information
vadymmarkov committed Aug 7, 2018
1 parent 0bbdf94 commit e4fd357
Show file tree
Hide file tree
Showing 9 changed files with 217 additions and 99 deletions.
6 changes: 0 additions & 6 deletions Cache.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -128,8 +128,6 @@
D2D4CC251FA3426B00E4A2D5 /* JSONArrayWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2D4CC231FA3426B00E4A2D5 /* JSONArrayWrapper.swift */; };
D2D4CC261FA3426B00E4A2D5 /* JSONArrayWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2D4CC231FA3426B00E4A2D5 /* JSONArrayWrapper.swift */; };
D2D4CC281FA342CA00E4A2D5 /* JSONWrapperTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2D4CC271FA342CA00E4A2D5 /* JSONWrapperTests.swift */; };
D511464B2114775100197DCE /* StorageObservationRegistryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D511464A2114775100197DCE /* StorageObservationRegistryTests.swift */; };
D511464D2114775100197DCE /* StorageObservationRegistryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D511464A2114775100197DCE /* StorageObservationRegistryTests.swift */; };
D511464F21147B7C00197DCE /* ObservationTokenTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D511464E21147B7C00197DCE /* ObservationTokenTests.swift */; };
D511465121147B7C00197DCE /* ObservationTokenTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D511464E21147B7C00197DCE /* ObservationTokenTests.swift */; };
D51146532118337500197DCE /* KeyObservationRegistry.swift in Sources */ = {isa = PBXBuildFile; fileRef = D51146522118337500197DCE /* KeyObservationRegistry.swift */; };
Expand Down Expand Up @@ -223,7 +221,6 @@
D2D4CC1F1FA3411300E4A2D5 /* JSONDictionaryWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JSONDictionaryWrapper.swift; sourceTree = "<group>"; };
D2D4CC231FA3426B00E4A2D5 /* JSONArrayWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JSONArrayWrapper.swift; sourceTree = "<group>"; };
D2D4CC271FA342CA00E4A2D5 /* JSONWrapperTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JSONWrapperTests.swift; sourceTree = "<group>"; };
D511464A2114775100197DCE /* StorageObservationRegistryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StorageObservationRegistryTests.swift; sourceTree = "<group>"; };
D511464E21147B7C00197DCE /* ObservationTokenTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ObservationTokenTests.swift; sourceTree = "<group>"; };
D51146522118337500197DCE /* KeyObservationRegistry.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyObservationRegistry.swift; sourceTree = "<group>"; };
D5291CDF1C28374800B702C9 /* TestHelper+iOS.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "TestHelper+iOS.swift"; sourceTree = "<group>"; };
Expand Down Expand Up @@ -416,7 +413,6 @@
D292DB001F6AA06B0060F614 /* SyncStorageTests.swift */,
D292DB031F6AA0730060F614 /* AsyncStorageTests.swift */,
D236F3191F6BEF73004EE01F /* StorageTests.swift */,
D511464A2114775100197DCE /* StorageObservationRegistryTests.swift */,
);
path = Storage;
sourceTree = "<group>";
Expand Down Expand Up @@ -864,7 +860,6 @@
D511465121147B7C00197DCE /* ObservationTokenTests.swift in Sources */,
D28A1D241F6FFEF60030DF81 /* ObjectConverterTests.swift in Sources */,
D27014B120D12E38003B45C7 /* StorageSupportTests.swift in Sources */,
D511464D2114775100197DCE /* StorageObservationRegistryTests.swift in Sources */,
D27014AD20D12CC3003B45C7 /* SyncStorageTests.swift in Sources */,
D27014AA20D12BA4003B45C7 /* HybridStorageTests.swift in Sources */,
);
Expand All @@ -884,7 +879,6 @@
D2CF987F1F69513800CE8F68 /* ImageWrapperTests.swift in Sources */,
D2D4CC1A1FA3166900E4A2D5 /* MD5Tests.swift in Sources */,
D2D4CC281FA342CA00E4A2D5 /* JSONWrapperTests.swift in Sources */,
D511464B2114775100197DCE /* StorageObservationRegistryTests.swift in Sources */,
D27014B320D13E2C003B45C7 /* StorageTests.swift in Sources */,
D28C9BAF1F67EF8300C180C1 /* UIImage+ExtensionsTests.swift in Sources */,
D2CF987D1F69513800CE8F68 /* MemoryCapsuleTests.swift in Sources */,
Expand Down
1 change: 0 additions & 1 deletion Source/Shared/Storage/DiskStorage.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ final public class DiskStorage<T> {

private let transformer: Transformer<T>


// MARK: - Initialization

public convenience init(config: DiskConfig, fileManager: FileManager = FileManager.default, transformer: Transformer<T>) throws {
Expand Down
13 changes: 6 additions & 7 deletions Source/Shared/Storage/HybridStorage.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ public final class HybridStorage<T> {
public let memoryStorage: MemoryStorage<T>
public let diskStorage: DiskStorage<T>

private var storageObservations = [UUID : (HybridStorage, StorageChange) -> Void]()
private var keyObservations = [String : (HybridStorage, KeyChange<T>) -> Void]()
private(set) var storageObservations = [UUID : (HybridStorage, StorageChange) -> Void]()
private(set) var keyObservations = [String : (HybridStorage, KeyChange<T>) -> Void]()

public init(memoryStorage: MemoryStorage<T>, diskStorage: DiskStorage<T>) {
self.memoryStorage = memoryStorage
Expand Down Expand Up @@ -54,7 +54,6 @@ extension HybridStorage: StorageAware {
memoryStorage.setObject(object, forKey: key, expiry: expiry)
try diskStorage.setObject(object, forKey: key, expiry: expiry)


if let change = keyChange {
notifyObserver(forKey: key, about: change)
}
Expand Down Expand Up @@ -111,7 +110,7 @@ extension HybridStorage: StorageObservationRegistry {
}
}

public func removeAllStorageObservations() {
public func removeAllStorageObservers() {
storageObservations.removeAll()
}

Expand All @@ -131,7 +130,7 @@ extension HybridStorage: KeyObservationRegistry {
) -> ObservationToken {
keyObservations[key] = { [weak self, weak observer] storage, change in
guard let observer = observer else {
self?.removeObservation(forKey: key)
self?.removeObserver(forKey: key)
return
}

Expand All @@ -143,11 +142,11 @@ extension HybridStorage: KeyObservationRegistry {
}
}

public func removeObservation(forKey key: String) {
public func removeObserver(forKey key: String) {
keyObservations.removeValue(forKey: key)
}

public func removeAllKeyObservations() {
public func removeAllKeyObservers() {
keyObservations.removeAll()
}

Expand Down
4 changes: 2 additions & 2 deletions Source/Shared/Storage/KeyObservationRegistry.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ public protocol KeyObservationRegistry {
closure: @escaping (O, S, KeyChange<S.T>) -> Void
) -> ObservationToken

func removeObservation(forKey key: String)
func removeAllKeyObservations()
func removeObserver(forKey key: String)
func removeAllKeyObservers()
}

// MARK: - KeyChange
Expand Down
12 changes: 6 additions & 6 deletions Source/Shared/Storage/Storage.swift
Original file line number Diff line number Diff line change
Expand Up @@ -96,8 +96,8 @@ extension Storage: StorageObservationRegistry {
}
}

public func removeAllStorageObservations() {
hybridStorage.removeAllStorageObservations()
public func removeAllStorageObservers() {
hybridStorage.removeAllStorageObservers()
}
}

Expand All @@ -114,11 +114,11 @@ extension Storage: KeyObservationRegistry {
}
}

public func removeObservation(forKey key: String) {
hybridStorage.removeObservation(forKey: key)
public func removeObserver(forKey key: String) {
hybridStorage.removeObserver(forKey: key)
}

public func removeAllKeyObservations() {
hybridStorage.removeAllKeyObservations()
public func removeAllKeyObservers() {
hybridStorage.removeAllKeyObservers()
}
}
2 changes: 1 addition & 1 deletion Source/Shared/Storage/StorageObservationRegistry.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ public protocol StorageObservationRegistry {
closure: @escaping (O, S, StorageChange) -> Void
) -> ObservationToken

func removeAllStorageObservations()
func removeAllStorageObservers()
}

// MARK: - StorageChange
Expand Down
82 changes: 68 additions & 14 deletions Tests/iOS/Tests/Storage/HybridStorageTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -157,27 +157,81 @@ final class HybridStorageTests: XCTestCase {
}
}

func testAddObservations() throws {
// MARK: - Storage observers

func testAddStorageObserver() throws {
var changes = [StorageChange]()
storage.addStorageObserver(self) { _, _, change in
changes.append(change)
}

try storage.setObject(testObject, forKey: "user1")
XCTAssertEqual(changes, [StorageChange.add(key: "user1")])
XCTAssertEqual(storage.storageObservations.count, 1)

storage.addStorageObserver(self) { _, _, _ in }
XCTAssertEqual(storage.storageObservations.count, 2)
}

func testRemoveStorageObserver() {
let token = storage.addStorageObserver(self) { _, _, _ in }
XCTAssertEqual(storage.storageObservations.count, 1)

token.cancel()
XCTAssertTrue(storage.storageObservations.isEmpty)
}

func testRemoveAllStorageObservers() {
storage.addStorageObserver(self) { _, _, _ in }
storage.addStorageObserver(self) { _, _, _ in }
XCTAssertEqual(storage.storageObservations.count, 2)

storage.removeAllStorageObservers()
XCTAssertTrue(storage.storageObservations.isEmpty)
}

// MARK: - Key observers

storage.storageObservationRegistry.addObservation { storage, change in
func testAddObserverForKey() throws {
var changes = [KeyChange<User>]()
storage.addObserver(self, forKey: "user1") { _, _, change in
changes.append(change)
}

XCTAssertEqual(storage.keyObservations.count, 1)

try storage.setObject(testObject, forKey: "user1")
try storage.setObject(testObject, forKey: "user2")
try storage.removeObject(forKey: "user1")
try storage.removeExpiredObjects()
try storage.removeAll()
XCTAssertEqual(changes, [KeyChange.edit(before: nil, after: testObject)])

storage.addObserver(self, forKey: "user1") { _, _, _ in }
XCTAssertEqual(storage.keyObservations.count, 1)

storage.addObserver(self, forKey: "user2") { _, _, _ in }
XCTAssertEqual(storage.keyObservations.count, 2)
}

func testRemoveKeyObserver() {
// Test remove for key
storage.addObserver(self, forKey: "user1") { _, _, _ in }
XCTAssertEqual(storage.keyObservations.count, 1)

storage.removeObserver(forKey: "user1")
XCTAssertTrue(storage.storageObservations.isEmpty)

// Test remove by token
let token = storage.addObserver(self, forKey: "user2") { _, _, _ in }
XCTAssertEqual(storage.keyObservations.count, 1)

token.cancel()
XCTAssertTrue(storage.storageObservations.isEmpty)
}

let expectedChanges: [StorageChange] = [
.add(key: "user1"),
.add(key: "user2"),
.remove(key: "user1"),
.removeExpired,
.removeAll
]
func testRemoveAllKeyObservers() {
storage.addObserver(self, forKey: "user1") { _, _, _ in }
storage.addObserver(self, forKey: "user2") { _, _, _ in }
XCTAssertEqual(storage.keyObservations.count, 2)

XCTAssertEqual(changes, expectedChanges)
storage.removeAllKeyObservers()
XCTAssertTrue(storage.keyObservations.isEmpty)
}
}
60 changes: 0 additions & 60 deletions Tests/iOS/Tests/Storage/StorageObservationRegistryTests.swift

This file was deleted.

Loading

0 comments on commit e4fd357

Please sign in to comment.