1   /*
2    *   Copyright 2004 The Apache Software Foundation
3    *
4    *   Licensed under the Apache License, Version 2.0 (the "License");
5    *   you may not use this file except in compliance with the License.
6    *   You may obtain a copy of the License at
7    *
8    *       http://www.apache.org/licenses/LICENSE-2.0
9    *
10   *   Unless required by applicable law or agreed to in writing, software
11   *   distributed under the License is distributed on an "AS IS" BASIS,
12   *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   *   See the License for the specific language governing permissions and
14   *   limitations under the License.
15   *
16   */
17  package org.apache.ldap.server.subtree;
18  
19  
20  import junit.framework.TestCase;
21  import org.apache.ldap.server.schema.GlobalRegistries;
22  import org.apache.ldap.server.schema.OidRegistry;
23  import org.apache.ldap.server.schema.bootstrap.*;
24  import org.apache.ldap.common.subtree.SubtreeSpecificationModifier;
25  import org.apache.ldap.common.subtree.SubtreeSpecification;
26  import org.apache.ldap.common.name.LdapName;
27  import org.apache.ldap.common.filter.FilterParserImpl;
28  import org.apache.ldap.common.filter.FilterParser;
29  import org.apache.ldap.common.filter.ExprNode;
30  
31  import javax.naming.NamingException;
32  import javax.naming.Name;
33  import javax.naming.directory.Attribute;
34  import javax.naming.directory.BasicAttribute;
35  import java.util.Set;
36  import java.util.HashSet;
37  
38  
39  /***
40   * Unit test cases for the SubtreeEvaluator.
41   *
42   * @author <a href="mailto:directory-dev@incubator.apache.org">Apache Directory Project</a>
43   * @version $Rev$
44   */
45  public class SubtreeEvaluatorTest extends TestCase
46  {
47      private GlobalRegistries registries;
48      private SubtreeEvaluator evaluator;
49  
50  
51      private void init() throws NamingException
52      {
53          BootstrapRegistries bsRegistries = new BootstrapRegistries();
54          registries = new GlobalRegistries( bsRegistries );
55          BootstrapSchemaLoader loader = new BootstrapSchemaLoader();
56          Set schemas = new HashSet();
57          schemas.add( new SystemSchema() );
58          schemas.add( new ApacheSchema() );
59          schemas.add( new CoreSchema() );
60          schemas.add( new CosineSchema() );
61          schemas.add( new InetorgpersonSchema() );
62          schemas.add( new JavaSchema() );
63          loader.load( schemas, bsRegistries );
64      }
65  
66  
67      protected void setUp() throws Exception
68      {
69          init();
70          OidRegistry registry = registries.getOidRegistry();
71          evaluator = new SubtreeEvaluator( registry );
72      }
73  
74  
75      protected void tearDown() throws Exception
76      {
77          evaluator = null;
78          registries = null;
79      }
80  
81  
82      public void testDefaults() throws Exception
83      {
84          SubtreeSpecificationModifier modifier = new SubtreeSpecificationModifier();
85          SubtreeSpecification ss = modifier.getSubtreeSpecification();
86          Name apDn = new LdapName( "ou=system" );
87          Name entryDn = new LdapName( "ou=users,ou=system" );
88          Attribute objectClasses = new BasicAttribute( "objectClass" );
89  
90          assertTrue( evaluator.evaluate( ss, apDn, entryDn, objectClasses ) );
91  
92          entryDn = new LdapName( "ou=system" );
93          assertTrue( evaluator.evaluate( ss, apDn, entryDn, objectClasses ) );
94  
95          entryDn = new LdapName( "ou=abc" );
96          assertFalse( evaluator.evaluate( ss, apDn, entryDn, objectClasses ) );
97      }
98  
99  
100     public void testWithBase() throws Exception
101     {
102         SubtreeSpecificationModifier modifier = new SubtreeSpecificationModifier();
103         modifier.setBase( new LdapName( "ou=users" ) );
104         SubtreeSpecification ss = modifier.getSubtreeSpecification();
105         Name apDn = new LdapName( "ou=system" );
106         Name entryDn = new LdapName( "ou=users,ou=system" );
107         Attribute objectClasses = new BasicAttribute( "objectClass" );
108 
109         assertTrue( evaluator.evaluate( ss, apDn, entryDn, objectClasses ) );
110 
111         entryDn = new LdapName( "uid=akarasulu,ou=users,ou=system" );
112         assertTrue( evaluator.evaluate( ss, apDn, entryDn, objectClasses ) );
113 
114         entryDn = new LdapName( "ou=system" );
115         assertFalse( evaluator.evaluate( ss, apDn, entryDn, objectClasses ) );
116     }
117 
118 
119     public void testWithMinMax() throws Exception
120     {
121         SubtreeSpecificationModifier modifier = new SubtreeSpecificationModifier();
122         modifier.setMinBaseDistance( 1 );
123         modifier.setMaxBaseDistance( 3 );
124         modifier.setBase( new LdapName( "ou=users" ) );
125         SubtreeSpecification ss = modifier.getSubtreeSpecification();
126         Name apDn = new LdapName( "ou=system" );
127         Name entryDn = new LdapName( "ou=users,ou=system" );
128         Attribute objectClasses = new BasicAttribute( "objectClass" );
129 
130         assertFalse( evaluator.evaluate( ss, apDn, entryDn, objectClasses ) );
131 
132         entryDn = new LdapName( "uid=akarasulu,ou=users,ou=system" );
133         assertTrue( evaluator.evaluate( ss, apDn, entryDn, objectClasses ) );
134 
135         entryDn = new LdapName( "ou=system" );
136         assertFalse( evaluator.evaluate( ss, apDn, entryDn, objectClasses ) );
137 
138         entryDn = new LdapName( "ou=twolevels,uid=akarasulu,ou=users,ou=system" );
139         assertTrue( evaluator.evaluate( ss, apDn, entryDn, objectClasses ) );
140 
141         entryDn = new LdapName( "ou=threelevels,ou=twolevels,uid=akarasulu,ou=users,ou=system" );
142         assertTrue( evaluator.evaluate( ss, apDn, entryDn, objectClasses ) );
143 
144         entryDn = new LdapName( "ou=fourlevels,ou=threelevels,ou=twolevels,uid=akarasulu,ou=users,ou=system" );
145         assertFalse( evaluator.evaluate( ss, apDn, entryDn, objectClasses ) );
146     }
147 
148 
149     public void testWithMinMaxAndChopAfter() throws Exception
150     {
151         SubtreeSpecificationModifier modifier = new SubtreeSpecificationModifier();
152         Set chopAfter = new HashSet();
153         chopAfter.add( new LdapName( "uid=Tori Amos" ) );
154         chopAfter.add( new LdapName( "ou=twolevels,uid=akarasulu" ) );
155         modifier.setChopAfterExclusions( chopAfter );
156         modifier.setMinBaseDistance( 1 );
157         modifier.setMaxBaseDistance( 3 );
158         modifier.setBase( new LdapName( "ou=users" ) );
159         SubtreeSpecification ss = modifier.getSubtreeSpecification();
160         Name apDn = new LdapName( "ou=system" );
161         Name entryDn = new LdapName( "ou=users,ou=system" );
162         Attribute objectClasses = new BasicAttribute( "objectClass" );
163 
164         assertFalse( evaluator.evaluate( ss, apDn, entryDn, objectClasses ) );
165 
166         entryDn = new LdapName( "uid=akarasulu,ou=users,ou=system" );
167         assertTrue( evaluator.evaluate( ss, apDn, entryDn, objectClasses ) );
168 
169         entryDn = new LdapName( "ou=system" );
170         assertFalse( evaluator.evaluate( ss, apDn, entryDn, objectClasses ) );
171 
172         entryDn = new LdapName( "ou=twolevels,uid=akarasulu,ou=users,ou=system" );
173         assertTrue( evaluator.evaluate( ss, apDn, entryDn, objectClasses ) );
174 
175         entryDn = new LdapName( "ou=threelevels,ou=twolevels,uid=akarasulu,ou=users,ou=system" );
176         assertFalse( evaluator.evaluate( ss, apDn, entryDn, objectClasses ) );
177 
178         entryDn = new LdapName( "ou=fourlevels,ou=threelevels,ou=twolevels,uid=akarasulu,ou=users,ou=system" );
179         assertFalse( evaluator.evaluate( ss, apDn, entryDn, objectClasses ) );
180     }
181 
182 
183     public void testWithMinMaxAndChopBefore() throws Exception
184     {
185         SubtreeSpecificationModifier modifier = new SubtreeSpecificationModifier();
186         Set chopBefore = new HashSet();
187         chopBefore.add( new LdapName( "uid=Tori Amos" ) );
188         chopBefore.add( new LdapName( "ou=threelevels,ou=twolevels,uid=akarasulu" ) );
189         modifier.setChopBeforeExclusions( chopBefore );
190         modifier.setMinBaseDistance( 1 );
191         modifier.setMaxBaseDistance( 3 );
192         modifier.setBase( new LdapName( "ou=users" ) );
193         SubtreeSpecification ss = modifier.getSubtreeSpecification();
194         Name apDn = new LdapName( "ou=system" );
195         Name entryDn = new LdapName( "ou=users,ou=system" );
196         Attribute objectClasses = new BasicAttribute( "objectClass" );
197 
198         assertFalse( evaluator.evaluate( ss, apDn, entryDn, objectClasses ) );
199 
200         entryDn = new LdapName( "uid=akarasulu,ou=users,ou=system" );
201         assertTrue( evaluator.evaluate( ss, apDn, entryDn, objectClasses ) );
202 
203         entryDn = new LdapName( "ou=system" );
204         assertFalse( evaluator.evaluate( ss, apDn, entryDn, objectClasses ) );
205 
206         entryDn = new LdapName( "ou=twolevels,uid=akarasulu,ou=users,ou=system" );
207         assertTrue( evaluator.evaluate( ss, apDn, entryDn, objectClasses ) );
208 
209         entryDn = new LdapName( "ou=threelevels,ou=twolevels,uid=akarasulu,ou=users,ou=system" );
210         assertFalse( evaluator.evaluate( ss, apDn, entryDn, objectClasses ) );
211 
212         entryDn = new LdapName( "ou=fourlevels,ou=threelevels,ou=twolevels,uid=akarasulu,ou=users,ou=system" );
213         assertFalse( evaluator.evaluate( ss, apDn, entryDn, objectClasses ) );
214     }
215 
216 
217     public void testWithMinMaxAndSimpleRefinement() throws Exception
218     {
219         FilterParser parser = new FilterParserImpl();
220         ExprNode refinement = parser.parse( "( objectClass = person )" );
221 
222         SubtreeSpecificationModifier modifier = new SubtreeSpecificationModifier();
223         modifier.setRefinement( refinement );
224         modifier.setMinBaseDistance( 1 );
225         modifier.setMaxBaseDistance( 3 );
226         modifier.setBase( new LdapName( "ou=users" ) );
227         SubtreeSpecification ss = modifier.getSubtreeSpecification();
228         Name apDn = new LdapName( "ou=system" );
229         Name entryDn = new LdapName( "ou=users,ou=system" );
230         Attribute objectClasses = new BasicAttribute( "objectClass", "person" );
231 
232         assertFalse( evaluator.evaluate( ss, apDn, entryDn, objectClasses ) );
233 
234         entryDn = new LdapName( "uid=akarasulu,ou=users,ou=system" );
235         assertTrue( evaluator.evaluate( ss, apDn, entryDn, objectClasses ) );
236 
237         entryDn = new LdapName( "ou=system" );
238         assertFalse( evaluator.evaluate( ss, apDn, entryDn, objectClasses ) );
239 
240         entryDn = new LdapName( "ou=twolevels,uid=akarasulu,ou=users,ou=system" );
241         assertTrue( evaluator.evaluate( ss, apDn, entryDn, objectClasses ) );
242 
243         entryDn = new LdapName( "ou=threelevels,ou=twolevels,uid=akarasulu,ou=users,ou=system" );
244         assertTrue( evaluator.evaluate( ss, apDn, entryDn, objectClasses ) );
245 
246         entryDn = new LdapName( "ou=fourlevels,ou=threelevels,ou=twolevels,uid=akarasulu,ou=users,ou=system" );
247         assertFalse( evaluator.evaluate( ss, apDn, entryDn, objectClasses ) );
248 
249         // now change the refinement so the entry is rejected
250         objectClasses = new BasicAttribute( "objectClass", "organizationalUnit" );
251 
252         assertFalse( evaluator.evaluate( ss, apDn, entryDn, objectClasses ) );
253 
254         entryDn = new LdapName( "uid=akarasulu,ou=users,ou=system" );
255         assertFalse( evaluator.evaluate( ss, apDn, entryDn, objectClasses ) );
256 
257         entryDn = new LdapName( "ou=system" );
258         assertFalse( evaluator.evaluate( ss, apDn, entryDn, objectClasses ) );
259 
260         entryDn = new LdapName( "ou=twolevels,uid=akarasulu,ou=users,ou=system" );
261         assertFalse( evaluator.evaluate( ss, apDn, entryDn, objectClasses ) );
262 
263         entryDn = new LdapName( "ou=threelevels,ou=twolevels,uid=akarasulu,ou=users,ou=system" );
264         assertFalse( evaluator.evaluate( ss, apDn, entryDn, objectClasses ) );
265 
266         entryDn = new LdapName( "ou=fourlevels,ou=threelevels,ou=twolevels,uid=akarasulu,ou=users,ou=system" );
267         assertFalse( evaluator.evaluate( ss, apDn, entryDn, objectClasses ) );
268 
269     }
270 }