Skip to content

Commit c401304

Browse files
committed
full crud test
1 parent 3cf9920 commit c401304

File tree

6 files changed

+146
-13
lines changed

6 files changed

+146
-13
lines changed

caffein-bounded-cache-support/src/main/java/io/javaoperatorsdk/operator/processing/event/source/cache/CaffeinBoundedCache.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@ public R remove(K key) {
2323
}
2424

2525
@Override
26-
public R put(K key, R object) {
26+
public void put(K key, R object) {
2727
cache.put(key, object);
28-
return object;
2928
}
3029
}

caffein-bounded-cache-support/src/main/java/io/javaoperatorsdk/operator/processing/event/source/cache/CaffeinBoundedItemStores.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010

1111
public class CaffeinBoundedItemStores {
1212

13+
private CaffeinBoundedItemStores() {}
14+
1315
public static <R extends HasMetadata> BoundedItemStore<R> boundedItemStore(
1416
KubernetesClient client, Class<R> rClass,
1517
Duration accessExpireDuration, long cacheMaxSize) {

caffein-bounded-cache-support/src/test/java/io/javaoperatorsdk/operator/processing/event/source/cache/CaffeinBoundedCacheIT.java

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ class CaffeinBoundedCacheIT {
2323
public static final int NUMBER_OF_RESOURCE_TO_TEST = 3;
2424
public static final String RESOURCE_NAME_PREFIX = "test-";
2525
public static final String INITIAL_DATA_PREFIX = "data-";
26+
public static final String UPDATED_PREFIX = "updatedPrefix";
2627

2728
@RegisterExtension
2829
LocallyRunOperatorExtension extension =
@@ -38,17 +39,44 @@ class CaffeinBoundedCacheIT {
3839
void reconciliationWorksWithLimitedCache() {
3940
createTestResources();
4041

41-
await().untilAsserted(() -> {
42-
assertConfigMapData(INITIAL_DATA_PREFIX);
42+
assertConfigMapData(INITIAL_DATA_PREFIX);
43+
44+
updateTestResources();
45+
46+
assertConfigMapData(UPDATED_PREFIX);
47+
48+
deleteTestResources();
49+
50+
assertConfigMapsDeleted();
51+
}
52+
53+
private void assertConfigMapsDeleted() {
54+
await().untilAsserted(() -> IntStream.range(0, NUMBER_OF_RESOURCE_TO_TEST).forEach(i -> {
55+
var cm = extension.get(ConfigMap.class, RESOURCE_NAME_PREFIX + i);
56+
assertThat(cm).isNull();
57+
}));
58+
}
59+
60+
private void deleteTestResources() {
61+
IntStream.range(0, NUMBER_OF_RESOURCE_TO_TEST).forEach(i -> {
62+
var cm = extension.get(BoundedCacheTestCustomResource.class, RESOURCE_NAME_PREFIX + i);
63+
extension.delete(cm);
4364
});
4465
}
4566

46-
void assertConfigMapData(String dataPrefix) {
67+
private void updateTestResources() {
4768
IntStream.range(0, NUMBER_OF_RESOURCE_TO_TEST).forEach(i -> {
48-
assertConfigMap(i, dataPrefix);
69+
var cm = extension.get(ConfigMap.class, RESOURCE_NAME_PREFIX + i);
70+
cm.getData().put(DATA_KEY, UPDATED_PREFIX + i);
71+
extension.replace(cm);
4972
});
5073
}
5174

75+
void assertConfigMapData(String dataPrefix) {
76+
await().untilAsserted(() -> IntStream.range(0, NUMBER_OF_RESOURCE_TO_TEST)
77+
.forEach(i -> assertConfigMap(i, dataPrefix)));
78+
}
79+
5280
private void assertConfigMap(int i, String prefix) {
5381
var cm = extension.get(ConfigMap.class, RESOURCE_NAME_PREFIX + i);
5482
assertThat(cm).isNotNull();
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
package io.javaoperatorsdk.operator.processing.event.source.cache;
22

3-
// todo: rename to cache? (replace the old one)
43
public interface BoundedCache<K, R> {
54

65
R get(K key);
76

87
R remove(K key);
98

10-
R put(K key, R object);
9+
void put(K key, R object);
1110

1211
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/cache/BoundedItemStore.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,15 @@ public class BoundedItemStore<R extends HasMetadata>
2828

2929
public BoundedItemStore(KubernetesClient client,
3030
BoundedCache<String, R> cache, Class<R> resourceClass) {
31-
this(client, cache, resourceClass, namespaceKeyFunc());
31+
this(cache, resourceClass, namespaceKeyFunc(),
32+
new KubernetesResourceFetcher<>(resourceClass, client));
3233
}
3334

34-
public BoundedItemStore(KubernetesClient client,
35-
BoundedCache<String, R> cache,
35+
public BoundedItemStore(BoundedCache<String, R> cache,
3636
Class<R> resourceClass,
37-
Function<R, String> keyFunction) {
38-
this.resourceFetcher = new KubernetesResourceFetcher<>(resourceClass, client);
37+
Function<R, String> keyFunction,
38+
ResourceFetcher<String, R> resourceFetcher) {
39+
this.resourceFetcher = resourceFetcher;
3940
this.cache = cache;
4041
this.keyFunction = keyFunction;
4142
this.resourceClass = resourceClass;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
package io.javaoperatorsdk.operator.processing.event.source.cache;
2+
3+
import org.junit.jupiter.api.BeforeEach;
4+
import org.junit.jupiter.api.Test;
5+
6+
import io.fabric8.kubernetes.api.model.HasMetadata;
7+
import io.fabric8.kubernetes.client.informers.cache.Cache;
8+
import io.javaoperatorsdk.operator.TestUtils;
9+
import io.javaoperatorsdk.operator.sample.simple.TestCustomResource;
10+
11+
import static io.javaoperatorsdk.operator.processing.event.source.cache.BoundedItemStore.namespaceKeyFunc;
12+
import static org.assertj.core.api.Assertions.assertThat;
13+
import static org.mockito.ArgumentMatchers.any;
14+
import static org.mockito.Mockito.*;
15+
16+
class BoundedItemStoreTest {
17+
18+
private BoundedItemStore<TestCustomResource> boundedItemStore;
19+
private BoundedCache<String, TestCustomResource> boundedCache = mock(BoundedCache.class);
20+
private ResourceFetcher<String, TestCustomResource> resourceFetcher = mock(ResourceFetcher.class);
21+
22+
@BeforeEach
23+
void setup() {
24+
boundedItemStore = new BoundedItemStore<>(boundedCache,
25+
TestCustomResource.class,
26+
namespaceKeyFunc(),
27+
resourceFetcher);
28+
}
29+
30+
@Test
31+
void notFetchesResourceFromServer() {
32+
var res = boundedItemStore.get(testRes1Key());
33+
34+
assertThat(res).isNull();
35+
verify(resourceFetcher, never()).fetchResource(any());
36+
}
37+
38+
@Test
39+
void getsResourceFromServerIfNotInCache() {
40+
boundedItemStore.put(testRes1Key(),
41+
TestUtils.testCustomResource1());
42+
when(resourceFetcher.fetchResource(testRes1Key()))
43+
.thenReturn(TestUtils.testCustomResource1());
44+
45+
var res = boundedItemStore.get(testRes1Key());
46+
47+
assertThat(res).isNotNull();
48+
verify(resourceFetcher, times(1)).fetchResource(any());
49+
}
50+
51+
@Test
52+
void ifFetchingNotFoundResourceRemovesItFromStore() {
53+
boundedItemStore.put(testRes1Key(),
54+
TestUtils.testCustomResource1());
55+
when(resourceFetcher.fetchResource(testRes1Key()))
56+
.thenReturn(null);
57+
58+
var res = boundedItemStore.get(testRes1Key());
59+
60+
assertThat(res).isNull();
61+
assertThat(boundedItemStore.keySet()).isEmpty();
62+
}
63+
64+
@Test
65+
void removesResourceFromCache() {
66+
boundedItemStore.put(testRes1Key(),
67+
TestUtils.testCustomResource1());
68+
69+
boundedItemStore.remove(testRes1Key());
70+
71+
var res = boundedItemStore.get(testRes1Key());
72+
verify(resourceFetcher, never()).fetchResource(any());
73+
assertThat(res).isNull();
74+
assertThat(boundedItemStore.keySet()).isEmpty();
75+
}
76+
77+
@Test
78+
void readingKeySeyNotReadsTheBoundedCache() {
79+
boundedItemStore.put(testRes1Key(),
80+
TestUtils.testCustomResource1());
81+
82+
boundedItemStore.keySet();
83+
84+
verify(boundedCache, never()).get(any());
85+
}
86+
87+
@Test
88+
void readingValuesNotReadsTheBoundedCache() {
89+
boundedItemStore.put(testRes1Key(),
90+
TestUtils.testCustomResource1());
91+
92+
boundedItemStore.values();
93+
94+
verify(boundedCache, never()).get(any());
95+
}
96+
97+
String key(HasMetadata r) {
98+
return Cache.namespaceKeyFunc(r.getMetadata().getNamespace(), r.getMetadata().getName());
99+
}
100+
101+
String testRes1Key() {
102+
return key(TestUtils.testCustomResource1());
103+
}
104+
}

0 commit comments

Comments
 (0)