package org.infinispan.server.memcached;
import static org.infinispan.server.memcached.test.MemcachedTestingUtil.startMemcachedTextServer;
import static org.infinispan.test.TestingUtil.generateRandomString;
import static org.infinispan.test.TestingUtil.k;
import static org.infinispan.test.TestingUtil.sleepThread;
import static org.infinispan.test.TestingUtil.v;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertFalse;
import static org.testng.AssertJUnit.assertNull;
import static org.testng.AssertJUnit.assertTrue;
import static org.testng.AssertJUnit.fail;
import java.io.IOException;
import java.lang.reflect.Method;
import java.math.BigInteger;
import java.net.SocketAddress;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import org.infinispan.Cache;
import org.infinispan.Version;
import org.infinispan.commons.logging.LogFactory;
import org.infinispan.configuration.cache.Configuration;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.manager.EmbeddedCacheManager;
import org.infinispan.notifications.Listener;
import org.infinispan.notifications.cachelistener.annotation.CacheEntryRemoved;
import org.infinispan.notifications.cachelistener.event.CacheEntryRemovedEvent;
import org.infinispan.server.memcached.configuration.MemcachedServerConfigurationBuilder;
import org.infinispan.server.memcached.logging.JavaLog;
import org.infinispan.test.fwk.TestCacheManagerFactory;
import org.testng.annotations.Test;
import net.spy.memcached.CASResponse;
import net.spy.memcached.CASValue;
import net.spy.memcached.internal.OperationFuture;
/**
* Tests Memcached protocol functionality against Infinispan Memcached server.
*
* @author Galder ZamarreƱo
* @since 4.1
*/
@Test(groups = "functional", testName = "server.memcached.MemcachedFunctionalTest")
public class MemcachedFunctionalTest extends MemcachedSingleNodeTest {
public void testSetBasic(Method m) throws InterruptedException, ExecutionException, TimeoutException {
OperationFuture<Boolean> f = client.set(k(m), 0, v(m));
assertTrue(f.get(timeout, TimeUnit.SECONDS));
assertEquals(client.get(k(m)), v(m));
}
public void testSetWithExpirySeconds(Method m) throws InterruptedException, ExecutionException, TimeoutException {
OperationFuture<Boolean> f = client.set(k(m), 1, v(m));
assertTrue(f.get(timeout, TimeUnit.SECONDS));
sleepThread(1100);
assertNull(client.get(k(m)));
}
public void testSetWithExpiryUnixTime(Method m) throws InterruptedException, ExecutionException, TimeoutException {
int future = (int) TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() + 1000);
OperationFuture<Boolean> f = client.set(k(m), future, v(m));
assertTrue(f.get(timeout, TimeUnit.SECONDS));
sleepThread(1100);
assertNull(client.get(k(m)));
}
public void testSetWithExpiryUnixTimeInPast(Method m) throws InterruptedException, ExecutionException, TimeoutException {
OperationFuture<Boolean> f = client.set(k(m), 60*60*24*30 + 1, v(m));
assertTrue(f.get(timeout, TimeUnit.SECONDS));
sleepThread(1100);
assertNull(client.get(k(m)));
}
public void testGetMultipleKeys(Method m) throws InterruptedException, ExecutionException, TimeoutException {
OperationFuture<Boolean> f1 = client.set(k(m, "k1-"), 0, v(m, "v1-"));
OperationFuture<Boolean> f2 = client.set(k(m, "k2-"), 0, v(m, "v2-"));
OperationFuture<Boolean> f3 = client.set(k(m, "k3-"), 0, v(m, "v3-"));
assertTrue(f1.get(timeout, TimeUnit.SECONDS));
assertTrue(f2.get(timeout, TimeUnit.SECONDS));
assertTrue(f3.get(timeout, TimeUnit.SECONDS));
List<String> keys = Arrays.asList(k(m, "k1-"), k(m, "k2-"), k(m, "k3-"));
Map<String, Object> ret = client.getBulk(keys);
assertEquals(ret.get(k(m, "k1-")), v(m, "v1-"));
assertEquals(ret.get(k(m, "k2-")), v(m, "v2-"));
assertEquals(ret.get(k(m, "k3-")), v(m, "v3-"));
}
public void testAddBasic(Method m) throws InterruptedException, ExecutionException, TimeoutException {
addAndGet(m);
}
public void testAddWithExpirySeconds(Method m) throws InterruptedException, ExecutionException, TimeoutException {
OperationFuture<Boolean> f = client.add(k(m), 1, v(m));
assertTrue(f.get(timeout, TimeUnit.SECONDS));
sleepThread(1100);
assertNull(client.get(k(m)));
f = client.add(k(m), 0, v(m, "v1-"));
assertTrue(f.get(timeout, TimeUnit.SECONDS));
assertEquals(client.get(k(m)), v(m, "v1-"));
}
public void testAddWithExpiryUnixTime(Method m) throws InterruptedException, ExecutionException, TimeoutException {
int future = (int) TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() + 1000);
OperationFuture<Boolean> f = client.add(k(m), future, v(m));
assertTrue(f.get(timeout, TimeUnit.SECONDS));
sleepThread(1100);
assertNull(client.get(k(m)));
f = client.add(k(m), 0, v(m, "v1-"));
assertTrue(f.get(timeout, TimeUnit.SECONDS));
assertEquals(client.get(k(m)), v(m, "v1-"));
}
public void testNotAddIfPresent(Method m) throws InterruptedException, ExecutionException, TimeoutException {
addAndGet(m);
OperationFuture<Boolean> f = client.add(k(m), 0, v(m, "v1-"));
assertFalse(f.get(timeout, TimeUnit.SECONDS));
assertEquals(client.get(k(m)), v(m));
}
public void testReplaceBasic(Method m) throws InterruptedException, ExecutionException, TimeoutException {
addAndGet(m);
OperationFuture<Boolean> f = client.replace(k(m), 0, v(m, "v1-"));
assertTrue(f.get(timeout, TimeUnit.SECONDS));
assertEquals(client.get(k(m)), v(m, "v1-"));
}
public void testNotReplaceIfNotPresent(Method m) throws InterruptedException, ExecutionException, TimeoutException {
OperationFuture<Boolean> f = client.replace(k(m), 0, v(m));
assertFalse(f.get(timeout, TimeUnit.SECONDS));
assertNull(client.get(k(m)));
}
public void testReplaceWithExpirySeconds(Method m) throws InterruptedException, ExecutionException, TimeoutException {
addAndGet(m);
OperationFuture<Boolean> f = client.replace(k(m), 1, v(m, "v1-"));
assertTrue(f.get(timeout, TimeUnit.SECONDS));
assertEquals(client.get(k(m)), v(m, "v1-"));
sleepThread(1100);
assertNull(client.get(k(m)));
}
public void testReplaceWithExpiryUnixTime(Method m) throws InterruptedException, ExecutionException, TimeoutException {
addAndGet(m);
int future = (int) TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() + 1000);
OperationFuture<Boolean> f = client.replace(k(m), future, v(m, "v1-"));
assertTrue(f.get(timeout, TimeUnit.SECONDS));
assertEquals(client.get(k(m)), v(m, "v1-"));
sleepThread(1100);
assertNull(client.get(k(m)));
}
public void testAppendBasic(Method m) throws InterruptedException, ExecutionException, TimeoutException {
addAndGet(m);
OperationFuture<Boolean> f = client.append(0, k(m), v(m, "v1-"));
assertTrue(f.get(timeout, TimeUnit.SECONDS));
String expected = v(m) + v(m, "v1-");
assertEquals(client.get(k(m)), expected);
}
public void testAppendNotFound(Method m) throws InterruptedException, ExecutionException, TimeoutException {
addAndGet(m);
OperationFuture<Boolean> f = client.append(0, k(m, "k2-"), v(m, "v1-"));
assertFalse(f.get(timeout, TimeUnit.SECONDS));
assertEquals(client.get(k(m)), v(m));
assertNull(client.get(k(m, "k2-")));
}
public void testPrependBasic(Method m) throws InterruptedException, ExecutionException, TimeoutException {
addAndGet(m);
OperationFuture<Boolean> f = client.prepend(0, k(m), v(m, "v1-"));
assertTrue(f.get(timeout, TimeUnit.SECONDS));
String expected = v(m, "v1-") + v(m);
assertEquals(client.get(k(m)), expected);
}
public void testPrependNotFound(Method m) throws InterruptedException, ExecutionException, TimeoutException {
addAndGet(m);
OperationFuture<Boolean> f = client.prepend(0, k(m, "k2-"), v(m, "v1-"));
assertFalse(f.get(timeout, TimeUnit.SECONDS));
assertEquals(client.get(k(m)), v(m));
assertNull(client.get(k(m, "k2-")));
}
public void testGetsBasic(Method m) throws InterruptedException, ExecutionException, TimeoutException {
addAndGet(m);
CASValue value = client.gets(k(m));
assertEquals(value.getValue(), v(m));
assertTrue(value.getCas() != 0);
}
public void testCasBasic(Method m) throws InterruptedException, ExecutionException, TimeoutException {
addAndGet(m);
CASValue value = client.gets(k(m));
assertEquals(value.getValue(), v(m));
assertTrue(value.getCas() != 0);
CASResponse resp = client.cas(k(m), value.getCas(), v(m, "v1-"));
assertEquals(resp, CASResponse.OK);
}
public void testCasNotFound(Method m) throws InterruptedException, ExecutionException, TimeoutException {
addAndGet(m);
CASValue value = client.gets(k(m));
assertEquals(value.getValue(), v(m));
assertTrue(value.getCas() != 0);
CASResponse resp = client.cas(k(m, "k1-"), value.getCas(), v(m, "v1-"));
assertEquals(resp, CASResponse.NOT_FOUND);
}
public void testCasExists(Method m) throws InterruptedException, ExecutionException, TimeoutException {
addAndGet(m);
CASValue value = client.gets(k(m));
assertEquals(value.getValue(), v(m));
assertTrue(value.getCas() != 0);
long old = value.getCas();
CASResponse resp = client.cas(k(m), value.getCas(), v(m, "v1-"));
value = client.gets(k(m));
assertEquals(value.getValue(), v(m, "v1-"));
assertTrue(value.getCas() != 0);
assertTrue(value.getCas() != old);
resp = client.cas(k(m), old, v(m, "v2-"));
assertEquals(resp, CASResponse.EXISTS);
resp = client.cas(k(m), value.getCas(), v(m, "v2-"));
assertEquals(resp, CASResponse.OK);
}
public void testInvalidCas() throws IOException {
String resp = send("cas bad blah 0 0 0\r\n\r\n");
assertClientError(resp);
resp = send("cas bad 0 blah 0 0\r\n\r\n");
assertClientError(resp);
resp = send("cas bad 0 0 blah 0\r\n\r\n");
assertClientError(resp);
resp = send("cas bad 0 0 0 blah\r\n\r\n");
assertClientError(resp);
}
public void testInvalidCasValue() throws IOException {
String resp = send("cas foo 0 0 6 \r\nbarva2\r\n");
assertClientError(resp);
}
public void testDeleteBasic(Method m) throws InterruptedException, ExecutionException, TimeoutException {
addAndGet(m);
OperationFuture<Boolean> f = client.delete(k(m));
assertTrue(f.get(timeout, TimeUnit.SECONDS));
assertNull(client.get(k(m)));
}
public void testDeleteDoesNotExist(Method m) throws InterruptedException, ExecutionException, TimeoutException {
OperationFuture<Boolean> f = client.delete(k(m));
assertFalse(f.get(timeout, TimeUnit.SECONDS));
}
public void testDeleteNoReply(Method m) throws InterruptedException, ExecutionException, TimeoutException, IOException {
withNoReply(m, String.format("delete %s noreply\r\n", k(m)));
}
public void testSetAndMultiDelete(Method m) throws IOException {
String key = k(m);
List<String> responses = sendMulti(String.format(
"set %s 0 0 1\r\na\r\ndelete %s\r\ndelete %s\r\ndelete %s\r\ndelete %s\r\n", key, key, key, key, key), 5, true);
assertEquals(responses.size(), 5);
assertEquals(responses.get(0), "STORED");
assertEquals(responses.get(1), "DELETED");
assertEquals(responses.get(2), "NOT_FOUND");
assertEquals(responses.get(3), "NOT_FOUND");
assertEquals(responses.get(4), "NOT_FOUND");
}
public void testSetNoReplyMultiDelete(Method m) throws IOException {
String key = k(m);
List<String> responses = sendMulti(String.format(
"set %s 0 0 1 noreply\r\na\r\ndelete %s\r\ndelete %s\r\ndelete %s\r\ndelete %s\r\n", key, key, key, key, key), 4, true);
assertEquals(responses.size(), 4);
assertEquals(responses.get(0), "DELETED");
assertEquals(responses.get(1), "NOT_FOUND");
assertEquals(responses.get(2), "NOT_FOUND");
assertEquals(responses.get(3), "NOT_FOUND");
}
private void withNoReply(Method m, String op) throws InterruptedException, ExecutionException, TimeoutException,
IOException {
OperationFuture<Boolean> f = client.set(k(m), 0, "blah");
assertTrue(f.get(timeout, TimeUnit.SECONDS));
CountDownLatch latch = new CountDownLatch(1);
NoReplyListener listener = new NoReplyListener(latch);
cache.addListener(listener);
try {
sendNoWait(op);
log.debug("No reply delete sent, wait...");
boolean completed = latch.await(10, TimeUnit.SECONDS);
assertTrue("Timed out waiting for remove to be executed", completed);
} finally {
cache.removeListener(listener);
}
}
public void testPipelinedDelete() throws IOException {
List<String> responses = sendMulti("delete a\r\ndelete a\r\n", 2, true);
assertEquals(responses.size(), 2);
responses.forEach(r -> assertTrue(r.equals("NOT_FOUND")));
}
public void testPipelinedGetAfterInvalidCas() throws IOException {
List<String> responses = sendMulti("cas bad 0 0 1 0 0\r\nget a\r\n", 2, true);
assertEquals(responses.size(), 2);
assertTrue(responses.get(0).contains("CLIENT_ERROR"));
assertTrue("Instead response was: " + responses.get(1), responses.get(1).equals("END"));
}
public void testIncrementBasic(Method m) throws InterruptedException, ExecutionException, TimeoutException {
OperationFuture<Boolean> f = client.set(k(m), 0, "1");
assertTrue(f.get(timeout, TimeUnit.SECONDS));
long result = client.incr(k(m), 1);
assertEquals(result, 2);
}
public void testIncrementTriple(Method m) throws InterruptedException, ExecutionException, TimeoutException {
OperationFuture<Boolean> f = client.set(k(m), 0, "1");
assertTrue(f.get(timeout, TimeUnit.SECONDS));
assertEquals(client.incr(k(m), 1), 2);
assertEquals(client.incr(k(m), 2), 4);
assertEquals(client.incr(k(m), 4), 8);
}
public void testIncrementNotExist(Method m) {
assertEquals(client.incr(k(m), 1), -1);
}
public void testIncrementIntegerMax(Method m) throws InterruptedException, ExecutionException, TimeoutException {
OperationFuture<Boolean> f = client.set(k(m), 0, "0");
assertTrue(f.get(timeout, TimeUnit.SECONDS));
assertEquals(client.incr(k(m), Integer.MAX_VALUE), Integer.MAX_VALUE);
}
public void testIncrementBeyondIntegerMax(Method m) throws InterruptedException, ExecutionException, TimeoutException {
OperationFuture<Boolean> f = client.set(k(m), 0, "1");
assertTrue(f.get(timeout, TimeUnit.SECONDS));
long newValue = client.incr(k(m), Integer.MAX_VALUE);
assertEquals(newValue, (long) Integer.MAX_VALUE + 1);
}
public void testIncrementBeyondLongMax(Method m) throws InterruptedException, ExecutionException, TimeoutException, IOException {
OperationFuture<Boolean> f = client.set(k(m), 0, "9223372036854775808");
assertTrue(f.get(timeout, TimeUnit.SECONDS));
String newValue = incr(m, 1);
assertEquals(new BigInteger(newValue), new BigInteger("9223372036854775809"));
}
public void testIncrementSurpassLongMax(Method m) throws InterruptedException, ExecutionException, TimeoutException, IOException {
OperationFuture<Boolean> f = client.set(k(m), 0, "9223372036854775807");
assertTrue(f.get(timeout, TimeUnit.SECONDS));
String newValue = incr(m, 1);
assertEquals(new BigInteger(newValue), new BigInteger("9223372036854775808"));
}
public void testIncrementSurpassBigIntMax(Method m) throws InterruptedException, ExecutionException, TimeoutException, IOException {
OperationFuture<Boolean> f = client.set(k(m), 0, "18446744073709551615");
assertTrue(f.get(timeout, TimeUnit.SECONDS));
String newValue = incr(m, 1);
assertEquals(newValue, "0");
}
public void testDecrementBasic(Method m) throws InterruptedException, ExecutionException, TimeoutException {
OperationFuture<Boolean> f = client.set(k(m), 0, "1");
assertTrue(f.get(timeout, TimeUnit.SECONDS));
assertEquals(client.decr(k(m), 1), 0);
}
public void testDecrementTriple(Method m) throws InterruptedException, ExecutionException, TimeoutException {
OperationFuture<Boolean> f = client.set(k(m), 0, "8");
assertTrue(f.get(timeout, TimeUnit.SECONDS));
assertEquals(client.decr(k(m), 1), 7);
assertEquals(client.decr(k(m), 2), 5);
assertEquals(client.decr(k(m), 4), 1);
}
public void testDecrementNotExist(Method m) {
assertEquals(client.decr(k(m), 1), -1);
}
public void testDecrementBelowZero(Method m) throws InterruptedException, ExecutionException, TimeoutException {
OperationFuture<Boolean> f = client.set(k(m), 0, "1");
assertTrue(f.get(timeout, TimeUnit.SECONDS));
long newValue = client.decr(k(m), 2);
assertEquals(newValue, 0);
}
public void testFlushAll(Method m) throws InterruptedException, ExecutionException, TimeoutException {
for (int i = 1; i < 5; ++i) {
String key = k(m, "k" + i + "-");
String value = v(m, "v" + i + "-");
OperationFuture<Boolean> f = client.set(key, 0, value);
assertTrue(f.get(timeout, TimeUnit.SECONDS));
assertEquals(client.get(key), value);
}
OperationFuture<Boolean> f = client.flush();
assertTrue(f.get(timeout, TimeUnit.SECONDS));
for (int i = 1; i < 5; ++i) {
String key = k(m, "k" + i + "-");
assertNull(client.get(key));
}
}
public void testFlushAllDelayed(Method m) throws InterruptedException, ExecutionException, TimeoutException {
flushAllDelayed(m, 2, 2200);
}
public void testFlushAllDelayedUnixTime(Method m) throws InterruptedException, ExecutionException, TimeoutException {
int delay = (int) TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() + 2000);
flushAllDelayed(m, delay, 2200);
}
private void flushAllDelayed(Method m, int delay, long sleep) throws InterruptedException, ExecutionException, TimeoutException {
for (int i = 1; i < 5; ++i) {
String key = k(m, "k" + i + "-");
String value = v(m, "v" + i + "-");
OperationFuture<Boolean> f = client.set(key, 0, value);
assertTrue(f.get(timeout, TimeUnit.SECONDS));
assertEquals(client.get(key), value);
}
OperationFuture<Boolean> f = client.flush(delay);
assertTrue(f.get(timeout, TimeUnit.SECONDS));
sleepThread(sleep);
for (int i = 1; i < 5; ++i) {
String key = k(m, "k" + i + "-");
assertNull(client.get(key));
}
}
public void testFlushAllNoReply(Method m) throws InterruptedException, ExecutionException, TimeoutException, IOException {
withNoReply(m, "flush_all noreply\r\n");
}
public void testFlushAllPipeline() throws IOException {
List<String> responses = sendMulti("flush_all\r\nget a\r\n", 2, true);
assertEquals(responses.size(), 2);
assertEquals(responses.get(0), "OK");
assertEquals(responses.get(1), "END");
}
public void testVersion() {
Map<SocketAddress, String> versions = client.getVersions();
assertEquals(versions.size(), 1);
String version = versions.values().iterator().next();
assertEquals(version, Version.getVersion());
}
public void testIncrKeyLengthLimit() throws InterruptedException, ExecutionException, TimeoutException, IOException {
String keyUnderLimit = generateRandomString(249);
OperationFuture<Boolean> f = client.set(keyUnderLimit, 0, "78");
assertTrue(f.get(timeout, TimeUnit.SECONDS));
assertEquals(client.get(keyUnderLimit), "78");
String keyInLimit = generateRandomString(250);
f = client.set(keyInLimit, 0, "89");
assertTrue(f.get(timeout, TimeUnit.SECONDS));
assertEquals(client.get(keyInLimit), "89");
String keyAboveLimit = generateRandomString(251);
String resp = incr(keyAboveLimit, 1);
assertClientError(resp);
}
public void testGetKeyLengthLimit() throws IOException {
String tooLongKey = generateRandomString(251);
String resp = send("get " + tooLongKey + "\r\n");
assertClientError(resp);
tooLongKey = generateRandomString(251);
resp = send("get k1 k2 k3 " + tooLongKey + "\r\n");
assertClientError(resp);
}
public void testUnknownCommand() throws IOException {
assertError(send("blah\r\n"));
assertError(send("blah boo poo goo zoo\r\n"));
}
public void testUnknownCommandPipelined() throws IOException {
List<String> responses = sendMulti("bogus\r\ndelete a\r\n", 2, true);
assertEquals(responses.size(), 2);
assertEquals(responses.get(0), "ERROR");
assertEquals(responses.get(1), "NOT_FOUND");
}
public void testReadFullLineAfterLongKey() throws IOException {
String key = generateRandomString(300);
String command = "add " + key + " 0 0 1\r\nget a\r\n";
List<String> responses = sendMulti(command, 2, true);
assertEquals(responses.size(), 2);
assertTrue(responses.get(0).contains("CLIENT_ERROR"));
assertEquals(responses.get(1), "END");
}
public void testNegativeBytesLengthValue() throws IOException {
assertClientError(send("set boo1 0 0 -1\r\n"));
assertClientError(send("add boo2 0 0 -1\r\n"));
}
public void testFlagsIsUnsigned(Method m) throws IOException {
String k = m.getName();
assertClientError(send("set boo1 -1 0 0\r\n"));
assertStored(send("set " + k + " 4294967295 0 0\r\n"));
assertClientError(send("set boo2 4294967296 0 0\r\n"));
assertClientError(send("set boo2 18446744073709551615 0 0\r\n"));
}
public void testIncrDecrIsUnsigned(Method m) throws IOException, InterruptedException, ExecutionException, TimeoutException {
String k = m.getName();
OperationFuture<Boolean> f = client.set(k, 0, "0");
assertTrue(f.get(timeout, TimeUnit.SECONDS));
assertClientError(send("incr " + k + " -1\r\n"));
assertClientError(send("decr " + k + " -1\r\n"));
k = k + "-1";
f = client.set(k, 0, "0");
assertTrue(f.get(timeout, TimeUnit.SECONDS));
assertExpectedResponse(send("incr " + k + " 18446744073709551615\r\n"), "18446744073709551615", true);
k = k + "-1";
f = client.set(k, 0, "0");
assertTrue(f.get(timeout, TimeUnit.SECONDS));
assertClientError(send("incr " + k + " 18446744073709551616\r\n"));
assertClientError(send("decr " + k + " 18446744073709551616\r\n"));
}
public void testVerbosity() throws IOException {
assertClientError(send("verbosity\r\n"));
assertClientError(send("verbosity 5\r\n"));
assertClientError(send("verbosity 10 noreply\r\n"));
}
public void testQuit(Method m) throws InterruptedException, ExecutionException, TimeoutException, IOException {
OperationFuture<Boolean> f = client.set(k(m), 0, "0");
assertTrue(f.get(timeout, TimeUnit.SECONDS));
sendNoWait("quit\r\n");
}
public void testSetBigSizeValue(Method m) throws InterruptedException, ExecutionException, TimeoutException {
OperationFuture<Boolean> f = client.set(k(m), 0, generateRandomString(1024 * 1024).getBytes());
assertTrue(f.get(timeout, TimeUnit.SECONDS));
}
public void testStoreAsBinaryOverride() {
ConfigurationBuilder builder = TestCacheManagerFactory.getDefaultCacheConfiguration(false);
builder.storeAsBinary().enable();
EmbeddedCacheManager cm = TestCacheManagerFactory.createCacheManager(builder);
Configuration cfg = builder.build();
cm.defineConfiguration(new MemcachedServerConfigurationBuilder().build().defaultCacheName(), cfg);
assertTrue(cfg.storeAsBinary().enabled());
MemcachedServer testServer = startMemcachedTextServer(cm, server.getPort() + 33);
try {
Cache memcachedCache = cm.getCache(testServer.getConfiguration().defaultCacheName());
assertFalse(memcachedCache.getCacheConfiguration().storeAsBinary().enabled());
} finally {
cm.stop();
testServer.stop();
}
}
public void testDisableCache(Method m) throws InterruptedException, ExecutionException, TimeoutException {
OperationFuture<Boolean> f = client.set(k(m), 0, v(m));
assertTrue(f.get(timeout, TimeUnit.SECONDS));
assertEquals(v(m), client.get(k(m)));
String cacheName = server.getConfiguration().defaultCacheName();
server.ignoreCache(cacheName);
try {
client.get(k(m));
fail("Should have failed");
} catch (Exception e) {
// Ignore, should fail
}
server.unignore(cacheName);
client.get(k(m));
}
// public void testRegex {
// val notFoundRegex = new Regex("""\bNOT_FOUND\b""");
// assertEquals(notFoundRegex.findAllIn("NOT_FOUND\r\nNOT_FOUND\r\n").length, 2);
// }
//
// private def assertExpectedResponse(resp: String, expectedResp: String, numberOfTimes: Int) {
// val expectedRespRegex = new Regex("""\b""" + expectedResp + """\b""");
// assertEquals(expectedRespRegex.findAllIn(resp).length, numberOfTimes,
// "Expected " + expectedResp + " to be found " + numberOfTimes
// + " times, but instead received response: " + resp);
// }
private void addAndGet(Method m) throws InterruptedException, ExecutionException, TimeoutException {
OperationFuture<Boolean> f = client.add(k(m), 0, v(m));
assertTrue(f.get(timeout, TimeUnit.SECONDS));
assertEquals(client.get(k(m)), v(m));
}
private String incr(Method m, int by) throws IOException {
return incr(k(m), by);
}
private String incr(String k, int by) throws IOException {
return send("incr " + k + " " + by + "\r\n");
}
}
@Listener
class NoReplyListener {
private final CountDownLatch latch;
JavaLog log = LogFactory.getLog(NoReplyListener.class, JavaLog.class);
NoReplyListener(CountDownLatch latch) {
this.latch = latch;
}
@CacheEntryRemoved
public void removed(CacheEntryRemovedEvent event) {
log.debug("Entry removed, open latch");
latch.countDown();
}
}