Package org.eclipse.ecf.tests.remoteservice

Source Code of org.eclipse.ecf.tests.remoteservice.AbstractRemoteServiceTest

/****************************************************************************
* Copyright (c) 2004 Composent, Inc. 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:
*    Composent, Inc. - initial API and implementation
*****************************************************************************/

package org.eclipse.ecf.tests.remoteservice;

import java.util.Dictionary;
import java.util.Enumeration;
import java.util.Properties;

import org.eclipse.ecf.core.ContainerConnectException;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.core.identity.Namespace;
import org.eclipse.ecf.core.util.ECFException;
import org.eclipse.ecf.remoteservice.Constants;
import org.eclipse.ecf.remoteservice.IRemoteCall;
import org.eclipse.ecf.remoteservice.IRemoteCallListener;
import org.eclipse.ecf.remoteservice.IRemoteService;
import org.eclipse.ecf.remoteservice.IRemoteServiceContainerAdapter;
import org.eclipse.ecf.remoteservice.IRemoteServiceID;
import org.eclipse.ecf.remoteservice.IRemoteServiceListener;
import org.eclipse.ecf.remoteservice.IRemoteServiceProxy;
import org.eclipse.ecf.remoteservice.IRemoteServiceReference;
import org.eclipse.ecf.remoteservice.IRemoteServiceRegistration;
import org.eclipse.ecf.remoteservice.events.IRemoteCallEvent;
import org.eclipse.ecf.remoteservice.events.IRemoteServiceEvent;
import org.eclipse.ecf.remoteservice.events.IRemoteServiceRegisteredEvent;
import org.eclipse.ecf.tests.ContainerAbstractTestCase;
import org.eclipse.equinox.concurrent.future.IFuture;
import org.osgi.framework.InvalidSyntaxException;

