package cz.cuni.mff.d3s.been.cluster.action;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;
import cz.cuni.mff.d3s.been.socketworks.twoway.Reply;
import cz.cuni.mff.d3s.been.socketworks.twoway.ReplyType;
import cz.cuni.mff.d3s.been.task.checkpoints.CheckpointRequest;
import cz.cuni.mff.d3s.been.task.checkpoints.CheckpointRequestType;
import org.junit.*;
import com.hazelcast.config.Config;
import com.hazelcast.config.NetworkConfig;
import com.hazelcast.core.Hazelcast;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.impl.GroupProperties;
import cz.cuni.mff.d3s.been.cluster.context.ClusterContext;
import cz.cuni.mff.d3s.been.socketworks.twoway.Request;
/**
* @author Martin Sixta
*/
public class MapGetActionTest extends Assert {
private static final String KEY1 = "key1";
private static final String VALUE1 = "value1";
private static final String SELECTOR_SEPARATOR = "#";
private static final String TASK_ID = "abc-def";
private static final String CONTEXT_ID = "fed-cba";
private static final String MAP = String.format("checkpointmap_%s", CONTEXT_ID);
private static HazelcastInstance hazelcastInstance;
private static ClusterContext ctx;
private static Properties properties;
@Before
public void setUp() {
hazelcastInstance.getMap(MAP).clear();
}
@BeforeClass
public static void setUpClass() throws Exception {
System.setProperty("hazelcast.logging.type", "none");
Config c1 = buildConfig(false);
c1.getNetworkConfig().setPort(35701);
List<String> allMembers = Arrays.asList("127.0.0.1:35701");
c1.getNetworkConfig().getJoin().getTcpIpConfig().setMembers(allMembers);
hazelcastInstance = Hazelcast.newHazelcastInstance(c1);
properties = new Properties();
ctx = new ClusterContext(hazelcastInstance, properties);
}
@AfterClass
public static void tearDownClass() throws Exception {
properties = null;
ctx = null;
hazelcastInstance.getLifecycleService().shutdown();
}
@Test
public void testNonExistingKey() {
CheckpointRequest request = new CheckpointRequest(CheckpointRequestType.GET, "nonExistingKey");
fillIds(request);
Action action = Actions.createAction(request, ctx);
Reply reply = action.handle();
assertSame(ReplyType.OK, reply.getReplyType());
assertSame(null, reply.getValue());
}
@Test
public void testExistingKey() {
ctx.getMap(MAP).put(KEY1, VALUE1);
CheckpointRequest request = new CheckpointRequest(CheckpointRequestType.GET, KEY1);
fillIds(request);
Action action = Actions.createAction(request, ctx);
Reply reply = action.handle();
assertSame(ReplyType.OK, reply.getReplyType());
assertEquals(VALUE1, reply.getValue());
}
@Test
public void testMalformedSelectorNull() {
CheckpointRequest request = new CheckpointRequest(CheckpointRequestType.GET, "");
fillIds(request);
Action action = Actions.createAction(request, ctx);
Reply reply = action.handle();
assertSame(ReplyType.ERROR, reply.getReplyType());
}
// ------------------------------------------------------------------------
// AUXILIARY FUNCTIONS
// ------------------------------------------------------------------------
private String concat(String map, String key) {
return map + SELECTOR_SEPARATOR + key;
}
private String getSelector(String key) {
return concat(MAP, key);
}
private void fillIds(CheckpointRequest request) {
request.setTaskId(TASK_ID);
request.setTaskContextId(CONTEXT_ID);
}
private static Config buildConfig(boolean multicastEnabled) {
Config c = new Config();
c.getGroupConfig().setName("group").setPassword("pass");
c.setProperty(GroupProperties.PROP_MERGE_FIRST_RUN_DELAY_SECONDS, "10");
c.setProperty(GroupProperties.PROP_MERGE_NEXT_RUN_DELAY_SECONDS, "5");
c.setProperty(GroupProperties.PROP_MAX_NO_HEARTBEAT_SECONDS, "10");
c.setProperty(GroupProperties.PROP_MASTER_CONFIRMATION_INTERVAL_SECONDS, "2");
c.setProperty(GroupProperties.PROP_MAX_NO_MASTER_CONFIRMATION_SECONDS, "10");
c.setProperty(GroupProperties.PROP_MEMBER_LIST_PUBLISH_INTERVAL_SECONDS, "10");
final NetworkConfig networkConfig = c.getNetworkConfig();
networkConfig.getJoin().getMulticastConfig().setEnabled(multicastEnabled);
networkConfig.getJoin().getTcpIpConfig().setEnabled(!multicastEnabled);
networkConfig.setPortAutoIncrement(false);
return c;
}
}