This project has retired. For details please refer to its Attic page.
AbstractRbacManagerPerformanceTestCase xref
View Javadoc

1   package org.apache.archiva.redback.tests;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   * http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  import junit.framework.TestCase;
22  import org.apache.archiva.redback.rbac.Permission;
23  import org.apache.archiva.redback.rbac.RBACManager;
24  import org.apache.archiva.redback.rbac.RbacManagerException;
25  import org.apache.archiva.redback.rbac.Resource;
26  import org.apache.archiva.redback.rbac.Role;
27  import org.apache.archiva.redback.rbac.UserAssignment;
28  import org.apache.archiva.redback.rbac.Operation;
29  import org.apache.archiva.redback.tests.utils.RBACDefaults;
30  import org.junit.Test;
31  import org.junit.runner.RunWith;
32  import org.slf4j.Logger;
33  import org.slf4j.LoggerFactory;
34  import org.springframework.test.context.ContextConfiguration;
35  import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
36  
37  import java.util.Collections;
38  
39  @RunWith( SpringJUnit4ClassRunner.class )
40  @ContextConfiguration( locations = { "classpath*:/META-INF/spring-context.xml", "classpath*:/spring-context.xml" } )
41  public class AbstractRbacManagerPerformanceTestCase
42      extends TestCase
43  {
44      private RBACManager rbacManager;
45  
46      private RBACDefaults rbacDefaults;
47  
48      protected Logger logger = LoggerFactory.getLogger( getClass() );
49  
50      public void setRbacManager( RBACManager store )
51      {
52          this.rbacManager = store;
53          rbacDefaults = new RBACDefaults( rbacManager );
54      }
55  
56      public void setUp()
57          throws Exception
58      {
59          super.setUp();
60      }
61  
62      public void tearDown()
63          throws Exception
64      {
65          super.tearDown();
66      }
67  
68      private Role getDeveloperRole()
69          throws RbacManagerException
70      {
71          Role role = rbacManager.createRole( "DEVELOPER" );
72          role.setAssignable( true );
73  
74          Permission perm = rbacManager.createPermission( "EDIT_MY_USER", "EDIT", "User:Self" );
75  
76          role.addPermission( perm );
77  
78          return role;
79      }
80      
81      private Role getSuperDeveloperRole()
82      {
83          Role role = rbacManager.createRole( "SUPER_DEVELOPER" );
84          role.setAssignable( true );
85  
86          return role;
87      }
88  
89      private static final int ITERATIONS = 10000;
90  
91      private static final int ONESECOND = 1000;
92  
93      public void assertPerformance( String msg, long startTime, long endTime, int iterations, double threshold )
94      {
95          long elapsed = endTime - startTime;
96          double ratio = (double) elapsed / (double) ONESECOND; // ratio of time to 1 second.
97          double opsPerSecond = (double) iterations / ratio;
98  
99          logger.info( "Performance {}: {} operations per second. (effective)", msg, opsPerSecond );
100 
101         if ( opsPerSecond < threshold )
102         {
103             // Failure
104 
105             StringBuilder stats = new StringBuilder();
106 
107             stats.append( "Stats on " ).append( msg );
108             stats.append( "\nStart Time (ms): " ).append( Long.toString( startTime ) );
109             stats.append( "\nEnd Time (ms)  : " ).append( Long.toString( endTime ) );
110             stats.append( "\nElapsed (ms)   : " ).append( Long.toString( elapsed ) );
111             stats.append( "\nRatio          : " ).append( Double.toString( ratio ) );
112             stats.append( "\nOps per second : " ).append( Double.toString( opsPerSecond ) );
113 
114             logger.info( stats.toString() );
115 
116             fail( "Performance Error: " + msg + " expecting greater than [" + threshold + "], actual [" + opsPerSecond
117                 + "]" );
118         }
119     }
120 
121     @Test
122     public void testPerformanceResource()
123         throws RbacManagerException
124     {
125         assertNotNull( rbacManager );
126         rbacManager.eraseDatabase();
127 
128         Resource resource = rbacManager.createResource( "foo" );
129         Resource resource2 = rbacManager.createResource( "bar" );
130 
131         assertNotNull( resource );
132 
133         Resource added = rbacManager.saveResource( resource );
134         assertNotNull( added );
135         Resource added2 = rbacManager.saveResource( resource2 );
136         assertNotNull( added2 );
137 
138         assertEquals( 2, rbacManager.getAllResources().size() );
139 
140         String resFooId = resource.getIdentifier();
141         String resBarId = resource2.getIdentifier();
142         long startTime = System.currentTimeMillis();
143 
144         for ( int i = 0; i <= ITERATIONS; i++ )
145         {
146             Resource resFoo = rbacManager.getResource( resFooId );
147             Resource resBar = rbacManager.getResource( resBarId );
148 
149             assertNotNull( resFoo );
150             assertNotNull( resBar );
151 
152             assertEquals( "foo", resFoo.getIdentifier() );
153             assertEquals( "bar", resBar.getIdentifier() );
154         }
155 
156         long endTime = System.currentTimeMillis();
157 
158         assertPerformance( "Resource", startTime, endTime, ITERATIONS, 500.0 );
159     }
160 
161     @Test
162     public void testPerformanceUserAssignment()
163         throws RbacManagerException
164     {
165         RBACManager manager = rbacManager;
166 
167         rbacManager.eraseDatabase();
168 
169         Role devRole = getDeveloperRole();
170         Role devPlusRole = getSuperDeveloperRole();
171         devPlusRole.setChildRoleNames( Collections.singletonList( devRole.getName() ) );
172         devRole = manager.saveRole( devRole );
173         devPlusRole = manager.saveRole( devPlusRole );
174 
175         // Setup User / Assignment with 1 role.
176         String username = "bob";
177         UserAssignment assignment = manager.createUserAssignment( username );
178         assignment.addRoleName( devRole );
179         assignment = manager.saveUserAssignment( assignment );
180 
181         assertEquals( 1, manager.getAllUserAssignments().size() );
182         assertEquals( "should be only one role assigned", 1, manager.getAssignedRoles( assignment.getPrincipal() )
183             .size() );
184         assertEquals( "should be one role left to assign", 1, manager.getUnassignedRoles( assignment.getPrincipal() )
185             .size() );
186         assertEquals( 2, manager.getAllRoles().size() );
187 
188         // assign the same role again to the same user
189         assignment.addRoleName( devRole.getName() );
190         manager.saveUserAssignment( assignment );
191 
192         // we certainly shouldn't have 2 roles here now
193         assertEquals( 1, assignment.getRoleNames().size() );
194 
195         String bobId = assignment.getPrincipal();
196 
197         username = "janet";
198 
199         devPlusRole.setChildRoleNames( Collections.singletonList( devRole.getName() ) );
200         devRole = manager.saveRole( devRole );
201         manager.saveRole( devPlusRole );
202 
203         assignment = manager.createUserAssignment( username );
204         assignment.addRoleName( devRole );
205         assignment = manager.saveUserAssignment( assignment );
206 
207         assertEquals( 2, manager.getAllUserAssignments().size() );
208         assertEquals( "should be only one role assigned", 1, manager.getAssignedRoles( assignment.getPrincipal() )
209             .size() );
210         assertEquals( "should be one role left to assign", 1, manager.getUnassignedRoles( assignment.getPrincipal() )
211             .size() );
212         assertEquals( 2, manager.getAllRoles().size() );
213 
214         // assign the same role again to the same user
215         assignment.addRoleName( devRole.getName() );
216         manager.saveUserAssignment( assignment );
217 
218         // we certainly shouldn't have 2 roles here now
219         assertEquals( 1, assignment.getRoleNames().size() );
220 
221         String janetId = assignment.getPrincipal();
222 
223         long startTime = System.currentTimeMillis();
224 
225         for ( int i = 0; i <= ITERATIONS; i++ )
226         {
227             UserAssignment uaBob = rbacManager.getUserAssignment( bobId );
228             UserAssignment uaJanet = rbacManager.getUserAssignment( janetId );
229 
230             assertNotNull( uaBob );
231             assertNotNull( uaJanet );
232 
233             assertEquals( "bob", uaBob.getPrincipal() );
234             assertEquals( "janet", uaJanet.getPrincipal() );
235         }
236 
237         long endTime = System.currentTimeMillis();
238         assertPerformance( "UserAssignment", startTime, endTime, ITERATIONS, 350.0 );
239     }
240 
241     @Test
242     public void testPerformanceRoles()
243         throws RbacManagerException
244     {
245         rbacDefaults.createDefaults();
246 
247         String roleIdSysAdmin = "System Administrator";
248         String roleIdUserAdmin = "User Administrator";
249 
250         long startTime = System.currentTimeMillis();
251 
252         for ( int i = 0; i <= ITERATIONS; i++ )
253         {
254             Role roleSysAdmin = rbacManager.getRole( roleIdSysAdmin );
255             Role roleUserAdmin = rbacManager.getRole( roleIdUserAdmin );
256 
257             assertNotNull( roleSysAdmin );
258             assertNotNull( roleUserAdmin );
259 
260             assertEquals( roleIdSysAdmin, roleSysAdmin.getName() );
261             assertEquals( roleIdUserAdmin, roleUserAdmin.getName() );
262         }
263 
264         long endTime = System.currentTimeMillis();
265 
266         assertPerformance( "Roles", startTime, endTime, ITERATIONS, 130 );
267     }
268 
269     @Test
270     public void testPerformancePermissions()
271         throws RbacManagerException
272     {
273         rbacDefaults.createDefaults();
274 
275         String permIdRunIndexer = "Run Indexer";
276         String permIdAddRepo = "Add Repository";
277 
278         long startTime = System.currentTimeMillis();
279 
280         for ( int i = 0; i <= ITERATIONS; i++ )
281         {
282             Permission permRunIndex = rbacManager.getPermission( permIdRunIndexer );
283             Permission permAddRepo = rbacManager.getPermission( permIdAddRepo );
284 
285             assertNotNull( permRunIndex );
286             assertNotNull( permAddRepo );
287 
288             assertEquals( permIdRunIndexer, permRunIndex.getName() );
289             assertEquals( permIdAddRepo, permAddRepo.getName() );
290         }
291 
292         long endTime = System.currentTimeMillis();
293 
294         assertPerformance( "Permissions", startTime, endTime, ITERATIONS, 350 );
295     }
296 
297     @Test
298     public void testPerformanceOperations()
299         throws RbacManagerException
300     {
301         rbacDefaults.createDefaults();
302 
303         String operIdEditRepo = "edit-repository";
304         String operIdDelRepo = "delete-repository";
305 
306         long startTime = System.currentTimeMillis();
307 
308         for ( int i = 0; i <= ITERATIONS; i++ )
309         {
310             Operation operEditRepo = rbacManager.getOperation( operIdEditRepo );
311             Operation operDelRepo = rbacManager.getOperation( operIdDelRepo );
312 
313             assertNotNull( operEditRepo );
314             assertNotNull( operDelRepo );
315 
316             assertEquals( operIdEditRepo, operEditRepo.getName() );
317             assertEquals( operIdDelRepo, operDelRepo.getName() );
318         }
319 
320         long endTime = System.currentTimeMillis();
321 
322         assertPerformance( "Operations", startTime, endTime, ITERATIONS, 500 );
323     }
324 }