View Javadoc
1   package com.atlassian.plugin.validation;
2   
3   import com.atlassian.plugin.Application;
4   import com.atlassian.plugin.InstallationMode;
5   import com.google.common.collect.ImmutableSet;
6   import com.google.common.collect.Iterables;
7   import io.atlassian.fugue.Either;
8   import org.junit.Test;
9   
10  import java.io.IOException;
11  import java.io.InputStream;
12  import java.util.Set;
13  
14  import static com.atlassian.plugin.validation.DescriptorValidator.ValidationError;
15  import static com.atlassian.plugin.validation.DescriptorValidator.ValidationSuccess;
16  import static com.atlassian.plugin.validation.ResourcesLoader.getInput;
17  import static org.junit.Assert.assertEquals;
18  import static org.junit.Assert.assertFalse;
19  import static org.junit.Assert.assertTrue;
20  
21  public final class DescriptorValidatorTest {
22      @Test
23      public void testGetRequiredPermissionsIsEmptyForEmptyDescriptor() throws IOException {
24          try (InputStream descriptorStream = getInput("/empty-descriptor.xml");
25               InputStream schemaStream = getInput("/schema.xsd")) {
26              final DescriptorValidator descriptorValidator = new DescriptorValidator(descriptorStream, schemaStream, getApplications());
27  
28              final Set<String> requiredPermissions = descriptorValidator.getRequiredPermissions(InstallationMode.LOCAL);
29              assertTrue(requiredPermissions.isEmpty());
30          }
31      }
32  
33      @Test
34      public void testGetRequiredPermissionsIsEmptyForDescriptorWithModuleRequiringPermission() throws IOException {
35          try (InputStream descriptorStream = getInput("/descriptor-with-module-requiring-exec-java.xml");
36               InputStream schemaStream = getInput("/schema.xsd")) {
37              final DescriptorValidator descriptorValidator = new DescriptorValidator(descriptorStream, schemaStream, getApplications());
38  
39              final Set<String> requiredPermissions = descriptorValidator.getRequiredPermissions(InstallationMode.LOCAL);
40              assertEquals(1, requiredPermissions.size());
41              assertEquals("execute_java", Iterables.getFirst(requiredPermissions, null));
42          }
43      }
44  
45      @Test
46      public void testHasNecessaryPermissionsForEmptyDescriptor() throws IOException {
47          try (InputStream descriptorStream = getInput("/empty-descriptor.xml");
48               InputStream schemaStream = getInput("/schema.xsd")) {
49              final DescriptorValidator descriptorValidator = new DescriptorValidator(descriptorStream, schemaStream, getApplications());
50  
51              final Either<ValidationError, ValidationSuccess> validation = descriptorValidator.validate(InstallationMode.LOCAL);
52              assertTrue(validation.isRight());
53              assertFalse(validation.right().get().isRemotable());
54          }
55      }
56  
57      @Test
58      public void testHasNecessaryPermissionsForRemotableDescriptor() throws IOException {
59          try (InputStream descriptorStream = getInput("/remotable-descriptor.xml");
60               InputStream schemaStream = getInput("/schema.xsd")) {
61              final DescriptorValidator descriptorValidator = new DescriptorValidator(descriptorStream, schemaStream, getApplications());
62  
63              final Either<ValidationError, ValidationSuccess> validation = descriptorValidator.validate(InstallationMode.LOCAL);
64              assertTrue(validation.isRight());
65              assertTrue(validation.right().get().isRemotable());
66          }
67      }
68  
69      @Test
70      public void testHasNecessaryPermissionsForDescriptorWithModuleRequiringPermission() throws IOException {
71          try (InputStream descriptorStream = getInput("/descriptor-with-module-requiring-exec-java.xml");
72               InputStream schemaStream = getInput("/schema.xsd")) {
73              final DescriptorValidator descriptorValidator = new DescriptorValidator(descriptorStream, schemaStream, getApplications());
74  
75              final Either<ValidationError, ValidationSuccess> validation = descriptorValidator.validate(InstallationMode.LOCAL);
76              assertFalse(validation.isRight());
77              final ValidationError validationError = validation.left().get();
78              assertEquals(1, validationError.getNotAskedPermissions().size());
79              assertEquals("execute_java", Iterables.getFirst(validationError.getNotAskedPermissions(), null));
80          }
81      }
82  
83      @Test
84      public void testHasNecessaryPermissionsForDescriptorWithModuleRequiringPermissionButAtlassianPlugins2()
85              throws IOException {
86          try (InputStream descriptorStream = getInput("/descriptor-with-module-requiring-exec-java-but-version-2.xml");
87               InputStream schemaStream = getInput("/schema.xsd")) {
88              final DescriptorValidator descriptorValidator = new DescriptorValidator(descriptorStream, schemaStream, getApplications());
89  
90              final Either<ValidationError, ValidationSuccess> validation = descriptorValidator.validate(InstallationMode.LOCAL);
91              assertTrue(validation.isRight());
92          }
93      }
94  
95      @Test
96      public void testHasNecessaryPermissionsForDescriptorWithModuleRequiringPermissionAndDescriptorAskingForIt()
97              throws IOException {
98          try (InputStream descriptorStream = getInput("/descriptor-asking-exec-java.xml");
99               InputStream schemaStream = getInput("/schema.xsd")) {
100             final DescriptorValidator descriptorValidator = new DescriptorValidator(descriptorStream, schemaStream, getApplications());
101 
102             final Either<ValidationError, ValidationSuccess> validation = descriptorValidator.validate(InstallationMode.LOCAL);
103             assertTrue(validation.isRight());
104         }
105     }
106 
107     @Test
108     public void testHasNecessaryPermissionsForDescriptorWithModuleRequiringPermissionAndDescriptorAskingForItInLocalMode()
109             throws IOException {
110         try (InputStream descriptorStream = getInput("/descriptor-asking-exec-java-when-installed-locally.xml");
111              InputStream schemaStream = getInput("/schema.xsd")) {
112             final DescriptorValidator descriptorValidator = new DescriptorValidator(descriptorStream, schemaStream, getApplications());
113 
114             final Either<ValidationError, ValidationSuccess> validation = descriptorValidator.validate(InstallationMode.LOCAL);
115             assertTrue(validation.isRight());
116         }
117     }
118 
119     @Test
120     public void testHasNecessaryPermissionsForDescriptorWithModuleRequiringPermissionAndDescriptorAskingForItInRemoteMode()
121             throws IOException {
122         try (InputStream descriptorStream = getInput("/descriptor-asking-exec-java-when-installed-locally.xml");
123              InputStream schemaStream = getInput("/schema.xsd")) {
124             final DescriptorValidator descriptorValidator = new DescriptorValidator(descriptorStream, schemaStream, getApplications());
125 
126             final Either<ValidationError, ValidationSuccess> validation = descriptorValidator.validate(InstallationMode.REMOTE);
127             assertTrue(validation.isRight());
128         }
129     }
130 
131     @Test
132     public void testHasNecessaryPermissionsForDescriptorWithModuleRequiringPermissionAndDescriptorAskingForItInLocalModeButRequireInRemoteTestingLocal()
133             throws IOException {
134         try (InputStream descriptorStream = getInput("/descriptor-asking-exec-java-locally-but-require-remotely.xml");
135              InputStream schemaStream = getInput("/schema.xsd")) {
136             final DescriptorValidator descriptorValidator = new DescriptorValidator(descriptorStream, schemaStream, getApplications());
137 
138             final Either<ValidationError, ValidationSuccess> validation = descriptorValidator.validate(InstallationMode.LOCAL);
139             assertTrue(validation.isRight());
140         }
141     }
142 
143     @Test
144     public void testHasNecessaryPermissionsForDescriptorWithModuleRequiringPermissionAndDescriptorAskingForItInLocalModeButRequireInRemoteTestingRemote()
145             throws IOException {
146         try (InputStream descriptorStream = getInput("/descriptor-asking-exec-java-locally-but-require-remotely.xml");
147              InputStream schemaStream = getInput("/schema.xsd")) {
148             final DescriptorValidator descriptorValidator = new DescriptorValidator(descriptorStream, schemaStream, getApplications());
149 
150             final Either<ValidationError, ValidationSuccess> validation = descriptorValidator.validate(InstallationMode.REMOTE);
151             assertTrue(validation.isLeft());
152             final ValidationError validationError = validation.left().get();
153             assertEquals(1, validationError.getNotAskedPermissions().size());
154             assertEquals("execute_java", Iterables.getFirst(validationError.getNotAskedPermissions(), null));
155         }
156     }
157 
158     @Test
159     public void testHasNecessaryPermissionsForDescriptorRequiringNonValidPermission() throws IOException {
160         try (InputStream descriptorStream = getInput("/descriptor-requiring-non-valid-permission.xml");
161              InputStream schemaStream = getInput("/schema.xsd")) {
162             final DescriptorValidator descriptorValidator = new DescriptorValidator(descriptorStream, schemaStream, getApplications());
163 
164             final Either<ValidationError, ValidationSuccess> validation = descriptorValidator.validate(InstallationMode.LOCAL);
165             assertFalse(validation.isRight());
166             final ValidationError validationError = validation.left().get();
167             assertEquals(1, validationError.getNonValidPermissions().size());
168             assertEquals("funky_permission", Iterables.getFirst(validationError.getNonValidPermissions(), null));
169         }
170     }
171 
172     @Test
173     public void testHasNecessaryPermissionsForDescriptorRequiringNonValidPermissionForOtherInstallationMode()
174             throws IOException {
175         try (InputStream descriptorStream = getInput("/descriptor-requiring-non-valid-permission-local.xml");
176              InputStream schemaStream = getInput("/schema.xsd")) {
177             final DescriptorValidator descriptorValidator = new DescriptorValidator(descriptorStream, schemaStream, getApplications());
178 
179             final Either<ValidationError, ValidationSuccess> validation = descriptorValidator.validate(InstallationMode.REMOTE);
180             assertTrue(validation.isRight());
181         }
182     }
183 
184     @Test
185     public void testHasNecessaryPermissionsForDescriptorRequiringNonValidPermissionForSameInstallationMode()
186             throws IOException {
187         try (InputStream descriptorStream = getInput("/descriptor-requiring-non-valid-permission-local.xml");
188              InputStream schemaStream = getInput("/schema.xsd")) {
189             final DescriptorValidator descriptorValidator = new DescriptorValidator(descriptorStream, schemaStream, getApplications());
190 
191             final Either<ValidationError, ValidationSuccess> validation = descriptorValidator.validate(InstallationMode.LOCAL);
192             assertFalse(validation.isRight());
193             final ValidationError validationError = validation.left().get();
194             assertEquals(1, validationError.getNonValidPermissions().size());
195             assertEquals("funky_permission", Iterables.getFirst(validationError.getNonValidPermissions(), null));
196         }
197     }
198 
199     private ImmutableSet<Application> getApplications() {
200         return ImmutableSet.of(new Application() {
201             @Override
202             public String getKey() {
203                 return "test-app";
204             }
205 
206             @Override
207             public String getVersion() {
208                 return "1.0";
209             }
210 
211             @Override
212             public String getBuildNumber() {
213                 return "1";
214             }
215         });
216     }
217 }