package org.infinispan.server.memcached.test;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.Collections;
import java.util.concurrent.atomic.AtomicInteger;
import org.infinispan.Cache;
import org.infinispan.commons.logging.LogFactory;
import org.infinispan.manager.EmbeddedCacheManager;
import org.infinispan.server.memcached.MemcachedDecoder;
import org.infinispan.server.memcached.MemcachedServer;
import org.infinispan.server.memcached.configuration.MemcachedServerConfigurationBuilder;
import org.infinispan.server.memcached.logging.JavaLog;
import org.infinispan.test.fwk.TestResourceTracker;
import io.netty.channel.ChannelInboundHandler;
import net.spy.memcached.DefaultConnectionFactory;
import net.spy.memcached.MemcachedClient;
/**
* Utils for Memcached tests.
*
* @author Galder ZamarreƱo
* @since 4.1
*/
public class MemcachedTestingUtil {
private static final JavaLog log = LogFactory.getLog(MemcachedTestingUtil.class, JavaLog.class);
private static final String host = "127.0.0.1";
public static MemcachedClient createMemcachedClient(long timeout, int port) throws IOException {
DefaultConnectionFactory d = new DefaultConnectionFactory() {
@Override
public long getOperationTimeout() {
return timeout;
}
};
return new MemcachedClient(d, Collections.singletonList(new InetSocketAddress(host, port)));
}
public static MemcachedServer startMemcachedTextServer(EmbeddedCacheManager cacheManager) {
return startMemcachedTextServer(cacheManager, UniquePortThreadLocal.INSTANCE.get());
}
public static MemcachedServer startMemcachedTextServer(EmbeddedCacheManager cacheManager, int port) {
MemcachedServer server = new MemcachedServer();
String serverName = TestResourceTracker.getCurrentTestShortName();
server.start(new MemcachedServerConfigurationBuilder().name(serverName).host(host).port(port).build(),
cacheManager);
return server;
}
public static MemcachedServer startMemcachedTextServer(EmbeddedCacheManager cacheManager, String cacheName) {
return startMemcachedTextServer(cacheManager, UniquePortThreadLocal.INSTANCE.get(), cacheName);
}
public static MemcachedServer startMemcachedTextServer(EmbeddedCacheManager cacheManager, int port, String cacheName) {
MemcachedServer server = new MemcachedServer() {
@Override
public ChannelInboundHandler getDecoder() {
Cache<String, byte[]> cache = getCacheManager().getCache(cacheName);
return new MemcachedDecoder(cache.getAdvancedCache(), scheduler, transport, s -> false);
}
@Override
protected void startDefaultCache() {
getCacheManager().getCache(cacheName);
}
};
String serverName = TestResourceTracker.getCurrentTestShortName();
server.start(new MemcachedServerConfigurationBuilder().name(serverName).host(host).port(port).build(),
cacheManager);
return server;
}
public static void killMemcachedClient(MemcachedClient client) {
try {
if (client != null) client.shutdown();
}
catch (Throwable t) {
log.error("Error stopping client", t);
}
}
public static void killMemcachedServer(MemcachedServer server) {
if (server != null) server.stop();
}
}
class UniquePortThreadLocal extends ThreadLocal<Integer> {
private UniquePortThreadLocal() { }
static UniquePortThreadLocal INSTANCE = new UniquePortThreadLocal();
private static final AtomicInteger uniqueAddr = new AtomicInteger(16211);
@Override
protected Integer initialValue() {
return uniqueAddr.getAndAdd(100);
}
}