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.authz.support;
21  
22  
23  import java.util.ArrayList;
24  import java.util.Collection;
25  import java.util.Collections;
26  import java.util.HashSet;
27  import java.util.List;
28  import java.util.Set;
29  
30  import junit.framework.Assert;
31  import junit.framework.TestCase;
32  
33  import org.apache.directory.server.core.authz.support.MostSpecificUserClassFilter;
34  import org.apache.directory.server.core.authz.support.OperationScope;
35  import org.apache.directory.shared.ldap.aci.ACITuple;
36  import org.apache.directory.shared.ldap.aci.MicroOperation;
37  import org.apache.directory.shared.ldap.aci.ProtectedItem;
38  import org.apache.directory.shared.ldap.aci.UserClass;
39  import org.apache.directory.shared.ldap.constants.AuthenticationLevel;
40  import org.apache.directory.shared.ldap.name.LdapDN;
41  import org.apache.directory.shared.ldap.subtree.SubtreeSpecification;
42  
43  
44  /**
45   * Tests {@link MostSpecificUserClassFilter}.
46   *
47   * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
48   * @version $Rev: 613608 $, $Date: 2008-01-20 17:59:10 +0100 (So, 20 Jan 2008) $
49   */
50  public class MostSpecificUserClassFilterTest extends TestCase
51  {
52      private static final Set<LdapDN> EMPTY_NAME_SET = Collections.unmodifiableSet( new HashSet<LdapDN>() );
53      private static final Set<MicroOperation> EMPTY_MICRO_OPERATION_SET = Collections.unmodifiableSet( new HashSet<MicroOperation>() );
54      private static final Collection<UserClass> EMPTY_USER_CLASS_COLLECTION = Collections.unmodifiableCollection( new ArrayList<UserClass>() );
55      private static final Collection<SubtreeSpecification> EMPTY_SUBTREE_SPECIFICATION_COLLECTION = Collections.unmodifiableCollection( new ArrayList<SubtreeSpecification>() );
56      private static final Collection<ProtectedItem> EMPTY_PROTECTED_ITEM_COLLECTION = Collections.unmodifiableCollection( new ArrayList<ProtectedItem>() );
57      private static final Collection<ACITuple> EMPTY_ACI_TUPLE_COLLECTION = Collections.unmodifiableCollection( new ArrayList<ACITuple>() );
58  
59      private static final List<ACITuple> TUPLES_A = new ArrayList<ACITuple>();
60      private static final List<ACITuple> TUPLES_B = new ArrayList<ACITuple>();
61      private static final List<ACITuple> TUPLES_C = new ArrayList<ACITuple>();
62      private static final List<ACITuple> TUPLES_D = new ArrayList<ACITuple>();
63      private static final List<ACITuple> TUPLES_E = new ArrayList<ACITuple>();
64  
65      static
66      {
67          Collection<UserClass> name = new ArrayList<UserClass>();
68          Collection<UserClass> thisEntry = new ArrayList<UserClass>();
69          Collection<UserClass> userGroup = new ArrayList<UserClass>();
70          Collection<UserClass> subtree = new ArrayList<UserClass>();
71          Collection<UserClass> allUsers = new ArrayList<UserClass>();
72  
73          name.add( new UserClass.Name( EMPTY_NAME_SET ) );
74          thisEntry.add( UserClass.THIS_ENTRY );
75          userGroup.add( new UserClass.UserGroup( EMPTY_NAME_SET ) );
76          subtree.add( new UserClass.Subtree( EMPTY_SUBTREE_SPECIFICATION_COLLECTION ) );
77          allUsers.add( UserClass.ALL_USERS );
78  
79          ACITuple nameTuple = new ACITuple( name, AuthenticationLevel.NONE, EMPTY_PROTECTED_ITEM_COLLECTION, EMPTY_MICRO_OPERATION_SET, true, 0 );
80          ACITuple thisEntryTuple = new ACITuple( thisEntry, AuthenticationLevel.NONE, EMPTY_PROTECTED_ITEM_COLLECTION, EMPTY_MICRO_OPERATION_SET, true, 0 );
81          ACITuple userGroupTuple = new ACITuple( userGroup, AuthenticationLevel.NONE, EMPTY_PROTECTED_ITEM_COLLECTION, EMPTY_MICRO_OPERATION_SET, true, 0 );
82          ACITuple subtreeTuple = new ACITuple( subtree, AuthenticationLevel.NONE, EMPTY_PROTECTED_ITEM_COLLECTION, EMPTY_MICRO_OPERATION_SET, true, 0 );
83          ACITuple allUsersTuple = new ACITuple( allUsers, AuthenticationLevel.NONE, EMPTY_PROTECTED_ITEM_COLLECTION, EMPTY_MICRO_OPERATION_SET, true, 0 );
84  
85          TUPLES_A.add( nameTuple );
86          TUPLES_A.add( thisEntryTuple );
87          TUPLES_A.add( userGroupTuple );
88          TUPLES_A.add( subtreeTuple );
89          TUPLES_A.add( allUsersTuple );
90  
91          TUPLES_B.add( thisEntryTuple );
92          TUPLES_B.add( userGroupTuple );
93          TUPLES_B.add( subtreeTuple );
94          TUPLES_B.add( allUsersTuple );
95  
96          TUPLES_C.add( userGroupTuple );
97          TUPLES_C.add( subtreeTuple );
98          TUPLES_C.add( allUsersTuple );
99  
100         TUPLES_D.add( subtreeTuple );
101         TUPLES_D.add( allUsersTuple );
102 
103         TUPLES_E.add( allUsersTuple );
104         TUPLES_E.add( allUsersTuple );
105     }
106 
107 
108     public void testZeroOrOneTuple() throws Exception
109     {
110         MostSpecificUserClassFilter filter = new MostSpecificUserClassFilter();
111 
112         Assert.assertEquals( 0, filter.filter( null, EMPTY_ACI_TUPLE_COLLECTION, OperationScope.ATTRIBUTE_TYPE_AND_VALUE, null, null,
113             null, null, null, null, null, null, null, null, null ).size() );
114 
115         Collection<ACITuple> tuples = new ArrayList<ACITuple>();
116         tuples.add( new ACITuple( EMPTY_USER_CLASS_COLLECTION, AuthenticationLevel.NONE, EMPTY_PROTECTED_ITEM_COLLECTION, EMPTY_MICRO_OPERATION_SET, false, 0 ) );
117 
118         Assert.assertEquals( 1, filter.filter( null, tuples, OperationScope.ATTRIBUTE_TYPE_AND_VALUE, null, null, null, null,
119             null, null, null, null, null, null, null ).size() );
120     }
121 
122 
123     public void testNameAndThisEntry() throws Exception
124     {
125         MostSpecificUserClassFilter filter = new MostSpecificUserClassFilter();
126 
127         List<ACITuple> tuples = new ArrayList<ACITuple>( TUPLES_A );
128         tuples = ( List<ACITuple> ) filter.filter( null, tuples, OperationScope.ENTRY, null, null, null, null, null, null, null, null,
129             null, null, null );
130 
131         Assert.assertEquals( 2, tuples.size() );
132         Assert.assertSame( TUPLES_A.get( 0 ), tuples.get( 0 ) );
133         Assert.assertSame( TUPLES_A.get( 1 ), tuples.get( 1 ) );
134     }
135 
136 
137     public void testThisEntry() throws Exception
138     {
139         MostSpecificUserClassFilter filter = new MostSpecificUserClassFilter();
140 
141         List<ACITuple> tuples = new ArrayList<ACITuple>( TUPLES_B );
142         tuples = ( List<ACITuple> ) filter.filter( null, tuples, OperationScope.ENTRY, null, null, null, null, null, null, null, null,
143             null, null, null );
144 
145         Assert.assertEquals( 1, tuples.size() );
146         Assert.assertSame( TUPLES_B.get( 0 ), tuples.get( 0 ) );
147     }
148 
149 
150     public void testUserGroup() throws Exception
151     {
152         MostSpecificUserClassFilter filter = new MostSpecificUserClassFilter();
153 
154         List<ACITuple> tuples = new ArrayList<ACITuple>( TUPLES_C );
155         tuples = ( List<ACITuple> ) filter.filter( null, tuples, OperationScope.ENTRY, null, null, null, null, null, null, null, null,
156             null, null, null );
157 
158         Assert.assertEquals( 1, tuples.size() );
159         Assert.assertSame( TUPLES_C.get( 0 ), tuples.get( 0 ) );
160     }
161 
162 
163     public void testSubtree() throws Exception
164     {
165         MostSpecificUserClassFilter filter = new MostSpecificUserClassFilter();
166 
167         List<ACITuple> tuples = new ArrayList<ACITuple>( TUPLES_D );
168         tuples = ( List<ACITuple> ) filter.filter( null, tuples, OperationScope.ENTRY, null, null, null, null, null, null, null, null,
169             null, null, null );
170 
171         Assert.assertEquals( 1, tuples.size() );
172         Assert.assertSame( TUPLES_D.get( 0 ), tuples.get( 0 ) );
173     }
174 
175 
176     public void testOthers() throws Exception
177     {
178         MostSpecificUserClassFilter filter = new MostSpecificUserClassFilter();
179 
180         List<ACITuple> tuples = new ArrayList<ACITuple>( TUPLES_E );
181         tuples = (List<ACITuple>)filter.filter( null, tuples, OperationScope.ENTRY, null, null, null, null, null, null, null, null,
182             null, null, null );
183 
184         Assert.assertEquals( 2, tuples.size() );
185         Assert.assertSame( TUPLES_E.get( 0 ), tuples.get( 0 ) );
186         Assert.assertSame( TUPLES_E.get( 1 ), tuples.get( 1 ) );
187     }
188 }