1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
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 }