1 package com.atlassian.config.lifecycle;
2
3 import com.atlassian.plugin.module.ModuleFactory;
4 import junit.framework.TestCase;
5
6 import java.util.List;
7 import java.util.ArrayList;
8 import java.util.Collections;
9 import java.io.InputStream;
10
11 import com.atlassian.plugin.PluginParseException;
12 import com.atlassian.plugin.impl.StaticPlugin;
13 import com.atlassian.core.util.ClassLoaderUtils;
14 import com.atlassian.spring.container.ContainerContext;
15 import com.atlassian.spring.container.ContainerManager;
16 import org.dom4j.Document;
17 import org.dom4j.DocumentException;
18 import org.dom4j.Element;
19 import org.dom4j.io.SAXReader;
20 import org.mockito.Mock;
21 import org.mockito.MockitoAnnotations;
22
23 import static org.mockito.Mockito.*;
24
25 public class LifecyclePluginModuleDescriptorTest extends TestCase
26 {
27 @Mock private ContainerContext mockContainer;
28 @Mock private ModuleFactory mockModuleFactory;
29
30 public void testSortOrder()
31 {
32 List<LifecyclePluginModuleDescriptor> descriptors = new ArrayList<LifecyclePluginModuleDescriptor>();
33 descriptors.add(new LifecyclePluginModuleDescriptor(mockModuleFactory, "blah", 80));
34 descriptors.add(new LifecyclePluginModuleDescriptor(mockModuleFactory, "blah", 10));
35 descriptors.add(new LifecyclePluginModuleDescriptor(mockModuleFactory, "blah", 10));
36 descriptors.add(new LifecyclePluginModuleDescriptor(mockModuleFactory, "blah", 40));
37 descriptors.add(new LifecyclePluginModuleDescriptor(mockModuleFactory, "blah", -90));
38
39 Collections.sort(descriptors);
40
41 assertEquals(-90, descriptors.get(0).getSequence());
42 assertEquals(10, descriptors.get(1).getSequence());
43 assertEquals(10, descriptors.get(2).getSequence());
44 assertEquals(40, descriptors.get(3).getSequence());
45 assertEquals(80, descriptors.get(4).getSequence());
46 }
47
48 protected void setUp() throws Exception
49 {
50 super.setUp();
51 MockitoAnnotations.initMocks(this);
52 ContainerManager.getInstance().setContainerContext(mockContainer);
53 }
54
55 protected void tearDown() throws Exception
56 {
57 super.tearDown();
58 ContainerManager.resetInstance();
59 mockContainer = null;
60 mockModuleFactory = null;
61 }
62
63 public void testParseElement() throws DocumentException, PluginParseException
64 {
65 testLoadedPluginModule("lifecycle1", DummyLifecycleItem.class, 50);
66 testLoadedPluginModule("lifecycle2", DummyServletContextListener.class, 30);
67 try
68 {
69 testLoadedPluginModule("lifecycle3", String.class, 90);
70 fail("Expected parse exception - bad class");
71 }
72 catch (PluginParseException e)
73 {
74
75 }
76 verify(mockContainer).createComponent(DummyLifecycleItem.class);
77 verify(mockContainer).createComponent(DummyServletContextListener.class);
78 }
79
80 public void testWrappedElement() throws DocumentException, PluginParseException
81 {
82 when(mockContainer.createComponent(DummyServletContextListener.class)).thenReturn(new DummyServletContextListener());
83
84 LifecyclePluginModuleDescriptor descriptor = loadDescriptor("lifecycle2");
85 assertEquals(ServletContextListenerWrapper.class, descriptor.getModule().getClass());
86 assertEquals(DummyServletContextListener.class, ((ServletContextListenerWrapper) descriptor.getModule()).getWrappedListener().getClass());
87 }
88
89 private void testLoadedPluginModule(String elementId, Class<?> expectedClass, int expectedSequence) throws DocumentException, PluginParseException
90 {
91 LifecyclePluginModuleDescriptor descriptor = loadDescriptor(elementId);
92 assertEquals(expectedClass, descriptor.getModuleClass());
93 assertEquals(expectedSequence, descriptor.getSequence());
94 }
95
96 private LifecyclePluginModuleDescriptor loadDescriptor(String elementId)
97 throws DocumentException, PluginParseException
98 {
99 LifecyclePluginModuleDescriptor descriptor = new LifecyclePluginModuleDescriptor(ModuleFactory.LEGACY_MODULE_FACTORY);
100 Document doc = getDocument();
101 descriptor.init(new StaticPlugin(), (Element) doc.selectSingleNode("/atlassian-plugin/lifecycle[@key='" + elementId + "']"));
102 descriptor.enabled();
103 return descriptor;
104 }
105
106 private Document getDocument() throws DocumentException
107 {
108 SAXReader reader = new SAXReader();
109 final InputStream is = ClassLoaderUtils.getResourceAsStream("lifecycle-plugins.xml", LifecyclePluginModuleDescriptorTest.class);
110 return reader.read(is);
111 }
112 }