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              // expected
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 }