/**
*
*/
public abstract class AbstractRemoteServiceTest extends
    ContainerAbstractTestCase {

  protected static final int SLEEPTIME = new Integer(System.getProperty(
      "org.eclipse.ecf.tests.remoteservice.AbstractRemoteServiceTest.SLEEPTIME", "5000"))
      .intValue();

  protected IRemoteServiceContainerAdapter[] adapters = null;

  protected IRemoteServiceID[] ids;

  /*
   * (non-Javadoc)
   *
   * @see
   * org.eclipse.ecf.tests.ContainerAbstractTestCase#getClientContainerName()
   */
  protected abstract String getClientContainerName();

  protected void setClientCount(int count) {
    super.setClientCount(count);
    adapters = new IRemoteServiceContainerAdapter[count];
    ids = new IRemoteServiceID[count];
  }

  protected void setupRemoteServiceAdapters() throws Exception {
    if (server != null)
      server.getAdapter(IRemoteServiceContainerAdapter.class);
    final int clientCount = getClientCount();
    for (int i = 0; i < clientCount; i++) {
      adapters[i] = (IRemoteServiceContainerAdapter) getClients()[i]
          .getAdapter(IRemoteServiceContainerAdapter.class);
    }
  }

  protected IRemoteServiceContainerAdapter[] getRemoteServiceAdapters() {
    return adapters;
  }

  protected IRemoteServiceListener createRemoteServiceListener(
      final boolean server) {
    return new IRemoteServiceListener() {
      public void handleServiceEvent(IRemoteServiceEvent event) {
        System.out.println((server ? "server" : "client")
            + "handleServiceEvent(" + event + ")");
        if (event instanceof IRemoteServiceRegisteredEvent) {
          if (server) {
            ids[0] = event.getReference().getID();
          } else {
            ids[1] = event.getReference().getID();
          }
        }
      }
    };
  }

  protected void addRemoteServiceListeners() {
    for (int i = 0; i < adapters.length; i++) {
      adapters[i]
          .addRemoteServiceListener(createRemoteServiceListener(i == 0));
    }
  }

  protected IRemoteServiceRegistration registerService(
      IRemoteServiceContainerAdapter adapter, String serviceInterface,
      Object service, Dictionary serviceProperties, int sleepTime) {
    final IRemoteServiceRegistration result = adapter
        .registerRemoteService(new String[] { serviceInterface },
            service, serviceProperties);
    sleep(sleepTime);
    return result;
  }

  protected IRemoteServiceReference[] getRemoteServiceReferences(
      IRemoteServiceContainerAdapter adapter, ID target, ID[] idFilter,
      String clazz, String filter) throws ContainerConnectException {
    try {
      return adapter.getRemoteServiceReferences(target, idFilter, clazz,
          filter);
    } catch (final InvalidSyntaxException e) {
      fail("should not happen");
    }
    return null;
  }

  protected IRemoteService getRemoteService(
      IRemoteServiceContainerAdapter adapter, ID target, ID[] idFilter,
      String clazz, String filter, int sleepTime)
      throws ContainerConnectException {
    final IRemoteServiceReference[] refs = getRemoteServiceReferences(
        adapter, target, idFilter, clazz, filter);
    if (refs == null || refs.length == 0)
      return null;
    return adapter.getRemoteService(refs[0]);
  }

  protected String getFilterFromServiceProperties(Dictionary serviceProperties) {
    StringBuffer filter = null;
    if (serviceProperties != null && serviceProperties.size() > 0) {
      filter = new StringBuffer("(&");
      for (final Enumeration e = serviceProperties.keys(); e
          .hasMoreElements();) {
        final Object key = e.nextElement();
        final Object val = serviceProperties.get(key);
        if (key != null && val != null) {
          filter.append("(").append(key).append("=").append(val)
              .append(")");
        }
      }
      filter.append(")");
    }
    return (filter == null) ? null : filter.toString();
  }

  protected IRemoteService registerAndGetRemoteService(
      IRemoteServiceContainerAdapter server,
      IRemoteServiceContainerAdapter client, ID target, ID[] idFilter,
      String serviceName, Dictionary serviceProperties, int sleepTime)
      throws ContainerConnectException {
    registerService(server, serviceName, createService(),
        serviceProperties, sleepTime);
    return getRemoteService(client, target, idFilter, serviceName,
        getFilterFromServiceProperties(serviceProperties), sleepTime);
  }

  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 5000;
      }
    };
  }

  protected Object createService() {
    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);
      }
    };
  }

  public void testRemoteServiceAdapters() throws Exception {
    final IRemoteServiceContainerAdapter[] adapters = getRemoteServiceAdapters();
    assertNotNull(adapters);
    for (int i = 0; i < adapters.length; i++)
      assertNotNull(adapters[i]);
    Thread.sleep(SLEEPTIME);
  }

  public void testRemoteServiceNamespace() throws Exception {
    final IRemoteServiceContainerAdapter[] adapters = getRemoteServiceAdapters();
    assertNotNull(adapters);
    for (int i = 0; i < adapters.length; i++) {
      Namespace namespace = adapters[i].getRemoteServiceNamespace();
      assertNotNull(namespace);
    }
    Thread.sleep(SLEEPTIME);
  }

  public void testRegisterService() throws Exception {
    final IRemoteServiceContainerAdapter[] adapters = getRemoteServiceAdapters();
    // adapter [0] is the service 'server'
    final IRemoteServiceRegistration reg = registerService(adapters[0],
        IConcatService.class.getName(), createService(),
        customizeProperties(null), 0);
    assertNotNull(reg);
    IRemoteServiceID remoteServiceID = reg.getID();
    assertNotNull(remoteServiceID);
    assertNotNull(remoteServiceID.getContainerID());
    Thread.sleep(SLEEPTIME);
  }

  public void testUnregisterService() throws Exception {
    final IRemoteServiceContainerAdapter[] adapters = getRemoteServiceAdapters();
    // adapter [0] is the service 'server'
    final IRemoteServiceRegistration reg = registerService(adapters[0],
        IConcatService.class.getName(), createService(),
        customizeProperties(null), SLEEPTIME);
    assertNotNull(reg);
    assertNotNull(reg.getContainerID());

    reg.unregister();
    Thread.sleep(SLEEPTIME);
  }

  protected ID getConnectTargetID() {
    return null;
  }

  protected ID[] getIDFilter() {
    return null;
  }

  public void testGetServiceReferences() throws Exception {
    final IRemoteServiceContainerAdapter[] adapters = getRemoteServiceAdapters();
    // Register service on client[0]
    registerService(adapters[0], IConcatService.class.getName(),
        createService(), customizeProperties(null), SLEEPTIME);

    final IRemoteServiceReference[] refs = getRemoteServiceReferences(
        adapters[1], getConnectTargetID(), getIDFilter(),
        IConcatService.class.getName(), null);

    assertTrue(refs != null);
    assertTrue(refs.length > 0);
    Thread.sleep(SLEEPTIME);
  }

  public void testGetServiceReferencesWithFilter() throws Exception {
    final IRemoteServiceContainerAdapter[] adapters = getRemoteServiceAdapters();
    final Properties props = new Properties();
    props.put("foo", "bar");
    props.put("foo1", "bar");
    registerService(adapters[0], IConcatService.class.getName(),
        createService(), customizeProperties(props), SLEEPTIME);

    final IRemoteServiceReference[] refs = getRemoteServiceReferences(
        adapters[1], getConnectTargetID(), getIDFilter(),
        IConcatService.class.getName(),
        getFilterFromServiceProperties(props));

    assertTrue(refs != null);
    assertTrue(refs.length > 0);
    Thread.sleep(SLEEPTIME);
  }

  public void testGetServiceReferencesWithFilterFail() throws Exception {
    final IRemoteServiceContainerAdapter[] adapters = getRemoteServiceAdapters();
    final Properties props = new Properties();
    props.put("foo", "bar");
    props.put("foo1", "bar");
    registerService(adapters[0], IConcatService.class.getName(),
        createService(), customizeProperties(props), SLEEPTIME);

    // Create dictionary that is *not* the same as props, so the filter
    // should miss
    final Properties missProps = new Properties();
    missProps.put("bar", "foo");
    final String missFilter = getFilterFromServiceProperties(missProps);

    final IRemoteServiceReference[] refs = getRemoteServiceReferences(
        adapters[1], getConnectTargetID(), getIDFilter(),
        IConcatService.class.getName(), missFilter);

    assertTrue(refs == null);
    Thread.sleep(SLEEPTIME);
  }

  public void testGetService() throws Exception {
    final IRemoteService service = registerAndGetRemoteService();
    assertNotNull(service);
    Thread.sleep(SLEEPTIME);
  }

  public void testGetProxy() throws Exception {
    final IRemoteService service = registerAndGetRemoteService();
    assertNotNull(service);
    Object proxy = service.getProxy();
    assertTrue(proxy instanceof IRemoteServiceProxy);
    Thread.sleep(SLEEPTIME);
  }

  public void testGetProxyNoRemoteServiceProxy() throws Exception {
    final IRemoteServiceContainerAdapter[] adapters = getRemoteServiceAdapters();
    Properties props = new Properties();
    props.put(Constants.SERVICE_PREVENT_RSPROXY,"true");
    final IRemoteService service = registerAndGetRemoteService(adapters[0], adapters[1],
        getClient(0).getConnectedID(), getIDFilter(),
        IConcatService.class.getName(), customizeProperties(props), SLEEPTIME);
    assertNotNull(service);
    Object proxy = service.getProxy();
    assertTrue(!(proxy instanceof IRemoteServiceProxy));
    Thread.sleep(SLEEPTIME);
  }

  protected IRemoteCall createRemoteConcat(String first, String second) {
    return createRemoteCall("concat", new Object[] { first, second });
  }

  protected IRemoteService registerAndGetRemoteService()
      throws ContainerConnectException {
    final IRemoteServiceContainerAdapter[] adapters = getRemoteServiceAdapters();
    return registerAndGetRemoteService(adapters[0], adapters[1],
        getClient(0).getConnectedID(), getIDFilter(),
        IConcatService.class.getName(), customizeProperties(null), SLEEPTIME);
  }

  protected IRemoteCallListener createRemoteCallListener() {
    return new IRemoteCallListener() {
      public void handleEvent(IRemoteCallEvent event) {
        System.out.println("CLIENT.handleEvent(" + event + ")");
      }
    };
  }

  public void testCallSynch() throws Exception {
    final IRemoteService service = registerAndGetRemoteService();

    if (service == null)
      return;

    traceCallStart("callSynch");
    final Object result = service.callSync(createRemoteConcat("Eclipse ",
        "is cool"));
    traceCallEnd("callSynch", result);

    assertNotNull(result);
    assertTrue(result.equals("Eclipse ".concat("is cool")));
    Thread.sleep(SLEEPTIME);
  }

  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.");
  }

  public void testBadCallSynch() throws Exception {
    final IRemoteService service = registerAndGetRemoteService();

    if (service == null)
      return;
    // Following should throw exception because "concat1" method does not
    // exist
    try {
      service.callSync(createRemoteCall("concat1", new Object[] {
          "first", "second" }));
      fail();
    } catch (final ECFException e) {
      // Exception should occur
    }

    // Following should throw exception because wrong number of params for
    // concat
    try {
      service.callSync(createRemoteCall("concat",
          new Object[] { "first" }));
      fail();
    } catch (final ECFException e) {
      // Exception should occur
    }
    Thread.sleep(SLEEPTIME);
  }

  public void testCallAsynch() throws Exception {
    final IRemoteService service = registerAndGetRemoteService();
    if (service == null)
      return;
    traceCallStart("callAsynch");
    service.callAsync(createRemoteConcat("ECF ", "is cool"),
        createRemoteCallListener());
    traceCallEnd("callAsynch");
    Thread.sleep(SLEEPTIME);
  }

  public void testFireAsynch() throws Exception {
    final IRemoteService service = registerAndGetRemoteService();
    if (service == null)
      return;
    traceCallStart("fireAsynch");
    service.fireAsync(createRemoteConcat("Eclipse ", "sucks"));
    traceCallEnd("fireAsynch");
    Thread.sleep(SLEEPTIME);
  }

  public void testProxy() throws Exception {
    final IRemoteService service = registerAndGetRemoteService();
    if (service == null)
      return;
    final IConcatService proxy = (IConcatService) service.getProxy();
    assertNotNull(proxy);
    traceCallStart("getProxy");
    final String result = proxy.concat("ECF ", "sucks");
    traceCallEnd("getProxy", result);
    Thread.sleep(SLEEPTIME);
  }

  public void testAsyncResult() throws Exception {
    final IRemoteService service = registerAndGetRemoteService();
    if (service == null)
      return;
    traceCallStart("callAsynchResult");
    final IFuture result = service.callAsync(createRemoteConcat(
        "ECF AsynchResults ", "are cool"));
    traceCallEnd("callAsynchResult", result);
    assertNotNull(result);
    Thread.sleep(SLEEPTIME);
  }

  protected Dictionary customizeProperties(Dictionary props) {
    return props;
  }
}
TOP

Related Classes of org.eclipse.ecf.tests.remoteservice.AbstractRemoteServiceTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.