View Javadoc

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 }