View Javadoc

1   package com.atlassian.plugin.parsers;
2   
3   import java.io.*;
4   import java.net.URL;
5   
6   import junit.framework.TestCase;
7   
8   import com.atlassian.plugin.*;
9   import com.atlassian.plugin.mock.MockAnimalModuleDescriptor;
10  import com.atlassian.plugin.classloader.PluginClassLoader;
11  import com.atlassian.plugin.impl.DefaultDynamicPlugin;
12  import com.atlassian.plugin.util.ClassLoaderUtils;
13  import com.mockobjects.dynamic.Mock;
14  import com.mockobjects.dynamic.C;
15  
16  @SuppressWarnings({"deprecation"}) //suppress deprecation warnings because we still need to test deprecated methods.
17  public class TestXmlDescriptorParser extends TestCase
18  {
19      private static final String MISSING_INFO_TEST_FILE = "test-missing-plugin-info.xml";
20      private static final String DUMMY_PLUGIN_FILE = "pooh-test-plugin.jar";
21  
22      public TestXmlDescriptorParser(String name)
23      {
24          super(name);
25      }
26  
27      // CONF-12680 Test for missing plugin-info
28      public void testMissingPluginInfo()
29      {
30          // mock up some supporting objects
31          PluginClassLoader classLoader = new PluginClassLoader(new File(getTestFile("ap-plugins") + "/" + DUMMY_PLUGIN_FILE));
32          Mock mockFactory = new Mock(ModuleDescriptorFactory.class);
33          mockFactory.expect("getModuleDescriptorClass", "unknown-plugin");
34  
35          // create a Plugin for testing
36          Plugin testPlugin = new DefaultDynamicPlugin((PluginArtifact) new Mock(PluginArtifact.class).proxy(), classLoader);
37  
38          try
39          {
40              XmlDescriptorParser parser = new XmlDescriptorParser(new FileInputStream(getTestFile(MISSING_INFO_TEST_FILE)));
41              parser.configurePlugin((ModuleDescriptorFactory)mockFactory.proxy(), testPlugin);
42              
43              PluginInformation info = testPlugin.getPluginInformation();
44              assertNotNull("Info should not be null", info);
45          }
46          catch (PluginParseException e)
47          {
48              e.printStackTrace();
49              fail("Plugin information parsing should not fail.");
50          }
51          catch (FileNotFoundException e)
52          {
53              e.printStackTrace();
54              // This shouldn't happen
55              fail("Error setting up test");
56          }
57      }
58  
59      public void testPluginsApplicationVersionMinMax()
60      {
61          XmlDescriptorParser parser = parse(null,
62                  "<atlassian-plugin key='foo'>",
63                  "  <plugin-info>",
64                  "    <application-version min='3' max='4' />",
65                  "  </plugin-info>",
66                  "</atlassian-plugin>");
67          assertEquals(3, (int)parser.getPluginInformation().getMinVersion());
68          assertEquals(4, (int)parser.getPluginInformation().getMaxVersion());
69      }
70  
71      public void testPluginsApplicationVersionMinMaxWithOnlyMin()
72      {
73          XmlDescriptorParser parser = parse(null,
74                  "<atlassian-plugin key='foo'>",
75                  "  <plugin-info>",
76                  "    <application-version min='3' />",
77                  "  </plugin-info>",
78                  "</atlassian-plugin>");
79          assertEquals(3, (int)parser.getPluginInformation().getMinVersion());
80          assertEquals(0, (int)parser.getPluginInformation().getMaxVersion());
81      }
82  
83      public void testPluginsApplicationVersionMinMaxWithOnlyMax()
84      {
85          XmlDescriptorParser parser = parse(null,
86                  "<atlassian-plugin key='foo'>",
87                  "  <plugin-info>",
88                  "    <application-version max='3' />",
89                  "  </plugin-info>",
90                  "</atlassian-plugin>");
91          assertEquals(3, (int)parser.getPluginInformation().getMaxVersion());
92          assertEquals(0, (int)parser.getPluginInformation().getMinVersion());
93      }
94  
95      // Also CONF-12680 test for missing "essential metadata"
96  
97      public void testPluginsVersion()
98      {
99          String xml = "<atlassian-plugin key=\"foo\" pluginsVersion=\"2\" />";
100         XmlDescriptorParser parser = new XmlDescriptorParser(new ByteArrayInputStream(xml.getBytes()));
101         assertEquals(2, parser.getPluginsVersion());
102     }
103 
104     public void testPluginsVersionAfterConfigure()
105     {
106         XmlDescriptorParser parser = new XmlDescriptorParser(new ByteArrayInputStream("<atlassian-plugin key=\"foo\" plugins-version=\"2\" />".getBytes()));
107         // mock up some supporting objects
108         PluginClassLoader classLoader = new PluginClassLoader(new File(getTestFile("ap-plugins") + "/" + DUMMY_PLUGIN_FILE));
109         Mock mockFactory = new Mock(ModuleDescriptorFactory.class);
110         mockFactory.expect("getModuleDescriptorClass", "unknown-plugin");
111 
112         // create a Plugin for testing
113         Plugin testPlugin = new DefaultDynamicPlugin((PluginArtifact) new Mock(PluginArtifact.class).proxy(), classLoader);
114         parser.configurePlugin((ModuleDescriptorFactory)mockFactory.proxy(), testPlugin);
115         assertEquals(2, testPlugin.getPluginsVersion());
116     }
117 
118     public void testPluginWithModules()
119     {
120         XmlDescriptorParser parser = parse(null,
121                  "<atlassian-plugin key='foo'>",
122                 "  <animal key='bear' />",
123                 "</atlassian-plugin>");
124         // mock up some supporting objects
125         PluginClassLoader classLoader = new PluginClassLoader(new File(getTestFile("ap-plugins") + "/" + DUMMY_PLUGIN_FILE));
126         Mock mockFactory = new Mock(ModuleDescriptorFactory.class);
127         mockFactory.expectAndReturn("getModuleDescriptorClass", C.args(C.eq("animal")), MockAnimalModuleDescriptor.class);
128 
129         // create a Plugin for testing
130         Plugin testPlugin = new DefaultDynamicPlugin((PluginArtifact) new Mock(PluginArtifact.class).proxy(), classLoader);
131         parser.configurePlugin((ModuleDescriptorFactory)mockFactory.proxy(), testPlugin);
132         assertNotNull(testPlugin.getModuleDescriptor("bear"));
133     }
134 
135     public void testPluginWithModulesNoApplicationKey()
136     {
137         XmlDescriptorParser parser = parse(null,
138                  "<atlassian-plugin key='foo'>",
139                 "  <animal key='bear' application='foo'/>",
140                 "</atlassian-plugin>");
141         // mock up some supporting objects
142         PluginClassLoader classLoader = new PluginClassLoader(new File(getTestFile("ap-plugins") + "/" + DUMMY_PLUGIN_FILE));
143         Mock mockFactory = new Mock(ModuleDescriptorFactory.class);
144         mockFactory.expectAndReturn("getModuleDescriptorClass", C.args(C.eq("animal")), MockAnimalModuleDescriptor.class);
145 
146         // create a Plugin for testing
147         Plugin testPlugin = new DefaultDynamicPlugin((PluginArtifact) new Mock(PluginArtifact.class).proxy(), classLoader);
148         parser.configurePlugin((ModuleDescriptorFactory)mockFactory.proxy(), testPlugin);
149         assertNull(testPlugin.getModuleDescriptor("bear"));
150     }
151 
152     public void testPluginWithSomeNonApplicationModules()
153     {
154         XmlDescriptorParser parser = parse("myapp",
155                  "<atlassian-plugin key='foo'>",
156                 "  <animal key='bear' application='myapp'/>",
157                 "  <animal key='bear2' application='otherapp'/>",
158                 "</atlassian-plugin>");
159         // mock up some supporting objects
160         PluginClassLoader classLoader = new PluginClassLoader(new File(getTestFile("ap-plugins") + "/" + DUMMY_PLUGIN_FILE));
161         Mock mockFactory = new Mock(ModuleDescriptorFactory.class);
162         mockFactory.expectAndReturn("getModuleDescriptorClass", C.args(C.eq("animal")), MockAnimalModuleDescriptor.class);
163 
164         // create a Plugin for testing
165         Plugin testPlugin = new DefaultDynamicPlugin((PluginArtifact) new Mock(PluginArtifact.class).proxy(), classLoader);
166         parser.configurePlugin((ModuleDescriptorFactory)mockFactory.proxy(), testPlugin);
167         assertNotNull(testPlugin.getModuleDescriptor("bear"));
168         assertNull(testPlugin.getModuleDescriptor("bear2"));
169     }
170 
171     public void testPluginWithSystemAttribute()
172     {
173         XmlDescriptorParser parser = parse(null,
174                  "<atlassian-plugin key='foo' system='true'>",
175                 "</atlassian-plugin>");
176         
177         // mock up some supporting objects
178         PluginClassLoader classLoader = new PluginClassLoader(new File(getTestFile("ap-plugins") + "/" + DUMMY_PLUGIN_FILE));
179         Mock mockFactory = new Mock(ModuleDescriptorFactory.class);
180         mockFactory.expectAndReturn("getModuleDescriptorClass", C.args(C.eq("animal")), MockAnimalModuleDescriptor.class);
181 
182         // create a Plugin for testing
183         Plugin testPlugin = new DefaultDynamicPlugin((PluginArtifact) new Mock(PluginArtifact.class).proxy(), classLoader);
184         parser.configurePlugin((ModuleDescriptorFactory)mockFactory.proxy(), testPlugin);
185         // PLUG-415 Plugins2 plugins now need to be able to be declared as system.
186         assertEquals("This plugin should be a system plugin - bundled plugins2 plugins are system plugins.", true, testPlugin.isSystemPlugin());
187     }
188 
189     public void testPluginWithoutSystemAttribute()
190     {
191         XmlDescriptorParser parser = parse(null,
192                  "<atlassian-plugin key='foo' >",
193                 "</atlassian-plugin>");
194 
195         // mock up some supporting objects
196         PluginClassLoader classLoader = new PluginClassLoader(new File(getTestFile("ap-plugins") + "/" + DUMMY_PLUGIN_FILE));
197         Mock mockFactory = new Mock(ModuleDescriptorFactory.class);
198         mockFactory.expectAndReturn("getModuleDescriptorClass", C.args(C.eq("animal")), MockAnimalModuleDescriptor.class);
199 
200         // create a Plugin for testing
201         Plugin testPlugin = new DefaultDynamicPlugin((PluginArtifact) new Mock(PluginArtifact.class).proxy(), classLoader);
202         parser.configurePlugin((ModuleDescriptorFactory)mockFactory.proxy(), testPlugin);
203         assertEquals("This plugin should not be a system plugin.", false, testPlugin.isSystemPlugin());
204     }
205 
206     public void testPluginsVersionWithDash()
207     {
208         String xml = "<atlassian-plugin key=\"foo\" plugins-version=\"2\" />";
209         XmlDescriptorParser parser = new XmlDescriptorParser(new ByteArrayInputStream(xml.getBytes()));
210         assertEquals(2, parser.getPluginsVersion());
211     }
212 
213     public void testPluginsVersionMissing()
214     {
215         String xml = "<atlassian-plugin key=\"foo\" />";
216         XmlDescriptorParser parser = new XmlDescriptorParser(new ByteArrayInputStream(xml.getBytes()));
217         assertEquals(1, parser.getPluginsVersion());
218     }
219     
220     public void testPluginsResourcesAvailableToModuleDescriptors()
221     {
222         XmlDescriptorParser parser = parse(null,
223                  "<atlassian-plugin key='foo'>",
224                 "  <resource type='velocity' name='edit'>Show an input box here.</resource>",
225                 "  <animal key='bear' />",
226                 "</atlassian-plugin>");
227         // mock up some supporting objects
228         PluginClassLoader classLoader = new PluginClassLoader(new File(getTestFile("ap-plugins") + "/" + DUMMY_PLUGIN_FILE));
229         Mock mockFactory = new Mock(ModuleDescriptorFactory.class);
230         MockAnimalModuleDescriptor descriptor = new MockAnimalModuleDescriptor("velocity", "edit");
231         mockFactory.expectAndReturn("getModuleDescriptor", C.args(C.eq("animal")), descriptor);
232 
233         // create a Plugin for testing
234         Plugin testPlugin = new DefaultDynamicPlugin((PluginArtifact) new Mock(PluginArtifact.class).proxy(), classLoader);
235         parser.configurePlugin((ModuleDescriptorFactory)mockFactory.proxy(), testPlugin);
236         assertNotNull(testPlugin.getModuleDescriptor("bear"));
237         
238         mockFactory.verify();
239     }
240     
241 
242     private String getTestFile(String filename)
243     {
244         final URL url = ClassLoaderUtils.getResource(filename, this.getClass());
245         return url.getFile();
246     }
247 
248     private static XmlDescriptorParser parse(String applicationKey, String... lines)
249     {
250         StringBuffer sb = new StringBuffer();
251         for (String line : lines)
252         {
253             sb.append(line.replace('\'', '"')).append('\n');
254         }
255         InputStream in = new ByteArrayInputStream(sb.toString().getBytes());
256         return new XmlDescriptorParser(in, applicationKey);
257     }
258 }