View Javadoc
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 }