Skip to content

Commit ed4f5ca

Browse files
author
Lug4rd
committed
Fix "expiry" values
While using .seconds case an object never be with expired date and expiry values will be different for memory and disk storages when coped to memory for hybrid storage.
1 parent 3b53dfe commit ed4f5ca

File tree

4 files changed

+37
-2
lines changed

4 files changed

+37
-2
lines changed

Source/Shared/Storage/HybridStorage.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ extension HybridStorage: StorageAware {
1818
} catch {
1919
let entry = try diskStorage.entry(ofType: type, forKey: key)
2020
// set back to memoryStorage
21-
memoryStorage.setObject(entry.object, forKey: key)
21+
memoryStorage.setObject(entry.object, forKey: key, expiry: entry.expiry)
2222
return entry
2323
}
2424
}

Source/Shared/Storage/MemoryStorage.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ extension MemoryStorage: StorageAware {
3737
}
3838

3939
func setObject<T: Codable>(_ object: T, forKey key: String, expiry: Expiry? = nil) {
40-
let capsule = MemoryCapsule(value: object, expiry: expiry ?? config.expiry)
40+
let capsule = MemoryCapsule(value: object, expiry: .date(expiry?.date ?? config.expiry.date))
4141
cache.setObject(capsule, forKey: NSString(string: key))
4242
keys.insert(key)
4343
}

Tests/iOS/Tests/Storage/HybridStorageTests.swift

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,26 @@ final class HybridStorageTests: XCTestCase {
6161
XCTAssertEqual(inMemoryCachedObject, testObject)
6262
}
6363
}
64+
65+
func testEntityExpiryForObjectCopyToMemory() throws {
66+
let date = Date().addingTimeInterval(3)
67+
try when("set to disk only") {
68+
try storage.diskStorage.setObject(testObject, forKey: key, expiry: .seconds(3))
69+
let entry = try storage.entry(ofType: User.self, forKey: key)
70+
//accuracy for slow disk processes
71+
XCTAssertEqual(entry.expiry.date.timeIntervalSinceReferenceDate,
72+
date.timeIntervalSinceReferenceDate,
73+
accuracy: 1.0)
74+
}
75+
76+
try then("there is no object in memory") {
77+
let entry = try storage.memoryStorage.entry(ofType: User.self, forKey: key)
78+
//accuracy for slow disk processes
79+
XCTAssertEqual(entry.expiry.date.timeIntervalSinceReferenceDate,
80+
date.timeIntervalSinceReferenceDate,
81+
accuracy: 1.0)
82+
}
83+
}
6484

6585
/// Removes cached object from memory and disk
6686
func testRemoveObject() throws {

Tests/iOS/Tests/Storage/MemoryStorageTests.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,21 @@ final class MemoryStorageTests: XCTestCase {
3939
XCTAssertEqual(entry?.object.lastName, testObject.lastName)
4040
XCTAssertEqual(entry?.expiry.date, config.expiry.date)
4141
}
42+
43+
func testSetObjectWithExpiry() {
44+
let date = Date().addingTimeInterval(1)
45+
storage.setObject(testObject, forKey: key, expiry: .seconds(1))
46+
var entry = try! storage.entry(ofType: User.self, forKey: key)
47+
XCTAssertEqual(entry.expiry.date.timeIntervalSinceReferenceDate,
48+
date.timeIntervalSinceReferenceDate,
49+
accuracy: 0.1)
50+
//Timer vs sleep: do not complicate
51+
sleep(1)
52+
entry = try! storage.entry(ofType: User.self, forKey: key)
53+
XCTAssertEqual(entry.expiry.date.timeIntervalSinceReferenceDate,
54+
date.timeIntervalSinceReferenceDate,
55+
accuracy: 0.1)
56+
}
4257

4358
/// Test that it removes cached object
4459
func testRemoveObject() {

0 commit comments

Comments
 (0)