/******************************************************************************* * Copyright (c) 2008 IBM Corporation 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.osgi.tests.serviceregistry; import java.util.Hashtable; import junit.framework.Test; import junit.framework.TestSuite; import org.eclipse.osgi.tests.OSGiTestsActivator; import org.eclipse.osgi.tests.bundles.AbstractBundleTests; import org.osgi.framework.*; public class ServiceExceptionTests extends AbstractBundleTests { public static Test suite() { return new TestSuite(ServiceExceptionTests.class); } public void testServiceException01() { final String testMethodName = "testServiceException01"; //$NON-NLS-1$ // test a service factory which returns wrong object types ServiceExceptionServiceFactory wrongObjectFactory = new ServiceExceptionServiceFactory("A String"); //$NON-NLS-1$ Hashtable props = new Hashtable(); props.put("name", testMethodName); //$NON-NLS-1$ ServiceRegistration reg = OSGiTestsActivator.getContext().registerService(Runnable.class.getName(), wrongObjectFactory, props); ServiceExceptionFrameworkListener listener = new ServiceExceptionFrameworkListener(OSGiTestsActivator.getContext().getBundle(), null, ServiceException.FACTORY_ERROR); OSGiTestsActivator.getContext().addFrameworkListener(listener); try { ServiceReference[] refs = null; try { refs = OSGiTestsActivator.getContext().getServiceReferences(Runnable.class.getName(), "(name=" + testMethodName + ")"); //$NON-NLS-1$ //$NON-NLS-2$ } catch (InvalidSyntaxException e) { fail("Unexpected syntax error", e); //$NON-NLS-1$ } assertNotNull("service refs is null", refs); //$NON-NLS-1$ assertEquals("Wrong number of references", 1, refs.length); //$NON-NLS-1$ Runnable service = null; try { service = (Runnable) OSGiTestsActivator.getContext().getService(refs[0]); } catch (ClassCastException e) { fail("Unexpected cast exception", e); //$NON-NLS-1$ } assertNull("service is not null", service); //$NON-NLS-1$ listener.waitForEvent("Failed to fire ServiceException"); //$NON-NLS-1$ OSGiTestsActivator.getContext().ungetService(refs[0]); Error error = wrongObjectFactory.getUngetFailure(); if (error != null) throw error; } finally { if (reg != null) reg.unregister(); if (listener != null) OSGiTestsActivator.getContext().removeFrameworkListener(listener); } } public void testServiceException02() { final String testMethodName = "testServiceException02"; //$NON-NLS-1$ // test a service factory which returns null objects ServiceExceptionServiceFactory nullObjectFactory = new ServiceExceptionServiceFactory(null); Hashtable props = new Hashtable(); props.put("name", testMethodName); //$NON-NLS-1$ ServiceRegistration reg = OSGiTestsActivator.getContext().registerService(Runnable.class.getName(), nullObjectFactory, props); ServiceExceptionFrameworkListener listener = new ServiceExceptionFrameworkListener(OSGiTestsActivator.getContext().getBundle(), null, ServiceException.FACTORY_ERROR); OSGiTestsActivator.getContext().addFrameworkListener(listener); try { ServiceReference[] refs = null; try { refs = OSGiTestsActivator.getContext().getServiceReferences(Runnable.class.getName(), "(name=" + testMethodName + ")"); //$NON-NLS-1$ //$NON-NLS-2$ } catch (InvalidSyntaxException e) { fail("Unexpected syntax error", e); //$NON-NLS-1$ } assertNotNull("service refs is null", refs); //$NON-NLS-1$ assertEquals("Wrong number of references", 1, refs.length); //$NON-NLS-1$ Runnable service = null; try { service = (Runnable) OSGiTestsActivator.getContext().getService(refs[0]); } catch (ClassCastException e) { fail("Unexpected cast exception", e); //$NON-NLS-1$ } assertNull("service is not null", service); //$NON-NLS-1$ listener.waitForEvent("Failed to fire ServiceException"); //$NON-NLS-1$ OSGiTestsActivator.getContext().ungetService(refs[0]); Error error = nullObjectFactory.getUngetFailure(); if (error != null) throw error; } finally { if (reg != null) reg.unregister(); if (listener != null) OSGiTestsActivator.getContext().removeFrameworkListener(listener); } } public void testServiceException03() { final String testMethodName = "testServiceException03"; //$NON-NLS-1$ // test a service factory which throws a RuntimeException RuntimeException cause = new RuntimeException(testMethodName); ServiceExceptionServiceFactory runtimeExceptionFactory = new ServiceExceptionServiceFactory(cause); Hashtable props = new Hashtable(); props.put("name", testMethodName); //$NON-NLS-1$ ServiceRegistration reg = OSGiTestsActivator.getContext().registerService(Runnable.class.getName(), runtimeExceptionFactory, props); ServiceExceptionFrameworkListener listener = new ServiceExceptionFrameworkListener(OSGiTestsActivator.getContext().getBundle(), cause, ServiceException.FACTORY_EXCEPTION); OSGiTestsActivator.getContext().addFrameworkListener(listener); try { ServiceReference[] refs = null; try { refs = OSGiTestsActivator.getContext().getServiceReferences(Runnable.class.getName(), "(name=" + testMethodName + ")"); //$NON-NLS-1$ //$NON-NLS-2$ } catch (InvalidSyntaxException e) { fail("Unexpected syntax error", e); //$NON-NLS-1$ } assertNotNull("service refs is null", refs); //$NON-NLS-1$ assertEquals("Wrong number of references", 1, refs.length); //$NON-NLS-1$ Runnable service = null; try { service = (Runnable) OSGiTestsActivator.getContext().getService(refs[0]); } catch (ClassCastException e) { fail("Unexpected cast exception", e); //$NON-NLS-1$ } assertNull("service is not null", service); //$NON-NLS-1$ listener.waitForEvent("Failed to fire ServiceException"); //$NON-NLS-1$ OSGiTestsActivator.getContext().ungetService(refs[0]); Error error = runtimeExceptionFactory.getUngetFailure(); if (error != null) throw error; } finally { if (reg != null) reg.unregister(); if (listener != null) OSGiTestsActivator.getContext().removeFrameworkListener(listener); } } public void testServiceException04() { final String testMethodName = "testServiceException04"; //$NON-NLS-1$ // test a service factory which throws an Error Error cause = new Error(testMethodName); ServiceExceptionServiceFactory errorFactory = new ServiceExceptionServiceFactory(cause); Hashtable props = new Hashtable(); props.put("name", testMethodName); //$NON-NLS-1$ ServiceRegistration reg = OSGiTestsActivator.getContext().registerService(Runnable.class.getName(), errorFactory, props); ServiceExceptionFrameworkListener listener = new ServiceExceptionFrameworkListener(OSGiTestsActivator.getContext().getBundle(), cause, ServiceException.FACTORY_EXCEPTION); OSGiTestsActivator.getContext().addFrameworkListener(listener); try { ServiceReference[] refs = null; try { refs = OSGiTestsActivator.getContext().getServiceReferences(Runnable.class.getName(), "(name=" + testMethodName + ")"); //$NON-NLS-1$ //$NON-NLS-2$ } catch (InvalidSyntaxException e) { fail("Unexpected syntax error", e); //$NON-NLS-1$ } assertNotNull("service refs is null", refs); //$NON-NLS-1$ assertEquals("Wrong number of references", 1, refs.length); //$NON-NLS-1$ Runnable service = null; try { service = (Runnable) OSGiTestsActivator.getContext().getService(refs[0]); } catch (ClassCastException e) { fail("Unexpected cast exception", e); //$NON-NLS-1$ } assertNull("service is not null", service); //$NON-NLS-1$ listener.waitForEvent("Failed to fire ServiceException"); //$NON-NLS-1$ OSGiTestsActivator.getContext().ungetService(refs[0]); Error error = errorFactory.getUngetFailure(); if (error != null) throw error; } finally { if (reg != null) reg.unregister(); if (listener != null) OSGiTestsActivator.getContext().removeFrameworkListener(listener); } } class ServiceExceptionServiceFactory implements ServiceFactory { private final Object serviceOrThrowable; private Error ungetFailure; public ServiceExceptionServiceFactory(Object serviceOrThrowable) { this.serviceOrThrowable = serviceOrThrowable; } public Object getService(Bundle bundle, ServiceRegistration registration) { if (serviceOrThrowable instanceof RuntimeException) throw (RuntimeException) serviceOrThrowable; if (serviceOrThrowable instanceof Error) throw (Error) serviceOrThrowable; return serviceOrThrowable; } public synchronized void ungetService(Bundle bundle, ServiceRegistration registration, Object service) { try { if (serviceOrThrowable instanceof RuntimeException) fail("Unexpected call to ungetService: " + serviceOrThrowable); //$NON-NLS-1$ if (serviceOrThrowable instanceof Error) fail("Unexpected call to ungetService: " + serviceOrThrowable); //$NON-NLS-1$ } catch (Error error) { ungetFailure = error; } } public Error getUngetFailure() { return ungetFailure; } } class ServiceExceptionFrameworkListener implements FrameworkListener { private final Bundle registrationBundle; private final Throwable exception; private final int exceptionType; private boolean waitForEvent = true; public ServiceExceptionFrameworkListener(Bundle registrationBundle, Throwable exception, int exceptionType) { this.registrationBundle = registrationBundle; this.exception = exception; this.exceptionType = exceptionType; } public void frameworkEvent(FrameworkEvent event) { if (event.getBundle() != registrationBundle) return; if (!(event.getThrowable() instanceof ServiceException)) return; if (((ServiceException) event.getThrowable()).getCause() != exception) return; if (((ServiceException) event.getThrowable()).getType() != exceptionType) return; notifyWaiter(); } private synchronized void notifyWaiter() { waitForEvent = false; notifyAll(); } public synchronized void waitForEvent(String failMessage) { if (waitForEvent) { try { wait(10000); } catch (InterruptedException e) { fail("unexpected interuption", e); //$NON-NLS-1$ } // still waiting for event; we now fail if (waitForEvent) fail(failMessage); } } } }