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