/*******************************************************************************
* Copyright (c) 2009 EclipseSource and others. All rights reserved. This
* program and the accompanying materials are made available under the terms of
* the Eclipse Public License v1.0 which accompanies this distribution, and is
* available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* EclipseSource - initial API and implementation
******************************************************************************/
package org.eclipse.ecf.tests.remoteservice;
import java.util.Arrays;
import java.util.Dictionary;
import java.util.List;
import junit.framework.TestCase;
import org.eclipse.ecf.core.ContainerConnectException;
import org.eclipse.ecf.core.ContainerCreateException;
import org.eclipse.ecf.core.ContainerFactory;
import org.eclipse.ecf.core.IContainer;
import org.eclipse.ecf.core.IContainerManager;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.core.identity.IDFactory;
import org.eclipse.ecf.core.identity.Namespace;
import org.eclipse.ecf.remoteservice.IRemoteCall;
import org.eclipse.ecf.remoteservice.IRemoteCallListener;
import org.eclipse.ecf.remoteservice.IRemoteService;
import org.eclipse.ecf.remoteservice.IRemoteServiceContainer;
import org.eclipse.ecf.remoteservice.IRemoteServiceContainerAdapter;
import org.eclipse.ecf.remoteservice.IRemoteServiceID;
import org.eclipse.ecf.remoteservice.IRemoteServiceReference;
import org.eclipse.ecf.remoteservice.RemoteServiceContainer;
import org.eclipse.ecf.remoteservice.events.IRemoteCallEvent;
import org.eclipse.equinox.concurrent.future.IFuture;
import org.osgi.framework.InvalidSyntaxException;
public abstract class AbstractConcatConsumerTestCase extends TestCase {
private static int ASYNC_WAITTIME = 5000;
protected IRemoteServiceContainer rsContainer;
protected ID targetID;
protected abstract String getContainerType();
protected ID createStringID(String value) {
return IDFactory.getDefault().createStringID(value);
}
protected ID createID(IContainer container, String value) {
return IDFactory.getDefault().createID(container.getConnectNamespace(),
value);
}
protected IContainer createContainer() throws ContainerCreateException {
return Activator.getDefault().getContainerManager()
.getContainerFactory().createContainer(getContainerType());
}
protected IContainer createContainer(ID containerID)
throws ContainerCreateException {
return Activator.getDefault().getContainerManager()
.getContainerFactory().createContainer(getContainerType(),
containerID);
}
protected IContainer createContainer(String containerID)
throws ContainerCreateException {
return Activator.getDefault().getContainerManager()
.getContainerFactory().createContainer(getContainerType(),
createStringID(containerID));
}
protected IRemoteServiceContainer createRemoteServiceContainer(
IContainer container) {
return new RemoteServiceContainer(container,
(IRemoteServiceContainerAdapter) container
.getAdapter(IRemoteServiceContainerAdapter.class));
}
protected void tearDown() throws Exception {
rsContainer.getContainer().disconnect();
rsContainer.getContainer().dispose();
((IContainerManager) ContainerFactory.getDefault())
.removeAllContainers();
rsContainer = null;
targetID = null;
}
protected Object createRemoteService() {
return new IConcatService() {
public String concat(String string1, String string2) {
final String result = string1.concat(string2);
System.out.println("SERVICE.concat(" + string1 + "," + string2
+ ") returning " + result);
return string1.concat(string2);
}
};
}
protected Dictionary createRemoteServiceProperties() {
return null;
}
protected IRemoteService getRemoteService(ID target, String clazz,
String filter) {
final IRemoteServiceReference[] refs = getRemoteServiceReferences(
target, clazz, filter);
if (refs == null || refs.length == 0)
return null;
return rsContainer.getContainerAdapter().getRemoteService(refs[0]);
}
protected IRemoteServiceReference[] getRemoteServiceReferences(ID target,
String clazz, String filter) {
try {
return rsContainer.getContainerAdapter()
.getRemoteServiceReferences(target, clazz, filter);
} catch (final InvalidSyntaxException e) {
fail("should not happen");
} catch (final ContainerConnectException e) {
fail("connect problem");
}
return null;
}
protected IRemoteServiceReference[] getRemoteServiceReferences(ID[] targets,
String clazz, String filter) {
try {
return rsContainer.getContainerAdapter()
.getRemoteServiceReferences(targets, clazz, filter);
} catch (final InvalidSyntaxException e) {
fail("should not happen");
}
return null;
}
public void testGetServiceReferences() throws Exception {
final IRemoteServiceReference[] refs = getRemoteServiceReferences(
targetID, getRemoteServiceClass().getName(),
getRemoteServiceFilter());
assertTrue(refs != null);
assertTrue(refs.length > 0);
}
public void testGetRemoteServiceIDs() throws Exception {
final IRemoteServiceReference[] refs = getRemoteServiceReferences(
targetID, getRemoteServiceClass().getName(),
getRemoteServiceFilter());
assertTrue(refs != null);
assertTrue(refs.length > 0);
for (int i = 0; i < refs.length; i++) {
IRemoteServiceID rsid = refs[i].getID();
assertNotNull(rsid);
}
}
public void testGetRemoteServiceReferenceObjectClass() throws Exception {
String className = getRemoteServiceClass().getName();
final IRemoteServiceReference[] refs = getRemoteServiceReferences(
targetID, className, getRemoteServiceFilter());
assertTrue(refs != null);
assertTrue(refs.length > 0);
for (int i = 0; i < refs.length; i++) {
String[] intfClasses = (String[]) refs[i]
.getProperty(org.eclipse.ecf.remoteservice.Constants.OBJECTCLASS);
List classNames = Arrays.asList(intfClasses);
assertTrue(classNames.contains(className));
}
}
public void testGetRemoteServiceReferenceServiceID() throws Exception {
final IRemoteServiceReference[] refs = getRemoteServiceReferences(
targetID, getRemoteServiceClass().getName(),
getRemoteServiceFilter());
assertTrue(refs != null);
assertTrue(refs.length > 0);
for (int i = 0; i < refs.length; i++) {
IRemoteServiceID rsid = refs[i].getID();
Long sid = (Long) refs[i]
.getProperty(org.eclipse.ecf.remoteservice.Constants.SERVICE_ID);
assertNotNull(sid);
assertTrue(sid.longValue() > -1);
assertTrue(sid.longValue() == rsid.getContainerRelativeID());
}
}
public void testGetService() throws Exception {
final IRemoteService service = getRemoteService(targetID,
IConcatService.class.getName(), null);
assertNotNull(service);
}
public void testCallSynch() throws Exception {
final IRemoteService service = getRemoteService(targetID,
IConcatService.class.getName(), null);
assertNotNull(service);
traceCallStart("callSynch");
final Object result = service.callSync(createRemoteConcat("Eclipse ",
"is cool"));
traceCallEnd("callSynch", result);
assertNotNull(result);
assertTrue(result.equals("Eclipse ".concat("is cool")));
}
protected void traceCallStart(String callType) {
System.out.println(callType + " start");
}
protected void traceCallEnd(String callType, Object result) {
System.out.println(callType + " end");
System.out.println(" result=" + result);
}
protected void traceCallEnd(String callType) {
System.out.println(callType + " end.");
}
protected IRemoteCallListener createRemoteCallListener() {
return new IRemoteCallListener() {
public void handleEvent(IRemoteCallEvent event) {
System.out.println("CLIENT.handleEvent(" + event + ")");
}
};
}
protected IRemoteCall createRemoteCall(final String method,
final Object[] params) {
return new IRemoteCall() {
public String getMethod() {
return method;
}
public Object[] getParameters() {
return params;
}
public long getTimeout() {
return 3000;
}
};
}
protected IRemoteCall createRemoteConcat(String first, String second) {
return createRemoteCall("concat", new Object[] { first, second });
}
protected Class getRemoteServiceClass() {
return IConcatService.class;
}
protected String getRemoteServiceFilter() {
return null;
}
public void testGetNamespace() throws Exception {
Namespace ns = rsContainer.getContainer().getConnectNamespace();
assertNotNull(ns);
}
public void testGetRSNamespace() throws Exception {
Namespace ns = rsContainer.getContainerAdapter()
.getRemoteServiceNamespace();
assertNotNull(ns);
}
public void testGetRSReference() throws Exception {
IRemoteServiceReference[] references = getRemoteServiceReferences(
targetID, getRemoteServiceClass().getName(),
getRemoteServiceFilter());
assertNotNull(references);
assertTrue(references.length == 1);
}
public void testCallAsynch() throws Exception {
final IRemoteService service = getRemoteService(targetID,
getRemoteServiceClass().getName(), getRemoteServiceFilter());
assertNotNull(service);
traceCallStart("callAsynch");
service.callAsync(createRemoteConcat("ECF ", "is cool"),
createRemoteCallListener());
traceCallEnd("callAsynch");
Thread.sleep(ASYNC_WAITTIME);
}
public void testFireAsynch() throws Exception {
final IRemoteService service = getRemoteService(targetID,
getRemoteServiceClass().getName(), getRemoteServiceFilter());
assertNotNull(service);
traceCallStart("fireAsynch");
service.fireAsync(createRemoteConcat("Eclipse ", "sucks"));
traceCallEnd("fireAsynch");
Thread.sleep(ASYNC_WAITTIME);
}
public void testProxy() throws Exception {
final IRemoteService service = getRemoteService(targetID,
getRemoteServiceClass().getName(), getRemoteServiceFilter());
assertNotNull(service);
final IConcatService proxy = (IConcatService) service.getProxy();
assertNotNull(proxy);
traceCallStart("getProxy");
final String result = proxy.concat("ECF ", "sucks");
traceCallEnd("getProxy", result);
Thread.sleep(ASYNC_WAITTIME);
}
public void testAsyncResult() throws Exception {
final IRemoteService service = getRemoteService(targetID,
getRemoteServiceClass().getName(), getRemoteServiceFilter());
assertNotNull(service);
traceCallStart("callAsynchResult");
final IFuture result = service.callAsync(createRemoteConcat(
"ECF AsynchResults ", "are cool"));
Thread.sleep(ASYNC_WAITTIME);
traceCallEnd("callAsynchResult", result);
assertNotNull(result);
}
public void testGetLocallyRegisteredService() throws Exception {
String classname = getRemoteServiceClass().getName();
registerLocalService(classname, createRemoteService(),
createRemoteServiceProperties());
IRemoteServiceReference[] references = rsContainer.getContainerAdapter().getRemoteServiceReferences(new ID[] { rsContainer.getContainer().getID() }, classname, getRemoteServiceFilter());
assertNotNull(references);
assertTrue(references.length == 1);
assertTrue(references[0].getContainerID().equals(
rsContainer.getContainer().getID()));
Thread.sleep(ASYNC_WAITTIME);
}
private void registerLocalService(String name, Object service,
Dictionary properties) {
rsContainer.getContainerAdapter().registerRemoteService(
new String[] { name }, service, properties);
}
public void testGetRemoteServiceWithLocallyRegisteredService()
throws Exception {
String classname = getRemoteServiceClass().getName();
// Register service locally
registerLocalService(classname, createRemoteService(),
createRemoteServiceProperties());
// Now get remote service
final IRemoteService service = getRemoteService(targetID,
getRemoteServiceClass().getName(), getRemoteServiceFilter());
assertNotNull(service);
// Now get both
IRemoteServiceReference[] references = getRemoteServiceReferences(
new ID[] { rsContainer.getContainer().getID(), targetID }, classname,
getRemoteServiceFilter());
assertNotNull(references);
assertTrue(references.length == 2);
Thread.sleep(ASYNC_WAITTIME);
}
}