This project has retired. For details please refer to its
Attic page.
AbstractRbacManagerPerformanceTestCase xref
1 package org.apache.archiva.redback.tests;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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;
97 double opsPerSecond = (double) iterations / ratio;
98
99 logger.info( "Performance {}: {} operations per second. (effective)", msg, opsPerSecond );
100
101 if ( opsPerSecond < threshold )
102 {
103
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
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
189 assignment.addRoleName( devRole.getName() );
190 manager.saveUserAssignment( assignment );
191
192
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
215 assignment.addRoleName( devRole.getName() );
216 manager.saveUserAssignment( assignment );
217
218
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 }