View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.syncope.core.provisioning.api;
20  
21  import static org.junit.jupiter.api.Assertions.assertEquals;
22  import static org.junit.jupiter.api.Assertions.assertFalse;
23  import static org.junit.jupiter.api.Assertions.assertNotNull;
24  import static org.junit.jupiter.api.Assertions.assertNull;
25  import static org.junit.jupiter.api.Assertions.assertTrue;
26  import static org.junit.jupiter.api.Assertions.fail;
27  import static org.mockito.ArgumentMatchers.any;
28  import static org.mockito.ArgumentMatchers.anyString;
29  import static org.mockito.Mockito.lenient;
30  import static org.mockito.Mockito.mock;
31  import static org.mockito.Mockito.when;
32  
33  import java.text.ParseException;
34  import java.util.HashMap;
35  import java.util.List;
36  import java.util.Map;
37  import org.apache.commons.lang3.builder.HashCodeBuilder;
38  import org.apache.syncope.common.lib.types.AnyTypeKind;
39  import org.apache.syncope.common.lib.types.AttrSchemaType;
40  import org.apache.syncope.common.lib.types.SchemaType;
41  import org.apache.syncope.core.persistence.api.dao.DerSchemaDAO;
42  import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
43  import org.apache.syncope.core.persistence.api.dao.VirSchemaDAO;
44  import org.apache.syncope.core.persistence.api.entity.AnyUtils;
45  import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory;
46  import org.apache.syncope.core.persistence.api.entity.DerSchema;
47  import org.apache.syncope.core.persistence.api.entity.PlainSchema;
48  import org.apache.syncope.core.persistence.api.entity.VirSchema;
49  import org.junit.jupiter.api.BeforeEach;
50  import org.junit.jupiter.api.Test;
51  import org.mockito.Mock;
52  import org.springframework.util.ReflectionUtils;
53  
54  public class IntAttrNameParserTest extends AbstractTest {
55  
56      private static final Map<AnyTypeKind, List<String>> FIELDS = new HashMap<>();
57  
58      static {
59          FIELDS.put(AnyTypeKind.USER, List.of("key", "username"));
60          FIELDS.put(AnyTypeKind.GROUP, List.of("key", "name", "userOwner"));
61          FIELDS.put(AnyTypeKind.ANY_OBJECT, List.of("key", "name"));
62      }
63  
64      @Mock
65      private PlainSchemaDAO plainSchemaDAO;
66  
67      @Mock
68      private DerSchemaDAO derSchemaDAO;
69  
70      @Mock
71      private VirSchemaDAO virSchemaDAO;
72  
73      @Mock
74      private AnyUtilsFactory anyUtilsFactory;
75  
76      @Mock
77      private AnyUtils anyUtils;
78  
79      private IntAttrNameParser intAttrNameParser;
80  
81      @BeforeEach
82      public void initMocks() throws NoSuchFieldException {
83          lenient().when(anyUtilsFactory.getInstance(any(AnyTypeKind.class))).thenAnswer(ic -> {
84              when(anyUtils.anyTypeKind()).thenReturn(ic.getArgument(0));
85              return anyUtils;
86          });
87          lenient().when(anyUtils.getField(anyString())).thenAnswer(ic -> {
88              String field = ic.getArgument(0);
89              return FIELDS.get(anyUtils.anyTypeKind()).contains(field)
90                      ? ReflectionUtils.findField(getClass(), "anyUtils")
91                      : null;
92          });
93          lenient().when(plainSchemaDAO.find(anyString())).thenAnswer(ic -> {
94              String schemaName = ic.getArgument(0);
95              switch (schemaName) {
96                  case "email":
97                  case "firstname":
98                  case "location":
99                      PlainSchema schema = mock(PlainSchema.class);
100                     lenient().when(schema.getKey()).thenReturn(schemaName);
101                     lenient().when(schema.getType()).thenReturn(AttrSchemaType.String);
102                     return schema;
103 
104                 default:
105                     return null;
106             }
107         });
108         lenient().when(derSchemaDAO.find(anyString())).thenAnswer(ic -> {
109             String schemaName = ic.getArgument(0);
110             switch (schemaName) {
111                 case "cn":
112                     DerSchema schema = mock(DerSchema.class);
113                     lenient().when(schema.getKey()).thenReturn(ic.getArgument(0));
114                     return schema;
115 
116                 default:
117                     return null;
118             }
119         });
120         lenient().when(virSchemaDAO.find(anyString())).thenAnswer(ic -> {
121             String schemaName = ic.getArgument(0);
122             switch (schemaName) {
123                 case "rvirtualdata":
124                     VirSchema schema = mock(VirSchema.class);
125                     lenient().when(schema.getKey()).thenReturn(ic.getArgument(0));
126                     return schema;
127 
128                 default:
129                     return null;
130             }
131         });
132 
133         intAttrNameParser = new IntAttrNameParser(plainSchemaDAO, derSchemaDAO, virSchemaDAO, anyUtilsFactory);
134     }
135 
136     @Test
137     public void ownFields() throws ParseException {
138         IntAttrName intAttrName = intAttrNameParser.parse("key", AnyTypeKind.USER);
139         assertNotNull(intAttrName);
140         assertEquals(AnyTypeKind.USER, intAttrName.getAnyTypeKind());
141         assertNotNull(intAttrName.getField());
142         assertEquals("key", intAttrName.getField());
143         assertNull(intAttrName.getSchema());
144         assertNull(intAttrName.getSchemaType());
145         assertNull(intAttrName.getEnclosingGroup());
146         assertNull(intAttrName.getMembershipOfGroup());
147         assertNull(intAttrName.getRelatedAnyObject());
148         assertNull(intAttrName.getPrivilegesOfApplication());
149         assertNull(intAttrName.getRelationshipAnyType());
150         assertNull(intAttrName.getRelationshipType());
151         assertNull(intAttrName.getRelatedUser());
152 
153         intAttrName = intAttrNameParser.parse("name", AnyTypeKind.GROUP);
154         assertNotNull(intAttrName);
155         assertEquals(AnyTypeKind.GROUP, intAttrName.getAnyTypeKind());
156         assertNotNull(intAttrName.getField());
157         assertEquals("name", intAttrName.getField());
158         assertNull(intAttrName.getSchema());
159         assertNull(intAttrName.getSchemaType());
160         assertNull(intAttrName.getEnclosingGroup());
161         assertNull(intAttrName.getMembershipOfGroup());
162         assertNull(intAttrName.getRelatedAnyObject());
163         assertNull(intAttrName.getPrivilegesOfApplication());
164         assertNull(intAttrName.getRelationshipAnyType());
165         assertNull(intAttrName.getRelationshipType());
166         assertNull(intAttrName.getRelatedUser());
167 
168         intAttrName = intAttrNameParser.parse("userOwner", AnyTypeKind.GROUP);
169         assertNotNull(intAttrName);
170         assertEquals(AnyTypeKind.GROUP, intAttrName.getAnyTypeKind());
171         assertNotNull(intAttrName.getField());
172         assertEquals("userOwner", intAttrName.getField());
173         assertNull(intAttrName.getSchema());
174         assertNull(intAttrName.getSchemaType());
175         assertNull(intAttrName.getEnclosingGroup());
176         assertNull(intAttrName.getMembershipOfGroup());
177         assertNull(intAttrName.getRelatedAnyObject());
178         assertNull(intAttrName.getPrivilegesOfApplication());
179         assertNull(intAttrName.getRelationshipAnyType());
180         assertNull(intAttrName.getRelationshipType());
181         assertNull(intAttrName.getRelatedUser());
182 
183         intAttrName = intAttrNameParser.parse("name", AnyTypeKind.USER);
184         assertNotNull(intAttrName);
185         assertEquals(AnyTypeKind.USER, intAttrName.getAnyTypeKind());
186         assertNull(intAttrName.getField());
187 
188         Object nullObj = null;
189         int expected = new HashCodeBuilder().
190                 append(AnyTypeKind.USER).append(nullObj).append(nullObj).append(nullObj).append(nullObj).
191                 append(nullObj).append(nullObj).append(nullObj).append(nullObj).append(nullObj).append(nullObj).
192                 build();
193         assertEquals(expected, intAttrName.hashCode());
194         IntAttrName intAttrName2 = intAttrNameParser.parse("email", AnyTypeKind.USER);
195         assertFalse(intAttrName.equals(intAttrName2));
196         assertFalse(intAttrName.equals(nullObj));
197         assertTrue(intAttrName.equals(intAttrName));
198         String toString = intAttrName.toString();
199         assertTrue(toString.startsWith("org.apache.syncope.core.provisioning.api.IntAttrName"));
200         assertTrue(toString.endsWith("[USER,<null>,<null>,<null>,<null>,<null>,<null>,<null>,<null>,<null>,<null>]"));
201     }
202 
203     @Test
204     public void ownSchema() throws ParseException {
205         IntAttrName intAttrName = intAttrNameParser.parse("email", AnyTypeKind.USER);
206         assertNotNull(intAttrName);
207         assertEquals(AnyTypeKind.USER, intAttrName.getAnyTypeKind());
208         assertNull(intAttrName.getField());
209         assertEquals("email", intAttrName.getSchema().getKey());
210         assertEquals(SchemaType.PLAIN, intAttrName.getSchemaType());
211         assertTrue(intAttrName.getSchema() instanceof PlainSchema);
212         assertNull(intAttrName.getEnclosingGroup());
213         assertNull(intAttrName.getMembershipOfGroup());
214         assertNull(intAttrName.getRelatedAnyObject());
215         assertNull(intAttrName.getPrivilegesOfApplication());
216         assertNull(intAttrName.getRelationshipAnyType());
217         assertNull(intAttrName.getRelationshipType());
218         assertNull(intAttrName.getRelatedUser());
219 
220         intAttrName = intAttrNameParser.parse("cn", AnyTypeKind.ANY_OBJECT);
221         assertNotNull(intAttrName);
222         assertEquals(AnyTypeKind.ANY_OBJECT, intAttrName.getAnyTypeKind());
223         assertNull(intAttrName.getField());
224         assertEquals("cn", intAttrName.getSchema().getKey());
225         assertEquals(SchemaType.DERIVED, intAttrName.getSchemaType());
226         assertTrue(intAttrName.getSchema() instanceof DerSchema);
227         assertNull(intAttrName.getEnclosingGroup());
228         assertNull(intAttrName.getMembershipOfGroup());
229         assertNull(intAttrName.getRelatedAnyObject());
230         assertNull(intAttrName.getPrivilegesOfApplication());
231         assertNull(intAttrName.getRelationshipAnyType());
232         assertNull(intAttrName.getRelationshipType());
233         assertNull(intAttrName.getRelatedUser());
234 
235         intAttrName = intAttrNameParser.parse("rvirtualdata", AnyTypeKind.ANY_OBJECT);
236         assertNotNull(intAttrName);
237         assertEquals(AnyTypeKind.ANY_OBJECT, intAttrName.getAnyTypeKind());
238         assertNull(intAttrName.getField());
239         assertEquals("rvirtualdata", intAttrName.getSchema().getKey());
240         assertEquals(SchemaType.VIRTUAL, intAttrName.getSchemaType());
241         assertTrue(intAttrName.getSchema() instanceof VirSchema);
242         assertNull(intAttrName.getEnclosingGroup());
243         assertNull(intAttrName.getMembershipOfGroup());
244         assertNull(intAttrName.getRelatedAnyObject());
245         assertNull(intAttrName.getPrivilegesOfApplication());
246         assertNull(intAttrName.getRelationshipAnyType());
247         assertNull(intAttrName.getRelationshipType());
248         assertNull(intAttrName.getRelatedUser());
249     }
250 
251     @Test
252     public void enclosingGroup() throws ParseException {
253         IntAttrName intAttrName = intAttrNameParser.parse("groups[readers].cn", AnyTypeKind.USER);
254         assertNotNull(intAttrName);
255         assertEquals(AnyTypeKind.GROUP, intAttrName.getAnyTypeKind());
256         assertNull(intAttrName.getField());
257         assertEquals("cn", intAttrName.getSchema().getKey());
258         assertEquals(SchemaType.DERIVED, intAttrName.getSchemaType());
259         assertTrue(intAttrName.getSchema() instanceof DerSchema);
260         assertEquals("readers", intAttrName.getEnclosingGroup());
261         assertNull(intAttrName.getMembershipOfGroup());
262         assertNull(intAttrName.getRelatedAnyObject());
263         assertNull(intAttrName.getPrivilegesOfApplication());
264         assertNull(intAttrName.getRelationshipAnyType());
265         assertNull(intAttrName.getRelationshipType());
266         assertNull(intAttrName.getRelatedUser());
267     }
268 
269     @Test
270     public void relatedUser() throws ParseException {
271         IntAttrName intAttrName = intAttrNameParser.parse("users[bellini].firstname", AnyTypeKind.USER);
272         assertNotNull(intAttrName);
273         assertEquals(AnyTypeKind.USER, intAttrName.getAnyTypeKind());
274         assertNull(intAttrName.getField());
275         assertEquals("firstname", intAttrName.getSchema().getKey());
276         assertEquals(SchemaType.PLAIN, intAttrName.getSchemaType());
277         assertTrue(intAttrName.getSchema() instanceof PlainSchema);
278         assertEquals("bellini", intAttrName.getRelatedUser());
279         assertNull(intAttrName.getEnclosingGroup());
280         assertNull(intAttrName.getMembershipOfGroup());
281         assertNull(intAttrName.getRelatedAnyObject());
282         assertNull(intAttrName.getPrivilegesOfApplication());
283         assertNull(intAttrName.getRelationshipAnyType());
284         assertNull(intAttrName.getRelationshipType());
285     }
286 
287     @Test
288     public void relatedAnyObject() throws ParseException {
289         IntAttrName intAttrName = intAttrNameParser.parse("anyObjects[hp].name", AnyTypeKind.USER);
290         assertNotNull(intAttrName);
291         assertEquals(AnyTypeKind.ANY_OBJECT, intAttrName.getAnyTypeKind());
292         assertEquals("name", intAttrName.getField());
293         assertNull(intAttrName.getSchema());
294         assertNull(intAttrName.getSchemaType());
295         assertNull(intAttrName.getEnclosingGroup());
296         assertEquals("hp", intAttrName.getRelatedAnyObject());
297         assertNull(intAttrName.getMembershipOfGroup());
298         assertNull(intAttrName.getPrivilegesOfApplication());
299         assertNull(intAttrName.getRelationshipAnyType());
300         assertNull(intAttrName.getRelationshipType());
301         assertNull(intAttrName.getRelatedUser());
302     }
303 
304     @Test
305     public void membership() throws ParseException {
306         IntAttrName intAttrName = intAttrNameParser.parse("memberships[top].cn", AnyTypeKind.USER);
307         assertNotNull(intAttrName);
308         assertEquals(AnyTypeKind.USER, intAttrName.getAnyTypeKind());
309         assertNull(intAttrName.getField());
310         assertEquals("cn", intAttrName.getSchema().getKey());
311         assertEquals(SchemaType.DERIVED, intAttrName.getSchemaType());
312         assertTrue(intAttrName.getSchema() instanceof DerSchema);
313         assertNull(intAttrName.getEnclosingGroup());
314         assertEquals("top", intAttrName.getMembershipOfGroup());
315         assertNull(intAttrName.getRelatedAnyObject());
316         assertNull(intAttrName.getPrivilegesOfApplication());
317         assertNull(intAttrName.getRelationshipAnyType());
318         assertNull(intAttrName.getRelationshipType());
319         assertNull(intAttrName.getRelatedUser());
320     }
321 
322     @Test
323     public void privileges() throws ParseException {
324         IntAttrName intAttrName = intAttrNameParser.parse("privileges[mightyApp]", AnyTypeKind.USER);
325         assertNotNull(intAttrName);
326         assertEquals(AnyTypeKind.USER, intAttrName.getAnyTypeKind());
327         assertNull(intAttrName.getField());
328         assertNull(intAttrName.getSchema());
329         assertNull(intAttrName.getSchemaType());
330         assertNull(intAttrName.getEnclosingGroup());
331         assertNull(intAttrName.getRelatedAnyObject());
332         assertEquals("mightyApp", intAttrName.getPrivilegesOfApplication());
333         assertNull(intAttrName.getRelationshipAnyType());
334         assertNull(intAttrName.getRelationshipType());
335         assertNull(intAttrName.getRelatedUser());
336     }
337 
338     @Test
339     public void relationship() throws ParseException {
340         IntAttrName intAttrName = intAttrNameParser.parse(
341                 "relationships[inclusion][PRINTER].location", AnyTypeKind.USER);
342         assertNotNull(intAttrName);
343         assertEquals(AnyTypeKind.ANY_OBJECT, intAttrName.getAnyTypeKind());
344         assertNull(intAttrName.getField());
345         assertEquals("location", intAttrName.getSchema().getKey());
346         assertEquals(SchemaType.PLAIN, intAttrName.getSchemaType());
347         assertTrue(intAttrName.getSchema() instanceof PlainSchema);
348         assertEquals("inclusion", intAttrName.getRelationshipType());
349         assertEquals("PRINTER", intAttrName.getRelationshipAnyType());
350         assertNull(intAttrName.getEnclosingGroup());
351         assertNull(intAttrName.getRelatedAnyObject());
352         assertNull(intAttrName.getPrivilegesOfApplication());
353         assertNull(intAttrName.getRelatedUser());
354     }
355 
356     @Test
357     public void invalid() {
358         try {
359             intAttrNameParser.parse("memberships.cn", AnyTypeKind.USER);
360             fail("This should not happen");
361         } catch (ParseException e) {
362             assertNotNull(e);
363         }
364     }
365 }