/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.communication.rpc.internal;
import static de.rcenvironment.core.communication.testutils.CommunicationTestHelper.LOCAL_LOGICAL_NODE_SESSION_ID;
import static de.rcenvironment.core.communication.testutils.CommunicationTestHelper.REMOTE_CONTACT;
import static de.rcenvironment.core.communication.testutils.CommunicationTestHelper.REQUEST;
import static de.rcenvironment.core.communication.testutils.CommunicationTestHelper.RESULT;
import static de.rcenvironment.core.communication.testutils.CommunicationTestHelper.RETURN_VALUE;
import static de.rcenvironment.core.communication.testutils.CommunicationTestHelper.SERVICE_CONTACT;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import junit.framework.TestCase;
import org.easymock.EasyMock;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import de.rcenvironment.core.communication.api.PlatformService;
import de.rcenvironment.core.communication.common.CommunicationException;
import de.rcenvironment.core.communication.common.InstanceNodeSessionId;
import de.rcenvironment.core.communication.common.ResolvableNodeId;
import de.rcenvironment.core.communication.legacy.internal.NetworkContact;
import de.rcenvironment.core.communication.messaging.internal.InternalMessagingException;
import de.rcenvironment.core.communication.rpc.ServiceCallRequest;
import de.rcenvironment.core.communication.rpc.ServiceCallResult;
import de.rcenvironment.core.communication.rpc.ServiceCallResultFactory;
import de.rcenvironment.core.communication.rpc.api.CallbackProxyService;
import de.rcenvironment.core.communication.rpc.api.CallbackService;
import de.rcenvironment.core.communication.spi.CallbackObject;
import de.rcenvironment.core.communication.testutils.CommunicationTestHelper;
import de.rcenvironment.core.communication.testutils.PlatformServiceDefaultStub;
import de.rcenvironment.core.utils.common.rpc.RemoteOperationException;
/**
* Unit test for {@link ServiceCallHandlerServiceImpl} with an OSGi service resolver.
*
* @author Heinrich Wendel
* @author Doreen Seider
* @author Robert Mischke
*/
public class OSGiServiceCallHandlerImplTest extends TestCase {
private static final String CALLBACK_TEST_METHOD = "callbackTest";
private static ServiceCallHandlerServiceImpl callHandler;
private final String objectID1 = "id1";
private final String objectID2 = "id2";
private final String objectID3 = "id3";
private final CallbackProxy proxy = new DummyProxy(objectID1);
private final CallbackObject object = new DummyObject();
public static ServiceCallHandlerServiceImpl getCallHandler() {
return callHandler;
}
@Override
public void setUp() throws Exception {
Bundle bundleMock = EasyMock.createNiceMock(Bundle.class);
EasyMock.expect(bundleMock.getSymbolicName()).andReturn("de.rcenvironment.rce.communication.rmi").anyTimes();
EasyMock.replay(bundleMock);
ServiceCallSender senderMock = EasyMock.createNiceMock(ServiceCallSender.class);
EasyMock.expect(senderMock.send(REQUEST)).andReturn(RESULT).anyTimes();
EasyMock.replay(senderMock);
ServiceReference factoryRefMock = EasyMock.createNiceMock(ServiceReference.class);
ServiceCallSenderFactory factoryMock = EasyMock.createNiceMock(ServiceCallSenderFactory.class);
EasyMock.expect(factoryMock.createServiceCallSender(SERVICE_CONTACT))
.andReturn(senderMock).anyTimes();
EasyMock.expect(factoryMock.createServiceCallSender(REMOTE_CONTACT))
.andReturn(new ServiceCallSenderDummy()).anyTimes();
EasyMock.replay(factoryMock);
ServiceReference testServiceRef = EasyMock.createNiceMock(ServiceReference.class);
MethodCallTestInterface testmethods = new MethodCallTestInterfaceImpl();
BundleContext contextMock = EasyMock.createNiceMock(BundleContext.class);
EasyMock.expect(contextMock.getBundles()).andReturn(new Bundle[] { bundleMock }).anyTimes();
EasyMock.expect(contextMock.getServiceReferences(EasyMock.eq(ServiceCallSenderFactory.class.getName()),
EasyMock.eq((String) null))).andReturn(new ServiceReference[] { factoryRefMock }).anyTimes();
EasyMock.expect(contextMock.getServiceReferences(REQUEST.getServiceName(), null))
.andReturn(new ServiceReference[] { testServiceRef }).anyTimes();
EasyMock.expect(contextMock.getService(factoryRefMock)).andReturn(factoryMock).anyTimes();
EasyMock.expect(contextMock.getService(testServiceRef)).andReturn(testmethods).anyTimes();
EasyMock.replay(contextMock);
callHandler = new ServiceCallHandlerServiceImpl();
callHandler.bindPlatformService(new DummyPlatformService());
callHandler.bindCallbackService(new DummyCallbackService());
callHandler.bindCallbackProxyService(new DummyCallbackProxyService());
OSGiLocalServiceResolver serviceResolver = new OSGiLocalServiceResolver();
serviceResolver.activate(contextMock);
callHandler.bindLocalServiceResolver(serviceResolver);
}
/**
* Test normal call.
*
* @throws Exception if the test fails.
*/
public void testLocalCall() throws Exception {
ServiceCallResult result = callHandler.handle(REQUEST);
assertEquals(RETURN_VALUE, result.getReturnValue());
// equal call request to cover cache functionality
result = callHandler.handle(REQUEST);
assertEquals(result.getReturnValue(), RETURN_VALUE);
List<Serializable> params = new ArrayList<>();
params.add(new DummyProxy(objectID1));
ServiceCallRequest callbackRequest =
new ServiceCallRequest(LOCAL_LOGICAL_NODE_SESSION_ID, CommunicationTestHelper.REMOTE_LOGICAL_NODE_SESSION_ID,
MethodCallTestInterface.class.getCanonicalName(), CALLBACK_TEST_METHOD, params);
assertNotNull(callHandler.handle(callbackRequest));
params = new ArrayList<Serializable>();
params.add(new DummyProxy(objectID2));
callbackRequest = new ServiceCallRequest(LOCAL_LOGICAL_NODE_SESSION_ID, CommunicationTestHelper.REMOTE_LOGICAL_NODE_SESSION_ID,
MethodCallTestInterface.class.getCanonicalName(), CALLBACK_TEST_METHOD, params);
assertNotNull(callHandler.handle(callbackRequest));
params = new ArrayList<Serializable>();
params.add(new DummyProxy(objectID3));
callbackRequest = new ServiceCallRequest(LOCAL_LOGICAL_NODE_SESSION_ID, CommunicationTestHelper.REMOTE_LOGICAL_NODE_SESSION_ID,
MethodCallTestInterface.class.getCanonicalName(), CALLBACK_TEST_METHOD, params);
assertNotNull(callHandler.handle(callbackRequest));
params = new ArrayList<Serializable>();
List<Serializable> param = new ArrayList<>();
param.add(new DummyProxy(objectID1));
param.add(new DummyProxy(objectID2));
param.add(new DummyProxy(objectID3));
params.add((Serializable) param); // ArrayList
callbackRequest = new ServiceCallRequest(LOCAL_LOGICAL_NODE_SESSION_ID, CommunicationTestHelper.REMOTE_LOGICAL_NODE_SESSION_ID,
MethodCallTestInterface.class.getCanonicalName(), CALLBACK_TEST_METHOD, params);
assertNotNull(callHandler.handle(callbackRequest));
}
/**
* Test implementation of {@link CallbackService}.
*
* @author Doreen Seider
*/
private class DummyCallbackService 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) {
if (objectIdentifier.equals(objectID2)) {
return object;
}
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 CallbackProxyService} implementation.
*
* @author Doreen Seider
*/
private class DummyCallbackProxyService implements CallbackProxyService {
@Override
public void addCallbackProxy(CallbackProxy callBackProxy) {
}
@Override
public Object getCallbackProxy(String objectIdentifier) {
if (objectIdentifier.equals(objectID3)) {
return proxy;
}
return null;
}
@Override
public void setTTL(String objectIdentifier, Long ttl) {
}
}
/**
* Test callback object.
*
* @author Doreen Seider
*/
private class DummyProxy implements DummyInterface, CallbackProxy {
private static final long serialVersionUID = 1L;
private String id;
DummyProxy(String id) {
this.id = id;
}
@Override
public void method() {}
@Override
public InstanceNodeSessionId getHomePlatform() {
return CommunicationTestHelper.LOCAL_INSTANCE_SESSION_ID;
}
@Override
public String getObjectIdentifier() {
return id;
}
@Override
public Class<?> getInterface() {
return DummyInterface.class;
}
}
/**
* Test callback object.
*
* @author Doreen Seider
*/
private class DummyObject implements DummyInterface {
private static final long serialVersionUID = 1L;
@Override
public void method() {}
@Override
public Class<?> getInterface() {
return DummyInterface.class;
}
}
/**
* Test interface used for test callback object.
*
* @author Doreen Seider
*/
private interface DummyInterface extends CallbackObject {
void method();
}
/**
* Test {@link PlatformService} implementation.
*
* @author Doreen Seider
*/
private class DummyPlatformService extends PlatformServiceDefaultStub {
@Override
public boolean matchesLocalInstance(ResolvableNodeId nodeId) {
if (nodeId.equals(LOCAL_LOGICAL_NODE_SESSION_ID)) {
return true;
}
return false;
}
}
/**
*
* Dummy {@link ServiceCallSender} implementation.
*
* @author Doreen Seider
*/
private class ServiceCallSenderDummy implements ServiceCallSender {
@Override
public ServiceCallResult send(ServiceCallRequest serviceCallRequest) throws RemoteOperationException {
try {
return OSGiServiceCallHandlerImplTest.getCallHandler().handle(serviceCallRequest);
} catch (InternalMessagingException e) {
return ServiceCallResultFactory.representInternalErrorAtHandler(serviceCallRequest, "Exception in mock handler", e);
}
}
@Override
public void initialize(NetworkContact contact) throws CommunicationException {}
}
}