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 }