Skip to content

Commit 27253e9

Browse files
authored
Merge pull request #176 from lug4rd/master
Fix "expiry" values
2 parents 3b53dfe + 096014c commit 27253e9

File tree

6 files changed

+68
-2
lines changed

6 files changed

+68
-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
}

Source/Shared/Storage/StorageAware.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,12 @@ public protocol StorageAware {
4545
Clears all expired objects.
4646
*/
4747
func removeExpiredObjects() throws
48+
49+
/**
50+
Check if an expired object by the given key.
51+
- Parameter key: Unique key to identify the object.
52+
*/
53+
func isExpiredObject<T: Codable>(ofType type: T.Type, forKey key: String) throws -> Bool
4854
}
4955

5056
public extension StorageAware {
@@ -60,4 +66,13 @@ public extension StorageAware {
6066
return false
6167
}
6268
}
69+
70+
func isExpiredObject<T: Codable>(ofType type: T.Type, forKey key: String) throws -> Bool {
71+
do {
72+
let entry = try self.entry(ofType: type, forKey: key)
73+
return entry.expiry.isExpired
74+
} catch {
75+
return true
76+
}
77+
}
6378
}

Tests/iOS/Tests/Storage/DiskStorageTests.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,14 @@ final class DiskStorageTests: XCTestCase {
129129
let cachedObject: User? = try storage.object(ofType: User.self, forKey: key)
130130
XCTAssertNotNil(cachedObject)
131131
}
132+
133+
/// Test expired object
134+
func testExpiredObject() throws {
135+
try storage.setObject(testObject, forKey: key, expiry: .seconds(0.9))
136+
XCTAssertFalse(try! storage.isExpiredObject(ofType: User.self, forKey: key))
137+
sleep(1)
138+
XCTAssertTrue(try! storage.isExpiredObject(ofType: User.self, forKey: key))
139+
}
132140

133141
/// Test that it clears cache directory
134142
func testClear() throws {

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: 23 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() {
@@ -66,6 +81,14 @@ final class MemoryStorageTests: XCTestCase {
6681

6782
XCTAssertNotNil(cachedObject)
6883
}
84+
85+
/// Test expired object
86+
func testExpiredObject() throws {
87+
storage.setObject(testObject, forKey: key, expiry: .seconds(0.9))
88+
XCTAssertFalse(try! storage.isExpiredObject(ofType: User.self, forKey: key))
89+
sleep(1)
90+
XCTAssertTrue(try! storage.isExpiredObject(ofType: User.self, forKey: key))
91+
}
6992

7093
/// Test that it clears cache directory
7194
func testRemoveAll() {

0 commit comments

Comments
 (0)