You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by ga...@apache.org on 2009/10/07 05:00:44 UTC
svn commit: r822565 [1/4] - in
/incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries:
mocks/ unittest/junit/ unittest/mocks/ unittest/mocks/annotations/
Author: gawor
Date: Wed Oct 7 03:00:43 2009
New Revision: 822565
URL: http://svn.apache.org/viewvc?rev=822565&view=rev
Log:
set svn:eol-style property on all Java files
Modified:
incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/mocks/BundleContextMock.java (contents, props changed)
incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/mocks/BundleMock.java (contents, props changed)
incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/mocks/MockInitialContextFactoryBuilder.java (contents, props changed)
incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/unittest/junit/Assert.java (contents, props changed)
incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/unittest/mocks/DefaultInvocationHandler.java (contents, props changed)
incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/unittest/mocks/DefaultMethodCallHandlers.java (contents, props changed)
incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/unittest/mocks/DefaultReturnTypeHandlers.java (contents, props changed)
incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/unittest/mocks/ExceptionListener.java (contents, props changed)
incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/unittest/mocks/MethodCall.java (contents, props changed)
incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/unittest/mocks/MethodCallHandler.java (contents, props changed)
incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/unittest/mocks/ReturnTypeHandler.java (contents, props changed)
incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/unittest/mocks/Skeleton.java (contents, props changed)
incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/unittest/mocks/annotations/InjectSkeleton.java (contents, props changed)
incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/unittest/mocks/annotations/Singleton.java (contents, props changed)
Modified: incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/mocks/BundleContextMock.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/mocks/BundleContextMock.java?rev=822565&r1=822564&r2=822565&view=diff
==============================================================================
--- incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/mocks/BundleContextMock.java (original)
+++ incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/mocks/BundleContextMock.java Wed Oct 7 03:00:43 2009
@@ -1,734 +1,734 @@
-/*
- * 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.aries.mocks;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.Dictionary;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.jar.Attributes;
-import java.util.jar.JarInputStream;
-import java.util.jar.Manifest;
-
-import junit.framework.AssertionFailedError;
-
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleException;
-import org.osgi.framework.Constants;
-import org.osgi.framework.Filter;
-import org.osgi.framework.FrameworkUtil;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceEvent;
-import org.osgi.framework.ServiceFactory;
-import org.osgi.framework.ServiceListener;
-import org.osgi.framework.ServiceReference;
-import org.osgi.framework.ServiceRegistration;
-
-import org.apache.aries.unittest.mocks.Skeleton;
-
-/**
- *
- */
-/**
- * This class is a partial implementation of BundleContext. Its main function
- * is to provide a service registry implementation
- */
-public class BundleContextMock
-{
- /** The service registry */
- private static Map<String, List<ServiceData>> registry = new HashMap<String, List<ServiceData>>();
- /** A list of bundles installed into the runtime */
- private static List<Bundle> bundles = new ArrayList<Bundle>();
- /** A list of service listeners */
- private static List<ServiceListener> listeners = new ArrayList<ServiceListener>();
- /** The next service id to be assigned */
- private static long nextId = 0;
-
- private static class MockServiceFactory implements ServiceFactory
- {
- private final Object service;
-
- public MockServiceFactory(Object obj)
- {
- service = obj;
- }
-
- public Object getService(Bundle arg0, ServiceRegistration arg1)
- {
- return service;
- }
-
- public void ungetService(Bundle arg0, ServiceRegistration arg1, Object arg2)
- {
- }
- }
-
- private static class FilteredServiceListener implements ServiceListener
- {
- private Filter filter;
- private final ServiceListener listener;
-
- public FilteredServiceListener(String f, ServiceListener l)
- {
- listener = l;
-
- if (f != null) {
- try {
- filter = FrameworkUtil.createFilter(f);
- } catch (InvalidSyntaxException e) {
- AssertionFailedError err = new AssertionFailedError("The filter " + f + " is invalid");
- err.initCause(e);
-
- throw err;
- }
- }
- }
-
- public void serviceChanged(ServiceEvent arg0)
- {
- if (matches(arg0)) listener.serviceChanged(arg0);
- }
-
- private boolean matches(ServiceEvent arg0)
- {
- if (filter == null) return true;
-
- ServiceReference ref = arg0.getServiceReference();
-
- if (Skeleton.isSkeleton(ref)) {
- Object template = Skeleton.getSkeleton(ref).getTemplateObject();
-
- if (template instanceof ServiceData) {
- return filter.match(((ServiceData)template).getProperties());
- }
- }
-
- return filter.match(ref);
- }
-
- @Override
- public boolean equals(Object obj)
- {
- if (obj == null) return false;
- else if (obj instanceof FilteredServiceListener) {
- return listener.equals(((FilteredServiceListener)obj).listener);
- }
-
- return false;
- }
-
- @Override
- public int hashCode()
- {
- return listener.hashCode();
- }
- }
-
- /**
- * This class represents the information registered about a service. It also
- * implements part of the ServiceRegistration and ServiceReference interfaces.
- */
- private class ServiceData
- {
- /** The service that was registered */
- private ServiceFactory serviceImpl;
- /** the service properties */
- @SuppressWarnings("unused")
- private final Hashtable<String, Object> serviceProps = new Hashtable<String, Object>();
- /** The interfaces the service publishes with */
- private String[] interfaceNames;
-
- /**
- * This method unregisters the service from the registry.
- */
- public void unregister()
- {
- for (String interfaceName : interfaceNames) {
- List<ServiceData> list = registry.get(interfaceName);
- if (list != null) {
- list.remove(this);
- if (list.isEmpty()) {
- registry.remove(interfaceName);
- }
- }
- }
- notifyAllListeners(ServiceEvent.UNREGISTERING);
- }
-
- /**
- * This method is used to register the service data in the registry
- */
- public void register()
- {
- for (String interfaceName : interfaceNames) {
- List<ServiceData> list = registry.get(interfaceName);
- if (list == null) {
- list = new ArrayList<ServiceData>();
- registry.put(interfaceName, list);
- }
- list.add(this);
- }
- notifyAllListeners(ServiceEvent.REGISTERED);
- }
-
- private void notifyAllListeners(int eventType) {
- List<ServiceListener> copy = new ArrayList<ServiceListener>(listeners.size());
- copy.addAll(listeners);
- for(ServiceListener listener : copy) {
- listener.serviceChanged(new ServiceEvent(eventType, Skeleton.newMock(this, ServiceReference.class)));
- }
- }
-
- /**
- * Change the service properties
- * @param newProps
- */
- public void setProperties(Dictionary<String,Object> newProps)
- {
- // make sure we don't overwrite framework properties
- newProps.put(Constants.OBJECTCLASS, serviceProps.get(Constants.OBJECTCLASS));
- newProps.put(Constants.SERVICE_ID, serviceProps.get(Constants.SERVICE_ID));
-
- Enumeration<String> keys = newProps.keys();
-
- serviceProps.clear();
- while (keys.hasMoreElements()) {
- String key = keys.nextElement();
- serviceProps.put(key, newProps.get(key));
- }
-
- notifyAllListeners(ServiceEvent.MODIFIED);
- }
-
- /**
- * This implements the isAssignableTo method from ServiceReference.
- *
- * @param b
- * @param className
- * @return true if the referenced service can be assigned to the requested
- * class name.
- */
- public boolean isAssignableTo(Bundle b, String className)
- {
- boolean result = false;
-
- for (String iName : interfaceNames)
- {
- result = iName.equals(className);
-
- if (result) break;
- }
-
- return result;
- }
-
- /**
- * Returns the requested service property.
- * @param key the property to return.
- * @return the property value.
- */
- public Object getProperty(String key)
- {
- return serviceProps.get(key);
- }
-
- @Override
- public boolean equals(Object o) {
- if(o == null) return false;
-
- if(o == this) return true;
-
- if (o instanceof ServiceData) {
- ServiceData other = (ServiceData) o;
- return serviceImpl == other.serviceImpl;
- }
-
- return false;
- }
-
- @Override
- public int hashCode()
- {
- return serviceImpl.hashCode();
- }
-
- /**
- * @return the keys of all the service properties.
- */
- public String[] getPropertyKeys()
- {
- Enumeration<String> e = serviceProps.keys();
-
- String[] toReturn = new String[serviceProps.size()];
-
- for(int i = 0 ; i < serviceProps.size(); i++)
- toReturn[i] = e.nextElement();
-
- return toReturn;
- }
-
- /**
- * @return the bundle this service reference was registered against.
- */
- public Bundle getBundle()
- {
- return bundle;
- }
-
- /**
- * @return a service reference for this service registration.
- */
- public ServiceReference getReference()
- {
- return Skeleton.newMock(this, ServiceReference.class);
- }
-
- public Hashtable<String, Object> getProperties()
- {
- return new Hashtable<String, Object>(serviceProps);
- }
- }
-
- /** The bundle associated with this bundle context */
- private Bundle bundle;
-
- /**
- * Default constructor, widely used in the tests.
- */
- public BundleContextMock()
- {
-
- }
-
- /**
- * Constructor used by BundleMock, it ensures the bundle and its context are wired together correctly.
- *
- * TODO We have to many Bundle mocks objects for a single OSGi bundle, we need to update this.
- *
- * @param b
- */
- public BundleContextMock(Bundle b)
- {
- bundle = b;
- }
-
- /**
- * This checks that we have at least one service with this interface name.
- *
- * @param interfaceName the name of the interface.
- */
- public static void assertServiceExists(String interfaceName)
- {
- assertTrue("No service registered with interface " + interfaceName + ". Services found: " + registry.keySet(), registry.containsKey(interfaceName));
- }
-
- /**
- * This checks that we have at no services with this interface name.
- *
- * @param interfaceName the name of the interface.
- */
- public static void assertNoServiceExists(String interfaceName)
- {
- assertFalse("Services registered with interface " + interfaceName + ". Services found: " + registry.keySet(), registry.containsKey(interfaceName));
- }
-
- /**
- * This implements the registerService method from BundleContext.
- *
- * @param interFace
- * @param service
- * @param properties
- * @return the ServiceRegistration object for this service.
- */
- public ServiceRegistration registerService(String interFace, final Object service, Dictionary<String, Object> properties)
- {
- // validate that the service implements interFace
- try {
- Class<?> clazz = Class.forName(interFace, false, service.getClass().getClassLoader());
-
- if (!!!clazz.isInstance(service) && !!!(service instanceof ServiceFactory)) {
- throw new AssertionFailedError("The service " + service + " does not implement " + interFace);
- }
- } catch (ClassNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
-
- ServiceFactory factory = new MockServiceFactory(service);
- return registerService(new String[] {interFace}, factory, properties);
- }
-
- /**
- * This implements the registerService method from BundleContext.
- *
- * @param interfaces
- * @param service
- * @param properties
- * @return the ServiceRegistration object for this service.
- */
- public ServiceRegistration registerService(String[] interfaces, Object service, Dictionary<String, Object> properties)
- {
- if (properties == null) properties = new Hashtable<String, Object>();
-
- ServiceData data = new ServiceData();
- // cast the service to a service factory because in our framework we only ever register
- // a service factory. If we every put a non-service factory object in that is a failure.
- properties.put(Constants.OBJECTCLASS, interfaces);
- properties.put(Constants.SERVICE_ID, nextId++);
- if (service instanceof ServiceFactory) {
- data.serviceImpl = (ServiceFactory)service;
- } else {
- data.serviceImpl = new MockServiceFactory(service);
- }
- data.interfaceNames = interfaces;
-
- Enumeration<String> keys = properties.keys();
-
- while (keys.hasMoreElements()) {
- String key = keys.nextElement();
- data.serviceProps.put(key, properties.get(key));
- }
-
- data.register();
-
- return Skeleton.newMock(data, ServiceRegistration.class);
- }
-
- /**
- * This helper method is used to get the service from the registry with the
- * given interface name.
- *
- * <p>This should really return multiple services.
- * </p>
- *
- * @param interfaceName the interface name.
- * @param bundle the bundle name.
- * @return the registered service.
- */
- public static Object getService(String interfaceName, Bundle bundle)
- {
- List<ServiceData> datum = registry.get(interfaceName);
-
- if (datum == null) return null;
- else if (datum.isEmpty()) return null;
- // this is safe for now, but may not be when we do other scoped components.
- else {
- ServiceRegistration reg = Skeleton.newMock(ServiceRegistration.class);
- return datum.iterator().next().serviceImpl.getService(bundle, reg);
- }
- }
-
- /**
- * A mock implementation of the getServiceReferences method. It does not currently
- * process the filter, this is probably a bit hard, so we might cheat when we do.
- *
- * <p>Note this does not check that the service classes are visible to the
- * caller as OSGi does. It is equivalent to getAllServiceReferences.
- * </p>
- *
- * @param className the name of the class the lookup is for.
- * @param filter
- * @return an array of matching service references.
- * @throws InvalidSyntaxException
- */
- public ServiceReference[] getServiceReferences(String className, String filter) throws InvalidSyntaxException
- {
- List<ServiceData> data = new ArrayList<ServiceData>();
-
- if (className != null) {
- List<ServiceData> tmpData = registry.get(className);
- if (tmpData != null) data.addAll(tmpData);
- } else {
- data = new ArrayList<ServiceData>();
- for (List<ServiceData> value : registry.values())
- data.addAll(value);
- }
-
- ServiceReference[] refs;
-
- if (data == null) {
- refs = null;
- } else {
-
- if (filter != null) {
- Filter f = FrameworkUtil.createFilter(filter);
-
- Iterator<ServiceData> it = data.iterator();
-
- while (it.hasNext()) {
- ServiceData sd = it.next();
-
- if (!!!f.match(sd.getProperties())) it.remove();
- }
- }
-
- if (data.isEmpty()) return null;
-
- refs = new ServiceReference[data.size()];
- for (int i = 0; i < refs.length; i++) {
- refs[i] = Skeleton.newMock(data.get(i), ServiceReference.class);
- }
- }
-
- return refs;
- }
-
- /**
- * Gets the first matching service reference.
- *
- * @param className the class name wanted.
- * @return the matchine service, or null if one cannot be found.
- */
- public ServiceReference getServiceReference(String className)
- {
- ServiceReference[] refs;
- try {
- refs = getServiceReferences(className, null);
- if (refs != null) return refs[0];
-
- return null;
- } catch (InvalidSyntaxException e) {
- // should never happen.
- e.printStackTrace();
- }
- return null;
- }
-
- /**
- * This method finds all the service references in the registry with the
- * matching class name and filter.
- *
- * @param className
- * @param filter
- * @return the matching service references.
- * @throws InvalidSyntaxException
- */
- public ServiceReference[] getAllServiceReferences(String className, String filter) throws InvalidSyntaxException
- {
- return getServiceReferences(className, filter);
- }
-
- /**
- * Retrieve a service from the registry.
- * @param ref the service reference.
- * @return the returned service.
- */
- public Object getService(ServiceReference ref)
- {
- ServiceData data = (ServiceData)Skeleton.getSkeleton(ref).getTemplateObject();
-
- return data.serviceImpl.getService(getBundle(), Skeleton.newMock(data, ServiceRegistration.class));
- }
-
- /**
- * This method implements the installBundle method from BundleContext. It
- * makes use of the java.util.jar package to parse the manifest from the input
- * stream.
- *
- * @param location the location of the bundle.
- * @param is the input stream to read from.
- * @return the created bundle.
- * @throws BundleException
- */
- public Bundle installBundle(String location, InputStream is) throws BundleException
- {
- Bundle b;
- JarInputStream jis;
- try {
- jis = new JarInputStream(is);
-
- Manifest man = jis.getManifest();
-
- b = createBundle(man, null);
-
- } catch (IOException e) {
- throw new BundleException(e.getMessage(), e);
- }
-
- return b;
- }
-
- /**
- * Create a mock bundle correctly configured using the supplied manifest and
- * location.
- *
- * @param man the manifest to load.
- * @param location the location on disk.
- * @return the created bundle
- * @throws MalformedURLException
- */
- private Bundle createBundle(Manifest man, String location) throws MalformedURLException
- {
- Attributes attribs = man.getMainAttributes();
- String symbolicName = attribs.getValue(Constants.BUNDLE_SYMBOLICNAME);
-
- Hashtable<Object, Object> attribMap = new Hashtable<Object, Object>();
-
- for (Map.Entry<Object, Object> entry : attribs.entrySet()) {
- Attributes.Name name = (Attributes.Name)entry.getKey();
- attribMap.put(name.toString(), entry.getValue());
- }
-
- BundleMock mock = new BundleMock(symbolicName, attribMap, location);
-
- mock.addToClassPath(new File("build/unittest/classes").toURL());
-
- Bundle b = Skeleton.newMock(mock, Bundle.class);
-
- bundles.add(b);
-
- return b;
- }
-
- /**
- * Asks to install an OSGi bundle from the given location.
- *
- * @param location the location of the bundle on the file system.
- * @return the installed bundle.
- * @throws BundleException
- */
- public Bundle installBundle(String location) throws BundleException
- {
- try {
- URI uri = new URI(location.replaceAll(" ", "%20"));
-
- File baseDir = new File(uri);
- Manifest man = null;
- //check if it is a directory
- if (baseDir.isDirectory()){
- man = new Manifest(new FileInputStream(new File(baseDir, "META-INF/MANIFEST.MF")));
- }
- //if it isn't assume it is a jar file
- else{
- InputStream is = new FileInputStream(baseDir);
- JarInputStream jis = new JarInputStream(is);
- man = jis.getManifest();
- jis.close();
- if (man == null){
- throw new BundleException("Null manifest");
- }
- }
-
- return createBundle(man, location);
- } catch (IOException e) {
- throw new BundleException(e.getMessage(), e);
- } catch (URISyntaxException e) {
- // TODO Auto-generated catch block
- throw new BundleException(e.getMessage(), e);
- }
- }
-
- /**
- * @return all the bundles in the system
- */
- public Bundle[] getBundles()
- {
- return bundles.toArray(new Bundle[bundles.size()]);
- }
-
- /**
- * Add a service listener.
- *
- * @param listener
- * @param filter
- */
- public void addServiceListener(ServiceListener listener, String filter)
- {
- listeners.add(new FilteredServiceListener(filter, listener));
- }
-
- /**
- * Add a service listener.
- *
- * @param listener
- */
- public void addServiceListener(ServiceListener listener)
- {
- listeners.add(listener);
- }
-
- /**
- * Remove a service listener
- * @param listener
- */
- public void removeServiceListener(ServiceListener listener)
- {
- listeners.remove(new FilteredServiceListener(null, listener));
- }
-
- public String getProperty(String name)
- {
- if (Constants.FRAMEWORK_VERSION.equals(name)) {
- return "4.1";
- }
- /*added System.getProperty so that tests can set a system property
- * but it is retrieved via the BundleContext.
- * This allows tests to emulate different properties being set on the
- * context, helpful for the feature pack launcher/kernel relationship
- */
- else if (System.getProperty(name) != null){
- return System.getProperty(name);
- }
-
- return "";
- }
-
- /**
- * @return the bundle associated with this bundle context (if we created one).
- */
- public Bundle getBundle()
- {
- return bundle;
- }
-
- /**
- * This method clears the service registry.
- */
- public static void clear()
- {
- registry.clear();
- bundles.clear();
- listeners.clear();
- nextId = 0;
- }
-
- public static List<ServiceListener> getServiceListeners()
- {
- return listeners;
- }
-
- public void addBundle(Bundle b)
- {
- bundles.add(b);
- }
+/*
+ * 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.aries.mocks;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.jar.Attributes;
+import java.util.jar.JarInputStream;
+import java.util.jar.Manifest;
+
+import junit.framework.AssertionFailedError;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.Constants;
+import org.osgi.framework.Filter;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceEvent;
+import org.osgi.framework.ServiceFactory;
+import org.osgi.framework.ServiceListener;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+
+import org.apache.aries.unittest.mocks.Skeleton;
+
+/**
+ *
+ */
+/**
+ * This class is a partial implementation of BundleContext. Its main function
+ * is to provide a service registry implementation
+ */
+public class BundleContextMock
+{
+ /** The service registry */
+ private static Map<String, List<ServiceData>> registry = new HashMap<String, List<ServiceData>>();
+ /** A list of bundles installed into the runtime */
+ private static List<Bundle> bundles = new ArrayList<Bundle>();
+ /** A list of service listeners */
+ private static List<ServiceListener> listeners = new ArrayList<ServiceListener>();
+ /** The next service id to be assigned */
+ private static long nextId = 0;
+
+ private static class MockServiceFactory implements ServiceFactory
+ {
+ private final Object service;
+
+ public MockServiceFactory(Object obj)
+ {
+ service = obj;
+ }
+
+ public Object getService(Bundle arg0, ServiceRegistration arg1)
+ {
+ return service;
+ }
+
+ public void ungetService(Bundle arg0, ServiceRegistration arg1, Object arg2)
+ {
+ }
+ }
+
+ private static class FilteredServiceListener implements ServiceListener
+ {
+ private Filter filter;
+ private final ServiceListener listener;
+
+ public FilteredServiceListener(String f, ServiceListener l)
+ {
+ listener = l;
+
+ if (f != null) {
+ try {
+ filter = FrameworkUtil.createFilter(f);
+ } catch (InvalidSyntaxException e) {
+ AssertionFailedError err = new AssertionFailedError("The filter " + f + " is invalid");
+ err.initCause(e);
+
+ throw err;
+ }
+ }
+ }
+
+ public void serviceChanged(ServiceEvent arg0)
+ {
+ if (matches(arg0)) listener.serviceChanged(arg0);
+ }
+
+ private boolean matches(ServiceEvent arg0)
+ {
+ if (filter == null) return true;
+
+ ServiceReference ref = arg0.getServiceReference();
+
+ if (Skeleton.isSkeleton(ref)) {
+ Object template = Skeleton.getSkeleton(ref).getTemplateObject();
+
+ if (template instanceof ServiceData) {
+ return filter.match(((ServiceData)template).getProperties());
+ }
+ }
+
+ return filter.match(ref);
+ }
+
+ @Override
+ public boolean equals(Object obj)
+ {
+ if (obj == null) return false;
+ else if (obj instanceof FilteredServiceListener) {
+ return listener.equals(((FilteredServiceListener)obj).listener);
+ }
+
+ return false;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return listener.hashCode();
+ }
+ }
+
+ /**
+ * This class represents the information registered about a service. It also
+ * implements part of the ServiceRegistration and ServiceReference interfaces.
+ */
+ private class ServiceData
+ {
+ /** The service that was registered */
+ private ServiceFactory serviceImpl;
+ /** the service properties */
+ @SuppressWarnings("unused")
+ private final Hashtable<String, Object> serviceProps = new Hashtable<String, Object>();
+ /** The interfaces the service publishes with */
+ private String[] interfaceNames;
+
+ /**
+ * This method unregisters the service from the registry.
+ */
+ public void unregister()
+ {
+ for (String interfaceName : interfaceNames) {
+ List<ServiceData> list = registry.get(interfaceName);
+ if (list != null) {
+ list.remove(this);
+ if (list.isEmpty()) {
+ registry.remove(interfaceName);
+ }
+ }
+ }
+ notifyAllListeners(ServiceEvent.UNREGISTERING);
+ }
+
+ /**
+ * This method is used to register the service data in the registry
+ */
+ public void register()
+ {
+ for (String interfaceName : interfaceNames) {
+ List<ServiceData> list = registry.get(interfaceName);
+ if (list == null) {
+ list = new ArrayList<ServiceData>();
+ registry.put(interfaceName, list);
+ }
+ list.add(this);
+ }
+ notifyAllListeners(ServiceEvent.REGISTERED);
+ }
+
+ private void notifyAllListeners(int eventType) {
+ List<ServiceListener> copy = new ArrayList<ServiceListener>(listeners.size());
+ copy.addAll(listeners);
+ for(ServiceListener listener : copy) {
+ listener.serviceChanged(new ServiceEvent(eventType, Skeleton.newMock(this, ServiceReference.class)));
+ }
+ }
+
+ /**
+ * Change the service properties
+ * @param newProps
+ */
+ public void setProperties(Dictionary<String,Object> newProps)
+ {
+ // make sure we don't overwrite framework properties
+ newProps.put(Constants.OBJECTCLASS, serviceProps.get(Constants.OBJECTCLASS));
+ newProps.put(Constants.SERVICE_ID, serviceProps.get(Constants.SERVICE_ID));
+
+ Enumeration<String> keys = newProps.keys();
+
+ serviceProps.clear();
+ while (keys.hasMoreElements()) {
+ String key = keys.nextElement();
+ serviceProps.put(key, newProps.get(key));
+ }
+
+ notifyAllListeners(ServiceEvent.MODIFIED);
+ }
+
+ /**
+ * This implements the isAssignableTo method from ServiceReference.
+ *
+ * @param b
+ * @param className
+ * @return true if the referenced service can be assigned to the requested
+ * class name.
+ */
+ public boolean isAssignableTo(Bundle b, String className)
+ {
+ boolean result = false;
+
+ for (String iName : interfaceNames)
+ {
+ result = iName.equals(className);
+
+ if (result) break;
+ }
+
+ return result;
+ }
+
+ /**
+ * Returns the requested service property.
+ * @param key the property to return.
+ * @return the property value.
+ */
+ public Object getProperty(String key)
+ {
+ return serviceProps.get(key);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if(o == null) return false;
+
+ if(o == this) return true;
+
+ if (o instanceof ServiceData) {
+ ServiceData other = (ServiceData) o;
+ return serviceImpl == other.serviceImpl;
+ }
+
+ return false;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return serviceImpl.hashCode();
+ }
+
+ /**
+ * @return the keys of all the service properties.
+ */
+ public String[] getPropertyKeys()
+ {
+ Enumeration<String> e = serviceProps.keys();
+
+ String[] toReturn = new String[serviceProps.size()];
+
+ for(int i = 0 ; i < serviceProps.size(); i++)
+ toReturn[i] = e.nextElement();
+
+ return toReturn;
+ }
+
+ /**
+ * @return the bundle this service reference was registered against.
+ */
+ public Bundle getBundle()
+ {
+ return bundle;
+ }
+
+ /**
+ * @return a service reference for this service registration.
+ */
+ public ServiceReference getReference()
+ {
+ return Skeleton.newMock(this, ServiceReference.class);
+ }
+
+ public Hashtable<String, Object> getProperties()
+ {
+ return new Hashtable<String, Object>(serviceProps);
+ }
+ }
+
+ /** The bundle associated with this bundle context */
+ private Bundle bundle;
+
+ /**
+ * Default constructor, widely used in the tests.
+ */
+ public BundleContextMock()
+ {
+
+ }
+
+ /**
+ * Constructor used by BundleMock, it ensures the bundle and its context are wired together correctly.
+ *
+ * TODO We have to many Bundle mocks objects for a single OSGi bundle, we need to update this.
+ *
+ * @param b
+ */
+ public BundleContextMock(Bundle b)
+ {
+ bundle = b;
+ }
+
+ /**
+ * This checks that we have at least one service with this interface name.
+ *
+ * @param interfaceName the name of the interface.
+ */
+ public static void assertServiceExists(String interfaceName)
+ {
+ assertTrue("No service registered with interface " + interfaceName + ". Services found: " + registry.keySet(), registry.containsKey(interfaceName));
+ }
+
+ /**
+ * This checks that we have at no services with this interface name.
+ *
+ * @param interfaceName the name of the interface.
+ */
+ public static void assertNoServiceExists(String interfaceName)
+ {
+ assertFalse("Services registered with interface " + interfaceName + ". Services found: " + registry.keySet(), registry.containsKey(interfaceName));
+ }
+
+ /**
+ * This implements the registerService method from BundleContext.
+ *
+ * @param interFace
+ * @param service
+ * @param properties
+ * @return the ServiceRegistration object for this service.
+ */
+ public ServiceRegistration registerService(String interFace, final Object service, Dictionary<String, Object> properties)
+ {
+ // validate that the service implements interFace
+ try {
+ Class<?> clazz = Class.forName(interFace, false, service.getClass().getClassLoader());
+
+ if (!!!clazz.isInstance(service) && !!!(service instanceof ServiceFactory)) {
+ throw new AssertionFailedError("The service " + service + " does not implement " + interFace);
+ }
+ } catch (ClassNotFoundException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ ServiceFactory factory = new MockServiceFactory(service);
+ return registerService(new String[] {interFace}, factory, properties);
+ }
+
+ /**
+ * This implements the registerService method from BundleContext.
+ *
+ * @param interfaces
+ * @param service
+ * @param properties
+ * @return the ServiceRegistration object for this service.
+ */
+ public ServiceRegistration registerService(String[] interfaces, Object service, Dictionary<String, Object> properties)
+ {
+ if (properties == null) properties = new Hashtable<String, Object>();
+
+ ServiceData data = new ServiceData();
+ // cast the service to a service factory because in our framework we only ever register
+ // a service factory. If we every put a non-service factory object in that is a failure.
+ properties.put(Constants.OBJECTCLASS, interfaces);
+ properties.put(Constants.SERVICE_ID, nextId++);
+ if (service instanceof ServiceFactory) {
+ data.serviceImpl = (ServiceFactory)service;
+ } else {
+ data.serviceImpl = new MockServiceFactory(service);
+ }
+ data.interfaceNames = interfaces;
+
+ Enumeration<String> keys = properties.keys();
+
+ while (keys.hasMoreElements()) {
+ String key = keys.nextElement();
+ data.serviceProps.put(key, properties.get(key));
+ }
+
+ data.register();
+
+ return Skeleton.newMock(data, ServiceRegistration.class);
+ }
+
+ /**
+ * This helper method is used to get the service from the registry with the
+ * given interface name.
+ *
+ * <p>This should really return multiple services.
+ * </p>
+ *
+ * @param interfaceName the interface name.
+ * @param bundle the bundle name.
+ * @return the registered service.
+ */
+ public static Object getService(String interfaceName, Bundle bundle)
+ {
+ List<ServiceData> datum = registry.get(interfaceName);
+
+ if (datum == null) return null;
+ else if (datum.isEmpty()) return null;
+ // this is safe for now, but may not be when we do other scoped components.
+ else {
+ ServiceRegistration reg = Skeleton.newMock(ServiceRegistration.class);
+ return datum.iterator().next().serviceImpl.getService(bundle, reg);
+ }
+ }
+
+ /**
+ * A mock implementation of the getServiceReferences method. It does not currently
+ * process the filter, this is probably a bit hard, so we might cheat when we do.
+ *
+ * <p>Note this does not check that the service classes are visible to the
+ * caller as OSGi does. It is equivalent to getAllServiceReferences.
+ * </p>
+ *
+ * @param className the name of the class the lookup is for.
+ * @param filter
+ * @return an array of matching service references.
+ * @throws InvalidSyntaxException
+ */
+ public ServiceReference[] getServiceReferences(String className, String filter) throws InvalidSyntaxException
+ {
+ List<ServiceData> data = new ArrayList<ServiceData>();
+
+ if (className != null) {
+ List<ServiceData> tmpData = registry.get(className);
+ if (tmpData != null) data.addAll(tmpData);
+ } else {
+ data = new ArrayList<ServiceData>();
+ for (List<ServiceData> value : registry.values())
+ data.addAll(value);
+ }
+
+ ServiceReference[] refs;
+
+ if (data == null) {
+ refs = null;
+ } else {
+
+ if (filter != null) {
+ Filter f = FrameworkUtil.createFilter(filter);
+
+ Iterator<ServiceData> it = data.iterator();
+
+ while (it.hasNext()) {
+ ServiceData sd = it.next();
+
+ if (!!!f.match(sd.getProperties())) it.remove();
+ }
+ }
+
+ if (data.isEmpty()) return null;
+
+ refs = new ServiceReference[data.size()];
+ for (int i = 0; i < refs.length; i++) {
+ refs[i] = Skeleton.newMock(data.get(i), ServiceReference.class);
+ }
+ }
+
+ return refs;
+ }
+
+ /**
+ * Gets the first matching service reference.
+ *
+ * @param className the class name wanted.
+ * @return the matchine service, or null if one cannot be found.
+ */
+ public ServiceReference getServiceReference(String className)
+ {
+ ServiceReference[] refs;
+ try {
+ refs = getServiceReferences(className, null);
+ if (refs != null) return refs[0];
+
+ return null;
+ } catch (InvalidSyntaxException e) {
+ // should never happen.
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ /**
+ * This method finds all the service references in the registry with the
+ * matching class name and filter.
+ *
+ * @param className
+ * @param filter
+ * @return the matching service references.
+ * @throws InvalidSyntaxException
+ */
+ public ServiceReference[] getAllServiceReferences(String className, String filter) throws InvalidSyntaxException
+ {
+ return getServiceReferences(className, filter);
+ }
+
+ /**
+ * Retrieve a service from the registry.
+ * @param ref the service reference.
+ * @return the returned service.
+ */
+ public Object getService(ServiceReference ref)
+ {
+ ServiceData data = (ServiceData)Skeleton.getSkeleton(ref).getTemplateObject();
+
+ return data.serviceImpl.getService(getBundle(), Skeleton.newMock(data, ServiceRegistration.class));
+ }
+
+ /**
+ * This method implements the installBundle method from BundleContext. It
+ * makes use of the java.util.jar package to parse the manifest from the input
+ * stream.
+ *
+ * @param location the location of the bundle.
+ * @param is the input stream to read from.
+ * @return the created bundle.
+ * @throws BundleException
+ */
+ public Bundle installBundle(String location, InputStream is) throws BundleException
+ {
+ Bundle b;
+ JarInputStream jis;
+ try {
+ jis = new JarInputStream(is);
+
+ Manifest man = jis.getManifest();
+
+ b = createBundle(man, null);
+
+ } catch (IOException e) {
+ throw new BundleException(e.getMessage(), e);
+ }
+
+ return b;
+ }
+
+ /**
+ * Create a mock bundle correctly configured using the supplied manifest and
+ * location.
+ *
+ * @param man the manifest to load.
+ * @param location the location on disk.
+ * @return the created bundle
+ * @throws MalformedURLException
+ */
+ private Bundle createBundle(Manifest man, String location) throws MalformedURLException
+ {
+ Attributes attribs = man.getMainAttributes();
+ String symbolicName = attribs.getValue(Constants.BUNDLE_SYMBOLICNAME);
+
+ Hashtable<Object, Object> attribMap = new Hashtable<Object, Object>();
+
+ for (Map.Entry<Object, Object> entry : attribs.entrySet()) {
+ Attributes.Name name = (Attributes.Name)entry.getKey();
+ attribMap.put(name.toString(), entry.getValue());
+ }
+
+ BundleMock mock = new BundleMock(symbolicName, attribMap, location);
+
+ mock.addToClassPath(new File("build/unittest/classes").toURL());
+
+ Bundle b = Skeleton.newMock(mock, Bundle.class);
+
+ bundles.add(b);
+
+ return b;
+ }
+
+ /**
+ * Asks to install an OSGi bundle from the given location.
+ *
+ * @param location the location of the bundle on the file system.
+ * @return the installed bundle.
+ * @throws BundleException
+ */
+ public Bundle installBundle(String location) throws BundleException
+ {
+ try {
+ URI uri = new URI(location.replaceAll(" ", "%20"));
+
+ File baseDir = new File(uri);
+ Manifest man = null;
+ //check if it is a directory
+ if (baseDir.isDirectory()){
+ man = new Manifest(new FileInputStream(new File(baseDir, "META-INF/MANIFEST.MF")));
+ }
+ //if it isn't assume it is a jar file
+ else{
+ InputStream is = new FileInputStream(baseDir);
+ JarInputStream jis = new JarInputStream(is);
+ man = jis.getManifest();
+ jis.close();
+ if (man == null){
+ throw new BundleException("Null manifest");
+ }
+ }
+
+ return createBundle(man, location);
+ } catch (IOException e) {
+ throw new BundleException(e.getMessage(), e);
+ } catch (URISyntaxException e) {
+ // TODO Auto-generated catch block
+ throw new BundleException(e.getMessage(), e);
+ }
+ }
+
+ /**
+ * @return all the bundles in the system
+ */
+ public Bundle[] getBundles()
+ {
+ return bundles.toArray(new Bundle[bundles.size()]);
+ }
+
+ /**
+ * Add a service listener.
+ *
+ * @param listener
+ * @param filter
+ */
+ public void addServiceListener(ServiceListener listener, String filter)
+ {
+ listeners.add(new FilteredServiceListener(filter, listener));
+ }
+
+ /**
+ * Add a service listener.
+ *
+ * @param listener
+ */
+ public void addServiceListener(ServiceListener listener)
+ {
+ listeners.add(listener);
+ }
+
+ /**
+ * Remove a service listener
+ * @param listener
+ */
+ public void removeServiceListener(ServiceListener listener)
+ {
+ listeners.remove(new FilteredServiceListener(null, listener));
+ }
+
+ public String getProperty(String name)
+ {
+ if (Constants.FRAMEWORK_VERSION.equals(name)) {
+ return "4.1";
+ }
+ /*added System.getProperty so that tests can set a system property
+ * but it is retrieved via the BundleContext.
+ * This allows tests to emulate different properties being set on the
+ * context, helpful for the feature pack launcher/kernel relationship
+ */
+ else if (System.getProperty(name) != null){
+ return System.getProperty(name);
+ }
+
+ return "";
+ }
+
+ /**
+ * @return the bundle associated with this bundle context (if we created one).
+ */
+ public Bundle getBundle()
+ {
+ return bundle;
+ }
+
+ /**
+ * This method clears the service registry.
+ */
+ public static void clear()
+ {
+ registry.clear();
+ bundles.clear();
+ listeners.clear();
+ nextId = 0;
+ }
+
+ public static List<ServiceListener> getServiceListeners()
+ {
+ return listeners;
+ }
+
+ public void addBundle(Bundle b)
+ {
+ bundles.add(b);
+ }
}
\ No newline at end of file
Propchange: incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/mocks/BundleContextMock.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/mocks/BundleMock.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/mocks/BundleMock.java?rev=822565&r1=822564&r2=822565&view=diff
==============================================================================
--- incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/mocks/BundleMock.java (original)
+++ incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/mocks/BundleMock.java Wed Oct 7 03:00:43 2009
@@ -1,391 +1,391 @@
-/*
- * 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.aries.mocks;
-
-import java.io.File;
-import java.io.FileFilter;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Dictionary;
-import java.util.Enumeration;
-import java.util.List;
-import java.util.Vector;
-import java.util.regex.Pattern;
-
-import junit.framework.AssertionFailedError;
-
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.BundleReference;
-import org.osgi.framework.Constants;
-import org.osgi.framework.Version;
-
-import org.apache.aries.unittest.mocks.MethodCall;
-import org.apache.aries.unittest.mocks.MethodCallHandler;
-import org.apache.aries.unittest.mocks.Skeleton;
-import org.apache.aries.unittest.mocks.annotations.Singleton;
-
-@Singleton
-public class BundleMock
-{
- private final String symbolicName;
- private final Dictionary<?, ?> headers;
- private final BundleContext bc;
- private String location;
- private BundleClassLoader cl;
-
- private class BundleClassLoader extends URLClassLoader implements BundleReference
- {
- List<Bundle> otherBundlesToCheck = new ArrayList<Bundle>();
-
- public BundleClassLoader(URL[] urls)
- {
- super(urls);
- }
-
- public BundleClassLoader(URL[] urls, ClassLoader parent)
- {
- super(urls, parent);
- }
-
- public void addBundle(Bundle ... otherBundles)
- {
- otherBundlesToCheck.addAll(Arrays.asList(otherBundles));
- }
-
- public Bundle[] getBundles()
- {
- return otherBundlesToCheck.toArray(new Bundle[otherBundlesToCheck.size()]);
- }
-
- @Override
- protected Class<?> findClass(String name) throws ClassNotFoundException
- {
- Class<?> result = null;
- for (Bundle b : otherBundlesToCheck) {
- try {
- result = b.loadClass(name);
- } catch (ClassNotFoundException e) {
- // do nothing here.
- }
-
- if (result != null) return result;
- }
-
- return super.findClass(name);
- }
-
- public Bundle getBundle()
- {
- return Skeleton.newMock(BundleMock.this, Bundle.class);
- }
- }
-
- public BundleMock(String name, Dictionary<?, ?> bundleHeaders)
- {
- symbolicName = name;
- headers = bundleHeaders;
- bc = Skeleton.newMock(new BundleContextMock(Skeleton.newMock(this, Bundle.class)), BundleContext.class);
-
- cl = AccessController.doPrivileged(new PrivilegedAction<BundleClassLoader>() {
-
- public BundleClassLoader run()
- {
- return new BundleClassLoader(new URL[0], this.getClass().getClassLoader());
- }
- });
- }
-
- public BundleMock(String name, Dictionary<?,?> bundleHeaders, boolean dummy)
- {
- this(name, bundleHeaders);
-
- cl = null;
- }
-
- public BundleMock(String name, Dictionary<?, ?> bundleHeaders, String location)
- {
- this(name, bundleHeaders);
- this.location = location;
-
- if (location != null) {
- String cp = (String)bundleHeaders.get(Constants.BUNDLE_CLASSPATH);
-
- if (cp == null) cp = ".";
-
- String[] cpEntries = cp.split(",");
-
- final List<URL> urls = new ArrayList<URL>();
-
- try {
- for (String cpEntry : cpEntries) {
- if (".".equals(cpEntry.trim())) {
- urls.add(new URL(location));
- } else {
- urls.add(new URL(location + "/" + cpEntry));
- }
- }
-
- cl = AccessController.doPrivileged(new PrivilegedAction<BundleClassLoader>() {
- public BundleClassLoader run()
- {
- return new BundleClassLoader(urls.toArray(new URL[urls.size()]));
- }
- });
- } catch (MalformedURLException e) {
- Error err = new AssertionFailedError("The location was not a valid url");
- err.initCause(e);
- throw err;
- }
- }
- }
-
- private static class PrivateDataFileHandler implements MethodCallHandler
- {
- private final File location;
-
- public PrivateDataFileHandler(File f)
- {
- this.location = f;
- }
-
- public Object handle(MethodCall call, Skeleton parent)
- {
- File privateStorage = new File(location.getAbsolutePath(), "_private");
- if (!!!privateStorage.exists())
- privateStorage.mkdirs();
-
- return new File(privateStorage, (String) call.getArguments()[0]);
- }
- }
-
- public BundleMock(String name, Dictionary<?, ?> properties, File location) throws Exception
- {
- this(name,properties,location.toURL().toExternalForm());
-
- Skeleton bcSkel = Skeleton.getSkeleton(bc);
- bcSkel.registerMethodCallHandler(
- new MethodCall(BundleContext.class,"getDataFile", new Object[] { String.class }),
- new PrivateDataFileHandler(location)
- );
- }
-
- public String getSymbolicName()
- {
- return symbolicName;
- }
-
- public Dictionary<?, ?> getHeaders()
- {
- return headers;
- }
-
- public Enumeration<URL> findEntries(String baseDir, String matchRule, boolean recurse)
- {
- System.err.println("findEntries: " + baseDir + ", " + matchRule + ", " + recurse);
- File base;
- try {
- base = new File(new File(new URL(location.replaceAll(" ", "%20")).toURI()), baseDir);
- System.err.println("Base dir: " + base);
- } catch (Exception e) {
- Error err = new AssertionFailedError("Unable to findEntries from " + location);
- err.initCause(e);
- throw err;
- }
-
- if (matchRule.equals("*.xml")) matchRule = ".*\\.xml";
- else matchRule = matchRule.replaceAll("\\*", ".*");
-
- System.err.println("matchrule: " + matchRule);
-
- final Pattern p = Pattern.compile(matchRule);
-
- File[] files = base.listFiles(new FileFilter(){
- public boolean accept(File pathname)
- {
- return pathname.isFile() &&
- p.matcher(pathname.getName()).matches();
- }
- });
-
- Vector<URL> v = new Vector<URL>();
-
- if (files != null) {
- for (File f : files) {
- try {
- v.add(f.toURL());
- } catch (MalformedURLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- } else {
- System.err.println("no matching files");
- }
-
- if (v.isEmpty()) {
- return null;
- } else {
- System.err.println(v);
- return v.elements();
- }
- }
-
- public URL getResource(String name)
- {
- if (cl != null) return cl.getResource(name);
-
- try {
- File f = new File(name);
- if(f.exists() || "Entities.jar".equals(name)) return f.toURL();
- else return null;
- } catch (MalformedURLException e) {
- Error err = new AssertionFailedError("The resource " + name + " could not be found.");
- err.initCause(e);
- throw err;
- }
- }
-
- public Enumeration<URL> getResources(String name)
- {
- if (cl != null)
- {
- try {
- return cl.getResources(name);
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- else {
- final URL resource = getResource(name);
-
- if(resource != null) {
- return new Enumeration<URL>() {
-
- boolean hasMore = true;
- public boolean hasMoreElements()
- {
- return hasMore;
- }
-
- public URL nextElement()
- {
- hasMore = false;
- return resource;
- }
-
- };
- }
- }
- return new Enumeration<URL>(){
- public URL nextElement()
- {
- return null;
- }
-
- public boolean hasMoreElements()
- {
- return false;
- }
- };
-
- }
-
- public Class<?> loadClass(String name) throws ClassNotFoundException
- {
- if (cl != null) return Class.forName(name, false, cl);
-
- throw new ClassNotFoundException("Argh, things went horribly wrong trying to load " + name);
- }
-
- public String getLocation()
- {
- try {
- return (location == null) ? new File(symbolicName + ".jar").toURL().toString() : location;
- } catch (MalformedURLException e) {
- Error err = new AssertionFailedError("We could not generate a valid url for the bundle");
- err.initCause(e);
- throw err;
- }
- }
-
- public BundleContext getBundleContext()
- {
- return bc;
- }
-
- public Version getVersion()
- {
- String res = (String) headers.get("Bundle-Version");
- if (res != null)
- return new Version(res);
- else
- return new Version("0.0.0");
- }
-
- public int getState()
- {
- return Bundle.ACTIVE;
- }
-
- public void addToClassPath(URL ... urls)
- {
- if (cl != null) {
- URL[] existingURLs = cl.getURLs();
- final URL[] mergedURLs = new URL[urls.length + existingURLs.length];
- int i = 0;
- for (; i < existingURLs.length; i++) {
- mergedURLs[i] = existingURLs[i];
- }
-
- for (int j = 0; j < urls.length; j++, i++) {
- mergedURLs[i] = urls[j];
- }
-
- BundleClassLoader newCl = AccessController.doPrivileged(new PrivilegedAction<BundleClassLoader>() {
-
- public BundleClassLoader run()
- {
- return new BundleClassLoader(mergedURLs, cl.getParent());
- }
-
- });
- newCl.addBundle(cl.getBundles());
- cl = newCl;
- }
- }
-
- public void addBundleToClassPath(Bundle ... bundles) {
- if (cl != null) {
- cl.addBundle(bundles);
- }
- }
-
- public ClassLoader getClassLoader()
- {
- return cl;
- }
+/*
+ * 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.aries.mocks;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Vector;
+import java.util.regex.Pattern;
+
+import junit.framework.AssertionFailedError;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleReference;
+import org.osgi.framework.Constants;
+import org.osgi.framework.Version;
+
+import org.apache.aries.unittest.mocks.MethodCall;
+import org.apache.aries.unittest.mocks.MethodCallHandler;
+import org.apache.aries.unittest.mocks.Skeleton;
+import org.apache.aries.unittest.mocks.annotations.Singleton;
+
+@Singleton
+public class BundleMock
+{
+ private final String symbolicName;
+ private final Dictionary<?, ?> headers;
+ private final BundleContext bc;
+ private String location;
+ private BundleClassLoader cl;
+
+ private class BundleClassLoader extends URLClassLoader implements BundleReference
+ {
+ List<Bundle> otherBundlesToCheck = new ArrayList<Bundle>();
+
+ public BundleClassLoader(URL[] urls)
+ {
+ super(urls);
+ }
+
+ public BundleClassLoader(URL[] urls, ClassLoader parent)
+ {
+ super(urls, parent);
+ }
+
+ public void addBundle(Bundle ... otherBundles)
+ {
+ otherBundlesToCheck.addAll(Arrays.asList(otherBundles));
+ }
+
+ public Bundle[] getBundles()
+ {
+ return otherBundlesToCheck.toArray(new Bundle[otherBundlesToCheck.size()]);
+ }
+
+ @Override
+ protected Class<?> findClass(String name) throws ClassNotFoundException
+ {
+ Class<?> result = null;
+ for (Bundle b : otherBundlesToCheck) {
+ try {
+ result = b.loadClass(name);
+ } catch (ClassNotFoundException e) {
+ // do nothing here.
+ }
+
+ if (result != null) return result;
+ }
+
+ return super.findClass(name);
+ }
+
+ public Bundle getBundle()
+ {
+ return Skeleton.newMock(BundleMock.this, Bundle.class);
+ }
+ }
+
+ public BundleMock(String name, Dictionary<?, ?> bundleHeaders)
+ {
+ symbolicName = name;
+ headers = bundleHeaders;
+ bc = Skeleton.newMock(new BundleContextMock(Skeleton.newMock(this, Bundle.class)), BundleContext.class);
+
+ cl = AccessController.doPrivileged(new PrivilegedAction<BundleClassLoader>() {
+
+ public BundleClassLoader run()
+ {
+ return new BundleClassLoader(new URL[0], this.getClass().getClassLoader());
+ }
+ });
+ }
+
+ public BundleMock(String name, Dictionary<?,?> bundleHeaders, boolean dummy)
+ {
+ this(name, bundleHeaders);
+
+ cl = null;
+ }
+
+ public BundleMock(String name, Dictionary<?, ?> bundleHeaders, String location)
+ {
+ this(name, bundleHeaders);
+ this.location = location;
+
+ if (location != null) {
+ String cp = (String)bundleHeaders.get(Constants.BUNDLE_CLASSPATH);
+
+ if (cp == null) cp = ".";
+
+ String[] cpEntries = cp.split(",");
+
+ final List<URL> urls = new ArrayList<URL>();
+
+ try {
+ for (String cpEntry : cpEntries) {
+ if (".".equals(cpEntry.trim())) {
+ urls.add(new URL(location));
+ } else {
+ urls.add(new URL(location + "/" + cpEntry));
+ }
+ }
+
+ cl = AccessController.doPrivileged(new PrivilegedAction<BundleClassLoader>() {
+ public BundleClassLoader run()
+ {
+ return new BundleClassLoader(urls.toArray(new URL[urls.size()]));
+ }
+ });
+ } catch (MalformedURLException e) {
+ Error err = new AssertionFailedError("The location was not a valid url");
+ err.initCause(e);
+ throw err;
+ }
+ }
+ }
+
+ private static class PrivateDataFileHandler implements MethodCallHandler
+ {
+ private final File location;
+
+ public PrivateDataFileHandler(File f)
+ {
+ this.location = f;
+ }
+
+ public Object handle(MethodCall call, Skeleton parent)
+ {
+ File privateStorage = new File(location.getAbsolutePath(), "_private");
+ if (!!!privateStorage.exists())
+ privateStorage.mkdirs();
+
+ return new File(privateStorage, (String) call.getArguments()[0]);
+ }
+ }
+
+ public BundleMock(String name, Dictionary<?, ?> properties, File location) throws Exception
+ {
+ this(name,properties,location.toURL().toExternalForm());
+
+ Skeleton bcSkel = Skeleton.getSkeleton(bc);
+ bcSkel.registerMethodCallHandler(
+ new MethodCall(BundleContext.class,"getDataFile", new Object[] { String.class }),
+ new PrivateDataFileHandler(location)
+ );
+ }
+
+ public String getSymbolicName()
+ {
+ return symbolicName;
+ }
+
+ public Dictionary<?, ?> getHeaders()
+ {
+ return headers;
+ }
+
+ public Enumeration<URL> findEntries(String baseDir, String matchRule, boolean recurse)
+ {
+ System.err.println("findEntries: " + baseDir + ", " + matchRule + ", " + recurse);
+ File base;
+ try {
+ base = new File(new File(new URL(location.replaceAll(" ", "%20")).toURI()), baseDir);
+ System.err.println("Base dir: " + base);
+ } catch (Exception e) {
+ Error err = new AssertionFailedError("Unable to findEntries from " + location);
+ err.initCause(e);
+ throw err;
+ }
+
+ if (matchRule.equals("*.xml")) matchRule = ".*\\.xml";
+ else matchRule = matchRule.replaceAll("\\*", ".*");
+
+ System.err.println("matchrule: " + matchRule);
+
+ final Pattern p = Pattern.compile(matchRule);
+
+ File[] files = base.listFiles(new FileFilter(){
+ public boolean accept(File pathname)
+ {
+ return pathname.isFile() &&
+ p.matcher(pathname.getName()).matches();
+ }
+ });
+
+ Vector<URL> v = new Vector<URL>();
+
+ if (files != null) {
+ for (File f : files) {
+ try {
+ v.add(f.toURL());
+ } catch (MalformedURLException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+ } else {
+ System.err.println("no matching files");
+ }
+
+ if (v.isEmpty()) {
+ return null;
+ } else {
+ System.err.println(v);
+ return v.elements();
+ }
+ }
+
+ public URL getResource(String name)
+ {
+ if (cl != null) return cl.getResource(name);
+
+ try {
+ File f = new File(name);
+ if(f.exists() || "Entities.jar".equals(name)) return f.toURL();
+ else return null;
+ } catch (MalformedURLException e) {
+ Error err = new AssertionFailedError("The resource " + name + " could not be found.");
+ err.initCause(e);
+ throw err;
+ }
+ }
+
+ public Enumeration<URL> getResources(String name)
+ {
+ if (cl != null)
+ {
+ try {
+ return cl.getResources(name);
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+ else {
+ final URL resource = getResource(name);
+
+ if(resource != null) {
+ return new Enumeration<URL>() {
+
+ boolean hasMore = true;
+ public boolean hasMoreElements()
+ {
+ return hasMore;
+ }
+
+ public URL nextElement()
+ {
+ hasMore = false;
+ return resource;
+ }
+
+ };
+ }
+ }
+ return new Enumeration<URL>(){
+ public URL nextElement()
+ {
+ return null;
+ }
+
+ public boolean hasMoreElements()
+ {
+ return false;
+ }
+ };
+
+ }
+
+ public Class<?> loadClass(String name) throws ClassNotFoundException
+ {
+ if (cl != null) return Class.forName(name, false, cl);
+
+ throw new ClassNotFoundException("Argh, things went horribly wrong trying to load " + name);
+ }
+
+ public String getLocation()
+ {
+ try {
+ return (location == null) ? new File(symbolicName + ".jar").toURL().toString() : location;
+ } catch (MalformedURLException e) {
+ Error err = new AssertionFailedError("We could not generate a valid url for the bundle");
+ err.initCause(e);
+ throw err;
+ }
+ }
+
+ public BundleContext getBundleContext()
+ {
+ return bc;
+ }
+
+ public Version getVersion()
+ {
+ String res = (String) headers.get("Bundle-Version");
+ if (res != null)
+ return new Version(res);
+ else
+ return new Version("0.0.0");
+ }
+
+ public int getState()
+ {
+ return Bundle.ACTIVE;
+ }
+
+ public void addToClassPath(URL ... urls)
+ {
+ if (cl != null) {
+ URL[] existingURLs = cl.getURLs();
+ final URL[] mergedURLs = new URL[urls.length + existingURLs.length];
+ int i = 0;
+ for (; i < existingURLs.length; i++) {
+ mergedURLs[i] = existingURLs[i];
+ }
+
+ for (int j = 0; j < urls.length; j++, i++) {
+ mergedURLs[i] = urls[j];
+ }
+
+ BundleClassLoader newCl = AccessController.doPrivileged(new PrivilegedAction<BundleClassLoader>() {
+
+ public BundleClassLoader run()
+ {
+ return new BundleClassLoader(mergedURLs, cl.getParent());
+ }
+
+ });
+ newCl.addBundle(cl.getBundles());
+ cl = newCl;
+ }
+ }
+
+ public void addBundleToClassPath(Bundle ... bundles) {
+ if (cl != null) {
+ cl.addBundle(bundles);
+ }
+ }
+
+ public ClassLoader getClassLoader()
+ {
+ return cl;
+ }
}
\ No newline at end of file
Propchange: incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/mocks/BundleMock.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/mocks/MockInitialContextFactoryBuilder.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/mocks/MockInitialContextFactoryBuilder.java?rev=822565&r1=822564&r2=822565&view=diff
==============================================================================
--- incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/mocks/MockInitialContextFactoryBuilder.java (original)
+++ incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/mocks/MockInitialContextFactoryBuilder.java Wed Oct 7 03:00:43 2009
@@ -1,56 +1,56 @@
-/*
- * 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.aries.mocks;
-
-import java.util.Hashtable;
-
-import javax.naming.Context;
-import javax.naming.NamingException;
-import javax.naming.spi.InitialContextFactory;
-import javax.naming.spi.InitialContextFactoryBuilder;
-import javax.naming.spi.NamingManager;
-
-import org.apache.aries.unittest.mocks.MethodCall;
-import org.apache.aries.unittest.mocks.Skeleton;
-
-public class MockInitialContextFactoryBuilder implements InitialContextFactoryBuilder
-{
- private static InitialContextFactory icf;
-
- public InitialContextFactory createInitialContextFactory(Hashtable<?, ?> environment)
- throws NamingException
- {
- return icf;
- }
-
- public static void start(Context ctx) throws NamingException
- {
- if (icf == null) {
- NamingManager.setInitialContextFactoryBuilder(new MockInitialContextFactoryBuilder());
- }
-
- icf = Skeleton.newMock(InitialContextFactory.class);
- getSkeleton().setReturnValue(new MethodCall(InitialContextFactory.class, "getInitialContext", Hashtable.class), ctx);
- }
-
- public static Skeleton getSkeleton()
- {
- return Skeleton.getSkeleton(icf);
- }
+/*
+ * 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.aries.mocks;
+
+import java.util.Hashtable;
+
+import javax.naming.Context;
+import javax.naming.NamingException;
+import javax.naming.spi.InitialContextFactory;
+import javax.naming.spi.InitialContextFactoryBuilder;
+import javax.naming.spi.NamingManager;
+
+import org.apache.aries.unittest.mocks.MethodCall;
+import org.apache.aries.unittest.mocks.Skeleton;
+
+public class MockInitialContextFactoryBuilder implements InitialContextFactoryBuilder
+{
+ private static InitialContextFactory icf;
+
+ public InitialContextFactory createInitialContextFactory(Hashtable<?, ?> environment)
+ throws NamingException
+ {
+ return icf;
+ }
+
+ public static void start(Context ctx) throws NamingException
+ {
+ if (icf == null) {
+ NamingManager.setInitialContextFactoryBuilder(new MockInitialContextFactoryBuilder());
+ }
+
+ icf = Skeleton.newMock(InitialContextFactory.class);
+ getSkeleton().setReturnValue(new MethodCall(InitialContextFactory.class, "getInitialContext", Hashtable.class), ctx);
+ }
+
+ public static Skeleton getSkeleton()
+ {
+ return Skeleton.getSkeleton(icf);
+ }
}
\ No newline at end of file
Propchange: incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/mocks/MockInitialContextFactoryBuilder.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/unittest/junit/Assert.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/unittest/junit/Assert.java?rev=822565&r1=822564&r2=822565&view=diff
==============================================================================
--- incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/unittest/junit/Assert.java (original)
+++ incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/unittest/junit/Assert.java Wed Oct 7 03:00:43 2009
@@ -1,80 +1,80 @@
-/*
- * 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.aries.unittest.junit;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-/**
- * A library of useful assertion routines.
- */
-public class Assert
-{
- /**
- * This method checks that the two objects have the same hashCode. If the
- * equalsObjects parameter is true then the objects must also be .equals equal
- * if the equalsObject parameter is false then they must not be .equals equal.
- *
- * @param <T>
- * @param obj the first object.
- * @param obj2 the second object.
- * @param equalObjects whether the objects are also equal.
- */
- public static <T> void assertHashCodeEquals(T obj, T obj2, boolean equalObjects)
- {
- assertEquals("The hashCodes were different, bad, bad, bad", obj.hashCode(), obj2.hashCode());
- assertEquals("The two objects are not equal", equalObjects, obj.equals(obj2));
- }
-
- /**
- * This method makes sure that the hashCodes are not equal. And that they
- * are not .equals. This is because two objects of the same type cannot be
- * .equals if they have different hashCodes.
- *
- * @param <T>
- * @param obj
- * @param obj2
- */
- public static <T> void assertHashCodeNotEquals(T obj, T obj2)
- {
- assertFalse("The the two hashCodes should be different: " + obj.hashCode() + ", " + obj2.hashCode(), obj.hashCode() == obj2.hashCode());
- assertFalse("The two objects not equal", obj.equals(obj2));
- }
-
- /**
- * This method asserts that the equals contract is upheld by type T.
- *
- * @param <T>
- * @param info an instance of T
- * @param info2 a different instance of T that is .equal to info
- * @param info3 an instance of T that is not equal to info
- */
- public static <T> void assertEqualsContract(T info, T info2, T info3)
- {
- Object other = new Object();
- if (info.getClass() == Object.class) other = "A string";
-
- assertEquals(info, info);
- assertFalse(info.equals(null));
- assertTrue("Equals should be commutative", info.equals(info2) == info2.equals(info) && info2.equals(info3) == info3.equals(info2));
- assertTrue("If two objects are equal, then they must both be equal (or not equal) to a third", info.equals(info3) == info2.equals(info3));
- assertFalse("An object should not equal an object of a disparate type", info.equals(other));
- }
+/*
+ * 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.aries.unittest.junit;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * A library of useful assertion routines.
+ */
+public class Assert
+{
+ /**
+ * This method checks that the two objects have the same hashCode. If the
+ * equalsObjects parameter is true then the objects must also be .equals equal
+ * if the equalsObject parameter is false then they must not be .equals equal.
+ *
+ * @param <T>
+ * @param obj the first object.
+ * @param obj2 the second object.
+ * @param equalObjects whether the objects are also equal.
+ */
+ public static <T> void assertHashCodeEquals(T obj, T obj2, boolean equalObjects)
+ {
+ assertEquals("The hashCodes were different, bad, bad, bad", obj.hashCode(), obj2.hashCode());
+ assertEquals("The two objects are not equal", equalObjects, obj.equals(obj2));
+ }
+
+ /**
+ * This method makes sure that the hashCodes are not equal. And that they
+ * are not .equals. This is because two objects of the same type cannot be
+ * .equals if they have different hashCodes.
+ *
+ * @param <T>
+ * @param obj
+ * @param obj2
+ */
+ public static <T> void assertHashCodeNotEquals(T obj, T obj2)
+ {
+ assertFalse("The the two hashCodes should be different: " + obj.hashCode() + ", " + obj2.hashCode(), obj.hashCode() == obj2.hashCode());
+ assertFalse("The two objects not equal", obj.equals(obj2));
+ }
+
+ /**
+ * This method asserts that the equals contract is upheld by type T.
+ *
+ * @param <T>
+ * @param info an instance of T
+ * @param info2 a different instance of T that is .equal to info
+ * @param info3 an instance of T that is not equal to info
+ */
+ public static <T> void assertEqualsContract(T info, T info2, T info3)
+ {
+ Object other = new Object();
+ if (info.getClass() == Object.class) other = "A string";
+
+ assertEquals(info, info);
+ assertFalse(info.equals(null));
+ assertTrue("Equals should be commutative", info.equals(info2) == info2.equals(info) && info2.equals(info3) == info3.equals(info2));
+ assertTrue("If two objects are equal, then they must both be equal (or not equal) to a third", info.equals(info3) == info2.equals(info3));
+ assertFalse("An object should not equal an object of a disparate type", info.equals(other));
+ }
}
\ No newline at end of file
Propchange: incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/unittest/junit/Assert.java
------------------------------------------------------------------------------
svn:eol-style = native