You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by cl...@apache.org on 2008/10/24 17:48:19 UTC

svn commit: r707659 [2/3] - in /felix/trunk/ipojo: core/src/main/java/org/apache/felix/ipojo/util/ handler/eventadmin/src/main/java/org/apache/felix/ipojo/handlers/event/ handler/eventadmin/src/main/java/org/apache/felix/ipojo/handlers/event/publisher/...

Modified: felix/trunk/ipojo/tests/handler/eventadmin/src/main/java/org/apache/felix/ipojo/test/BadTests.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/tests/handler/eventadmin/src/main/java/org/apache/felix/ipojo/test/BadTests.java?rev=707659&r1=707658&r2=707659&view=diff
==============================================================================
--- felix/trunk/ipojo/tests/handler/eventadmin/src/main/java/org/apache/felix/ipojo/test/BadTests.java (original)
+++ felix/trunk/ipojo/tests/handler/eventadmin/src/main/java/org/apache/felix/ipojo/test/BadTests.java Fri Oct 24 08:48:18 2008
@@ -1,876 +1,964 @@
-/* 
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.felix.ipojo.test;
-
-import java.util.Dictionary;
-import java.util.Hashtable;
-
-import org.apache.felix.ipojo.ComponentFactory;
-import org.apache.felix.ipojo.ComponentInstance;
-import org.apache.felix.ipojo.ConfigurationException;
-import org.apache.felix.ipojo.MissingHandlerException;
-import org.apache.felix.ipojo.UnacceptableConfiguration;
-import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
-import org.apache.felix.ipojo.metadata.Attribute;
-import org.apache.felix.ipojo.metadata.Element;
-import org.apache.felix.ipojo.parser.ManifestMetadataParser;
-import org.apache.felix.ipojo.parser.ParseException;
-import org.apache.felix.ipojo.test.donut.Donut;
-import org.apache.felix.ipojo.test.donut.DonutConsumer;
-import org.apache.felix.ipojo.test.donut.DonutProvider;
-import org.apache.felix.ipojo.test.util.IPojoTestUtils;
-import org.osgi.framework.ServiceReference;
-
-/**
- * Test the good behaviour of the EventAdminHandler.
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class BadTests extends OSGiTestCase {
-
-    /**
-     * The namespace of the Event admin handler.
-     */
-    private static final String NAMESPACE = "org.apache.felix.ipojo.handlers.event.EventAdminHandler";
-
-    /**
-     * The available components.
-     */
-    private Element[] m_components;
-
-    /**
-     * The description of a component that uses an event publisher.
-     */
-    private Element m_provider;
-
-    /**
-     * The event publisher description.
-     */
-    private Element m_publisher;
-
-    /**
-     * The name attribute of the event publisher.
-     */
-    private Attribute m_publisherName;
-
-    /**
-     * The field attribute of the event publisher.
-     */
-    private Attribute m_publisherField;
-
-    /**
-     * The topics attribute of the event publisher.
-     */
-    private Attribute m_publisherTopics;
-
-    /**
-     * The data-key attribute of the event publisher.
-     */
-    private Attribute m_publisherDataKey;
-
-    /**
-     * The synchronous attribute of the event publisher.
-     */
-    private Attribute m_publisherSynchronous;
-
-    /**
-     * The description of a component that uses an event subscriber.
-     */
-    private Element m_consumer;
-
-    /**
-     * The event subscriber description.
-     */
-    private Element m_subscriber;
-
-    /**
-     * The name attribute of the event subscriber.
-     */
-    private Attribute m_subscriberName;
-
-    /**
-     * The callback attribute of the event subscriber.
-     */
-    private Attribute m_subscriberCallback;
-
-    /**
-     * The topics attribute of the event subscriber.
-     */
-    private Attribute m_subscriberTopics;
-
-    /**
-     * The data-key attribute of the event subscriber.
-     */
-    private Attribute m_subscriberDataKey;
-
-    /**
-     * The data-type attribute of the event subscriber.
-     */
-    private Attribute m_subscriberDataType;
-
-    private Element getManipulationForComponent(String compName) {
-        for (int i = 0; i < m_components.length; i++) {
-            if (m_components[i].containsAttribute("name")
-                    && m_components[i].getAttribute("name").equals(compName)) {
-                return m_components[i].getElements("manipulation")[0];
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Initialization before test cases.
-     * 
-     * Create all the instances
-     * 
-     */
-    public void setUp() {
-
-        /**
-         * Get the list of available components.
-         */
-        try {
-            String header = (String) context.getBundle().getHeaders().get(
-                    "iPOJO-Components");
-            m_components = ManifestMetadataParser.parseHeaderMetadata(header)
-                    .getElements("component");
-        } catch (ParseException e) {
-            fail("Parse Exception when parsing iPOJO-Component");
-        }
-
-        /**
-         * Initialize the standard publishing component (based on the
-         * asynchronous donut provider).
-         */
-        m_provider = new Element("component", "");
-        m_provider.addAttribute(new Attribute("className",
-                "org.apache.felix.ipojo.test.donut.DonutProviderImpl"));
-        m_provider.addAttribute(new Attribute("name",
-                "standard donut provider for bad tests"));
-
-        // The provided service of the publisher
-        Element providesDonutProvider = new Element("provides", "");
-        providesDonutProvider.addAttribute(new Attribute("interface",
-                "org.apache.felix.ipojo.test.donut.DonutProvider"));
-        Element providesDonutProviderProperty = new Element("property", "");
-        providesDonutProviderProperty
-                .addAttribute(new Attribute("name", "name"));
-        providesDonutProviderProperty.addAttribute(new Attribute("field",
-                "m_name"));
-        providesDonutProviderProperty.addAttribute(new Attribute("value",
-                "Unknown donut vendor"));
-        providesDonutProvider.addElement(providesDonutProviderProperty);
-        m_provider.addElement(providesDonutProvider);
-
-        // The event publisher, corresponding to the following description :
-        // <ev:publisher name="donut-publisher" field="m_publisher"
-        // topics="food/donuts" data-key="food" synchronous="false"/>
-        m_publisher = new Element("publisher", NAMESPACE);
-        m_publisherName = new Attribute("name", "donut-publisher");
-        m_publisherField = new Attribute("field", "m_publisher");
-        m_publisherTopics = new Attribute("topics", "food/donuts");
-        m_publisherDataKey = new Attribute("data-key", "food");
-        m_publisherSynchronous = new Attribute("synchronous", "false");
-        m_publisher.addAttribute(m_publisherName);
-        m_publisher.addAttribute(m_publisherField);
-        m_publisher.addAttribute(m_publisherTopics);
-        m_publisher.addAttribute(m_publisherDataKey);
-        m_publisher.addAttribute(m_publisherSynchronous);
-        m_provider.addElement(m_publisher);
-
-        m_provider.addElement(getManipulationForComponent("donut-provider"));
-
-        /**
-         * Initialize the standard subscribing component (based on the donut
-         * consumer).
-         */
-        m_consumer = new Element("component", "");
-        m_consumer.addAttribute(new Attribute("className",
-                "org.apache.felix.ipojo.test.donut.DonutConsumerImpl"));
-        m_consumer.addAttribute(new Attribute("name",
-                "standard donut consumer for bad tests"));
-
-        // The provided service of the publisher
-        Element providesDonutConsumer = new Element("provides", "");
-        providesDonutConsumer.addAttribute(new Attribute("interface",
-                "org.apache.felix.ipojo.test.donut.DonutConsumer"));
-        Element providesDonutConsumerNameProperty = new Element("property", "");
-        providesDonutConsumerNameProperty.addAttribute(new Attribute("name",
-                "name"));
-        providesDonutConsumerNameProperty.addAttribute(new Attribute("field",
-                "m_name"));
-        providesDonutConsumerNameProperty.addAttribute(new Attribute("value",
-                "Unknown donut consumer"));
-        providesDonutConsumer.addElement(providesDonutConsumerNameProperty);
-        Element providesDonutConsumerSlowProperty = new Element("property", "");
-        providesDonutConsumerSlowProperty.addAttribute(new Attribute("name",
-                "slow"));
-        providesDonutConsumerSlowProperty.addAttribute(new Attribute("field",
-                "m_isSlow"));
-        providesDonutConsumerSlowProperty.addAttribute(new Attribute("value",
-                "false"));
-        providesDonutConsumer.addElement(providesDonutConsumerSlowProperty);
-        m_consumer.addElement(providesDonutConsumer);
-
-        // The event publisher, corresponding to the following description :
-        // <ev:subscriber name="donut-subscriber" callback="receiveDonut"
-        // topics="food/donuts" data-key="food"
-        // data-type="org.apache.felix.ipojo.test.donut.Donut"/>
-        m_subscriber = new Element("subscriber", NAMESPACE);
-        m_subscriberName = new Attribute("name", "donut-subscriber");
-        m_subscriberCallback = new Attribute("callback", "receiveDonut");
-        m_subscriberTopics = new Attribute("topics", "food/donuts");
-        m_subscriberDataKey = new Attribute("data-key", "food");
-        m_subscriberDataType = new Attribute("data-type",
-                "org.apache.felix.ipojo.test.donut.Donut");
-        m_subscriber.addAttribute(m_subscriberName);
-        m_subscriber.addAttribute(m_subscriberCallback);
-        m_subscriber.addAttribute(m_subscriberTopics);
-        m_subscriber.addAttribute(m_subscriberDataKey);
-        m_subscriber.addAttribute(m_subscriberDataType);
-        m_consumer.addElement(m_subscriber);
-
-        m_consumer.addElement(getManipulationForComponent("donut-consumer"));
-    }
-
-    /**
-     * Test the base configuration is correct to be sure the bad tests will fail
-     * because of they are really bad, and not because of an other application
-     * error.
-     * 
-     * This test simply create a provider and a consumer instance, send one
-     * event and check it is received.
-     * 
-     * @throws ConfigurationException
-     *             something bad happened
-     * @throws MissingHandlerException
-     *             something bad happened
-     * @throws UnacceptableConfiguration
-     *             something bad happened
-     */
-    public void testGoodConfig()
-        throws ConfigurationException, UnacceptableConfiguration,
-        MissingHandlerException {
-        /**
-         * Create the provider and the consumer instances.
-         */
-        Dictionary properties = new Hashtable();
-
-        // Provider
-        ComponentFactory providerFactory = new ComponentFactory(context,
-                m_provider);
-        providerFactory.start();
-        properties.put("instance.name","Emperor of donuts");
-        ComponentInstance providerInstance = providerFactory
-                .createComponentInstance(properties);
-        ServiceReference providerService = IPojoTestUtils
-                .getServiceReferenceByName(context, DonutProvider.class
-                        .getName(), providerInstance.getInstanceName());
-        DonutProvider provider = (DonutProvider) context
-                .getService(providerService);
-
-        // The consumer
-        properties = new Hashtable();
-        ComponentFactory consumerFactory = new ComponentFactory(context,
-                m_consumer);
-        consumerFactory.start();
-        properties.put("instance.name","Homer Simpson");
-        properties.put("slow", "false");
-        ComponentInstance consumerInstance = consumerFactory
-                .createComponentInstance(properties);
-        ServiceReference consumerService = IPojoTestUtils
-                .getServiceReferenceByName(context, DonutConsumer.class
-                        .getName(), consumerInstance.getInstanceName());
-        DonutConsumer consumer = (DonutConsumer) context
-                .getService(consumerService);
-
-        /**
-         * Test the normal behaviour of the instances.
-         */
-        consumer.clearDonuts();
-        Donut sentDonut = provider.sellDonut();
-        Donut receivedDonut = consumer.waitForDonut();
-        assertEquals("The received donut must be the same as the sent one.",
-                sentDonut, receivedDonut);
-
-        /**
-         * Destroy component's instances.
-         */
-        context.ungetService(providerService);
-        providerInstance.dispose();
-        context.ungetService(consumerService);
-        consumerInstance.dispose();
-        providerFactory.stop();
-        consumerFactory.stop();
-    }
-
-    /**
-     * Try to create a publisher with no name.
-     * 
-     * @throws ConfigurationException
-     *             something bad happened
-     * @throws MissingHandlerException
-     *             something bad happened
-     * @throws UnacceptableConfiguration
-     *             something bad happened
-     */
-    public void testPublisherWithoutName()
-        throws ConfigurationException, MissingHandlerException,
-        UnacceptableConfiguration {
-
-        // Remove the name attribute of the publisher
-        m_publisher.removeAttribute(m_publisherName);
-
-        // Create and try to start the factory
-        ComponentFactory fact = new ComponentFactory(context, m_provider);
-        try {
-            fact.start();
-            // Should not be executed
-            fact.stop();
-            fail("The factory must not start when no name is specified.");
-        } catch (IllegalStateException e) {
-            // OK
-        } finally {
-            // Restore the original state of the publisher
-            m_publisher.addAttribute(m_publisherName);
-        }
-    }
-
-    /**
-     * Try to create a publisher with no field.
-     * 
-     * @throws ConfigurationException
-     *             something bad happened
-     * @throws MissingHandlerException
-     *             something bad happened
-     * @throws UnacceptableConfiguration
-     *             something bad happened
-     */
-    public void testPublisherWithoutField()
-        throws ConfigurationException, MissingHandlerException,
-        UnacceptableConfiguration {
-
-        // Remove the name attribute of the publisher
-        m_publisher.removeAttribute(m_publisherField);
-
-        // Create and try to start the factory
-        ComponentFactory fact = new ComponentFactory(context, m_provider);
-        try {
-            fact.start();
-            // Should not be executed
-            fact.stop();
-            fail("The factory must not start when no field is specified.");
-        } catch (IllegalStateException e) {
-            // OK
-        } finally {
-            // Restore the original state of the publisher
-            m_publisher.addAttribute(m_publisherField);
-        }
-    }
-
-    /**
-     * Try to create a publisher with an unexisting field.
-     * 
-     * @throws ConfigurationException
-     *             something bad happened
-     * @throws MissingHandlerException
-     *             something bad happened
-     * @throws UnacceptableConfiguration
-     *             something bad happened
-     */
-    public void testPublisherWithUnexistingField()
-        throws ConfigurationException, MissingHandlerException,
-        UnacceptableConfiguration {
-
-        // Remove the name attribute of the publisher and replace with an
-        // unexisting field name
-        m_publisher.removeAttribute(m_publisherField);
-        Attribute unexistingField = new Attribute("field", "m_unexistingField");
-        m_publisher.addAttribute(unexistingField);
-
-        // Create and try to start the factory
-        ComponentFactory fact = new ComponentFactory(context, m_provider);
-        try {
-            fact.start();
-            // Should not be executed
-            fact.stop();
-            fail("The factory must not start when an unexisting field is specified.");
-        } catch (IllegalStateException e) {
-            // OK
-        } finally {
-            // Restore the original state of the publisher
-            m_publisher.removeAttribute(unexistingField);
-            m_publisher.addAttribute(m_publisherField);
-        }
-    }
-
-    /**
-     * Try to create a publisher with a bad typed field.
-     * 
-     * @throws ConfigurationException
-     *             something bad happened
-     * @throws MissingHandlerException
-     *             something bad happened
-     * @throws UnacceptableConfiguration
-     *             something bad happened
-     */
-    public void testPublisherWithBadTypedField()
-        throws ConfigurationException, MissingHandlerException,
-        UnacceptableConfiguration {
-
-        // Remove the name attribute of the publisher and replace with an
-        // bad typed field name
-        m_publisher.removeAttribute(m_publisherField);
-        Attribute badTypedField = new Attribute("field", "m_name");
-        m_publisher.addAttribute(badTypedField);
-
-        // Create and try to start the factory
-        ComponentFactory fact = new ComponentFactory(context, m_provider);
-        try {
-            fact.start();
-            // Should not be executed
-            fact.stop();
-            fail("The factory must not start when an bad typed field is specified.");
-        } catch (IllegalStateException e) {
-            // OK
-        } finally {
-            // Restore the original state of the publisher
-            m_publisher.removeAttribute(badTypedField);
-            m_publisher.addAttribute(m_publisherField);
-        }
-    }
-
-    /**
-     * Try to create a publisher instance without topics.
-     * 
-     * @throws ConfigurationException
-     *             something bad happened
-     * @throws MissingHandlerException
-     *             something bad happened
-     * @throws UnacceptableConfiguration
-     *             something bad happened
-     */
-    public void testPublisherWithoutTopics()
-        throws ConfigurationException, MissingHandlerException,
-        UnacceptableConfiguration {
-
-        // Remove the topics attribute of the publisher
-        m_publisher.removeAttribute(m_publisherTopics);
-        ComponentFactory fact = new ComponentFactory(context, m_provider);
-        fact.start();
-
-        // Try to create an instance without specified topics
-        Dictionary conf = new Hashtable();
-        conf.put("instance.name","provider without topics");
-
-        ComponentInstance instance;
-        try {
-            instance = fact.createComponentInstance(conf);
-            // Should not be executed
-            instance.dispose();
-            fail("The factory must not create instance without specified topics.");
-        } catch (ConfigurationException e) {
-            // OK
-        } finally {
-            fact.stop();
-            // Restore the original state of the publisher
-            m_publisher.addAttribute(m_publisherTopics);
-        }
-    }
-
-    /**
-     * Try to create a publisher with malformed topics.
-     * 
-     * @throws ConfigurationException
-     *             something bad happened
-     * @throws MissingHandlerException
-     *             something bad happened
-     * @throws UnacceptableConfiguration
-     *             something bad happened
-     */
-    public void testPublisherWithMalformedTopics()
-        throws ConfigurationException, MissingHandlerException,
-        UnacceptableConfiguration {
-
-        // Remove the topics attribute of the publisher and replace with a
-        // malformed one
-        m_publisher.removeAttribute(m_publisherTopics);
-        Attribute malformedTopics = new Attribute("topics",
-                "| |\\| \\/ /-\\ |_ | |)");
-        m_publisher.addAttribute(malformedTopics);
-
-        // Create and try to start the factory
-        ComponentFactory fact = new ComponentFactory(context, m_provider);
-        try {
-            fact.start();
-            // Should not be executed
-            fact.stop();
-            fail("The factory must not start when invalid topics are specified.");
-        } catch (IllegalStateException e) {
-            // OK
-        } finally {
-            // Restore the original state of the publisher
-            m_publisher.removeAttribute(malformedTopics);
-            m_publisher.addAttribute(m_publisherTopics);
-        }
-    }
-
-    /**
-     * Try to create a publisher with malformed instance topics.
-     * 
-     * @throws ConfigurationException
-     *             something bad happened
-     * @throws MissingHandlerException
-     *             something bad happened
-     * @throws UnacceptableConfiguration
-     *             something bad happened
-     */
-    public void testPublisherWithMalformedInstanceTopics()
-        throws ConfigurationException, MissingHandlerException,
-        UnacceptableConfiguration {
-
-        // Remove the topics attribute of the publisher and replace with a
-        // malformed one
-        m_publisher.removeAttribute(m_publisherTopics);
-        ComponentFactory fact = new ComponentFactory(context, m_provider);
-        fact.start();
-
-        // Try to create an instance with malformed specified topics
-        Dictionary conf = new Hashtable();
-        conf.put("instance.name","provider with malformed topics");
-        Dictionary topics = new Hashtable();
-        topics.put("donut-publisher", "| |\\| \\/ /-\\ |_ | |)");
-        conf.put("event.topics", topics);
-
-        ComponentInstance instance;
-        try {
-            instance = fact.createComponentInstance(conf);
-            // Should not be executed
-            instance.dispose();
-            fail("The factory must not create instance with invalid specified topics.");
-        } catch (ConfigurationException e) {
-            // OK
-        } finally {
-            fact.stop();
-            // Restore the original state of the publisher
-            m_publisher.addAttribute(m_publisherTopics);
-        }
-    }
-
-    /**
-     * Try to create a subscriber with no name.
-     * 
-     * @throws ConfigurationException
-     *             something bad happened
-     * @throws MissingHandlerException
-     *             something bad happened
-     * @throws UnacceptableConfiguration
-     *             something bad happened
-     */
-    public void testSubscriberWithoutName()
-        throws ConfigurationException, MissingHandlerException,
-        UnacceptableConfiguration {
-
-        // Remove the name attribute of the publisher
-        m_subscriber.removeAttribute(m_subscriberName);
-
-        // Create and try to start the factory
-        ComponentFactory fact = new ComponentFactory(context, m_consumer);
-        try {
-            fact.start();
-            // Should not be executed
-            fact.stop();
-            fail("The factory must not start when no name is specified.");
-        } catch (IllegalStateException e) {
-            // OK
-        } finally {
-            // Restore the original state of the publisher
-            m_subscriber.addAttribute(m_subscriberName);
-        }
-    }
-
-    /**
-     * Try to create a subscriber with no callback.
-     * 
-     * @throws ConfigurationException
-     *             something bad happened
-     * @throws MissingHandlerException
-     *             something bad happened
-     * @throws UnacceptableConfiguration
-     *             something bad happened
-     */
-    public void testSubscriberWithoutCallback()
-        throws ConfigurationException, MissingHandlerException,
-        UnacceptableConfiguration {
-
-        // Remove the name attribute of the publisher
-        m_subscriber.removeAttribute(m_subscriberCallback);
-
-        // Create and try to start the factory
-        ComponentFactory fact = new ComponentFactory(context, m_consumer);
-        try {
-            fact.start();
-            // Should not be executed
-            fact.stop();
-            fail("The factory must not start when no callback is specified.");
-        } catch (IllegalStateException e) {
-            // OK
-        } finally {
-            // Restore the original state of the publisher
-            m_subscriber.addAttribute(m_subscriberCallback);
-        }
-    }
-
-    /**
-     * Try to create a subscriber instance without topics.
-     * 
-     * @throws ConfigurationException
-     *             something bad happened
-     * @throws MissingHandlerException
-     *             something bad happened
-     * @throws UnacceptableConfiguration
-     *             something bad happened
-     */
-    public void testSubscriberWithoutTopics()
-        throws ConfigurationException, MissingHandlerException,
-        UnacceptableConfiguration {
-
-        // Remove the topics attribute of the subscriber
-        m_subscriber.removeAttribute(m_subscriberTopics);
-        ComponentFactory fact = new ComponentFactory(context, m_consumer);
-        fact.start();
-
-        // Try to create an instance without specified topics
-        Dictionary conf = new Hashtable();
-        conf.put("instance.name","consumer without topics");
-        conf.put("slow", "false");
-
-        ComponentInstance instance;
-        try {
-            instance = fact.createComponentInstance(conf);
-            // Should not be executed
-            instance.dispose();
-            fail("The factory must not create instance without specified topics.");
-        } catch (ConfigurationException e) {
-            // OK
-        } finally {
-            fact.stop();
-            // Restore the original state of the subscriber
-            m_subscriber.addAttribute(m_subscriberTopics);
-        }
-    }
-
-    /**
-     * Try to create a subscriber with malformed topics.
-     * 
-     * @throws ConfigurationException
-     *             something bad happened
-     * @throws MissingHandlerException
-     *             something bad happened
-     * @throws UnacceptableConfiguration
-     *             something bad happened
-     */
-    public void testSubscriberWithMalformedTopics()
-        throws ConfigurationException, MissingHandlerException,
-        UnacceptableConfiguration {
-
-        // Remove the topics attribute of the subscriber and replace with a
-        // malformed one
-        m_subscriber.removeAttribute(m_subscriberTopics);
-        Attribute malformedTopics = new Attribute("topics",
-                "| |\\| \\/ /-\\ |_ | |)");
-        m_subscriber.addAttribute(malformedTopics);
-
-        // Create and try to start the factory
-        ComponentFactory fact = new ComponentFactory(context, m_consumer);
-        try {
-            fact.start();
-            // Should not be executed
-            fact.stop();
-            fail("The factory must not start when invalid topics are specified.");
-        } catch (IllegalStateException e) {
-            // OK
-        } finally {
-            // Restore the original state of the subscriber
-            m_subscriber.removeAttribute(malformedTopics);
-            m_subscriber.addAttribute(m_subscriberTopics);
-        }
-    }
-
-    /**
-     * Try to create a subscriber with malformed instance topics.
-     * 
-     * @throws ConfigurationException
-     *             something bad happened
-     * @throws MissingHandlerException
-     *             something bad happened
-     * @throws UnacceptableConfiguration
-     *             something bad happened
-     */
-    public void testSubscriberWithMalformedInstanceTopics()
-        throws ConfigurationException, MissingHandlerException,
-        UnacceptableConfiguration {
-
-        // Remove the topics attribute of the subscriber and replace with a
-        // malformed one
-        m_subscriber.removeAttribute(m_subscriberTopics);
-        ComponentFactory fact = new ComponentFactory(context, m_consumer);
-        fact.start();
-
-        // Try to create an instance with malformed specified topics
-        Dictionary conf = new Hashtable();
-        conf.put("instance.name","consumer with malformed topics");
-        Dictionary topics = new Hashtable();
-        topics.put("donut-subscriber", "| |\\| \\/ /-\\ |_ | |)");
-        conf.put("event.topics", topics);
-
-        ComponentInstance instance;
-        try {
-            instance = fact.createComponentInstance(conf);
-            // Should not be executed
-            instance.dispose();
-            fail("The factory must not create instance with invalid specified topics.");
-        } catch (ConfigurationException e) {
-            // OK
-        } finally {
-            fact.stop();
-            // Restore the original state of the subscriber
-            m_subscriber.addAttribute(m_subscriberTopics);
-        }
-    }
-
-    /**
-     * Try to create a subscriber with unknown data type.
-     * 
-     * @throws ConfigurationException
-     *             something bad happened
-     * @throws MissingHandlerException
-     *             something bad happened
-     * @throws UnacceptableConfiguration
-     *             something bad happened
-     */
-    public void testSubscriberWithUnknownDataType()
-        throws ConfigurationException, MissingHandlerException,
-        UnacceptableConfiguration {
-
-        // Remove the data-type attribute of the subscriber and replace with a
-        // malformed one
-        m_subscriber.removeAttribute(m_subscriberDataType);
-        Attribute unknownType = new Attribute("data-type", "org.unknown.Clazz");
-        m_subscriber.addAttribute(unknownType);
-
-        // Create and try to start the factory
-        ComponentFactory fact = new ComponentFactory(context, m_consumer);
-        try {
-            fact.start();
-            // Should not be executed
-            fact.stop();
-            fail("The factory must not start when unknown data type is specified.");
-        } catch (IllegalStateException e) {
-            // OK
-        } finally {
-            // Restore the original state of the subscriber
-            m_subscriber.removeAttribute(unknownType);
-            m_subscriber.addAttribute(m_subscriberDataType);
-        }
-    }
-
-    /**
-     * Try to create a subscriber with a data type that does not match with the
-     * callback parameter type.
-     * 
-     * @throws ConfigurationException
-     *             something bad happened
-     * @throws MissingHandlerException
-     *             something bad happened
-     * @throws UnacceptableConfiguration
-     *             something bad happened
-     */
-    public void testSubscriberWithUnappropriatedDataType()
-        throws ConfigurationException, MissingHandlerException,
-        UnacceptableConfiguration {
-
-        // Remove the data-type attribute of the subscriber and replace with a
-        // malformed one
-        m_subscriber.removeAttribute(m_subscriberDataType);
-        Attribute unknownType = new Attribute("data-type", "java.lang.String");
-        m_subscriber.addAttribute(unknownType);
-
-        // Create and try to start the factory
-        ComponentFactory fact = new ComponentFactory(context, m_consumer);
-        try {
-            fact.start();
-            // Should not be executed
-            fact.stop();
-            fail("The factory must not start when unappropriated data type is specified.");
-        } catch (IllegalStateException e) {
-            // OK
-        } finally {
-            // Restore the original state of the subscriber
-            m_subscriber.removeAttribute(unknownType);
-            m_subscriber.addAttribute(m_subscriberDataType);
-        }
-    }
-
-    /**
-     * Finalization after test cases.
-     * 
-     * Release all services references and destroy instances.
-     */
-    public void tearDown() {
-
-    }
-
-    // DEBUG
-    public void dumpElement(String message, Element root) {
-        System.err.println(message + "\n" + dumpElement(0, root));
-    }
-
-    // DEBUG
-    private String dumpElement(int level, Element element) {
-        StringBuilder sb = new StringBuilder();
-        // Enter tag
-        for (int i = 0; i < level; i++) {
-            sb.append("  ");
-        }
-        sb.append('<');
-        sb.append(element.getName());
-        Attribute[] attributes = element.getAttributes();
-        for (int i = 0; i < attributes.length; i++) {
-            Attribute attribute = attributes[i];
-            sb.append(' ');
-            sb.append(attribute.getName());
-            sb.append('=');
-            sb.append(attribute.getValue());
-        }
-        sb.append(">\n");
-        // Children
-        Element[] elements = element.getElements();
-        for (int i = 0; i < elements.length; i++) {
-            sb.append(dumpElement(level + 1, elements[i]));
-        }
-        // Exit tag
-        for (int i = 0; i < level; i++) {
-            sb.append("  ");
-        }
-        sb.append("</" + element.getName() + ">\n");
-        return sb.toString();
-    }
-
-}
+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.ipojo.test;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import org.apache.felix.ipojo.ComponentFactory;
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.ConfigurationException;
+import org.apache.felix.ipojo.MissingHandlerException;
+import org.apache.felix.ipojo.UnacceptableConfiguration;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.metadata.Attribute;
+import org.apache.felix.ipojo.metadata.Element;
+import org.apache.felix.ipojo.parser.ManifestMetadataParser;
+import org.apache.felix.ipojo.parser.ParseException;
+import org.apache.felix.ipojo.test.donut.Donut;
+import org.apache.felix.ipojo.test.donut.DonutConsumer;
+import org.apache.felix.ipojo.test.donut.DonutProvider;
+import org.apache.felix.ipojo.test.util.EahTestUtils;
+import org.apache.felix.ipojo.test.util.IPojoTestUtils;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * Test the good behaviour of the EventAdminHandler.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class BadTests extends OSGiTestCase {
+	
+	 /**
+     * The utility class instance.
+     */
+    public EahTestUtils m_utils;
+
+    /**
+     * The namespace of the Event admin handler.
+     */
+    private static final String NAMESPACE = "org.apache.felix.ipojo.handlers.event.EventAdminHandler";
+
+    /**
+     * The available components.
+     */
+    private Element[] m_components;
+
+    /**
+     * The description of a component that uses an event publisher.
+     */
+    private Element m_provider;
+
+    /**
+     * The event publisher description.
+     */
+    private Element m_publisher;
+
+    /**
+     * The name attribute of the event publisher.
+     */
+    private Attribute m_publisherName;
+
+    /**
+     * The field attribute of the event publisher.
+     */
+    private Attribute m_publisherField;
+
+    /**
+     * The topics attribute of the event publisher.
+     */
+    private Attribute m_publisherTopics;
+
+    /**
+     * The data-key attribute of the event publisher.
+     */
+    private Attribute m_publisherDataKey;
+
+    /**
+     * The synchronous attribute of the event publisher.
+     */
+    private Attribute m_publisherSynchronous;
+
+    /**
+     * The description of a component that uses an event subscriber.
+     */
+    private Element m_consumer;
+
+    /**
+     * The event subscriber description.
+     */
+    private Element m_subscriber;
+
+    /**
+     * The name attribute of the event subscriber.
+     */
+    private Attribute m_subscriberName;
+
+    /**
+     * The callback attribute of the event subscriber.
+     */
+    private Attribute m_subscriberCallback;
+
+    /**
+     * The topics attribute of the event subscriber.
+     */
+    private Attribute m_subscriberTopics;
+
+    /**
+     * The data-key attribute of the event subscriber.
+     */
+    private Attribute m_subscriberDataKey;
+
+    /**
+     * The data-type attribute of the event subscriber.
+     */
+    private Attribute m_subscriberDataType;
+
+    private Element getManipulationForComponent(String compName) {
+        for (int i = 0; i < m_components.length; i++) {
+            if (m_components[i].containsAttribute("name")
+                    && m_components[i].getAttribute("name").equals(compName)) {
+                return m_components[i].getElements("manipulation")[0];
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Initialization before test cases.
+     * 
+     * Create all the instances
+     * 
+     */
+    public void setUp() {
+    	m_utils = new EahTestUtils(context);
+        /**
+         * Get the list of available components.
+         */
+        try {
+            String header = (String) context.getBundle().getHeaders().get(
+                    "iPOJO-Components");
+            m_components = ManifestMetadataParser.parseHeaderMetadata(header)
+                    .getElements("component");
+        } catch (ParseException e) {
+            fail("Parse Exception when parsing iPOJO-Component");
+        }
+
+        /**
+         * Initialize the standard publishing component (based on the
+         * asynchronous donut provider).
+         */
+        m_provider = new Element("component", "");
+        m_provider.addAttribute(new Attribute("className",
+                "org.apache.felix.ipojo.test.donut.DonutProviderImpl"));
+        m_provider.addAttribute(new Attribute("name",
+                "standard donut provider for bad tests"));
+
+        // The provided service of the publisher
+        Element providesDonutProvider = new Element("provides", "");
+        providesDonutProvider.addAttribute(new Attribute("interface",
+                "org.apache.felix.ipojo.test.donut.DonutProvider"));
+        Element providesDonutProviderProperty = new Element("property", "");
+        providesDonutProviderProperty
+                .addAttribute(new Attribute("name", "name"));
+        providesDonutProviderProperty.addAttribute(new Attribute("field",
+                "m_name"));
+        providesDonutProviderProperty.addAttribute(new Attribute("value",
+                "Unknown donut vendor"));
+        providesDonutProvider.addElement(providesDonutProviderProperty);
+        m_provider.addElement(providesDonutProvider);
+
+        // The event publisher, corresponding to the following description :
+        // <ev:publisher name="donut-publisher" field="m_publisher"
+        // topics="food/donuts" data-key="food" synchronous="false"/>
+        m_publisher = new Element("publisher", NAMESPACE);
+        m_publisherName = new Attribute("name", "donut-publisher");
+        m_publisherField = new Attribute("field", "m_publisher");
+        m_publisherTopics = new Attribute("topics", "food/donuts");
+        m_publisherDataKey = new Attribute("data-key", "food");
+        m_publisherSynchronous = new Attribute("synchronous", "false");
+        m_publisher.addAttribute(m_publisherName);
+        m_publisher.addAttribute(m_publisherField);
+        m_publisher.addAttribute(m_publisherTopics);
+        m_publisher.addAttribute(m_publisherDataKey);
+        m_publisher.addAttribute(m_publisherSynchronous);
+        m_provider.addElement(m_publisher);
+
+        m_provider.addElement(getManipulationForComponent("donut-provider"));
+
+        /**
+         * Initialize the standard subscribing component (based on the donut
+         * consumer).
+         */
+        m_consumer = new Element("component", "");
+        m_consumer.addAttribute(new Attribute("className",
+                "org.apache.felix.ipojo.test.donut.DonutConsumerImpl"));
+        m_consumer.addAttribute(new Attribute("name",
+                "standard donut consumer for bad tests"));
+
+        // The provided service of the publisher
+        Element providesDonutConsumer = new Element("provides", "");
+        providesDonutConsumer.addAttribute(new Attribute("interface",
+                "org.apache.felix.ipojo.test.donut.DonutConsumer"));
+        Element providesDonutConsumerNameProperty = new Element("property", "");
+        providesDonutConsumerNameProperty.addAttribute(new Attribute("name",
+                "name"));
+        providesDonutConsumerNameProperty.addAttribute(new Attribute("field",
+                "m_name"));
+        providesDonutConsumerNameProperty.addAttribute(new Attribute("value",
+                "Unknown donut consumer"));
+        providesDonutConsumer.addElement(providesDonutConsumerNameProperty);
+        Element providesDonutConsumerSlowProperty = new Element("property", "");
+        providesDonutConsumerSlowProperty.addAttribute(new Attribute("name",
+                "slow"));
+        providesDonutConsumerSlowProperty.addAttribute(new Attribute("field",
+                "m_isSlow"));
+        providesDonutConsumerSlowProperty.addAttribute(new Attribute("value",
+                "false"));
+        providesDonutConsumer.addElement(providesDonutConsumerSlowProperty);
+        m_consumer.addElement(providesDonutConsumer);
+
+        // The event publisher, corresponding to the following description :
+        // <ev:subscriber name="donut-subscriber" callback="receiveDonut"
+        // topics="food/donuts" data-key="food"
+        // data-type="org.apache.felix.ipojo.test.donut.Donut"/>
+        m_subscriber = new Element("subscriber", NAMESPACE);
+        m_subscriberName = new Attribute("name", "donut-subscriber");
+        m_subscriberCallback = new Attribute("callback", "receiveDonut");
+        m_subscriberTopics = new Attribute("topics", "food/donuts");
+        m_subscriberDataKey = new Attribute("data-key", "food");
+        m_subscriberDataType = new Attribute("data-type",
+                "org.apache.felix.ipojo.test.donut.Donut");
+        m_subscriber.addAttribute(m_subscriberName);
+        m_subscriber.addAttribute(m_subscriberCallback);
+        m_subscriber.addAttribute(m_subscriberTopics);
+        m_subscriber.addAttribute(m_subscriberDataKey);
+        m_subscriber.addAttribute(m_subscriberDataType);
+        m_consumer.addElement(m_subscriber);
+
+        m_consumer.addElement(getManipulationForComponent("donut-consumer"));
+    }
+
+    /**
+     * Test the base configuration is correct to be sure the bad tests will fail
+     * because of they are really bad, and not because of an other application
+     * error.
+     * 
+     * This test simply create a provider and a consumer instance, send one
+     * event and check it is received.
+     * 
+     * @throws ConfigurationException
+     *             something bad happened
+     * @throws MissingHandlerException
+     *             something bad happened
+     * @throws UnacceptableConfiguration
+     *             something bad happened
+     */
+    public void testGoodConfig()
+        throws ConfigurationException, UnacceptableConfiguration,
+        MissingHandlerException {
+        /**
+         * Create the provider and the consumer instances.
+         */
+        Dictionary properties = new Hashtable();
+
+        // Provider
+        ComponentFactory providerFactory = new ComponentFactory(context,
+                m_provider);
+        providerFactory.start();
+        properties.put("instance.name","Emperor of donuts");
+        ComponentInstance providerInstance = providerFactory
+                .createComponentInstance(properties);
+        ServiceReference providerService = IPojoTestUtils
+                .getServiceReferenceByName(context, DonutProvider.class
+                        .getName(), providerInstance.getInstanceName());
+        DonutProvider provider = (DonutProvider) context
+                .getService(providerService);
+
+        // The consumer
+        properties = new Hashtable();
+        ComponentFactory consumerFactory = new ComponentFactory(context,
+                m_consumer);
+        consumerFactory.start();
+        properties.put("instance.name","Homer Simpson");
+        properties.put("slow", "false");
+        ComponentInstance consumerInstance = consumerFactory
+                .createComponentInstance(properties);
+        ServiceReference consumerService = IPojoTestUtils
+                .getServiceReferenceByName(context, DonutConsumer.class
+                        .getName(), consumerInstance.getInstanceName());
+        DonutConsumer consumer = (DonutConsumer) context
+                .getService(consumerService);
+
+        /**
+         * Test the normal behaviour of the instances.
+         */
+        consumer.clearDonuts();
+        Donut sentDonut = provider.sellDonut();
+        Donut receivedDonut = consumer.waitForDonut();
+        assertEquals("The received donut must be the same as the sent one.",
+                sentDonut, receivedDonut);
+
+        /**
+         * Destroy component's instances.
+         */
+        context.ungetService(providerService);
+        providerInstance.dispose();
+        context.ungetService(consumerService);
+        consumerInstance.dispose();
+        providerFactory.stop();
+        consumerFactory.stop();
+    }
+
+    /**
+     * Try to create a publisher with no name.
+     * 
+     * @throws ConfigurationException
+     *             something bad happened
+     * @throws MissingHandlerException
+     *             something bad happened
+     * @throws UnacceptableConfiguration
+     *             something bad happened
+     */
+    public void testPublisherWithoutName()
+        throws ConfigurationException, MissingHandlerException,
+        UnacceptableConfiguration {
+
+        // Remove the name attribute of the publisher
+        m_publisher.removeAttribute(m_publisherName);
+
+        // Create and try to start the factory
+        ComponentFactory fact = new ComponentFactory(context, m_provider);
+        try {
+            fact.start();
+            // Should not be executed
+            fact.stop();
+            fail("The factory must not start when no name is specified.");
+        } catch (IllegalStateException e) {
+            // OK
+        } finally {
+            // Restore the original state of the publisher
+            m_publisher.addAttribute(m_publisherName);
+        }
+    }
+
+    /**
+     * Try to create a publisher with no field.
+     * 
+     * @throws ConfigurationException
+     *             something bad happened
+     * @throws MissingHandlerException
+     *             something bad happened
+     * @throws UnacceptableConfiguration
+     *             something bad happened
+     */
+    public void testPublisherWithoutField()
+        throws ConfigurationException, MissingHandlerException,
+        UnacceptableConfiguration {
+
+        // Remove the name attribute of the publisher
+        m_publisher.removeAttribute(m_publisherField);
+
+        // Create and try to start the factory
+        ComponentFactory fact = new ComponentFactory(context, m_provider);
+        try {
+            fact.start();
+            // Should not be executed
+            fact.stop();
+            fail("The factory must not start when no field is specified.");
+        } catch (IllegalStateException e) {
+            // OK
+        } finally {
+            // Restore the original state of the publisher
+            m_publisher.addAttribute(m_publisherField);
+        }
+    }
+
+    /**
+     * Try to create a publisher with an unexisting field.
+     * 
+     * @throws ConfigurationException
+     *             something bad happened
+     * @throws MissingHandlerException
+     *             something bad happened
+     * @throws UnacceptableConfiguration
+     *             something bad happened
+     */
+    public void testPublisherWithUnexistingField()
+        throws ConfigurationException, MissingHandlerException,
+        UnacceptableConfiguration {
+
+        // Remove the name attribute of the publisher and replace with an
+        // unexisting field name
+        m_publisher.removeAttribute(m_publisherField);
+        Attribute unexistingField = new Attribute("field", "m_unexistingField");
+        m_publisher.addAttribute(unexistingField);
+
+        // Create and try to start the factory
+        ComponentFactory fact = new ComponentFactory(context, m_provider);
+        try {
+            fact.start();
+            // Should not be executed
+            fact.stop();
+            fail("The factory must not start when an unexisting field is specified.");
+        } catch (IllegalStateException e) {
+            // OK
+        } finally {
+            // Restore the original state of the publisher
+            m_publisher.removeAttribute(unexistingField);
+            m_publisher.addAttribute(m_publisherField);
+        }
+    }
+
+    /**
+     * Try to create a publisher with a bad typed field.
+     * 
+     * @throws ConfigurationException
+     *             something bad happened
+     * @throws MissingHandlerException
+     *             something bad happened
+     * @throws UnacceptableConfiguration
+     *             something bad happened
+     */
+    public void testPublisherWithBadTypedField()
+        throws ConfigurationException, MissingHandlerException,
+        UnacceptableConfiguration {
+
+        // Remove the name attribute of the publisher and replace with an
+        // bad typed field name
+        m_publisher.removeAttribute(m_publisherField);
+        Attribute badTypedField = new Attribute("field", "m_name");
+        m_publisher.addAttribute(badTypedField);
+
+        // Create and try to start the factory
+        ComponentFactory fact = new ComponentFactory(context, m_provider);
+        try {
+            fact.start();
+            // Should not be executed
+            fact.stop();
+            fail("The factory must not start when an bad typed field is specified.");
+        } catch (IllegalStateException e) {
+            // OK
+        } finally {
+            // Restore the original state of the publisher
+            m_publisher.removeAttribute(badTypedField);
+            m_publisher.addAttribute(m_publisherField);
+        }
+    }
+
+    /**
+     * Try to create a publisher instance without topics.
+     * 
+     * @throws ConfigurationException
+     *             something bad happened
+     * @throws MissingHandlerException
+     *             something bad happened
+     * @throws UnacceptableConfiguration
+     *             something bad happened
+     */
+    public void testPublisherWithoutTopics()
+        throws ConfigurationException, MissingHandlerException,
+        UnacceptableConfiguration {
+
+        // Remove the topics attribute of the publisher
+        m_publisher.removeAttribute(m_publisherTopics);
+        ComponentFactory fact = new ComponentFactory(context, m_provider);
+        fact.start();
+
+        // Try to create an instance without specified topics
+        Dictionary conf = new Hashtable();
+        conf.put("instance.name","provider without topics");
+
+        ComponentInstance instance;
+        try {
+            instance = fact.createComponentInstance(conf);
+            // Should not be executed
+            instance.dispose();
+            fail("The factory must not create instance without specified topics.");
+        } catch (ConfigurationException e) {
+            // OK
+        } finally {
+            fact.stop();
+            // Restore the original state of the publisher
+            m_publisher.addAttribute(m_publisherTopics);
+        }
+    }
+
+    /**
+     * Try to create a publisher with malformed topics.
+     * 
+     * @throws ConfigurationException
+     *             something bad happened
+     * @throws MissingHandlerException
+     *             something bad happened
+     * @throws UnacceptableConfiguration
+     *             something bad happened
+     */
+    public void testPublisherWithMalformedTopics()
+        throws ConfigurationException, MissingHandlerException,
+        UnacceptableConfiguration {
+
+        // Remove the topics attribute of the publisher and replace with a
+        // malformed one
+        m_publisher.removeAttribute(m_publisherTopics);
+        Attribute malformedTopics = new Attribute("topics",
+                "| |\\| \\/ /-\\ |_ | |)");
+        m_publisher.addAttribute(malformedTopics);
+
+        // Create and try to start the factory
+        ComponentFactory fact = new ComponentFactory(context, m_provider);
+        try {
+            fact.start();
+            // Should not be executed
+            fact.stop();
+            fail("The factory must not start when invalid topics are specified.");
+        } catch (IllegalStateException e) {
+            // OK
+        } finally {
+            // Restore the original state of the publisher
+            m_publisher.removeAttribute(malformedTopics);
+            m_publisher.addAttribute(m_publisherTopics);
+        }
+    }
+    
+    /**
+     * Try to create a publisher with a pattern topic (ending with '*') instead of a fixed topic.
+     * 
+     * @throws ConfigurationException
+     *             something bad happened
+     * @throws MissingHandlerException
+     *             something bad happened
+     * @throws UnacceptableConfiguration
+     *             something bad happened
+     */
+    public void testPublisherWithPatternTopic()
+        throws ConfigurationException, MissingHandlerException,
+        UnacceptableConfiguration {
+
+        // Remove the topics attribute of the publisher and replace with a
+        // malformed one
+        m_publisher.removeAttribute(m_publisherTopics);
+        Attribute malformedTopics = new Attribute("topics",
+                "a/pattern/topic/*");
+        m_publisher.addAttribute(malformedTopics);
+
+        // Create and try to start the factory
+        ComponentFactory fact = new ComponentFactory(context, m_provider);
+        try {
+            fact.start();
+            // Should not be executed
+            fact.stop();
+            fail("The factory must not start when invalid topics are specified.");
+        } catch (IllegalStateException e) {
+            // OK
+        } finally {
+            // Restore the original state of the publisher
+            m_publisher.removeAttribute(malformedTopics);
+            m_publisher.addAttribute(m_publisherTopics);
+        }
+    }
+
+    /**
+     * Try to create a publisher with malformed instance topics.
+     * 
+     * @throws ConfigurationException
+     *             something bad happened
+     * @throws MissingHandlerException
+     *             something bad happened
+     * @throws UnacceptableConfiguration
+     *             something bad happened
+     */
+    public void testPublisherWithMalformedInstanceTopics()
+        throws ConfigurationException, MissingHandlerException,
+        UnacceptableConfiguration {
+
+        // Remove the topics attribute of the publisher and replace with a
+        // malformed one
+        m_publisher.removeAttribute(m_publisherTopics);
+        ComponentFactory fact = new ComponentFactory(context, m_provider);
+        fact.start();
+
+        // Try to create an instance with malformed specified topics
+        Dictionary conf = new Hashtable();
+        conf.put("instance.name","provider with malformed topics");
+        Dictionary topics = new Hashtable();
+        topics.put("donut-publisher", "| |\\| \\/ /-\\ |_ | |)");
+        conf.put("event.topics", topics);
+
+        ComponentInstance instance;
+        try {
+            instance = fact.createComponentInstance(conf);
+            // Should not be executed
+            instance.dispose();
+            fail("The factory must not create instance with invalid specified topics.");
+        } catch (ConfigurationException e) {
+            // OK
+        } finally {
+            fact.stop();
+            // Restore the original state of the publisher
+            m_publisher.addAttribute(m_publisherTopics);
+        }
+    }
+
+    /**
+     * Try to create a subscriber with no name.
+     * 
+     * @throws ConfigurationException
+     *             something bad happened
+     * @throws MissingHandlerException
+     *             something bad happened
+     * @throws UnacceptableConfiguration
+     *             something bad happened
+     */
+    public void testSubscriberWithoutName()
+        throws ConfigurationException, MissingHandlerException,
+        UnacceptableConfiguration {
+
+        // Remove the name attribute of the publisher
+        m_subscriber.removeAttribute(m_subscriberName);
+
+        // Create and try to start the factory
+        ComponentFactory fact = new ComponentFactory(context, m_consumer);
+        try {
+            fact.start();
+            // Should not be executed
+            fact.stop();
+            fail("The factory must not start when no name is specified.");
+        } catch (IllegalStateException e) {
+            // OK
+        } finally {
+            // Restore the original state of the publisher
+            m_subscriber.addAttribute(m_subscriberName);
+        }
+    }
+
+    /**
+     * Try to create a subscriber with no callback.
+     * 
+     * @throws ConfigurationException
+     *             something bad happened
+     * @throws MissingHandlerException
+     *             something bad happened
+     * @throws UnacceptableConfiguration
+     *             something bad happened
+     */
+    public void testSubscriberWithoutCallback()
+        throws ConfigurationException, MissingHandlerException,
+        UnacceptableConfiguration {
+
+        // Remove the name attribute of the publisher
+        m_subscriber.removeAttribute(m_subscriberCallback);
+
+        // Create and try to start the factory
+        ComponentFactory fact = new ComponentFactory(context, m_consumer);
+        try {
+            fact.start();
+            // Should not be executed
+            fact.stop();
+            fail("The factory must not start when no callback is specified.");
+        } catch (IllegalStateException e) {
+            // OK
+        } finally {
+            // Restore the original state of the publisher
+            m_subscriber.addAttribute(m_subscriberCallback);
+        }
+    }
+
+    /**
+     * Try to create a subscriber instance without topics.
+     * 
+     * @throws ConfigurationException
+     *             something bad happened
+     * @throws MissingHandlerException
+     *             something bad happened
+     * @throws UnacceptableConfiguration
+     *             something bad happened
+     */
+    public void testSubscriberWithoutTopics()
+        throws ConfigurationException, MissingHandlerException,
+        UnacceptableConfiguration {
+
+        // Remove the topics attribute of the subscriber
+        m_subscriber.removeAttribute(m_subscriberTopics);
+        ComponentFactory fact = new ComponentFactory(context, m_consumer);
+        fact.start();
+
+        // Try to create an instance without specified topics
+        Dictionary conf = new Hashtable();
+        conf.put("instance.name","consumer without topics");
+        conf.put("slow", "false");
+
+        ComponentInstance instance;
+        try {
+            instance = fact.createComponentInstance(conf);
+            // Should not be executed
+            instance.dispose();
+            fail("The factory must not create instance without specified topics.");
+        } catch (ConfigurationException e) {
+            // OK
+        } finally {
+            fact.stop();
+            // Restore the original state of the subscriber
+            m_subscriber.addAttribute(m_subscriberTopics);
+        }
+    }
+
+    /**
+     * Try to create a subscriber with malformed topics.
+     * 
+     * @throws ConfigurationException
+     *             something bad happened
+     * @throws MissingHandlerException
+     *             something bad happened
+     * @throws UnacceptableConfiguration
+     *             something bad happened
+     */
+    public void testSubscriberWithMalformedTopics()
+        throws ConfigurationException, MissingHandlerException,
+        UnacceptableConfiguration {
+
+        // Remove the topics attribute of the subscriber and replace with a
+        // malformed one
+        m_subscriber.removeAttribute(m_subscriberTopics);
+        Attribute malformedTopics = new Attribute("topics",
+                "| |\\| \\/ /-\\ |_ | |)");
+        m_subscriber.addAttribute(malformedTopics);
+
+        // Create and try to start the factory
+        ComponentFactory fact = new ComponentFactory(context, m_consumer);
+        try {
+            fact.start();
+            // Should not be executed
+            fact.stop();
+            fail("The factory must not start when invalid topics are specified.");
+        } catch (IllegalStateException e) {
+            // OK
+        } finally {
+            // Restore the original state of the subscriber
+            m_subscriber.removeAttribute(malformedTopics);
+            m_subscriber.addAttribute(m_subscriberTopics);
+        }
+    }
+
+    /**
+     * Try to create a subscriber with malformed instance topics.
+     * 
+     * @throws ConfigurationException
+     *             something bad happened
+     * @throws MissingHandlerException
+     *             something bad happened
+     * @throws UnacceptableConfiguration
+     *             something bad happened
+     */
+    public void testSubscriberWithMalformedInstanceTopics()
+        throws ConfigurationException, MissingHandlerException,
+        UnacceptableConfiguration {
+
+        // Remove the topics attribute of the subscriber and replace with a
+        // malformed one
+        m_subscriber.removeAttribute(m_subscriberTopics);
+        ComponentFactory fact = new ComponentFactory(context, m_consumer);
+        fact.start();
+
+        // Try to create an instance with malformed specified topics
+        Dictionary conf = new Hashtable();
+        conf.put("instance.name","consumer with malformed topics");
+        Dictionary topics = new Hashtable();
+        topics.put("donut-subscriber", "| |\\| \\/ /-\\ |_ | |)");
+        conf.put("event.topics", topics);
+
+        ComponentInstance instance;
+        try {
+            instance = fact.createComponentInstance(conf);
+            // Should not be executed
+            instance.dispose();
+            fail("The factory must not create instance with invalid specified topics.");
+        } catch (ConfigurationException e) {
+            // OK
+        } finally {
+            fact.stop();
+            // Restore the original state of the subscriber
+            m_subscriber.addAttribute(m_subscriberTopics);
+        }
+    }
+
+    /**
+     * Try to create a subscriber with unknown data type.
+     * 
+     * @throws ConfigurationException
+     *             something bad happened
+     * @throws MissingHandlerException
+     *             something bad happened
+     * @throws UnacceptableConfiguration
+     *             something bad happened
+     */
+    public void testSubscriberWithUnknownDataType()
+        throws ConfigurationException, MissingHandlerException,
+        UnacceptableConfiguration {
+
+        // Remove the data-type attribute of the subscriber and replace with a
+        // malformed one
+        m_subscriber.removeAttribute(m_subscriberDataType);
+        Attribute unknownType = new Attribute("data-type", "org.unknown.Clazz");
+        m_subscriber.addAttribute(unknownType);
+
+        // Create and try to start the factory
+        ComponentFactory fact = new ComponentFactory(context, m_consumer);
+        try {
+            fact.start();
+            // Should not be executed
+            fact.stop();
+            fail("The factory must not start when unknown data type is specified.");
+        } catch (IllegalStateException e) {
+            // OK
+        } finally {
+            // Restore the original state of the subscriber
+            m_subscriber.removeAttribute(unknownType);
+            m_subscriber.addAttribute(m_subscriberDataType);
+        }
+    }
+
+    /**
+     * Try to create a subscriber with a data type that does not match with the
+     * callback parameter type.
+     * 
+     * @throws ConfigurationException
+     *             something bad happened
+     * @throws MissingHandlerException
+     *             something bad happened
+     * @throws UnacceptableConfiguration
+     *             something bad happened
+     */
+    public void testSubscriberWithUnappropriatedDataType()
+        throws ConfigurationException, MissingHandlerException,
+        UnacceptableConfiguration {
+
+        // Remove the data-type attribute of the subscriber and replace with a
+        // malformed one
+        m_subscriber.removeAttribute(m_subscriberDataType);
+        Attribute unknownType = new Attribute("data-type", "java.lang.String");
+        m_subscriber.addAttribute(unknownType);
+
+        // Create and try to start the factory
+        ComponentFactory fact = new ComponentFactory(context, m_consumer);
+        try {
+            fact.start();
+            // Should not be executed
+            fact.stop();
+            fail("The factory must not start when unappropriated data type is specified.");
+        } catch (IllegalStateException e) {
+            // OK
+        } finally {
+            // Restore the original state of the subscriber
+            m_subscriber.removeAttribute(unknownType);
+            m_subscriber.addAttribute(m_subscriberDataType);
+        }
+    }
+
+    /**
+     * Finalization after test cases.
+     * 
+     * Release all services references and destroy instances.
+     */
+    public void tearDown() {
+
+    }
+
+    // DEBUG
+    public void dumpElement(String message, Element root) {
+        System.err.println(message + "\n" + dumpElement(0, root));
+    }
+
+    // DEBUG
+    private String dumpElement(int level, Element element) {
+        StringBuilder sb = new StringBuilder();
+        // Enter tag
+        for (int i = 0; i < level; i++) {
+            sb.append("  ");
+        }
+        sb.append('<');
+        sb.append(element.getName());
+        Attribute[] attributes = element.getAttributes();
+        for (int i = 0; i < attributes.length; i++) {
+            Attribute attribute = attributes[i];
+            sb.append(' ');
+            sb.append(attribute.getName());
+            sb.append('=');
+            sb.append(attribute.getValue());
+        }
+        sb.append(">\n");
+        // Children
+        Element[] elements = element.getElements();
+        for (int i = 0; i < elements.length; i++) {
+            sb.append(dumpElement(level + 1, elements[i]));
+        }
+        // Exit tag
+        for (int i = 0; i < level; i++) {
+            sb.append("  ");
+        }
+        sb.append("</" + element.getName() + ">\n");
+        return sb.toString();
+    }
+    
+    /**
+     * Creates a subscriber listening on a pattern topic (ending with '*').
+     * @throws ConfigurationException something bad happened.
+     * @throws MissingHandlerException something bad happened.
+     * @throws UnacceptableConfiguration something bad happened.
+     */
+    public void testSubscriberWithPatternTopic() throws UnacceptableConfiguration, MissingHandlerException, ConfigurationException {
+    	Dictionary properties = new Hashtable();
+    	Dictionary topics = new Hashtable();
+
+        // Create the donut consumer instance, listening on a pattern topic
+        properties.put("instance.name","subscriber with pattern topic");
+        topics.put("donut-subscriber", "a/pattern/topic/*rf");
+        properties.put("event.topics", topics);
+        ComponentInstance instance = null;
+        try {
+        	instance = m_utils.getDonutConsumerFactory()
+            .createComponentInstance(properties);
+        	
+        	// Should not been executed
+        	instance.dispose();
+        	 fail("An invalid topic scope was accepted)");
+        	 
+        } catch (ConfigurationException e) {
+        	// Nothing to do
+        }
+        
+    	properties = new Hashtable();
+    	topics = new Hashtable();
+
+        // Create the donut consumer instance, listening on a pattern topic
+        properties.put("instance.name","subscriber with pattern topic");
+        topics.put("donut-subscriber", "a/pattern/*topic/rf");
+        properties.put("event.topics", topics);
+        
+        try {
+        	instance = m_utils.getDonutConsumerFactory()
+            .createComponentInstance(properties);
+        	instance.dispose();
+        	fail("An invalid topic scope was accepted (2)");
+        } catch (ConfigurationException e) {
+        	// Nothing to do
+        }
+    }
+
+}