package com.ctrip.framework.apollo.biz.utils;
import com.google.common.collect.Sets;
import com.ctrip.framework.apollo.biz.MockBeanFactory;
import com.ctrip.framework.apollo.biz.entity.Namespace;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import static org.junit.Assert.assertEquals;
/**
* @author Jason Song(song_s@ctrip.com)
*/
public class ReleaseKeyGeneratorTest {
private static final Logger logger = LoggerFactory.getLogger(ReleaseKeyGeneratorTest.class);
@Test
public void testGenerateReleaseKey() throws Exception {
String someAppId = "someAppId";
String someCluster = "someCluster";
String someNamespace = "someNamespace";
String anotherAppId = "anotherAppId";
Namespace namespace = MockBeanFactory.mockNamespace(someAppId, someCluster, someNamespace);
Namespace anotherNamespace = MockBeanFactory.mockNamespace(anotherAppId, someCluster, someNamespace);
int generateTimes = 50000;
Set<String> releaseKeys = Sets.newConcurrentHashSet();
ExecutorService executorService = Executors.newFixedThreadPool(2);
CountDownLatch latch = new CountDownLatch(1);
executorService.submit(generateReleaseKeysTask(namespace, releaseKeys, generateTimes, latch));
executorService.submit(generateReleaseKeysTask(anotherNamespace, releaseKeys, generateTimes, latch));
latch.countDown();
executorService.shutdown();
executorService.awaitTermination(10, TimeUnit.SECONDS);
//make sure keys are unique
assertEquals(generateTimes * 2, releaseKeys.size());
}
private Runnable generateReleaseKeysTask(Namespace namespace, Set<String> releaseKeys,
int generateTimes, CountDownLatch latch) {
return () -> {
try {
latch.await();
} catch (InterruptedException e) {
//ignore
}
for (int i = 0; i < generateTimes; i++) {
releaseKeys.add(ReleaseKeyGenerator.generateReleaseKey(namespace));
}
};
}
}