package net.rubyeye.xmemcached.test.unittest;
import java.net.InetSocketAddress;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.rubyeye.xmemcached.GetsResponse;
import net.rubyeye.xmemcached.MemcachedClientBuilder;
import net.rubyeye.xmemcached.XMemcachedClientBuilder;
import net.rubyeye.xmemcached.command.BinaryCommandFactory;
import net.rubyeye.xmemcached.impl.KetamaMemcachedSessionLocator;
import net.rubyeye.xmemcached.transcoders.StringTranscoder;
import net.rubyeye.xmemcached.utils.AddrUtil;
import net.rubyeye.xmemcached.utils.ByteUtils;
import org.junit.Ignore;
import org.junit.Test;
/**
* 为了使Binary协议的测试通过,将检测key是否有非法字符,事实上binary协议无需检测的。
*
* @author boyan
*
*/
public class BinaryMemcachedClientUnitTest extends XMemcachedClientTest {
@Override
public MemcachedClientBuilder createBuilder() throws Exception {
MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil
.getAddresses(this.properties
.getProperty("test.memcached.servers")));
builder.setCommandFactory(new BinaryCommandFactory());
ByteUtils.testing = true;
return builder;
}
@Override
public MemcachedClientBuilder createWeightedBuilder() throws Exception {
List<InetSocketAddress> addressList = AddrUtil
.getAddresses(this.properties
.getProperty("test.memcached.servers"));
int[] weights = new int[addressList.size()];
for (int i = 0; i < weights.length; i++) {
weights[i] = i + 1;
}
MemcachedClientBuilder builder = new XMemcachedClientBuilder(
addressList, weights);
builder.setCommandFactory(new BinaryCommandFactory());
builder.setSessionLocator(new KetamaMemcachedSessionLocator());
ByteUtils.testing = true;
return builder;
}
@Override
@Test
public void testTouch() throws Exception {
if (this.isMemcached1_6()) {
assertNull(this.memcachedClient.get("name"));
this.memcachedClient.set("name", 1, "dennis", new StringTranscoder(),
1000);
assertEquals("dennis", this.memcachedClient.get("name",
new StringTranscoder()));
// touch expiration to three seconds
System.out.println(this.memcachedClient.touch("name", 3));
Thread.sleep(2000);
assertEquals("dennis", this.memcachedClient.get("name",
new StringTranscoder()));
Thread.sleep(1500);
assertNull(this.memcachedClient.get("name"));
}
}
@Test
public void testTouchNotExists() throws Exception {
if (this.isMemcached1_6()) {
assertNull(this.memcachedClient.get("name"));
assertFalse(this.memcachedClient.touch("name", 3));
}
}
@Test
public void testGetAndTouch_OneKey() throws Exception {
if (this.isMemcached1_6()) {
assertNull(this.memcachedClient.get("name"));
this.memcachedClient.set("name", 1, "dennis", new StringTranscoder(),
1000);
assertEquals("dennis", this.memcachedClient.getAndTouch("name", 3));
Thread.sleep(2000);
assertEquals("dennis", this.memcachedClient.get("name",
new StringTranscoder()));
Thread.sleep(1500);
assertNull(this.memcachedClient.get("name"));
}
}
private boolean isMemcached1_6() throws Exception {
Map<InetSocketAddress, String> versions = this.memcachedClient
.getVersions();
for (String v : versions.values()) {
if (!v.startsWith("1.6")) {
return false;
}
}
return true;
}
@Test
public void testGetAndTouch_NotExistsKey() throws Exception {
if (this.isMemcached1_6()) {
assertNull(this.memcachedClient.get("name"));
assertNull(this.memcachedClient.getAndTouch("name", 3));
assertNull(this.memcachedClient.getAndTouch("name", 3));
assertNull(this.memcachedClient.get("name"));
}
}
@Test
public void testDeleteWithCAS()throws Exception{
this.memcachedClient.set("a", 0, 1);
GetsResponse<Integer> gets = this.memcachedClient.gets("a");
this.memcachedClient.set("a", 0, 2);
assertFalse(this.memcachedClient.delete("a", gets.getCas(), 1000));
assertEquals(2, this.memcachedClient.get("a"));
gets = this.memcachedClient.gets("a");
assertTrue(this.memcachedClient.delete("a", gets.getCas(), 1000));
assertNull(this.memcachedClient.get("a"));
}
@Test
@Ignore
public void testBulkGetAndTouch() throws Exception {
int count = 100;
Map<String, Integer> keys = new HashMap<String, Integer>();
int exp = 3;
for (int i = 0; i < count; i++) {
String key = String.valueOf(i);
keys.put(key, exp);
assertNull(this.memcachedClient.get(key));
}
for (int i = 0; i < count; i++) {
this.memcachedClient.set(String.valueOf(i), i, i);
}
// Map<String, Integer> result = this.memcachedClient.getAndTouch(keys,
// 5000L);
// for (Map.Entry<String, Integer> entry : result.entrySet()) {
// assertEquals(entry.getKey(), String.valueOf(entry.getValue()));
// }
Thread.sleep(3500);
// assertTrue(this.memcachedClient.getAndTouch(keys, 5000L).isEmpty());
}
}