package org.infinispan.server.test.client.memcached;
import static org.infinispan.server.test.util.ITestUtils.isReplicatedMode;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import java.util.List;
import org.infinispan.arquillian.core.RemoteInfinispanServer;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
/**
* Tests for Memcached endpoint. Subclasses must provide a way to get the list of remote
* infinispan servers.
* <p/>
* Subclasses may be used in Client-Server mode or Hybrid mode where Memcached server
* runs as a library deployed in an application server.
*
* @author Michal Linhard
* @author Martin Gencur
* @author Jozef Vilkolak
*/
public abstract class AbstractMemcachedClusteredIT {
static final String ENCODING = "UTF-8";
// keys used during tests
// they are deleted in the setUp and tearDown methods
static final String KEY_A = "a";
static final String KEY_B = "b";
static final String KEY_C = "c";
MemcachedClient mc1;
MemcachedClient mc2;
protected abstract List<RemoteInfinispanServer> getServers();
protected abstract int getMemcachedPort1();
protected abstract int getMemcachedPort2();
@Before
public void setUp() throws Exception {
if (isReplicatedMode()) {
//set the memcached ports manually - workaround for https://issues.jboss.org/browse/ISPN-6310
mc1 = new MemcachedClient(ENCODING, getServers().get(0).getMemcachedEndpoint().getInetAddress()
.getHostName(), getMemcachedPort1(), 10000);
mc2 = new MemcachedClient(ENCODING, getServers().get(1).getMemcachedEndpoint().getInetAddress()
.getHostName(), getMemcachedPort2(), 10000);
} else {
mc1 = new MemcachedClient(ENCODING, getServers().get(0).getMemcachedEndpoint().getInetAddress()
.getHostName(), getServers().get(0).getMemcachedEndpoint().getPort(), 10000);
mc2 = new MemcachedClient(ENCODING, getServers().get(1).getMemcachedEndpoint().getInetAddress()
.getHostName(), getServers().get(1).getMemcachedEndpoint().getPort(), 10000);
}
mc1.delete(KEY_A);
mc1.delete(KEY_B);
mc1.delete(KEY_C);
mc2.delete(KEY_A);
mc2.delete(KEY_B);
mc2.delete(KEY_C);
assertNull(mc1.get(KEY_A));
assertNull(mc1.get(KEY_B));
assertNull(mc1.get(KEY_C));
assertNull(mc2.get(KEY_A));
assertNull(mc2.get(KEY_B));
assertNull(mc2.get(KEY_C));
}
@After
public void tearDown() throws Exception {
mc1.delete(KEY_A);
mc1.delete(KEY_B);
mc1.delete(KEY_C);
mc2.delete(KEY_A);
mc2.delete(KEY_B);
mc2.delete(KEY_C);
mc1.close();
mc2.close();
}
@Test
public void testReplicatedSet() throws Exception {
mc1.set(KEY_A, "A");
assertEquals("A", mc2.get(KEY_A));
}
@Test
public void testReplicatedGetMultipleKeys() throws Exception {
mc1.set(KEY_A, "A");
mc1.set(KEY_B, "B");
mc1.set(KEY_C, "C");
mc2.writeln("get " + KEY_A + " " + KEY_B + " " + KEY_C);
mc2.flush();
assertEquals("VALUE " + KEY_A + " 0 1", mc2.readln());
assertEquals("A", mc2.readln());
assertEquals("VALUE " + KEY_B + " 0 1", mc2.readln());
assertEquals("B", mc2.readln());
assertEquals("VALUE " + KEY_C + " 0 1", mc2.readln());
assertEquals("C", mc2.readln());
assertEquals("END", mc2.readln());
}
@Test
public void testReplicatedAdd() throws Exception {
String data = "testAdd";
mc1.writeln("add " + KEY_A + " 0 0 " + data.getBytes(ENCODING).length);
mc1.writeln(data);
mc1.flush();
assertEquals("STORED", mc1.readln());
assertEquals(data, mc2.get(KEY_A));
}
@Test
public void testReplicatedReplace() throws Exception {
mc1.set(KEY_A, "data1");
assertEquals("data1", mc2.get(KEY_A));
mc1.writeln("replace " + KEY_A + " 0 0 " + "data2".getBytes(ENCODING).length);
mc1.writeln("data2");
mc1.flush();
assertEquals("STORED", mc1.readln());
assertEquals("data2", mc2.get(KEY_A));
}
@Test
public void testReplicatedAppend() throws Exception {
mc1.set(KEY_A, "Hello");
assertEquals("Hello", mc2.get(KEY_A));
mc2.writeln("append " + KEY_A + " 0 0 " + ", World!".getBytes(ENCODING).length);
mc2.writeln(", World!");
mc2.flush();
assertEquals("STORED", mc2.readln());
assertEquals("Hello, World!", mc1.get(KEY_A));
}
@Test
public void testReplicatedPrepend() throws Exception {
mc1.set(KEY_A, "World!");
assertEquals("World!", mc1.get(KEY_A));
mc2.writeln("prepend " + KEY_A + " 0 0 " + "Hello, ".getBytes(ENCODING).length);
mc2.writeln("Hello, ");
mc2.flush();
assertEquals("STORED", mc2.readln());
assertEquals("Hello, World!", mc1.get(KEY_A));
}
@Test
public void testReplicatedCas() throws Exception {
mc1.set(KEY_A, "A");
String casId = mc2.getCasId(KEY_A);
mc2.writeln("cas " + KEY_A + " 0 0 1 " + casId);
mc2.writeln("B");
mc2.flush();
assertEquals("STORED", mc2.readln());
assertEquals("B", mc1.get(KEY_A));
}
@Test
public void testReplicatedCasExists() throws Exception {
mc1.set(KEY_A, "A");
String casId = mc2.getCasId(KEY_A);
mc2.writeln("cas " + KEY_A + " 0 0 1 1" + casId); // note appended 1 before casId
mc2.writeln("B");
mc2.flush();
assertEquals("EXISTS", mc2.readln());
assertEquals("A", mc1.get(KEY_A));
}
@Test
public void testReplicatedCasExists2() throws Exception {
mc1.set(KEY_A, "A");
String casId1 = mc1.getCasId(KEY_A);
String casId2 = mc2.getCasId(KEY_A);
assertEquals(casId1, casId2);
mc2.writeln("cas " + KEY_A + " 0 0 2 " + casId1);
mc2.writeln("B2");
mc2.flush();
assertEquals("STORED", mc2.readln());
mc1.writeln("cas " + KEY_A + " 0 0 2 " + casId1);
mc1.writeln("B1");
mc1.flush();
assertEquals("EXISTS", mc1.readln());
}
@Test
public void testReplicatedDelete() throws Exception {
mc1.set(KEY_A, "A");
assertEquals("A", mc2.get(KEY_A));
assertEquals("DELETED", mc1.delete(KEY_A));
assertNull(mc2.get(KEY_A));
}
@Test
public void testReplicatedIncrement() throws Exception {
mc1.set(KEY_A, "0");
mc2.writeln("incr " + KEY_A + " 1");
mc2.flush();
assertEquals("1", mc2.readln());
}
@Test
public void testReplicatedDecrement() throws Exception {
mc1.set(KEY_A, "1");
mc2.writeln("decr " + KEY_A + " 1");
mc2.flush();
assertEquals("0", mc2.readln());
}
@Test
public void testReplicatedFlushAll() throws Exception {
// flush_all command is not replicated across cluster
// it runs locally
// -- but galderz changed it https://github.com/infinispan/infinispan/commit/585f28cab5df8e6806ad92dcc40d61b82a09ff86
mc1.set(KEY_A, "1");
mc1.set(KEY_B, "2");
mc1.set(KEY_C, "3");
mc2.writeln("flush_all");
mc2.flush();
assertEquals("OK", mc2.readln());
assertNull(mc1.get(KEY_A));
assertNull(mc1.get(KEY_B));
assertNull(mc1.get(KEY_C));
}
}