1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
47
48
49
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
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
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 }