package org.jboss.seam.test.unit; import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.TreeSet; import org.jboss.seam.ScopeType; import org.jboss.seam.annotations.Install; import org.jboss.seam.init.ComponentDescriptor; import org.jboss.seam.init.DependencyManager; import org.testng.Assert; import org.testng.annotations.Test; public class DependencyTest { @Test public void testNoComponents() { Assert.assertEquals(0, installSet().size()); } @Test public void testNoDependencies() { MockDescriptor desc1 = new MockDescriptor("foo", SomeClass.class); Set<ComponentDescriptor> installed = installSet(desc1); Assert.assertEquals(installed.size(), 1); } @Test public void testNotInstalled() { MockDescriptor desc1 = new MockDescriptor("foo", SomeClass.class); desc1.setInstalled(false); Assert.assertEquals(installSet(desc1).size(), 0); } @Test public void testOverride() { MockDescriptor desc1 = new MockDescriptor("foo", SomeClass.class); desc1.setPrecedence(Install.APPLICATION); MockDescriptor desc2 = new MockDescriptor("foo", SomeClass.class); desc2.setPrecedence(Install.DEPLOYMENT); MockDescriptor desc3 = new MockDescriptor("foo", SomeClass.class); desc3.setPrecedence(Install.BUILT_IN); Set<ComponentDescriptor> installed = installSet(desc1, desc2, desc3); Assert.assertEquals(installed.size(), 1); Assert.assertEquals(installed.iterator().next().getPrecedence(),Install.DEPLOYMENT); } @Test public void testOverride2() { MockDescriptor desc1 = new MockDescriptor("foo", SomeClass.class); desc1.setDependencies(new String[] {"bar"}); MockDescriptor desc2 = new MockDescriptor("bar", SomeClass.class); desc2.setPrecedence(Install.FRAMEWORK); MockDescriptor desc3 = new MockDescriptor("bar", SomeOtherClass.class); desc3.setPrecedence(Install.APPLICATION); desc3.setClassDependencies(new String[] {"SomeClassThatDoesntExist"}); Set<ComponentDescriptor> installed = installSet(desc1, desc2, desc3); Assert.assertEquals(installed.size(), 2); Assert.assertTrue(installed.contains(desc1), "contains desc1"); Assert.assertTrue(installed.contains(desc2), "contains desc2"); } @Test public void testClassDependency() { MockDescriptor desc1 = new MockDescriptor("foo", SomeClass.class); desc1.setClassDependencies(new String[] {"SomeClassThatDoesntExist"}); Set<ComponentDescriptor> installed = installSet(desc1); Assert.assertEquals(installed.size(), 0); desc1.setClassDependencies(new String[] {"SomeClassThatDoesntExist", SomeClass.class.getName()}); installed = installSet(desc1); Assert.assertEquals(installed.size(), 0); desc1.setClassDependencies(new String[] {SomeClass.class.getName()}); installed = installSet(desc1); Assert.assertEquals(installed.size(), 1); } @Test public void testDependency() { MockDescriptor desc1 = new MockDescriptor("foo", SomeClass.class); desc1.setDependencies(new String[] {"bar"}); MockDescriptor desc2 = new MockDescriptor("bar", SomeClass.class); desc2.setDependencies(new String[] {"baz"}); MockDescriptor desc3 = new MockDescriptor("baz", SomeClass.class); Assert.assertEquals(installSet(desc1).size(), 0); Assert.assertEquals(installSet(desc1,desc2).size(), 0); Assert.assertEquals(installSet(desc1,desc2,desc3).size(), 3); } @Test public void testCircularDependency() { MockDescriptor desc1 = new MockDescriptor("foo", SomeClass.class); desc1.setDependencies(new String[] {"bar"}); MockDescriptor desc2 = new MockDescriptor("bar", SomeClass.class); desc2.setDependencies(new String[] {"foo"}); Assert.assertEquals(installSet(desc1).size(), 0); Assert.assertEquals(installSet(desc2).size(), 0); Assert.assertEquals(installSet(desc1,desc2).size(), 2); // just to make sure desc1.setDependencies(new String[] {"foo"}); Assert.assertEquals(installSet(desc1).size(), 1); } @Test public void testComponentByClassDependency() { MockDescriptor desc1 = new MockDescriptor("foo", SomeClass.class); desc1.setGenericDependencies(new Class[] {SomeOtherClass.class}); MockDescriptor desc2 = new MockDescriptor("bar", SomeOtherClass.class); Assert.assertEquals(installSet(desc1).size(), 0); Assert.assertEquals(installSet(desc2).size(), 1); Assert.assertEquals(installSet(desc1,desc2).size(), 2); } @Test public void testUnmetDueToOverride() { MockDescriptor desc1 = new MockDescriptor("foo", SomeClass.class); desc1.setGenericDependencies(new Class[] {SomeOtherClass.class}); MockDescriptor desc2 = new MockDescriptor("bar", SomeOtherClass.class); desc2.setPrecedence(Install.FRAMEWORK); MockDescriptor desc3 = new MockDescriptor("bar", SomeUnrelatedClass.class); Set<ComponentDescriptor> installed = installSet(desc1,desc2); Assert.assertEquals(installed.size(), 2); installed = installSet(desc1,desc2,desc3); Assert.assertEquals(installed.size(), 1); Assert.assertEquals(installed.iterator().next().getName(), "bar"); Assert.assertEquals(installed.iterator().next().getPrecedence(), Install.APPLICATION); } // ------------------------------------------------------ private Map<String,Set<ComponentDescriptor>> componentSet(ComponentDescriptor... descriptors) { Map<String,Set<ComponentDescriptor>> map = new HashMap<String, Set<ComponentDescriptor>>(); for (ComponentDescriptor descriptor: descriptors) { addDependency(map, descriptor); } return map; } private Set<ComponentDescriptor> installSet(ComponentDescriptor... descriptors) { DependencyManager manager = new DependencyManager(componentSet(descriptors)); return manager.installedSet(); } private void addDependency(Map<String,Set<ComponentDescriptor>> dependencies, ComponentDescriptor descriptor) { Set<ComponentDescriptor> descriptors = dependencies.get(descriptor.getName()); if (descriptors == null) { descriptors = new TreeSet<ComponentDescriptor>(new ComponentDescriptor.PrecedenceComparator()); dependencies.put(descriptor.getName(), descriptors); } descriptors.add(descriptor); } static class MockDescriptor extends ComponentDescriptor { private String[] classDependencies; private String[] dependencies; private Class[] genericDependencies; public MockDescriptor(String name, Class<?> componentClass) { super(name, componentClass, ScopeType.SESSION); } public void setInstalled(boolean installed) { this.installed = installed; } public void setPrecedence(int precedence) { this.precedence = precedence; } public void setClassDependencies(String[] classDependencies) { this.classDependencies = classDependencies; } @Override public String[] getClassDependencies() { return (classDependencies != null) ? classDependencies : super.getClassDependencies(); } public void setDependencies(String[] dependencies) { this.dependencies = dependencies; } @Override public String[] getDependencies() { return (dependencies != null) ? dependencies : super.getDependencies(); } public void setGenericDependencies(Class[] genericDependencies) { this.genericDependencies = genericDependencies; } @Override public Class[] getGenericDependencies() { return (genericDependencies != null) ? genericDependencies : super.getGenericDependencies(); } } static class SomeClass { } static class SomeOtherClass { } static class SomeUnrelatedClass { } }