ConfigMapLockRepositoryTest

This commit is contained in:
Gytis Trikleris
2018-05-25 12:08:39 +02:00
committed by Ioannis Canellos
parent 42b8b036b5
commit bd2a39be31
2 changed files with 151 additions and 4 deletions

View File

@@ -33,13 +33,13 @@ public class ConfigMapLockRepository {
static final String EXPIRATION_KEY = "expiration";
private static final String PROVIDER_LABEL = "provider";
static final String PROVIDER_LABEL = "provider";
private static final String PROVIDER_LABEL_VALUE = "spring-cloud-kubernetes";
static final String PROVIDER_LABEL_VALUE = "spring-cloud-kubernetes";
private static final String KIND_LABEL = "kind";
static final String KIND_LABEL = "kind";
private static final String KIND_LABEL_VALUE = "lock";
static final String KIND_LABEL_VALUE = "lock";
private static final Logger LOGGER = LoggerFactory.getLogger(ConfigMapLockRepository.class);

View File

@@ -0,0 +1,147 @@
package org.springframework.cloud.kubernetes.lock;
import java.util.Map;
import java.util.Optional;
import io.fabric8.kubernetes.api.model.ConfigMap;
import io.fabric8.kubernetes.api.model.ConfigMapBuilder;
import io.fabric8.kubernetes.api.model.ConfigMapList;
import io.fabric8.kubernetes.api.model.DoneableConfigMap;
import io.fabric8.kubernetes.client.KubernetesClient;
import io.fabric8.kubernetes.client.KubernetesClientException;
import io.fabric8.kubernetes.client.dsl.MixedOperation;
import io.fabric8.kubernetes.client.dsl.NonNamespaceOperation;
import io.fabric8.kubernetes.client.dsl.Resource;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.springframework.cloud.kubernetes.lock.ConfigMapLockRepository.CONFIG_MAP_PREFIX;
import static org.springframework.cloud.kubernetes.lock.ConfigMapLockRepository.EXPIRATION_KEY;
import static org.springframework.cloud.kubernetes.lock.ConfigMapLockRepository.HOLDER_KEY;
import static org.springframework.cloud.kubernetes.lock.ConfigMapLockRepository.KIND_LABEL;
import static org.springframework.cloud.kubernetes.lock.ConfigMapLockRepository.KIND_LABEL_VALUE;
import static org.springframework.cloud.kubernetes.lock.ConfigMapLockRepository.PROVIDER_LABEL;
import static org.springframework.cloud.kubernetes.lock.ConfigMapLockRepository.PROVIDER_LABEL_VALUE;
@RunWith(MockitoJUnitRunner.class)
public class ConfigMapLockRepositoryTest {
private static final String NAMESPACE = "test-namespace";
private static final String NAME = "test-name";
private static final String CONFIGMAP_NAME = String.format("%s-%s", CONFIG_MAP_PREFIX, NAME);
private static final String HOLDER = "test-holder";
@Mock
private KubernetesClient mockKubernetesClient;
@Mock
private MixedOperation<ConfigMap, ConfigMapList, DoneableConfigMap, Resource<ConfigMap, DoneableConfigMap>>
mockConfigMapsOperation;
@Mock
private NonNamespaceOperation<ConfigMap, ConfigMapList, DoneableConfigMap, Resource<ConfigMap, DoneableConfigMap>>
mockInNamespaceOperation;
@Mock
private Resource<ConfigMap, DoneableConfigMap> mockWithNameResource;
@Mock
private ConfigMap mockConfigMap;
@Mock
private Map<String, String> mockData;
private ConfigMapLockRepository repository;
@Before
public void before() {
given(mockKubernetesClient.configMaps()).willReturn(mockConfigMapsOperation);
given(mockConfigMapsOperation.inNamespace(NAMESPACE)).willReturn(mockInNamespaceOperation);
given(mockInNamespaceOperation.withName(CONFIGMAP_NAME)).willReturn(mockWithNameResource);
given(mockWithNameResource.get()).willReturn(mockConfigMap);
given(mockConfigMap.getData()).willReturn(mockData);
repository = new ConfigMapLockRepository(mockKubernetesClient, NAMESPACE);
}
@Test
public void shouldGet() {
Optional<ConfigMap> optionalConfigMap = repository.get(NAME);
assertThat(optionalConfigMap.isPresent()).isTrue();
assertThat(optionalConfigMap.get()).isEqualTo(mockConfigMap);
}
@Test
public void shouldNotGetNonExistent() {
given(mockWithNameResource.get()).willReturn(null);
Optional<ConfigMap> optionalConfigMap = repository.get(NAME);
assertThat(optionalConfigMap.isPresent()).isFalse();
}
@Test
public void shouldCreate() {
boolean result = repository.create(NAME, HOLDER, 1000);
assertThat(result).isTrue();
verify(mockKubernetesClient).configMaps();
verify(mockConfigMapsOperation).inNamespace(NAMESPACE);
ConfigMap expectedConfigMap = new ConfigMapBuilder().withNewMetadata()
.withName(CONFIGMAP_NAME)
.addToLabels(PROVIDER_LABEL, PROVIDER_LABEL_VALUE)
.addToLabels(KIND_LABEL, KIND_LABEL_VALUE)
.endMetadata()
.addToData(HOLDER_KEY, HOLDER)
.addToData(EXPIRATION_KEY, "1000")
.build();
verify(mockInNamespaceOperation).create(eq(expectedConfigMap));
}
@Test
public void shouldHandleCreationFailure() {
given(mockKubernetesClient.configMaps()).willThrow(new KubernetesClientException("test exception"));
boolean result = repository.create(NAME, HOLDER, 1000);
assertThat(result).isFalse();
}
@Test
public void shouldDelete() {
repository.delete(NAME);
verify(mockWithNameResource).delete();
}
@Test
public void shouldDeleteExpired() {
given(mockData.get(EXPIRATION_KEY)).willReturn(String.valueOf(System.currentTimeMillis() - 1));
repository.deleteIfExpired(NAME);
verify(mockWithNameResource).delete();
}
@Test
public void shouldNotDeleteNonExpired() {
given(mockData.get(EXPIRATION_KEY)).willReturn(String.valueOf(System.currentTimeMillis() + 10000));
repository.deleteIfExpired(NAME);
verify(mockWithNameResource, times(0)).delete();
}
}