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"})
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
28 public void testMissingPluginInfo()
29 {
30
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
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
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
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
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
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
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
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
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
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
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
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
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
183 Plugin testPlugin = new DefaultDynamicPlugin((PluginArtifact) new Mock(PluginArtifact.class).proxy(), classLoader);
184 parser.configurePlugin((ModuleDescriptorFactory)mockFactory.proxy(), testPlugin);
185
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
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
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
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
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 }