blob: 5d3b94be863767e090be85ac09e58b5c4bbb2a6a [file] [log] [blame]
/*
Copyright (c) 2006, 2010 VMware Inc.
All rights reserved. This program and the accompanying materials
are made available under the terms of the Eclipse Public License v1.0
and Apache License v2.0 which accompanies this distribution.
The Eclipse Public License is available at
http://www.eclipse.org/legal/epl-v10.html and the Apache License v2.0
is available at http://www.opensource.org/licenses/apache2.0.php.
You may elect to redistribute this code under either of these licenses.
Contributors:
VMware Inc.
*/
package org.eclipse.gemini.blueprint.extender.internal.support;
import junit.framework.TestCase;
import org.eclipse.gemini.blueprint.context.support.OsgiBundleXmlApplicationContext;
import org.eclipse.gemini.blueprint.extender.internal.blueprint.activator.support.BlueprintContainerConfig;
import org.eclipse.gemini.blueprint.extender.support.ApplicationContextConfiguration;
import org.eclipse.gemini.blueprint.mock.EntryLookupControllingMockBundle;
import java.net.URL;
import java.util.Dictionary;
import java.util.Enumeration;
import java.util.Hashtable;
/**
* Test that given a bundle, we can correctly determine the spring configuration
* required for it.
*
* @author Adrian Colyer
*/
public class ApplicationContextConfigurationTest extends TestCase {
private static final String[] META_INF_SPRING_CONTENT = new String[] { "file://META-INF/spring/context.xml",
"file://META-INF/spring/context-two.xml" };
public void testBundleWithNoHeaderAndNoMetaInfSpringResourcesIsNotSpringPowered() {
EntryLookupControllingMockBundle aBundle = new EntryLookupControllingMockBundle(null);
aBundle.setResultsToReturnOnNextCallToFindEntries(null);
ApplicationContextConfiguration config = new BlueprintContainerConfig(aBundle);
assertFalse("bundle is not spring powered", config.isBlueprintConfigurationPresent());
}
public void testBundleWithSpringResourcesAndNoHeaderIsSpringPowered() {
EntryLookupControllingMockBundle aBundle = new RepeatingEntryLookupControllingMockBundle(null);
aBundle.setResultsToReturnOnNextCallToFindEntries(META_INF_SPRING_CONTENT);
ApplicationContextConfiguration config = new BlueprintContainerConfig(aBundle);
assertTrue("bundle is spring powered", config.isBlueprintConfigurationPresent());
}
public void testBundleWithHeaderAndNoMetaInfResourcesIsSpringPowered() throws Exception {
Dictionary<String, Object> headers = new Hashtable<>();
headers.put("Spring-Context", "META-INF/spring/context.xml");
EntryLookupControllingMockBundle aBundle = new EntryLookupControllingMockBundle(headers);
aBundle.setResultsToReturnOnNextCallToFindEntries(null);
aBundle.setEntryReturnOnNextCallToGetEntry(new URL("file://META-INF/spring/context.xml"));
ApplicationContextConfiguration config = new BlueprintContainerConfig(aBundle);
assertTrue("bundle is spring powered", config.isBlueprintConfigurationPresent());
}
public void testBundleWithNoHeaderShouldWaitFiveMinutes() {
EntryLookupControllingMockBundle aBundle = new EntryLookupControllingMockBundle(null);
aBundle.setResultsToReturnOnNextCallToFindEntries(META_INF_SPRING_CONTENT);
ApplicationContextConfiguration config = new BlueprintContainerConfig(aBundle);
assertEquals("bundle should timeout in five minutes", new Long(5 * 60 * 1000), new Long(config.getTimeout()));
}
public void testBundleWithWaitFiveSecondWaitForTimeout() {
Dictionary<String, Object> headers = new Hashtable<>();
headers.put("Spring-Context", "*;timeout:=5");
EntryLookupControllingMockBundle aBundle = new EntryLookupControllingMockBundle(headers);
aBundle.setResultsToReturnOnNextCallToFindEntries(META_INF_SPRING_CONTENT);
ApplicationContextConfiguration config = new BlueprintContainerConfig(aBundle);
assertTrue("bundle should be Spring powered", config.isBlueprintConfigurationPresent());
assertEquals("bundle should timeout in 5 s", new Long(5 * 1000), new Long(config.getTimeout()));
}
public void testBundleWithWaitForEver() {
// *;flavour
Dictionary<String, Object> headers = new Hashtable<>();
headers.put("Spring-Context", "*;timeout:=none");
EntryLookupControllingMockBundle aBundle = new EntryLookupControllingMockBundle(headers);
aBundle.setResultsToReturnOnNextCallToFindEntries(META_INF_SPRING_CONTENT);
ApplicationContextConfiguration config = new BlueprintContainerConfig(aBundle);
assertTrue("bundle should be Spring powered", config.isBlueprintConfigurationPresent());
assertEquals("bundle should timeout -2 (indicates forever)", new Long(-2), new Long(config.getTimeout()));
}
public void tstConfigLocationsInMetaInfNoHeader() {
EntryLookupControllingMockBundle aBundle = new EntryLookupControllingMockBundle(null);
aBundle.setResultsToReturnOnNextCallToFindEntries(META_INF_SPRING_CONTENT);
ApplicationContextConfiguration config = new BlueprintContainerConfig(aBundle);
String[] configFiles = config.getConfigurationLocations();
assertEquals("0 config files", 0, configFiles.length);
// assertEquals("bundle-url:file://META-INF/spring/context.xml",
// configFiles[0]);
// assertEquals("bundle-url:file://META-INF/spring/context-two.xml",
// configFiles[1]);
}
public void tstConfigLocationsInMetaInfWithHeader() throws Exception {
Dictionary<String, Object> headers = new Hashtable<>();
headers.put("Spring-Context", "META-INF/spring/context.xml");
EntryLookupControllingMockBundle aBundle = new EntryLookupControllingMockBundle(headers);
aBundle.setResultsToReturnOnNextCallToFindEntries(META_INF_SPRING_CONTENT);
aBundle.setEntryReturnOnNextCallToGetEntry(new URL("file://META-INF/spring/context.xml"));
ApplicationContextConfiguration config = new BlueprintContainerConfig(aBundle);
String[] configFiles = config.getConfigurationLocations();
assertTrue("bundle should be Spring powered", config.isBlueprintConfigurationPresent());
assertEquals("osgibundle:META-INF/spring/context.xml", configFiles[0]);
}
public void tstConfigLocationsInMetaInfWithWildcardHeader() throws Exception {
Dictionary<String, Object> headers = new Hashtable<>();
headers.put("Spring-Context", "*;wait-for-dependencies:=false");
EntryLookupControllingMockBundle aBundle = new EntryLookupControllingMockBundle(headers);
aBundle.setResultsToReturnOnNextCallToFindEntries(META_INF_SPRING_CONTENT);
aBundle.setEntryReturnOnNextCallToGetEntry(new URL(META_INF_SPRING_CONTENT[0]));
ApplicationContextConfiguration config = new BlueprintContainerConfig(aBundle);
String[] configFiles = config.getConfigurationLocations();
assertTrue("bundle should be Spring powered", config.isBlueprintConfigurationPresent());
assertEquals("1 config files", 1, configFiles.length);
assertEquals(OsgiBundleXmlApplicationContext.DEFAULT_CONFIG_LOCATION, configFiles[0]);
}
public void tstEmptyConfigLocationsInMetaInf() throws Exception {
System.out.println("tsst");
Dictionary<String, Object> headers = new Hashtable<>();
headers.put("Spring-Context", ";wait-for-dependencies:=false");
EntryLookupControllingMockBundle aBundle = new EntryLookupControllingMockBundle(headers);
aBundle.setResultsToReturnOnNextCallToFindEntries(META_INF_SPRING_CONTENT);
aBundle.setEntryReturnOnNextCallToGetEntry(new URL(META_INF_SPRING_CONTENT[0]));
ApplicationContextConfiguration config = new BlueprintContainerConfig(aBundle);
String[] configFiles = config.getConfigurationLocations();
assertTrue("bundle should be Spring powered", config.isBlueprintConfigurationPresent());
assertEquals("1 config files", 1, configFiles.length);
assertEquals(OsgiBundleXmlApplicationContext.DEFAULT_CONFIG_LOCATION, configFiles[0]);
}
public void tstConfigLocationsInMetaInfWithHeaderAndDependencies() throws Exception {
Dictionary<String, Object> headers = new Hashtable<>();
headers.put("Spring-Context", "META-INF/spring/context.xml;wait-for-dependencies:=false");
EntryLookupControllingMockBundle aBundle = new EntryLookupControllingMockBundle(headers);
aBundle.setResultsToReturnOnNextCallToFindEntries(META_INF_SPRING_CONTENT);
aBundle.setEntryReturnOnNextCallToGetEntry(new URL(META_INF_SPRING_CONTENT[0]));
ApplicationContextConfiguration config = new BlueprintContainerConfig(aBundle);
String[] configFiles = config.getConfigurationLocations();
assertTrue("bundle should be Spring powered", config.isBlueprintConfigurationPresent());
assertEquals("2 config files", 1, configFiles.length);
assertEquals("osgibundle:META-INF/spring/context.xml", configFiles[0]);
}
public void tstBundleWithHeaderWithBadEntriesAndNoMetaInfResourcesIsNotSpringPowered() {
Dictionary<String, Object> headers = new Hashtable<>();
headers.put("Spring-Context", "META-INF/splurge/context.xml");
EntryLookupControllingMockBundle aBundle = new EntryLookupControllingMockBundle(headers);
aBundle.setResultsToReturnOnNextCallToFindEntries(null);
ApplicationContextConfiguration config = new BlueprintContainerConfig(aBundle);
assertFalse("bundle is not spring powered", config.isBlueprintConfigurationPresent());
}
public void tstHeaderWithWildcardEntryAndNoMetaInfResources() {
Dictionary<String, Object> headers = new Hashtable<>();
headers.put("Spring-Context", "*;wait-for-dependencies:=false");
EntryLookupControllingMockBundle aBundle = new EntryLookupControllingMockBundle(headers);
aBundle.setResultsToReturnOnNextCallToFindEntries(null);
ApplicationContextConfiguration config = new BlueprintContainerConfig(aBundle);
assertFalse("not spring powered", config.isBlueprintConfigurationPresent());
}
public void tstHeaderWithBadEntry() throws Exception {
Dictionary<String, Object> headers = new Hashtable<>();
headers.put("Spring-Context", "META-INF/spring/context-two.xml,META-INF/splurge/context.xml,");
EntryLookupControllingMockBundle aBundle = new EntryLookupControllingMockBundle(headers);
aBundle.setEntryReturnOnNextCallToGetEntry(new URL("file://META-INF/spring/context-two.xml"));
ApplicationContextConfiguration config = new BlueprintContainerConfig(aBundle);
assertFalse("bundle is not spring powered", config.isBlueprintConfigurationPresent());
String[] configFiles = config.getConfigurationLocations();
assertEquals("0 config file", 0, configFiles.length);
}
public void testCreateAsynchronouslyDefaultTrue() throws Exception {
// *;flavour
Dictionary<String, Object> headers = new Hashtable<>();
headers.put("Spring-Context", "*;timeout:=none");
EntryLookupControllingMockBundle aBundle = new EntryLookupControllingMockBundle(headers);
aBundle.setResultsToReturnOnNextCallToFindEntries(META_INF_SPRING_CONTENT);
aBundle.setEntryReturnOnNextCallToGetEntry(new URL(META_INF_SPRING_CONTENT[0]));
ApplicationContextConfiguration config = new BlueprintContainerConfig(aBundle);
assertTrue("bundle should be Spring powered", config.isBlueprintConfigurationPresent());
assertTrue("bundle should have create-asynchronously = true", config.isCreateAsynchronously());
}
public void testSetCreateAsynchronouslyTrue() {
// *;flavour
Dictionary<String, Object> headers = new Hashtable<>();
headers.put("Spring-Context", "*;create-asynchronously:=true");
EntryLookupControllingMockBundle aBundle = new EntryLookupControllingMockBundle(headers);
aBundle.setResultsToReturnOnNextCallToFindEntries(META_INF_SPRING_CONTENT);
ApplicationContextConfiguration config = new BlueprintContainerConfig(aBundle);
assertTrue("bundle should be Spring powered", config.isBlueprintConfigurationPresent());
assertTrue("bundle should have create-asynchronously = true", config.isCreateAsynchronously());
}
public void testSetCreateAsynchronouslyFalse() throws Exception {
// *;flavour
Dictionary<String, Object> headers = new Hashtable<>();
headers.put("Spring-Context", "META-INF/spring/context.xml;create-asynchronously:=false");
EntryLookupControllingMockBundle aBundle = new EntryLookupControllingMockBundle(headers);
aBundle.setResultsToReturnOnNextCallToFindEntries(META_INF_SPRING_CONTENT);
aBundle.setEntryReturnOnNextCallToGetEntry(new URL(META_INF_SPRING_CONTENT[0]));
ApplicationContextConfiguration config = new BlueprintContainerConfig(aBundle);
assertTrue("bundle should be Spring powered", config.isBlueprintConfigurationPresent());
assertFalse("bundle should have create-asynchronously = false", config.isCreateAsynchronously());
}
public void testCreateAsynchronouslyDefaultTrueIfAbsent() {
// *;flavour
Dictionary<String, Object> headers = new Hashtable<>();
EntryLookupControllingMockBundle aBundle = new EntryLookupControllingMockBundle(headers);
aBundle.setResultsToReturnOnNextCallToFindEntries(META_INF_SPRING_CONTENT);
ApplicationContextConfiguration config = new BlueprintContainerConfig(aBundle);
assertTrue("bundle should have create-asynchronously = true", config.isCreateAsynchronously());
}
public void testCreateAsynchronouslyDefaultTrueIfGarbage() {
// *;flavour
Dictionary<String, Object> headers = new Hashtable<>();
headers.put("Spring-Context", "*;favour:=false");
EntryLookupControllingMockBundle aBundle = new EntryLookupControllingMockBundle(headers);
aBundle.setResultsToReturnOnNextCallToFindEntries(META_INF_SPRING_CONTENT);
ApplicationContextConfiguration config = new BlueprintContainerConfig(aBundle);
assertTrue("bundle should have create-asynchronously = true", config.isCreateAsynchronously());
}
private static class RepeatingEntryLookupControllingMockBundle extends EntryLookupControllingMockBundle {
protected String[] findResult;
public RepeatingEntryLookupControllingMockBundle(Dictionary headers) {
super(headers);
}
public Enumeration findEntries(String path, String filePattern, boolean recurse) {
if (this.nextFindResult == null) {
return super.findEntries(path, filePattern, recurse);
}
else {
Enumeration r = this.nextFindResult;
this.nextFindResult = createEnumerationOver(findResult);
return r;
}
}
public void setResultsToReturnOnNextCallToFindEntries(String[] r) {
findResult = r;
if (findResult == null) {
findResult = new String[0];
}
this.nextFindResult = createEnumerationOver(findResult);
}
}
}