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