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.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 }