Skip to content

Commit 6367fdf

Browse files
[FSSDK-11152] update: add remove method in LRU Cache for CMAB service (#578)
* Cmab datafile parsed * Add CMAB configuration and parsing tests with cmab datafile * Add copyright notice to CmabTest and CmabParsingTest files * Refactor cmab parsing logic to simplify null check in JsonConfigParser * update: implement remove method in DefaultLRUCache for cache entry removal * add: implement remove method tests in DefaultLRUCacheTest for various scenarios * refactor: remove unused methods from Cache interface * update: add reset method to Cache interface
1 parent aa84c7d commit 6367fdf

File tree

2 files changed

+99
-0
lines changed

2 files changed

+99
-0
lines changed

core-api/src/main/java/com/optimizely/ab/internal/DefaultLRUCache.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,19 @@ public void reset() {
9494
}
9595
}
9696

97+
public void remove(String key) {
98+
if (maxSize == 0) {
99+
// Cache is disabled when maxSize = 0
100+
return;
101+
}
102+
lock.lock();
103+
try {
104+
linkedHashMap.remove(key);
105+
} finally {
106+
lock.unlock();
107+
}
108+
}
109+
97110
private class CacheEntity {
98111
public T value;
99112
public Long timestamp;

core-api/src/test/java/com/optimizely/ab/internal/DefaultLRUCacheTest.java

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,4 +169,90 @@ public void whenCacheIsReset() {
169169

170170
assertEquals(0, cache.linkedHashMap.size());
171171
}
172+
173+
@Test
174+
public void testRemoveNonExistentKey() {
175+
DefaultLRUCache<Integer> cache = new DefaultLRUCache<>(3, 1000);
176+
cache.save("1", 100);
177+
cache.save("2", 200);
178+
179+
cache.remove("3"); // Doesn't exist
180+
181+
assertEquals(Integer.valueOf(100), cache.lookup("1"));
182+
assertEquals(Integer.valueOf(200), cache.lookup("2"));
183+
}
184+
185+
@Test
186+
public void testRemoveExistingKey() {
187+
DefaultLRUCache<Integer> cache = new DefaultLRUCache<>(3, 1000);
188+
189+
cache.save("1", 100);
190+
cache.save("2", 200);
191+
cache.save("3", 300);
192+
193+
assertEquals(Integer.valueOf(100), cache.lookup("1"));
194+
assertEquals(Integer.valueOf(200), cache.lookup("2"));
195+
assertEquals(Integer.valueOf(300), cache.lookup("3"));
196+
197+
cache.remove("2");
198+
199+
assertEquals(Integer.valueOf(100), cache.lookup("1"));
200+
assertNull(cache.lookup("2"));
201+
assertEquals(Integer.valueOf(300), cache.lookup("3"));
202+
}
203+
204+
@Test
205+
public void testRemoveFromZeroSizedCache() {
206+
DefaultLRUCache<Integer> cache = new DefaultLRUCache<>(0, 1000);
207+
cache.save("1", 100);
208+
cache.remove("1");
209+
210+
assertNull(cache.lookup("1"));
211+
}
212+
213+
@Test
214+
public void testRemoveAndAddBack() {
215+
DefaultLRUCache<Integer> cache = new DefaultLRUCache<>(3, 1000);
216+
cache.save("1", 100);
217+
cache.save("2", 200);
218+
cache.save("3", 300);
219+
220+
cache.remove("2");
221+
cache.save("2", 201);
222+
223+
assertEquals(Integer.valueOf(100), cache.lookup("1"));
224+
assertEquals(Integer.valueOf(201), cache.lookup("2"));
225+
assertEquals(Integer.valueOf(300), cache.lookup("3"));
226+
}
227+
228+
@Test
229+
public void testThreadSafety() throws InterruptedException {
230+
int maxSize = 100;
231+
DefaultLRUCache<Integer> cache = new DefaultLRUCache<>(maxSize, 1000);
232+
233+
for (int i = 1; i <= maxSize; i++) {
234+
cache.save(String.valueOf(i), i * 100);
235+
}
236+
237+
Thread[] threads = new Thread[maxSize / 2];
238+
for (int i = 1; i <= maxSize / 2; i++) {
239+
final int key = i;
240+
threads[i - 1] = new Thread(() -> cache.remove(String.valueOf(key)));
241+
threads[i - 1].start();
242+
}
243+
244+
for (Thread thread : threads) {
245+
thread.join();
246+
}
247+
248+
for (int i = 1; i <= maxSize; i++) {
249+
if (i <= maxSize / 2) {
250+
assertNull(cache.lookup(String.valueOf(i)));
251+
} else {
252+
assertEquals(Integer.valueOf(i * 100), cache.lookup(String.valueOf(i)));
253+
}
254+
}
255+
256+
assertEquals(maxSize / 2, cache.linkedHashMap.size());
257+
}
172258
}

0 commit comments

Comments
 (0)