Package org.eclipse.ecf.tests.osgi.services.remoteserviceadmin

Source Code of org.eclipse.ecf.tests.osgi.services.remoteserviceadmin.AbstractRemoteServiceRegisterTest

/*******************************************************************************
* 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.osgi.services.remoteserviceadmin;

import java.util.Map;
import java.util.Properties;
import java.util.Vector;

import org.eclipse.ecf.core.ContainerFactory;
import org.eclipse.ecf.core.ContainerTypeDescription;
import org.eclipse.ecf.core.IContainer;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.remoteservice.Constants;
import org.eclipse.ecf.remoteservice.IRemoteServiceContainerAdapter;
import org.eclipse.ecf.remoteservice.IRemoteServiceReference;
import org.osgi.framework.ServiceRegistration;
import org.osgi.service.remoteserviceadmin.EndpointDescription;
import org.osgi.service.remoteserviceadmin.ExportReference;
import org.osgi.service.remoteserviceadmin.RemoteConstants;
import org.osgi.service.remoteserviceadmin.RemoteServiceAdminEvent;
import org.osgi.service.remoteserviceadmin.RemoteServiceAdminListener;

public abstract class AbstractRemoteServiceRegisterTest extends
    AbstractDistributionTest {

  protected static final int REGISTER_WAIT = 2000;
  private ServiceRegistration registration;
  protected Vector<RemoteServiceAdminEvent> remoteServiceAdminEvents = new Vector<RemoteServiceAdminEvent>();
 
  protected abstract String getServerContainerTypeName();
 
  protected void tearDown() throws Exception {
    remoteServiceAdminEvents.clear();
    // Then unregister
    if(registration != null) {
      registration.unregister();
      registration = null;
    }
    Thread.sleep(REGISTER_WAIT);
   
    super.tearDown();
   
    IContainer [] containers = getContainerManager().getAllContainers();
    for(int i=0; i < containers.length; i++) {
      containers[i].dispose();
    }
    getContainerManager().removeAllContainers();
   
  }
 
  protected void registerWaitAndUnregister(Properties props, boolean verifyRegistration) throws Exception {
    // Actually register with default service (IConcatService)
    registration = registerDefaultService(props);
    // Wait a while
    Thread.sleep(REGISTER_WAIT);
    // Verify
    if (verifyRegistration) {
      verifyRemoteServiceRegisteredWithServer();
    }
  }

  private void verifyRemoteServiceRegisteredWithServer() throws Exception {
    verifyRemoteServiceRegistered(getServerContainerAdapter(), getDefaultServiceClasses()[0]);
  }

  protected void verifyRemoteServiceRegistered(IRemoteServiceContainerAdapter adapter, String className) throws Exception {
    IRemoteServiceReference [] refs = adapter.getRemoteServiceReferences((ID[]) null, className, null);
    assertNotNull(refs);
    assertTrue(refs.length > 0);
    String[] objectClasses = (String[]) refs[0].getProperty(Constants.OBJECTCLASS);
    assertTrue(objectClasses != null);
    assertTrue(objectClasses.length > 0);
    assertTrue(objectClasses[0].equals(className));
  }
 
  private IRemoteServiceContainerAdapter getServerContainerAdapter() {
    if (this.server != null) return (IRemoteServiceContainerAdapter) this.server.getAdapter(IRemoteServiceContainerAdapter.class);
    IContainer [] containers = getContainerManager().getAllContainers();
    String containerType = getServerContainerTypeName();
    for(int i=0; i < containers.length; i++) {
      ContainerTypeDescription ctd = getContainerManager().getContainerTypeDescription(containers[i].getID());
      if (ctd != null && ctd.getName().equals(containerType)) return (IRemoteServiceContainerAdapter) containers[i].getAdapter(IRemoteServiceContainerAdapter.class);
    }
    return null;
  }

  public void testRegisterOnCreatedServer() throws Exception {
    Properties props = getServiceProperties();
    registerWaitAndUnregister(props, true);
  }

  private Properties getServiceProperties() {
    Properties props = new Properties();
    // Set config to the server container name/provider config name (e.g. ecf.generic.server)
    props.put(RemoteConstants.SERVICE_EXPORTED_CONFIGS, getServerContainerTypeName());
    // Set the service exported interfaces to all
    props.put(RemoteConstants.SERVICE_EXPORTED_INTERFACES, "*");
    return props;
  }

  public void testRegisterOnCreatedServerWithIdentity() throws Exception {
    Properties props = getServiceProperties();
    // set the container factory arguments to the server identity (e.g. ecftcp://localhost:3282/server)
    props.put(org.eclipse.ecf.osgi.services.remoteserviceadmin.RemoteConstants.SERVICE_EXPORTED_CONTAINER_FACTORY_ARGS, new String[] { getServerIdentity() } );
   
    props.put("customsvcprop1","foo");
    props.put("customsvcprop2", "bar");
    registerWaitAndUnregister(props, true);
  }

  public void testRegisterOnExistingServer() throws Exception {
    // Create server container
    this.server = ContainerFactory.getDefault().createContainer(getServerContainerTypeName(),new Object[] {createServerID()});
   
    Properties props = getServiceProperties();
   
    registerWaitAndUnregister(props, true);
  }

  public void testRegisterOnExistingServerWithIntents() throws Exception {
    // Create server container
    this.server = ContainerFactory.getDefault().createContainer(getServerContainerTypeName(),new Object[] {createServerID()});
   
    Properties props = getServiceProperties();
    // Add intents
    props.put(RemoteConstants.SERVICE_INTENTS, "passByValue");
    registerWaitAndUnregister(props, true);
  }

  public void testRegisterOnExistingServerWithMissingIntents() throws Exception {
    // Create server container
    this.server = ContainerFactory.getDefault().createContainer(getServerContainerTypeName(),new Object[] {createServerID()});
   
    Properties props = getServiceProperties();
    // Add intent that no one actually exposes
    props.put(RemoteConstants.SERVICE_INTENTS, "foobar");
    registerWaitAndUnregister(props, false);
  }

  public void testRegisterOnExistingServerWithExportedIntents() throws Exception {
    // Create server container
    this.server = ContainerFactory.getDefault().createContainer(getServerContainerTypeName(),new Object[] {createServerID()});
   
    Properties props = getServiceProperties();
    // Add intents
    props.put(RemoteConstants.SERVICE_EXPORTED_INTENTS, "passByValue");
    registerWaitAndUnregister(props, true);
  }

  public void testRegisterOnExistingServerWithMissingExportedIntents() throws Exception {
    // Create server container
    this.server = ContainerFactory.getDefault().createContainer(getServerContainerTypeName(),new Object[] {createServerID()});
   
    Properties props = getServiceProperties();
    // Add intent that no one actually exposes
    props.put(RemoteConstants.SERVICE_EXPORTED_INTENTS, "foobar");
    registerWaitAndUnregister(props, false);
  }

  public void testRegisterOnExistingServerWithExportedExtraIntents() throws Exception {
    // Create server container
    this.server = ContainerFactory.getDefault().createContainer(getServerContainerTypeName(),new Object[] {createServerID()});
   
    Properties props = getServiceProperties();
    // Add intents
    props.put(RemoteConstants.SERVICE_EXPORTED_INTENTS_EXTRA, "passByValue");
    registerWaitAndUnregister(props, true);
  }

  public void testRegisterOnExistingServerWithMissingExportedExtraIntents() throws Exception {
    // Create server container
    this.server = ContainerFactory.getDefault().createContainer(getServerContainerTypeName(),new Object[] {createServerID()});
   
    Properties props = getServiceProperties();
    // Add intent that no one actually exposes
    props.put(RemoteConstants.SERVICE_EXPORTED_INTENTS_EXTRA, "foobar");
    registerWaitAndUnregister(props, false);
  }

  public void testRegisterOnExistingServerWithContainerID() throws Exception {
    // Create server container
    this.server = ContainerFactory.getDefault().createContainer(getServerContainerTypeName(),new Object[] {createServerID()});
   
    final Properties props = getServiceProperties();
    props.put(org.eclipse.ecf.osgi.services.remoteserviceadmin.RemoteConstants.SERVICE_EXPORTED_CONTAINER_ID, this.server.getID());
    registerWaitAndUnregister(props, true);
  }

  public void testRegisterOnExistingServerWithIdentity() throws Exception {
    // Create server container
    this.server = ContainerFactory.getDefault().createContainer(getServerContainerTypeName(),getServerIdentity());
   
    Properties props = getServiceProperties();
   
    registerWaitAndUnregister(props, true);
  }
 
  protected boolean containsEventType(int eventType) {
    for(RemoteServiceAdminEvent event: remoteServiceAdminEvents) if (event.getType() == eventType) return true;
    return false;
  }
 
  protected RemoteServiceAdminListener createRemoteServiceAdminListener() {
    return new RemoteServiceAdminListener() {
      public void remoteAdminEvent(RemoteServiceAdminEvent event) {
        System.out.println("remoteAdminEvent event="+event);
        remoteServiceAdminEvents.add(event);
      }
    };
  }
 
  public void testRemoteServiceAdminListener() throws Exception {
    RemoteServiceAdminListener listener = createRemoteServiceAdminListener();
    ServiceRegistration listenerReg = getContext().registerService(RemoteServiceAdminListener.class.getName(), listener, null);
   
    Properties props = getServiceProperties();
    registration = registerDefaultService(props);
    // Wait a while
    Thread.sleep(REGISTER_WAIT);

    assertTrue(remoteServiceAdminEvents.size() > 0);
    assertTrue(containsEventType(RemoteServiceAdminEvent.EXPORT_REGISTRATION));
   
    // Now bring down
    registration.unregister();
    registration = null;
   
    // Wait a while
    Thread.sleep(REGISTER_WAIT);

    assertTrue(remoteServiceAdminEvents.size() > 2);
    assertTrue(containsEventType(RemoteServiceAdminEvent.EXPORT_UNREGISTRATION));
   
    // finally unregister the listenerReg
    listenerReg.unregister();
  }

  public void testRegisterAndUpdateProperties() throws Exception {
    remoteServiceAdminEvents.clear();
    // register RemoteServiceAdminListener
    ServiceRegistration listenerReg = getContext().registerService(RemoteServiceAdminListener.class.getName(), createRemoteServiceAdminListener(), null);
    // Create server container
    this.server = ContainerFactory.getDefault().createContainer(getServerContainerTypeName(),new Object[] {createServerID()});
    // Create props
    Properties props = getServiceProperties();
    // Put "1" for "testonekey"
    props.put("testonekey", "1");
    // Actually register with default service (IConcatService) as a remote service
    registration = registerDefaultService(props);
    ExportReference exportRef = null;
    Thread.sleep(15000);
    for(RemoteServiceAdminEvent e: remoteServiceAdminEvents)
      if (e.getType() == RemoteServiceAdminEvent.EXPORT_REGISTRATION) exportRef = e.getExportReference();
   
    assertTrue(exportRef != null);
    // remoteServiceAdminEvents should have the Export registration
    assertTrue(remoteServiceAdminEvents.size() > 0);
    // Get ExportReference
    EndpointDescription oldED = exportRef.getExportedEndpoint();
    assertNotNull(oldED);
    Map<String,?> oldEDProperties = oldED.getProperties();
    assertNotNull(oldEDProperties);
    assertTrue("1".equals(oldEDProperties.get("testonekey")));
    assertTrue(oldEDProperties.get("testtwokey")==null);

    // Change testonekey value to "two" and set a new property "testtwokey" to "2"
    props.put("testonekey", "two");
    props.put("testtwokey", "2");
    // Set/update the properties on the registration
    this.registration.setProperties(props);
   
    // Now get new EndpointDescription and test that new properties have been changed in EndpointDescription
    EndpointDescription updatedED = exportRef.getExportedEndpoint();
    assertNotNull(updatedED);
    Map<String,?> updatedEDProperties = updatedED.getProperties();
    assertNotNull(updatedEDProperties);
    assertTrue("two".equals(updatedEDProperties.get("testonekey")));
    assertTrue("2".equals(updatedEDProperties.get("testtwokey")));
   
    Thread.sleep(15000);
   
    listenerReg.unregister();
  }

}
TOP

Related Classes of org.eclipse.ecf.tests.osgi.services.remoteserviceadmin.AbstractRemoteServiceRegisterTest

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.