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   */
20  package org.apache.directory.server.core.subtree;
21  
22  
23  import java.util.HashSet;
24  import java.util.Set;
25  
26  import junit.framework.TestCase;
27  
28  import org.apache.directory.server.core.entry.DefaultServerEntry;
29  import org.apache.directory.server.core.entry.ServerEntry;
30  import org.apache.directory.server.schema.bootstrap.ApacheSchema;
31  import org.apache.directory.server.schema.bootstrap.BootstrapSchemaLoader;
32  import org.apache.directory.server.schema.bootstrap.CoreSchema;
33  import org.apache.directory.server.schema.bootstrap.Schema;
34  import org.apache.directory.server.schema.bootstrap.SystemSchema;
35  import org.apache.directory.server.schema.registries.DefaultOidRegistry;
36  import org.apache.directory.server.schema.registries.DefaultRegistries;
37  import org.apache.directory.server.schema.registries.Registries;
38  import org.apache.directory.shared.ldap.filter.ExprNode;
39  import org.apache.directory.shared.ldap.filter.FilterParser;
40  import org.apache.directory.shared.ldap.name.LdapDN;
41  import org.apache.directory.shared.ldap.subtree.SubtreeSpecification;
42  import org.apache.directory.shared.ldap.subtree.SubtreeSpecificationModifier;
43  
44  
45  /**
46   * Unit test cases for the SubtreeEvaluator.
47   *
48   * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
49   * @version $Rev: 658889 $
50   */
51  public class SubtreeEvaluatorTest extends TestCase
52  {
53      private Registries registries;
54      private SubtreeEvaluator evaluator;
55  
56  
57      private void init() throws Exception
58      {
59          BootstrapSchemaLoader loader = new BootstrapSchemaLoader();
60          DefaultRegistries bsRegistries = new DefaultRegistries( "bootstrap", loader, new DefaultOidRegistry() );
61          registries = bsRegistries;
62          Set<Schema> schemas = new HashSet<Schema>();
63          schemas.add( new SystemSchema() );
64          schemas.add( new ApacheSchema() );
65          schemas.add( new CoreSchema() );
66          loader.loadWithDependencies( schemas, bsRegistries );
67      }
68  
69  
70      protected void setUp() throws Exception
71      {
72          init();
73          evaluator = new SubtreeEvaluator( registries.getOidRegistry(), registries.getAttributeTypeRegistry() );
74      }
75  
76  
77      protected void tearDown() throws Exception
78      {
79          evaluator = null;
80          registries = null;
81      }
82  
83  
84      public void testDefaults() throws Exception
85      {
86          SubtreeSpecificationModifier modifier = new SubtreeSpecificationModifier();
87          SubtreeSpecification ss = modifier.getSubtreeSpecification();
88          LdapDN apDn = new LdapDN( "ou=system" );
89          LdapDN entryDn = new LdapDN( "ou=users,ou=system" );
90          ServerEntry entry = new DefaultServerEntry( registries, entryDn, "objectClass" );
91  
92          assertTrue( evaluator.evaluate( ss, apDn, entryDn, entry ) );
93  
94          entryDn = new LdapDN( "ou=system" );
95          assertTrue( evaluator.evaluate( ss, apDn, entryDn, entry ) );
96  
97          entryDn = new LdapDN( "ou=abc" );
98          assertFalse( evaluator.evaluate( ss, apDn, entryDn, entry ) );
99      }
100 
101 
102     public void testWithBase() throws Exception
103     {
104         SubtreeSpecificationModifier modifier = new SubtreeSpecificationModifier();
105         modifier.setBase( new LdapDN( "ou=users" ) );
106         SubtreeSpecification ss = modifier.getSubtreeSpecification();
107         LdapDN apDn = new LdapDN( "ou=system" );
108         LdapDN entryDn = new LdapDN( "ou=users,ou=system" );
109         ServerEntry entry = new DefaultServerEntry( registries, entryDn, "objectClass" );
110 
111         assertTrue( evaluator.evaluate( ss, apDn, entryDn, entry ) );
112 
113         entryDn = new LdapDN( "uid=akarasulu,ou=users,ou=system" );
114         assertTrue( evaluator.evaluate( ss, apDn, entryDn, entry ) );
115 
116         entryDn = new LdapDN( "ou=system" );
117         assertFalse( evaluator.evaluate( ss, apDn, entryDn, entry ) );
118     }
119 
120 
121     public void testWithMinMax() throws Exception
122     {
123         SubtreeSpecificationModifier modifier = new SubtreeSpecificationModifier();
124         modifier.setMinBaseDistance( 1 );
125         modifier.setMaxBaseDistance( 3 );
126         modifier.setBase( new LdapDN( "ou=users" ) );
127         SubtreeSpecification ss = modifier.getSubtreeSpecification();
128         LdapDN apDn = new LdapDN( "ou=system" );
129         LdapDN entryDn = new LdapDN( "ou=users,ou=system" );
130         ServerEntry entry = new DefaultServerEntry( registries, entryDn, "objectClass" );
131 
132         assertFalse( evaluator.evaluate( ss, apDn, entryDn, entry ) );
133 
134         entryDn = new LdapDN( "uid=akarasulu,ou=users,ou=system" );
135         assertTrue( evaluator.evaluate( ss, apDn, entryDn, entry ) );
136 
137         entryDn = new LdapDN( "ou=system" );
138         assertFalse( evaluator.evaluate( ss, apDn, entryDn, entry ) );
139 
140         entryDn = new LdapDN( "ou=twolevels,uid=akarasulu,ou=users,ou=system" );
141         assertTrue( evaluator.evaluate( ss, apDn, entryDn, entry ) );
142 
143         entryDn = new LdapDN( "ou=threelevels,ou=twolevels,uid=akarasulu,ou=users,ou=system" );
144         assertTrue( evaluator.evaluate( ss, apDn, entryDn, entry ) );
145 
146         entryDn = new LdapDN( "ou=fourlevels,ou=threelevels,ou=twolevels,uid=akarasulu,ou=users,ou=system" );
147         assertFalse( evaluator.evaluate( ss, apDn, entryDn, entry ) );
148     }
149 
150 
151     public void testWithMinMaxAndChopAfter() throws Exception
152     {
153         SubtreeSpecificationModifier modifier = new SubtreeSpecificationModifier();
154         Set<LdapDN> chopAfter = new HashSet<LdapDN>();
155         chopAfter.add( new LdapDN( "uid=Tori Amos" ) );
156         chopAfter.add( new LdapDN( "ou=twolevels,uid=akarasulu" ) );
157         modifier.setChopAfterExclusions( chopAfter );
158         modifier.setMinBaseDistance( 1 );
159         modifier.setMaxBaseDistance( 3 );
160         modifier.setBase( new LdapDN( "ou=users" ) );
161         SubtreeSpecification ss = modifier.getSubtreeSpecification();
162         LdapDN apDn = new LdapDN( "ou=system" );
163         LdapDN entryDn = new LdapDN( "ou=users,ou=system" );
164         ServerEntry entry = new DefaultServerEntry( registries, entryDn, "objectClass" );
165 
166         assertFalse( evaluator.evaluate( ss, apDn, entryDn, entry ) );
167 
168         entryDn = new LdapDN( "uid=akarasulu,ou=users,ou=system" );
169         assertTrue( evaluator.evaluate( ss, apDn, entryDn, entry ) );
170 
171         entryDn = new LdapDN( "ou=system" );
172         assertFalse( evaluator.evaluate( ss, apDn, entryDn, entry ) );
173 
174         entryDn = new LdapDN( "ou=twolevels,uid=akarasulu,ou=users,ou=system" );
175         assertTrue( evaluator.evaluate( ss, apDn, entryDn, entry ) );
176 
177         entryDn = new LdapDN( "ou=threelevels,ou=twolevels,uid=akarasulu,ou=users,ou=system" );
178         assertFalse( evaluator.evaluate( ss, apDn, entryDn, entry ) );
179 
180         entryDn = new LdapDN( "ou=fourlevels,ou=threelevels,ou=twolevels,uid=akarasulu,ou=users,ou=system" );
181         assertFalse( evaluator.evaluate( ss, apDn, entryDn, entry ) );
182     }
183 
184 
185     public void testWithMinMaxAndChopBefore() throws Exception
186     {
187         SubtreeSpecificationModifier modifier = new SubtreeSpecificationModifier();
188         Set<LdapDN> chopBefore = new HashSet<LdapDN>();
189         chopBefore.add( new LdapDN( "uid=Tori Amos" ) );
190         chopBefore.add( new LdapDN( "ou=threelevels,ou=twolevels,uid=akarasulu" ) );
191         modifier.setChopBeforeExclusions( chopBefore );
192         modifier.setMinBaseDistance( 1 );
193         modifier.setMaxBaseDistance( 3 );
194         modifier.setBase( new LdapDN( "ou=users" ) );
195         SubtreeSpecification ss = modifier.getSubtreeSpecification();
196         LdapDN apDn = new LdapDN( "ou=system" );
197         LdapDN entryDn = new LdapDN( "ou=users,ou=system" );
198         ServerEntry entry = new DefaultServerEntry( registries, entryDn, "objectClass" );
199 
200         assertFalse( evaluator.evaluate( ss, apDn, entryDn, entry ) );
201 
202         entryDn = new LdapDN( "uid=akarasulu,ou=users,ou=system" );
203         assertTrue( evaluator.evaluate( ss, apDn, entryDn, entry ) );
204 
205         entryDn = new LdapDN( "ou=system" );
206         assertFalse( evaluator.evaluate( ss, apDn, entryDn, entry ) );
207 
208         entryDn = new LdapDN( "ou=twolevels,uid=akarasulu,ou=users,ou=system" );
209         assertTrue( evaluator.evaluate( ss, apDn, entryDn, entry ) );
210 
211         entryDn = new LdapDN( "ou=threelevels,ou=twolevels,uid=akarasulu,ou=users,ou=system" );
212         assertFalse( evaluator.evaluate( ss, apDn, entryDn, entry ) );
213 
214         entryDn = new LdapDN( "ou=fourlevels,ou=threelevels,ou=twolevels,uid=akarasulu,ou=users,ou=system" );
215         assertFalse( evaluator.evaluate( ss, apDn, entryDn, entry ) );
216     }
217 
218 
219     public void testWithMinMaxAndSimpleRefinement() throws Exception
220     {
221         ExprNode refinement = FilterParser.parse( "(objectClass=person)" );
222 
223         SubtreeSpecificationModifier modifier = new SubtreeSpecificationModifier();
224         modifier.setRefinement( refinement );
225         modifier.setMinBaseDistance( 1 );
226         modifier.setMaxBaseDistance( 3 );
227         modifier.setBase( new LdapDN( "ou=users" ) );
228         SubtreeSpecification ss = modifier.getSubtreeSpecification();
229         LdapDN apDn = new LdapDN( "ou=system" );
230         LdapDN entryDn = new LdapDN( "ou=users,ou=system" );
231         ServerEntry entry = new DefaultServerEntry( registries, entryDn );
232         entry.put( "objectClass", "person" );
233 
234         assertFalse( evaluator.evaluate( ss, apDn, entryDn, entry ) );
235 
236         entryDn = new LdapDN( "uid=akarasulu,ou=users,ou=system" );
237         assertTrue( evaluator.evaluate( ss, apDn, entryDn, entry ) );
238 
239         entryDn = new LdapDN( "ou=system" );
240         assertFalse( evaluator.evaluate( ss, apDn, entryDn, entry ) );
241 
242         entryDn = new LdapDN( "ou=twolevels,uid=akarasulu,ou=users,ou=system" );
243         assertTrue( evaluator.evaluate( ss, apDn, entryDn, entry ) );
244 
245         entryDn = new LdapDN( "ou=threelevels,ou=twolevels,uid=akarasulu,ou=users,ou=system" );
246         assertTrue( evaluator.evaluate( ss, apDn, entryDn, entry ) );
247 
248         entryDn = new LdapDN( "ou=fourlevels,ou=threelevels,ou=twolevels,uid=akarasulu,ou=users,ou=system" );
249         assertFalse( evaluator.evaluate( ss, apDn, entryDn, entry ) );
250 
251         // now change the refinement so the entry is rejected
252         entry = new DefaultServerEntry( registries, entryDn );
253         entry.put( "objectClass", "organizationalUnit" );
254         
255 
256         assertFalse( evaluator.evaluate( ss, apDn, entryDn, entry ) );
257 
258         entryDn = new LdapDN( "uid=akarasulu,ou=users,ou=system" );
259         assertFalse( evaluator.evaluate( ss, apDn, entryDn, entry ) );
260 
261         entryDn = new LdapDN( "ou=system" );
262         assertFalse( evaluator.evaluate( ss, apDn, entryDn, entry ) );
263 
264         entryDn = new LdapDN( "ou=twolevels,uid=akarasulu,ou=users,ou=system" );
265         assertFalse( evaluator.evaluate( ss, apDn, entryDn, entry ) );
266 
267         entryDn = new LdapDN( "ou=threelevels,ou=twolevels,uid=akarasulu,ou=users,ou=system" );
268         assertFalse( evaluator.evaluate( ss, apDn, entryDn, entry ) );
269 
270         entryDn = new LdapDN( "ou=fourlevels,ou=threelevels,ou=twolevels,uid=akarasulu,ou=users,ou=system" );
271         assertFalse( evaluator.evaluate( ss, apDn, entryDn, entry ) );
272 
273     }
274     
275     
276     public void testWithFilter() throws Exception
277     {
278         ExprNode filter = FilterParser.parse( "(&(cn=Ersin)(objectClass=person))" );
279 
280         SubtreeSpecificationModifier modifier = new SubtreeSpecificationModifier();
281         modifier.setRefinement( filter );
282         modifier.setMinBaseDistance( 1 );
283         modifier.setMaxBaseDistance( 3 );
284         modifier.setBase( new LdapDN( "ou=users" ) );
285         SubtreeSpecification ss = modifier.getSubtreeSpecification();
286         LdapDN apDn = new LdapDN( "ou=system" );
287         LdapDN entryDn = new LdapDN( "ou=users,ou=system" );
288 
289         ServerEntry entry = new DefaultServerEntry( registries, entryDn );;
290         entry.put( "objectClass", "person" );
291         entry.put( "cn", "Ersin" );
292 
293         assertFalse( evaluator.evaluate( ss, apDn, entryDn, entry ) );
294 
295         entryDn = new LdapDN( "cn=Ersin,ou=users,ou=system" );
296         assertTrue( evaluator.evaluate( ss, apDn, entryDn, entry ) );
297 
298         // now change the filter so the entry is rejected
299         entry = new DefaultServerEntry( registries, entryDn );;
300         entry.put( "objectClass", "person" );
301         entry.put( "cn", "Alex" );
302 
303         assertFalse( evaluator.evaluate( ss, apDn, entryDn, entry ) );
304 
305         entryDn = new LdapDN( "cn=Alex,ou=users,ou=system" );
306         assertFalse( evaluator.evaluate( ss, apDn, entryDn, entry ) );
307     }
308 }