package com.ctrip.framework.apollo.adminservice.controller;
import com.google.common.base.Joiner;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.ctrip.framework.apollo.biz.entity.Instance;
import com.ctrip.framework.apollo.biz.entity.InstanceConfig;
import com.ctrip.framework.apollo.biz.entity.Release;
import com.ctrip.framework.apollo.biz.service.InstanceService;
import com.ctrip.framework.apollo.biz.service.ReleaseService;
import com.ctrip.framework.apollo.common.dto.InstanceDTO;
import com.ctrip.framework.apollo.common.dto.PageDTO;
import com.ctrip.framework.apollo.common.exception.NotFoundException;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.test.util.ReflectionTestUtils;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Set;
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
/**
* @author Jason Song(song_s@ctrip.com)
*/
@RunWith(MockitoJUnitRunner.class)
public class InstanceConfigControllerTest {
private InstanceConfigController instanceConfigController;
@Mock
private ReleaseService releaseService;
@Mock
private InstanceService instanceService;
@Mock
private Pageable pageable;
@Before
public void setUp() throws Exception {
instanceConfigController = new InstanceConfigController();
ReflectionTestUtils.setField(instanceConfigController, "releaseService", releaseService);
ReflectionTestUtils.setField(instanceConfigController, "instanceService", instanceService);
}
@Test
public void getByRelease() throws Exception {
long someReleaseId = 1;
long someInstanceId = 1;
long anotherInstanceId = 2;
String someReleaseKey = "someKey";
Release someRelease = new Release();
someRelease.setReleaseKey(someReleaseKey);
String someAppId = "someAppId";
String anotherAppId = "anotherAppId";
String someCluster = "someCluster";
String someDataCenter = "someDC";
String someConfigAppId = "someConfigAppId";
String someConfigNamespace = "someNamespace";
String someIp = "someIp";
Date someReleaseDeliveryTime = new Date();
Date anotherReleaseDeliveryTime = new Date();
when(releaseService.findOne(someReleaseId)).thenReturn(someRelease);
InstanceConfig someInstanceConfig = assembleInstanceConfig(someInstanceId, someConfigAppId,
someConfigNamespace, someReleaseKey, someReleaseDeliveryTime);
InstanceConfig anotherInstanceConfig = assembleInstanceConfig(anotherInstanceId,
someConfigAppId, someConfigNamespace, someReleaseKey, anotherReleaseDeliveryTime);
List<InstanceConfig> instanceConfigs = Lists.newArrayList(someInstanceConfig,
anotherInstanceConfig);
Page<InstanceConfig> instanceConfigPage = new PageImpl<>(instanceConfigs, pageable,
instanceConfigs.size());
when(instanceService.findActiveInstanceConfigsByReleaseKey(someReleaseKey, pageable))
.thenReturn(instanceConfigPage);
Instance someInstance = assembleInstance(someInstanceId, someAppId,
someCluster, someDataCenter, someIp);
Instance anotherInstance = assembleInstance(anotherInstanceId, anotherAppId,
someCluster, someDataCenter, someIp);
List<Instance> instances = Lists.newArrayList(someInstance, anotherInstance);
Set<Long> instanceIds = Sets.newHashSet(someInstanceId, anotherInstanceId);
when(instanceService.findInstancesByIds(instanceIds))
.thenReturn(instances);
PageDTO<InstanceDTO> result = instanceConfigController.getByRelease(someReleaseId, pageable);
assertEquals(2, result.getContent().size());
InstanceDTO someInstanceDto = null;
InstanceDTO anotherInstanceDto = null;
for (InstanceDTO instanceDTO : result.getContent()) {
if (instanceDTO.getId() == someInstanceId) {
someInstanceDto = instanceDTO;
} else if (instanceDTO.getId() == anotherInstanceId) {
anotherInstanceDto = instanceDTO;
}
}
verifyInstance(someInstance, someInstanceDto);
verifyInstance(anotherInstance, anotherInstanceDto);
assertEquals(1, someInstanceDto.getConfigs().size());
assertEquals(someReleaseDeliveryTime, someInstanceDto.getConfigs().get(0).getReleaseDeliveryTime());
assertEquals(1, anotherInstanceDto.getConfigs().size());
assertEquals(anotherReleaseDeliveryTime, anotherInstanceDto.getConfigs().get(0).getReleaseDeliveryTime());
}
@Test(expected = NotFoundException.class)
public void testGetByReleaseWhenReleaseIsNotFound() throws Exception {
long someReleaseIdNotExists = 1;
when(releaseService.findOne(someReleaseIdNotExists)).thenReturn(null);
instanceConfigController.getByRelease(someReleaseIdNotExists, pageable);
}
@Test
public void testGetByReleasesNotIn() throws Exception {
String someConfigAppId = "someConfigAppId";
String someConfigClusterName = "someConfigClusterName";
String someConfigNamespaceName = "someConfigNamespaceName";
long someReleaseId = 1;
long anotherReleaseId = 2;
String releaseIds = Joiner.on(",").join(someReleaseId, anotherReleaseId);
Date someReleaseDeliveryTime = new Date();
Date anotherReleaseDeliveryTime = new Date();
Release someRelease = mock(Release.class);
Release anotherRelease = mock(Release.class);
String someReleaseKey = "someReleaseKey";
String anotherReleaseKey = "anotherReleaseKey";
when(someRelease.getReleaseKey()).thenReturn(someReleaseKey);
when(anotherRelease.getReleaseKey()).thenReturn(anotherReleaseKey);
when(releaseService.findByReleaseIds(Sets.newHashSet(someReleaseId, anotherReleaseId)))
.thenReturn(Lists.newArrayList(someRelease, anotherRelease));
long someInstanceId = 1;
long anotherInstanceId = 2;
String someInstanceConfigReleaseKey = "someInstanceConfigReleaseKey";
String anotherInstanceConfigReleaseKey = "anotherInstanceConfigReleaseKey";
InstanceConfig someInstanceConfig = mock(InstanceConfig.class);
InstanceConfig anotherInstanceConfig = mock(InstanceConfig.class);
when(someInstanceConfig.getInstanceId()).thenReturn(someInstanceId);
when(anotherInstanceConfig.getInstanceId()).thenReturn(anotherInstanceId);
when(someInstanceConfig.getReleaseKey()).thenReturn(someInstanceConfigReleaseKey);
when(anotherInstanceConfig.getReleaseKey()).thenReturn(anotherInstanceConfigReleaseKey);
when(someInstanceConfig.getReleaseDeliveryTime()).thenReturn(someReleaseDeliveryTime);
when(anotherInstanceConfig.getReleaseDeliveryTime()).thenReturn(anotherReleaseDeliveryTime);
when(instanceService.findInstanceConfigsByNamespaceWithReleaseKeysNotIn(someConfigAppId,
someConfigClusterName, someConfigNamespaceName, Sets.newHashSet(someReleaseKey,
anotherReleaseKey))).thenReturn(Lists.newArrayList(someInstanceConfig,
anotherInstanceConfig));
String someInstanceAppId = "someInstanceAppId";
String someInstanceClusterName = "someInstanceClusterName";
String someInstanceNamespaceName = "someInstanceNamespaceName";
String someIp = "someIp";
String anotherIp = "anotherIp";
Instance someInstance = assembleInstance(someInstanceId, someInstanceAppId,
someInstanceClusterName,
someInstanceNamespaceName, someIp);
Instance anotherInstance = assembleInstance(anotherInstanceId, someInstanceAppId,
someInstanceClusterName,
someInstanceNamespaceName, anotherIp);
when(instanceService.findInstancesByIds(Sets.newHashSet(someInstanceId, anotherInstanceId)))
.thenReturn(Lists.newArrayList(someInstance, anotherInstance));
Release someInstanceConfigRelease = new Release();
someInstanceConfigRelease.setReleaseKey(someInstanceConfigReleaseKey);
Release anotherInstanceConfigRelease = new Release();
anotherInstanceConfigRelease.setReleaseKey(anotherInstanceConfigReleaseKey);
when(releaseService.findByReleaseKeys(Sets.newHashSet(someInstanceConfigReleaseKey,
anotherInstanceConfigReleaseKey))).thenReturn(Lists.newArrayList(someInstanceConfigRelease,
anotherInstanceConfigRelease));
List<InstanceDTO> result = instanceConfigController.getByReleasesNotIn(someConfigAppId,
someConfigClusterName, someConfigNamespaceName, releaseIds);
assertEquals(2, result.size());
InstanceDTO someInstanceDto = null;
InstanceDTO anotherInstanceDto = null;
for (InstanceDTO instanceDTO : result) {
if (instanceDTO.getId() == someInstanceId) {
someInstanceDto = instanceDTO;
} else if (instanceDTO.getId() == anotherInstanceId) {
anotherInstanceDto = instanceDTO;
}
}
verifyInstance(someInstance, someInstanceDto);
verifyInstance(anotherInstance, anotherInstanceDto);
assertEquals(someInstanceConfigReleaseKey, someInstanceDto.getConfigs().get(0).getRelease()
.getReleaseKey());
assertEquals(anotherInstanceConfigReleaseKey, anotherInstanceDto.getConfigs().get(0)
.getRelease()
.getReleaseKey());
assertEquals(someReleaseDeliveryTime, someInstanceDto.getConfigs().get(0).getReleaseDeliveryTime());
assertEquals(anotherReleaseDeliveryTime, anotherInstanceDto.getConfigs().get(0)
.getReleaseDeliveryTime());
}
@Test
public void testGetInstancesByNamespace() throws Exception {
String someAppId = "someAppId";
String someClusterName = "someClusterName";
String someNamespaceName = "someNamespaceName";
String someIp = "someIp";
long someInstanceId = 1;
long anotherInstanceId = 2;
Pageable pageable = mock(Pageable.class);
Instance someInstance = assembleInstance(someInstanceId, someAppId, someClusterName,
someNamespaceName, someIp);
Instance anotherInstance = assembleInstance(anotherInstanceId, someAppId, someClusterName,
someNamespaceName, someIp);
Page<Instance> instances = new PageImpl<>(Lists.newArrayList(someInstance, anotherInstance),
pageable, 2);
when(instanceService.findInstancesByNamespace(someAppId, someClusterName, someNamespaceName,
pageable)).thenReturn(instances);
PageDTO<InstanceDTO> result = instanceConfigController.getInstancesByNamespace(someAppId,
someClusterName, someNamespaceName, null, pageable);
assertEquals(2, result.getContent().size());
InstanceDTO someInstanceDto = null;
InstanceDTO anotherInstanceDto = null;
for (InstanceDTO instanceDTO : result.getContent()) {
if (instanceDTO.getId() == someInstanceId) {
someInstanceDto = instanceDTO;
} else if (instanceDTO.getId() == anotherInstanceId) {
anotherInstanceDto = instanceDTO;
}
}
verifyInstance(someInstance, someInstanceDto);
verifyInstance(anotherInstance, anotherInstanceDto);
}
@Test
public void testGetInstancesByNamespaceAndInstanceAppId() throws Exception {
String someInstanceAppId = "someInstanceAppId";
String someAppId = "someAppId";
String someClusterName = "someClusterName";
String someNamespaceName = "someNamespaceName";
String someIp = "someIp";
long someInstanceId = 1;
long anotherInstanceId = 2;
Pageable pageable = mock(Pageable.class);
Instance someInstance = assembleInstance(someInstanceId, someAppId, someClusterName,
someNamespaceName, someIp);
Instance anotherInstance = assembleInstance(anotherInstanceId, someAppId, someClusterName,
someNamespaceName, someIp);
Page<Instance> instances = new PageImpl<>(Lists.newArrayList(someInstance, anotherInstance),
pageable, 2);
when(instanceService.findInstancesByNamespaceAndInstanceAppId(someInstanceAppId, someAppId,
someClusterName, someNamespaceName, pageable)).thenReturn(instances);
PageDTO<InstanceDTO> result = instanceConfigController.getInstancesByNamespace(someAppId,
someClusterName, someNamespaceName, someInstanceAppId, pageable);
assertEquals(2, result.getContent().size());
InstanceDTO someInstanceDto = null;
InstanceDTO anotherInstanceDto = null;
for (InstanceDTO instanceDTO : result.getContent()) {
if (instanceDTO.getId() == someInstanceId) {
someInstanceDto = instanceDTO;
} else if (instanceDTO.getId() == anotherInstanceId) {
anotherInstanceDto = instanceDTO;
}
}
verifyInstance(someInstance, someInstanceDto);
verifyInstance(anotherInstance, anotherInstanceDto);
}
@Test
public void testGetInstancesCountByNamespace() throws Exception {
String someAppId = "someAppId";
String someClusterName = "someClusterName";
String someNamespaceName = "someNamespaceName";
Page<Instance> instances = new PageImpl<>(Collections.emptyList(), pageable, 2);
when(instanceService.findInstancesByNamespace(eq(someAppId), eq(someClusterName),
eq(someNamespaceName), any(Pageable.class))).thenReturn(instances);
long result = instanceConfigController.getInstancesCountByNamespace(someAppId,
someClusterName, someNamespaceName);
assertEquals(2, result);
}
private void verifyInstance(Instance instance, InstanceDTO instanceDTO) {
assertEquals(instance.getId(), instanceDTO.getId());
assertEquals(instance.getAppId(), instanceDTO.getAppId());
assertEquals(instance.getClusterName(), instanceDTO.getClusterName());
assertEquals(instance.getDataCenter(), instanceDTO.getDataCenter());
assertEquals(instance.getIp(), instanceDTO.getIp());
assertEquals(instance.getDataChangeCreatedTime(), instanceDTO.getDataChangeCreatedTime());
}
private Instance assembleInstance(long instanceId, String appId, String clusterName, String
dataCenter, String ip) {
Instance instance = new Instance();
instance.setId(instanceId);
instance.setAppId(appId);
instance.setIp(ip);
instance.setClusterName(clusterName);
instance.setDataCenter(dataCenter);
instance.setDataChangeCreatedTime(new Date());
return instance;
}
private InstanceConfig assembleInstanceConfig(long instanceId, String configAppId, String
configNamespaceName, String releaseKey, Date releaseDeliveryTime) {
InstanceConfig instanceConfig = new InstanceConfig();
instanceConfig.setInstanceId(instanceId);
instanceConfig.setConfigAppId(configAppId);
instanceConfig.setConfigNamespaceName(configNamespaceName);
instanceConfig.setReleaseKey(releaseKey);
instanceConfig.setDataChangeLastModifiedTime(new Date());
instanceConfig.setReleaseDeliveryTime(releaseDeliveryTime);
return instanceConfig;
}
}