package com.ctrip.framework.apollo.configservice.util;
import com.google.common.base.Joiner;
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
import com.google.common.collect.Sets;
import com.ctrip.framework.apollo.configservice.service.AppNamespaceServiceWithCache;
import com.ctrip.framework.apollo.common.entity.AppNamespace;
import com.ctrip.framework.apollo.core.ConfigConsts;
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.test.util.ReflectionTestUtils;
import java.util.Collection;
import java.util.Set;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.when;
/**
* @author Jason Song(song_s@ctrip.com)
*/
@RunWith(MockitoJUnitRunner.class)
public class WatchKeysUtilTest {
@Mock
private AppNamespaceServiceWithCache appNamespaceService;
@Mock
private AppNamespace someAppNamespace;
@Mock
private AppNamespace anotherAppNamespace;
@Mock
private AppNamespace somePublicAppNamespace;
private WatchKeysUtil watchKeysUtil;
private String someAppId;
private String someCluster;
private String someNamespace;
private String anotherNamespace;
private String somePublicNamespace;
private String defaultCluster;
private String someDC;
private String somePublicAppId;
@Before
public void setUp() throws Exception {
watchKeysUtil = new WatchKeysUtil();
someAppId = "someId";
someCluster = "someCluster";
someNamespace = "someName";
anotherNamespace = "anotherName";
somePublicNamespace = "somePublicName";
defaultCluster = ConfigConsts.CLUSTER_NAME_DEFAULT;
someDC = "someDC";
somePublicAppId = "somePublicId";
when(someAppNamespace.getName()).thenReturn(someNamespace);
when(anotherAppNamespace.getName()).thenReturn(anotherNamespace);
when(appNamespaceService.findByAppIdAndNamespaces(someAppId, Sets.newHashSet(someNamespace)))
.thenReturn(Lists.newArrayList(someAppNamespace));
when(appNamespaceService
.findByAppIdAndNamespaces(someAppId, Sets.newHashSet(someNamespace, anotherNamespace)))
.thenReturn(Lists.newArrayList(someAppNamespace, anotherAppNamespace));
when(appNamespaceService
.findByAppIdAndNamespaces(someAppId,
Sets.newHashSet(someNamespace, anotherNamespace, somePublicNamespace)))
.thenReturn(Lists.newArrayList(someAppNamespace, anotherAppNamespace));
when(somePublicAppNamespace.getAppId()).thenReturn(somePublicAppId);
when(somePublicAppNamespace.getName()).thenReturn(somePublicNamespace);
when(appNamespaceService.findPublicNamespacesByNames(Sets.newHashSet(somePublicNamespace)))
.thenReturn(Lists.newArrayList(somePublicAppNamespace));
when(appNamespaceService.findPublicNamespacesByNames(Sets.newHashSet(someNamespace, somePublicNamespace)))
.thenReturn(Lists.newArrayList(somePublicAppNamespace));
ReflectionTestUtils.setField(watchKeysUtil, "appNamespaceService", appNamespaceService);
}
@Test
public void testAssembleAllWatchKeysWithOneNamespaceAndDefaultCluster() throws Exception {
Set<String> watchKeys =
watchKeysUtil.assembleAllWatchKeys(someAppId, defaultCluster, someNamespace, null);
Set<String> clusters = Sets.newHashSet(defaultCluster);
assertEquals(clusters.size(), watchKeys.size());
assertWatchKeys(someAppId, clusters, someNamespace, watchKeys);
}
@Test
public void testAssembleAllWatchKeysWithOneNamespaceAndSomeDC() throws Exception {
Set<String> watchKeys =
watchKeysUtil.assembleAllWatchKeys(someAppId, someDC, someNamespace, someDC);
Set<String> clusters = Sets.newHashSet(defaultCluster, someDC);
assertEquals(clusters.size(), watchKeys.size());
assertWatchKeys(someAppId, clusters, someNamespace, watchKeys);
}
@Test
public void testAssembleAllWatchKeysWithOneNamespaceAndSomeDCAndSomeCluster() throws Exception {
Set<String> watchKeys =
watchKeysUtil.assembleAllWatchKeys(someAppId, someCluster, someNamespace, someDC);
Set<String> clusters = Sets.newHashSet(defaultCluster, someCluster, someDC);
assertEquals(clusters.size(), watchKeys.size());
assertWatchKeys(someAppId, clusters, someNamespace, watchKeys);
}
@Test
public void testAssembleAllWatchKeysWithMultipleNamespaces() throws Exception {
Multimap<String, String> watchKeysMap =
watchKeysUtil.assembleAllWatchKeys(someAppId, someCluster,
Sets.newHashSet(someNamespace, anotherNamespace), someDC);
Set<String> clusters = Sets.newHashSet(defaultCluster, someCluster, someDC);
assertEquals(clusters.size() * 2, watchKeysMap.size());
assertWatchKeys(someAppId, clusters, someNamespace, watchKeysMap.get(someNamespace));
assertWatchKeys(someAppId, clusters, anotherNamespace, watchKeysMap.get(anotherNamespace));
}
@Test
public void testAssembleAllWatchKeysWithPrivateAndPublicNamespaces() throws Exception {
Multimap<String, String> watchKeysMap =
watchKeysUtil.assembleAllWatchKeys(someAppId, someCluster,
Sets.newHashSet(someNamespace, anotherNamespace, somePublicNamespace), someDC);
Set<String> clusters = Sets.newHashSet(defaultCluster, someCluster, someDC);
assertEquals(clusters.size() * 4, watchKeysMap.size());
assertWatchKeys(someAppId, clusters, someNamespace, watchKeysMap.get(someNamespace));
assertWatchKeys(someAppId, clusters, anotherNamespace, watchKeysMap.get(anotherNamespace));
assertWatchKeys(someAppId, clusters, somePublicNamespace, watchKeysMap.get(somePublicNamespace));
assertWatchKeys(somePublicAppId, clusters, somePublicNamespace, watchKeysMap.get(somePublicNamespace));
}
@Test
public void testAssembleWatchKeysForNoAppIdPlaceHolder() throws Exception {
Multimap<String, String> watchKeysMap =
watchKeysUtil.assembleAllWatchKeys(ConfigConsts.NO_APPID_PLACEHOLDER, someCluster,
Sets.newHashSet(someNamespace, anotherNamespace), someDC);
assertTrue(watchKeysMap.isEmpty());
}
@Test
public void testAssembleWatchKeysForNoAppIdPlaceHolderAndPublicNamespace() throws Exception {
Multimap<String, String> watchKeysMap =
watchKeysUtil.assembleAllWatchKeys(ConfigConsts.NO_APPID_PLACEHOLDER, someCluster,
Sets.newHashSet(someNamespace, somePublicNamespace), someDC);
Set<String> clusters = Sets.newHashSet(defaultCluster, someCluster, someDC);
assertEquals(clusters.size(), watchKeysMap.size());
assertWatchKeys(somePublicAppId, clusters, somePublicNamespace, watchKeysMap.get(somePublicNamespace));
}
private void assertWatchKeys(String appId, Set<String> clusters, String namespaceName,
Collection<String> watchedKeys) {
for (String cluster : clusters) {
String key =
Joiner.on(ConfigConsts.CLUSTER_NAMESPACE_SEPARATOR)
.join(appId, cluster, namespaceName);
assertTrue(watchedKeys.contains(key));
}
}
}