/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.communication.rpc.internal;
import static org.junit.Assert.assertEquals;
import java.io.Serializable;
import java.lang.ref.WeakReference;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.easymock.EasyMock;
import org.junit.Before;
import org.junit.Test;
import org.osgi.framework.BundleContext;
import de.rcenvironment.core.communication.api.CommunicationService;
import de.rcenvironment.core.communication.common.InstanceNodeSessionId;
import de.rcenvironment.core.communication.common.NodeIdentifierTestUtils;
import de.rcenvironment.core.communication.common.ResolvableNodeId;
import de.rcenvironment.core.communication.rpc.api.CallbackProxyService;
import de.rcenvironment.core.communication.rpc.api.CallbackService;
import de.rcenvironment.core.communication.rpc.internal.CleanJob.CleanRunnable;
import de.rcenvironment.core.communication.spi.CallbackObject;
import de.rcenvironment.core.communication.testutils.CommunicationServiceDefaultStub;
import de.rcenvironment.core.utils.common.rpc.RemoteOperationException;
/**
* Test cases for {@link CleanJob}.
*
* @author Doreen Seider
* @author Robert Mischke (8.0.0 id adaptations)
*/
public class CleanJobTest {
private CleanJob job;
private final BundleContext contextMock = EasyMock.createNiceMock(BundleContext.class);
private final InstanceNodeSessionId instanceIdLocal1 = NodeIdentifierTestUtils.createTestInstanceNodeSessionIdWithDisplayName("local1");
private final InstanceNodeSessionId instanceIdLocal2 = NodeIdentifierTestUtils.createTestInstanceNodeSessionIdWithDisplayName("local2");
private final String id1 = "id1";
private final String id2 = "id2";
private Map<String, WeakReference<Object>> objects = new HashMap<String, WeakReference<Object>>();
private Map<String, Long> ttls = new HashMap<String, Long>();
private Map<String, InstanceNodeSessionId> nodes = new HashMap<String, InstanceNodeSessionId>();
/** Set up. */
@SuppressWarnings("deprecation")
@Before
public void setUp() {
job = new CleanJob();
job.activate(contextMock);
job.bindCommunicationService(new DummyCommunicatioService());
}
/** Tests if scheduling and unscheduling clean job work without exceptions. */
@Test
public void testUnSchedule() {
CleanJob.scheduleJob(CallbackService.class, objects, ttls, nodes);
CleanJob.unscheduleJob(CallbackService.class);
}
/**
* Test.
**/
@Test
public void testExecuteForCallbackService() {
testExecute(CallbackService.class);
}
/**
* Test.
**/
@Test
public void testExecuteForCallbackProxyService() {
testExecute(CallbackProxyService.class);
}
private void testExecute(Class<?> iface) {
CleanRunnable runnable = new CleanRunnable(iface, objects, ttls, nodes);
runnable.run();
Object o = new Object();
objects.put(id1, new WeakReference<Object>(o));
nodes.put(id1, instanceIdLocal1);
ttls.put(id1, new Date(System.currentTimeMillis() + CleanJob.TTL_MSEC).getTime());
assertEquals(1, objects.size());
assertEquals(1, nodes.size());
assertEquals(1, ttls.size());
runnable = new CleanRunnable(CallbackService.class, objects, ttls, nodes);
runnable.run();
assertEquals(1, objects.size());
assertEquals(1, nodes.size());
assertEquals(1, ttls.size());
nodes.put(id1, instanceIdLocal2);
o = null;
System.gc();
runnable = new CleanRunnable(CallbackService.class, objects, ttls, nodes);
runnable.run();
assertEquals(0, objects.size());
assertEquals(0, nodes.size());
assertEquals(0, ttls.size());
o = new Object();
objects.put(id2, new WeakReference<Object>(o));
nodes.put(id2, instanceIdLocal2);
ttls.put(id2, new Date(System.currentTimeMillis() - CleanJob.TTL_MSEC).getTime());
assertEquals(1, objects.size());
assertEquals(1, nodes.size());
assertEquals(1, ttls.size());
runnable = new CleanRunnable(CallbackService.class, objects, ttls, nodes);
runnable.run();
assertEquals(0, objects.size());
assertEquals(0, nodes.size());
assertEquals(0, ttls.size());
}
/**
* Test {@link CommunicationService} implementation.
*
* @author Doreen Seider
*/
private class DummyCommunicatioService extends CommunicationServiceDefaultStub {
@SuppressWarnings("unchecked")
@Override
public <T> T getRemotableService(Class<T> iface, ResolvableNodeId nodeId) {
T service = null;
if (iface == CallbackService.class && nodeId.equals(instanceIdLocal1)) {
service = (T) new DummyCallbackService1();
} else if (iface == CallbackService.class && nodeId.equals(instanceIdLocal2)) {
service = (T) new DummyCallbackService2();
} else if (iface == CallbackProxyService.class && nodeId.equals(instanceIdLocal1)) {
service = (T) new DummyCallbackProxyService1();
} else if (iface == CallbackProxyService.class && nodeId.equals(instanceIdLocal2)) {
service = (T) new DummyCallbackProxyService2();
}
return service;
}
}
/**
* Test {@link CallbackService} implementation.
*
* @author Doreen Seider
*/
private class DummyCallbackService1 implements CallbackService {
@Override
public String addCallbackObject(Object callBackObject, InstanceNodeSessionId nodeId) {
return null;
}
@Override
public Object callback(String objectIdentifier, String methodName, List<? extends Serializable> parameters)
throws RemoteOperationException {
return null;
}
@Override
public Object getCallbackObject(String objectIdentifier) {
return null;
}
@Override
public void setTTL(String objectIdentifier, Long ttl) {}
@Override
public Object createCallbackProxy(CallbackObject callbackObject, String objectIdentifier, InstanceNodeSessionId proxyHome) {
return null;
}
@Override
public String getCallbackObjectIdentifier(Object callbackObject) {
return null;
}
}
/**
* Test {@link CallbackService} implementation.
*
* @author Doreen Seider
*/
private class DummyCallbackService2 implements CallbackService {
@Override
public String addCallbackObject(Object callBackObject, InstanceNodeSessionId nodeId) {
return null;
}
@Override
public Object callback(String objectIdentifier, String methodName, List<? extends Serializable> parameters)
throws RemoteOperationException {
return null;
}
@Override
public Object getCallbackObject(String objectIdentifier) {
return null;
}
@Override
public void setTTL(String objectIdentifier, Long ttl) {
throw new RuntimeException("fail");
}
@Override
public Object createCallbackProxy(CallbackObject callbackObject, String objectIdentifier, InstanceNodeSessionId proxyHome) {
return null;
}
@Override
public String getCallbackObjectIdentifier(Object callbackObject) {
return null;
}
}
/**
* Test {@link CallbackProxyService} implementation.
*
* @author Doreen Seider
*/
private class DummyCallbackProxyService1 implements CallbackProxyService {
@Override
public void addCallbackProxy(CallbackProxy callBackProxy) {}
@Override
public Object getCallbackProxy(String objectIdentifier) {
return null;
}
@Override
public void setTTL(String objectIdentifier, Long ttl) {}
}
/**
* Test {@link CallbackProxyService} implementation.
*
* @author Doreen Seider
*/
private class DummyCallbackProxyService2 implements CallbackProxyService {
@Override
public void addCallbackProxy(CallbackProxy callBackProxy) {}
@Override
public Object getCallbackProxy(String objectIdentifier) {
return null;
}
@Override
public void setTTL(String objectIdentifier, Long ttl) {
throw new RuntimeException("fail");
}
}
}