/*
* #%L
* JBossOSGi Resolver Felix
* %%
* Copyright (C) 2010 - 2012 JBoss by Red Hat
* %%
* Licensed 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.
* #L%
*/
package org.jboss.test.osgi.resolver;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertSame;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.jboss.osgi.resolver.XResource;
import org.jboss.shrinkwrap.api.Archive;
import org.junit.Test;
import org.osgi.resource.Resource;
import org.osgi.resource.Wire;
import org.osgi.resource.Wiring;
/**
* Test the default resolver integration.
*
* @author thomas.diesler@jboss.com
* @author <a href="david@redhat.com">David Bosschaert</a>
* @since 31-May-2010
*/
public class PreferencesResolverTest extends AbstractResolverTest {
@Test
public void testPreferredExporterResolved() throws Exception {
// Bundle-SymbolicName: simpleimport
// Import-Package: org.jboss.test.osgi.classloader.support.a
Archive<?> assemblyA = assembleArchive("resourceA", "/resolver/simpleimport");
XResource resourceA = createResource(assemblyA);
// Bundle-SymbolicName: simpleexport
// Export-Package: org.jboss.test.osgi.classloader.support.a
Archive<?> assemblyB = assembleArchive("resourceB", "/resolver/simpleexport");
XResource resourceB = createResource(assemblyB);
// Bundle-SymbolicName: simpleexportother
// Export-Package: org.jboss.test.osgi.classloader.support.a
Archive<?> assemblyC = assembleArchive("resourceC", "/resolver/simpleexportother");
XResource resourceC = createResource(assemblyC);
// install C before B
installResources(resourceA, resourceC, resourceB);
// resolve B
List<XResource> mandatory = Collections.singletonList(resourceB);
Map<Resource,List<Wire>> map = resolver.resolve(getResolveContext(mandatory, null));
applyResolverResults(map);
// resolve A and C
mandatory = Arrays.asList(resourceA, resourceC);
map = resolver.resolve(getResolveContext(mandatory, null));
applyResolverResults(map);
Wiring wiringA = getWiring(resourceA);
assertEquals(1, wiringA.getRequiredResourceWires(null).size());
Wire wireA = wiringA.getRequiredResourceWires(null).get(0);
assertSame(resourceA, wireA.getRequirer());
assertSame(resourceB, wireA.getProvider());
Wiring wiringB = getWiring(resourceB);
assertEquals(1, wiringB.getProvidedResourceWires(null).size());
Wire wireB = wiringB.getProvidedResourceWires(null).get(0);
assertSame(resourceA, wireB.getRequirer());
assertSame(resourceB, wireB.getProvider());
}
@Test
public void testPreferredExporterResolvedReverse() throws Exception {
// Bundle-SymbolicName: simpleimport
// Import-Package: org.jboss.test.osgi.classloader.support.a
Archive<?> assemblyA = assembleArchive("resourceA", "/resolver/simpleimport");
XResource resourceA = createResource(assemblyA);
// Bundle-SymbolicName: simpleexport
// Export-Package: org.jboss.test.osgi.classloader.support.a
Archive<?> assemblyB = assembleArchive("resourceB", "/resolver/simpleexport");
XResource resourceB = createResource(assemblyB);
// Bundle-SymbolicName: simpleexportother
// Export-Package: org.jboss.test.osgi.classloader.support.a
Archive<?> assemblyC = assembleArchive("resourceC", "/resolver/simpleexportother");
XResource resourceC = createResource(assemblyC);
// install B before C
installResources(resourceA, resourceB, resourceC);
// resolve B
List<XResource> mandatory = Collections.singletonList(resourceB);
Map<Resource,List<Wire>> map = resolver.resolve(getResolveContext(mandatory, null));
applyResolverResults(map);
// resolve A and C
mandatory = Arrays.asList(resourceA, resourceC);
map = resolver.resolve(getResolveContext(mandatory, null));
applyResolverResults(map);
Wiring wiringA = getWiring(resourceA);
assertEquals(1, wiringA.getRequiredResourceWires(null).size());
Wire wireA = wiringA.getRequiredResourceWires(null).get(0);
assertSame(resourceA, wireA.getRequirer());
assertSame(resourceB, wireA.getProvider());
Wiring wiringB = getWiring(resourceB);
assertEquals(1, wiringB.getProvidedResourceWires(null).size());
Wire wireB = wiringB.getProvidedResourceWires(null).get(0);
assertSame(resourceA, wireB.getRequirer());
assertSame(resourceB, wireB.getProvider());
}
@Test
public void testPreferredExporterHigherVersion() throws Exception {
// Bundle-SymbolicName: packageexportversion100
// Export-Package: org.jboss.test.osgi.classloader.support.a;version=1.0.0
Archive<?> assemblyA = assembleArchive("resourceA", "/resolver/packageexportversion100");
XResource resourceA = createResource(assemblyA);
// Bundle-SymbolicName: packageexportversion200
// Export-Package: org.jboss.test.osgi.classloader.support.a;version=2.0.0
Archive<?> assemblyB = assembleArchive("resourceB", "/resolver/packageexportversion200");
XResource resourceB = createResource(assemblyB);
// Bundle-SymbolicName: simpleimport
// Import-Package: org.jboss.test.osgi.classloader.support.a
Archive<?> assemblyC = assembleArchive("resourceC", "/resolver/simpleimport");
XResource resourceC = createResource(assemblyC);
// install A before B
installResources(resourceA, resourceB, resourceC);
List<XResource> mandatory = Arrays.asList(resourceA, resourceB, resourceC);
Map<Resource,List<Wire>> map = resolver.resolve(getResolveContext(mandatory, null));
applyResolverResults(map);
Wiring wiringA = getWiring(resourceA);
assertEquals(0, wiringA.getRequiredResourceWires(null).size());
assertEquals(0, wiringA.getProvidedResourceWires(null).size());
Wiring wiringB = getWiring(resourceB);
assertEquals(0, wiringB.getRequiredResourceWires(null).size());
assertEquals(1, wiringB.getProvidedResourceWires(null).size());
Wire wireB = wiringB.getProvidedResourceWires(null).get(0);
assertSame(resourceC, wireB.getRequirer());
assertSame(resourceB, wireB.getProvider());
Wiring wiringC = getWiring(resourceC);
assertEquals(1, wiringC.getRequiredResourceWires(null).size());
assertEquals(0, wiringC.getProvidedResourceWires(null).size());
Wire wireC = wiringC.getRequiredResourceWires(null).get(0);
assertSame(resourceC, wireC.getRequirer());
assertSame(resourceB, wireC.getProvider());
}
@Test
public void testPreferredExporterHigherVersionReverse() throws Exception {
// Bundle-SymbolicName: packageexportversion100
// Export-Package: org.jboss.test.osgi.classloader.support.a;version=1.0.0
Archive<?> assemblyA = assembleArchive("resourceA", "/resolver/packageexportversion100");
XResource resourceA = createResource(assemblyA);
// Bundle-SymbolicName: packageexportversion200
// Export-Package: org.jboss.test.osgi.classloader.support.a;version=2.0.0
Archive<?> assemblyB = assembleArchive("resourceB", "/resolver/packageexportversion200");
XResource resourceB = createResource(assemblyB);
// Bundle-SymbolicName: simpleimport
// Import-Package: org.jboss.test.osgi.classloader.support.a
Archive<?> assemblyC = assembleArchive("resourceC", "/resolver/simpleimport");
XResource resourceC = createResource(assemblyC);
// install B before A
installResources(resourceB, resourceA, resourceC);
List<XResource> mandatory = Arrays.asList(resourceA, resourceB, resourceC);
Map<Resource,List<Wire>> map = resolver.resolve(getResolveContext(mandatory, null));
applyResolverResults(map);
Wiring wiringA = getWiring(resourceA);
assertEquals(0, wiringA.getRequiredResourceWires(null).size());
assertEquals(0, wiringA.getProvidedResourceWires(null).size());
Wiring wiringB = getWiring(resourceB);
assertEquals(0, wiringB.getRequiredResourceWires(null).size());
assertEquals(1, wiringB.getProvidedResourceWires(null).size());
Wire wireB = wiringB.getProvidedResourceWires(null).get(0);
assertSame(resourceC, wireB.getRequirer());
assertSame(resourceB, wireB.getProvider());
Wiring wiringC = getWiring(resourceC);
assertEquals(1, wiringC.getRequiredResourceWires(null).size());
assertEquals(0, wiringC.getProvidedResourceWires(null).size());
Wire wireC = wiringC.getRequiredResourceWires(null).get(0);
assertSame(resourceC, wireC.getRequirer());
assertSame(resourceB, wireC.getProvider());
}
@Test
public void testPreferredExporterLowerId() throws Exception {
// Bundle-SymbolicName: simpleexport
// Export-Package: org.jboss.test.osgi.classloader.support.a
Archive<?> assemblyA = assembleArchive("resourceA", "/resolver/simpleexport");
XResource resourceA = createResource(assemblyA);
// Bundle-SymbolicName: simpleexportother
// Export-Package: org.jboss.test.osgi.classloader.support.a
Archive<?> assemblyB = assembleArchive("resourceB", "/resolver/simpleexportother");
XResource resourceB = createResource(assemblyB);
// Bundle-SymbolicName: simpleimport
// Import-Package: org.jboss.test.osgi.classloader.support.a
Archive<?> assemblyC = assembleArchive("resourceC", "/resolver/simpleimport");
XResource resourceC = createResource(assemblyC);
// install A before B
installResources(resourceA, resourceB, resourceC);
List<XResource> mandatory = Arrays.asList(resourceA, resourceB, resourceC);
Map<Resource,List<Wire>> map = resolver.resolve(getResolveContext(mandatory, null));
applyResolverResults(map);
Wiring wiringA = getWiring(resourceA);
assertEquals(0, wiringA.getRequiredResourceWires(null).size());
assertEquals(1, wiringA.getProvidedResourceWires(null).size());
Wiring wiringB = getWiring(resourceB);
assertEquals(0, wiringB.getRequiredResourceWires(null).size());
assertEquals(0, wiringB.getProvidedResourceWires(null).size());
Wiring wiringC = getWiring(resourceC);
assertEquals(1, wiringC.getRequiredResourceWires(null).size());
assertEquals(0, wiringC.getProvidedResourceWires(null).size());
Wire wireC = wiringC.getRequiredResourceWires(null).get(0);
assertSame(resourceC, wireC.getRequirer());
assertSame(resourceA, wireC.getProvider());
}
@Test
public void testPreferredExporterLowerIdReverse() throws Exception {
// Bundle-SymbolicName: simpleexportother
// Export-Package: org.jboss.test.osgi.classloader.support.a
Archive<?> assemblyB = assembleArchive("resourceA", "/resolver/simpleexportother");
XResource resourceB = createResource(assemblyB);
// Bundle-SymbolicName: simpleexport
// Export-Package: org.jboss.test.osgi.classloader.support.a
Archive<?> assemblyA = assembleArchive("resourceB", "/resolver/simpleexport");
XResource resourceA = createResource(assemblyA);
// Bundle-SymbolicName: simpleimport
// Import-Package: org.jboss.test.osgi.classloader.support.a
Archive<?> assemblyC = assembleArchive("resourceC", "/resolver/simpleimport");
XResource resourceC = createResource(assemblyC);
// install B before A
installResources(resourceB, resourceA, resourceC);
List<XResource> mandatory = Arrays.asList(resourceA, resourceB, resourceC);
Map<Resource,List<Wire>> map = resolver.resolve(getResolveContext(mandatory, null));
applyResolverResults(map);
Wiring wiringA = getWiring(resourceA);
assertEquals(0, wiringA.getRequiredResourceWires(null).size());
assertEquals(0, wiringA.getProvidedResourceWires(null).size());
Wiring wiringB = getWiring(resourceB);
assertEquals(0, wiringB.getRequiredResourceWires(null).size());
assertEquals(1, wiringB.getProvidedResourceWires(null).size());
Wiring wiringC = getWiring(resourceC);
assertEquals(1, wiringC.getRequiredResourceWires(null).size());
assertEquals(0, wiringC.getProvidedResourceWires(null).size());
Wire wireC = wiringC.getRequiredResourceWires(null).get(0);
assertSame(resourceC, wireC.getRequirer());
assertSame(resourceB, wireC.getProvider());
}
}