1 package com.atlassian.plugin.util;
2
3 import com.atlassian.fugue.Option;
4 import com.atlassian.plugin.Application;
5 import com.atlassian.plugin.InstallationMode;
6 import com.atlassian.plugin.ModuleDescriptor;
7 import com.atlassian.plugin.Plugin;
8 import com.atlassian.plugin.descriptors.MockUnusedModuleDescriptor;
9 import com.atlassian.plugin.descriptors.RequiresRestart;
10 import com.google.common.base.Function;
11 import com.google.common.collect.Lists;
12 import org.dom4j.Element;
13 import org.junit.Test;
14 import org.junit.runner.RunWith;
15 import org.mockito.runners.MockitoJUnitRunner;
16
17 import java.util.HashSet;
18 import java.util.List;
19
20 import static com.google.common.collect.Lists.newArrayList;
21 import static com.google.common.collect.Sets.newHashSet;
22 import static org.junit.Assert.assertFalse;
23 import static org.junit.Assert.assertTrue;
24 import static org.mockito.Mockito.mock;
25 import static org.mockito.Mockito.when;
26
27 @RunWith(MockitoJUnitRunner.class)
28 public final class TestPluginUtils
29 {
30 private static final String ATLASSIAN_DEV_MODE = "atlassian.dev.mode";
31
32 @Test
33 public void testPluginWithNoModuleDoesNotRequireRestartInDevMode()
34 {
35 try
36 {
37 System.setProperty(ATLASSIAN_DEV_MODE, "true");
38 final Plugin plugin = mockPluginWithModuleDescriptors();
39
40 assertFalse(PluginUtils.doesPluginRequireRestart(plugin));
41 }
42 finally
43 {
44 System.clearProperty(ATLASSIAN_DEV_MODE);
45 }
46 }
47
48 @Test
49 public void testPluginWithNoModuleDoesNotRequireRestartNoDevMode()
50 {
51 final Plugin plugin = mockPluginWithModuleDescriptors();
52
53 assertFalse(PluginUtils.doesPluginRequireRestart(plugin));
54 }
55
56 @Test
57 public void testPluginWithModuleRequiringRestartDoesNotRequireRestartInDevMode()
58 {
59 try
60 {
61 System.setProperty(ATLASSIAN_DEV_MODE, "true");
62 final Plugin plugin = mockPluginWithModuleDescriptors(new DynamicModuleDescriptor(), new RequiresRestartModuleDescriptor());
63
64 assertFalse(PluginUtils.doesPluginRequireRestart(plugin));
65 }
66 finally
67 {
68 System.clearProperty(ATLASSIAN_DEV_MODE);
69 }
70 }
71
72 @Test
73 public void testPluginWithModuleRequiringRestartDoesRequireRestartNoDevMode()
74 {
75 final Plugin plugin = mockPluginWithModuleDescriptors(new DynamicModuleDescriptor(), new RequiresRestartModuleDescriptor());
76
77 assertTrue(PluginUtils.doesPluginRequireRestart(plugin));
78 }
79
80 @Test
81 public void testPluginWithNoModuleRequiringRestartDoesNotRequireRestartNoDevMode()
82 {
83 final Plugin plugin = mockPluginWithModuleDescriptors(new DynamicModuleDescriptor());
84
85 assertFalse(PluginUtils.doesPluginRequireRestart(plugin));
86 }
87
88 private Plugin mockPluginWithModuleDescriptors(ModuleDescriptor<?>... descriptors)
89 {
90 final Plugin plugin = mock(Plugin.class);
91 when(plugin.getModuleDescriptors()).thenReturn(Lists.<ModuleDescriptor<?>>newArrayList(descriptors));
92 return plugin;
93 }
94
95 @Test
96 public void testModuleElementAppliesWithNoInformation()
97 {
98 assertTrue(PluginUtils.doesModuleElementApplyToApplication(newMockModuleElement(null), applications(), InstallationMode.REMOTE));
99 }
100
101 @Test
102 public void testModuleElementAppliesWithApplicationAttributeJira()
103 {
104 assertTrue(PluginUtils.doesModuleElementApplyToApplication(newMockModuleElement("jira"), applications(), InstallationMode.REMOTE));
105 }
106
107 @Test
108 public void testModuleElementAppliesWithApplicationAttributeBamboo()
109 {
110 assertFalse(PluginUtils.doesModuleElementApplyToApplication(newMockModuleElement("bamboo"), applications(), InstallationMode.REMOTE));
111 }
112
113 @Test
114 public void testModuleElementAppliesWithApplicationAttributeJiraBamboo()
115 {
116 assertTrue(PluginUtils.doesModuleElementApplyToApplication(newMockModuleElement("jira,bamboo"), applications(), InstallationMode.REMOTE));
117 }
118
119 @Test
120 public void testModuleElementAppliesWithApplicationAttributeBambooConfluence()
121 {
122 assertTrue(PluginUtils.doesModuleElementApplyToApplication(newMockModuleElement("bamboo,confluence"), applications(), InstallationMode.REMOTE));
123 }
124
125 @Test
126 public void testModuleElementAppliesWithApplicationAttributeBambooCrowd()
127 {
128 assertFalse(PluginUtils.doesModuleElementApplyToApplication(newMockModuleElement("bamboo,crowd"), applications(), InstallationMode.REMOTE));
129 }
130
131 @Test
132 public void testModuleElementAppliesWithApplicationAttributeBambooCrowdAndBlank()
133 {
134 assertFalse(PluginUtils.doesModuleElementApplyToApplication(newMockModuleElement("bamboo,,crowd, ,"), applications(), InstallationMode.REMOTE));
135 }
136
137 @Test
138 public void testModuleElementAppliesWithApplicationAttributeBambooConfluenceAndBlank()
139 {
140 assertTrue(PluginUtils.doesModuleElementApplyToApplication(newMockModuleElement("bamboo,, , confluence, "), applications(), InstallationMode.REMOTE));
141 }
142
143 @Test
144 public void testModuleElementAppliesWithApplicationAttributeBlank()
145 {
146 assertTrue(PluginUtils.doesModuleElementApplyToApplication(newMockModuleElement(" "), applications(), InstallationMode.REMOTE));
147 assertTrue(PluginUtils.doesModuleElementApplyToApplication(newMockModuleElement(" ,"), applications(), InstallationMode.REMOTE));
148 assertTrue(PluginUtils.doesModuleElementApplyToApplication(newMockModuleElement(" ,, "), applications(), InstallationMode.REMOTE));
149 assertTrue(PluginUtils.doesModuleElementApplyToApplication(newMockModuleElement(" ,, ,,,"), applications(), InstallationMode.REMOTE));
150 }
151
152 @Test
153 public void testModuleElementAppliesWithRestrictElementJira()
154 {
155 assertTrue(PluginUtils.doesModuleElementApplyToApplication(newMockModuleElement(null, Lists.newArrayList(newMockRestrictElement("jira", Option.<InstallationMode>none()))), applications(), InstallationMode.REMOTE));
156 }
157
158 @Test
159 public void testModuleElementAppliesWithRestrictElementBamboo()
160 {
161 assertFalse(PluginUtils.doesModuleElementApplyToApplication(newMockModuleElement(null, Lists.newArrayList(newMockRestrictElement("bamboo", Option.<InstallationMode>none()))), applications(), InstallationMode.REMOTE));
162 }
163
164 @Test
165 public void testModuleElementAppliesWithRestrictElementJiraBamboo()
166 {
167 assertTrue(PluginUtils.doesModuleElementApplyToApplication(newMockModuleElement(null, Lists.newArrayList(newMockRestrictElement("jira", Option.<InstallationMode>none()), newMockRestrictElement("bamboo", Option.<InstallationMode>none()))), applications(), InstallationMode.REMOTE));
168 }
169
170 @Test
171 public void testModuleElementAppliesWithRestrictElementJiraConfluence()
172 {
173 assertTrue(PluginUtils.doesModuleElementApplyToApplication(newMockModuleElement(null, Lists.newArrayList(newMockRestrictElement("jira", Option.<InstallationMode>none()), newMockRestrictElement("confluence", Option.<InstallationMode>none()))), applications(), InstallationMode.REMOTE));
174 }
175
176 @Test
177 public void testModuleElementAppliesWithRestrictElementJiraAndVersionInRange()
178 {
179 assertTrue(PluginUtils.doesModuleElementApplyToApplication(
180 newMockModuleElement(null, Lists.newArrayList(newMockRestrictElement("jira", Option.<InstallationMode>none(), "[4.0,)"))), applications(), InstallationMode.REMOTE));
181 }
182
183 @Test
184 public void testModuleElementAppliesWithRestrictElementJiraAndVersionOutOfRange()
185 {
186 assertFalse(PluginUtils.doesModuleElementApplyToApplication(
187 newMockModuleElement(null, Lists.newArrayList(newMockRestrictElement("jira", Option.<InstallationMode>none(), "(,5.0)"))), applications(), InstallationMode.REMOTE));
188 }
189
190 @Test
191 public void testModuleElementAppliesWithRestrictElementJiraAndVersionsInRange()
192 {
193 assertTrue(PluginUtils.doesModuleElementApplyToApplication(
194 newMockModuleElement(null, Lists.newArrayList(newMockRestrictElement("jira", Option.<InstallationMode>none(), "(,4.0)", "5.0"))), applications(), InstallationMode.REMOTE));
195 }
196
197 @Test
198 public void testModuleElementAppliesWithRestrictElementJiraAndVersionsOutOfRange()
199 {
200 assertFalse(PluginUtils.doesModuleElementApplyToApplication(
201 newMockModuleElement(null, Lists.newArrayList(newMockRestrictElement("jira", Option.<InstallationMode>none(), "(,4.0]", "(5.0,)"))), applications(), InstallationMode.REMOTE));
202 }
203
204 @Test
205 public void testModuleElementAppliesWithRestrictElementMatchingInstallMode()
206 {
207 assertTrue(PluginUtils.doesModuleElementApplyToApplication(
208 newMockModuleElement(null, Lists.newArrayList(newMockRestrictElement("jira", Option.some(InstallationMode.LOCAL)))), applications(), InstallationMode.LOCAL));
209 }
210
211 @Test
212 public void testModuleElementAppliesWithRestrictElementNonMatchingInstallMode()
213 {
214 assertFalse(PluginUtils.doesModuleElementApplyToApplication(
215 newMockModuleElement(null, Lists.newArrayList(newMockRestrictElement("jira", Option.some(InstallationMode.REMOTE)))), applications(), InstallationMode.LOCAL));
216 }
217
218 @Test
219 public void testModuleElementAppliesWithRestrictElementInstallModeUnspecified()
220 {
221 assertTrue(PluginUtils.doesModuleElementApplyToApplication(
222 newMockModuleElement(null, Lists.newArrayList(newMockRestrictElement("jira", Option.<InstallationMode>none()))), applications(), InstallationMode.LOCAL));
223 }
224
225 @Test
226 public void testModuleElementAppliesWithRestrictElementInstallModeSpecifiedOnDifferentAppVersion()
227 {
228 List<Element> restricts = Lists.newArrayList(newMockRestrictElement("jira", Option.some(InstallationMode.LOCAL), "5.0"), newMockRestrictElement("jira", Option.some(InstallationMode.REMOTE), "6.0"));
229
230 assertTrue(PluginUtils.doesModuleElementApplyToApplication(newMockModuleElement(null, restricts), applications(), InstallationMode.LOCAL));
231 assertFalse(PluginUtils.doesModuleElementApplyToApplication(newMockModuleElement(null, restricts), applications(), InstallationMode.REMOTE));
232 }
233
234 private Element newMockRestrictElement(String app, Option<InstallationMode> modeOption, String... versions)
235 {
236 final Element restrict = mock(Element.class);
237 when(restrict.attributeValue("application")).thenReturn(app);
238 if (modeOption.isDefined())
239 {
240 when(restrict.attributeValue("mode")).thenReturn(modeOption.get().toString().toLowerCase());
241 }
242 if (versions != null && versions.length == 1)
243 {
244 when(restrict.attributeValue("version")).thenReturn(versions[0]);
245 }
246 else if (versions != null)
247 {
248 when(restrict.elements("version")).thenReturn(Lists.transform(newArrayList(versions), new Function<String, Element>()
249 {
250 @Override
251 public Element apply(String version)
252 {
253 final Element versionE = mock(Element.class);
254 when(versionE.getText()).thenReturn(version);
255 return versionE;
256 }
257 }));
258 }
259
260 return restrict;
261 }
262
263 private HashSet<Application> applications()
264 {
265 return newHashSet(jira50(), confluence40());
266 }
267
268 private Application confluence40()
269 {
270 return newApplication("confluence", "4.0");
271 }
272
273 private Application jira50()
274 {
275 return newApplication("jira", "5.0");
276 }
277
278 private Element newMockModuleElement(String app)
279 {
280 return newMockModuleElement(app, Lists.<Element>newArrayList());
281 }
282
283 private Element newMockModuleElement(String app, List<Element> restricts)
284 {
285 final Element element = mock(Element.class);
286 when(element.attributeValue("application")).thenReturn(app);
287 when(element.elements("restrict")).thenReturn(restricts);
288 return element;
289 }
290
291 private Application newApplication(String name, String version)
292 {
293 final Application app = mock(Application.class);
294 when(app.getKey()).thenReturn(name);
295 when(app.getVersion()).thenReturn(version);
296 return app;
297 }
298
299 static class DynamicModuleDescriptor extends MockUnusedModuleDescriptor
300 {
301 }
302
303 @RequiresRestart
304 static class RequiresRestartModuleDescriptor extends MockUnusedModuleDescriptor
305 {
306 }
307 }