]> source.dussan.org Git - archiva.git/blob
e3dc48daba9e895faef785907b95d27859d9d76d
[archiva.git] /
1 package org.apache.archiva.redback.tests;
2
3 /*
4  * Copyright 2001-2006 The Apache Software Foundation.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * 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, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */
18
19 import junit.framework.TestCase;
20 import org.apache.archiva.redback.rbac.Operation;
21 import org.apache.archiva.redback.rbac.RBACManager;
22 import org.apache.archiva.redback.rbac.RbacManagerException;
23 import org.apache.archiva.redback.rbac.Resource;
24 import org.apache.archiva.redback.rbac.Role;
25 import org.apache.archiva.redback.rbac.UserAssignment;
26 import org.apache.archiva.redback.rbac.Permission;
27 import org.apache.archiva.redback.rbac.RbacPermanentException;
28 import org.apache.archiva.redback.tests.utils.RBACDefaults;
29 import org.junit.Test;
30 import org.junit.runner.RunWith;
31 import org.springframework.test.context.ContextConfiguration;
32 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
33
34 import java.util.Collection;
35 import java.util.Collections;
36 import java.util.List;
37 import java.util.Set;
38
39 /**
40  * AbstractRbacManagerTestCase
41  *
42  * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
43  *
44  */
45 @RunWith( SpringJUnit4ClassRunner.class )
46 @ContextConfiguration( locations = { "classpath*:/META-INF/spring-context.xml", "classpath*:/spring-context.xml" } )
47 public abstract class AbstractRbacManagerTestCase
48     extends TestCase
49 {
50     private RBACManager rbacManager;
51
52     protected RbacManagerEventTracker eventTracker;
53
54     private RBACDefaults rbacDefaults;
55
56     public void setRbacManager( RBACManager store )
57     {
58         this.rbacManager = store;
59         if ( this.rbacManager != null )
60         {
61             this.eventTracker = new RbacManagerEventTracker();
62             this.rbacManager.addListener( eventTracker );
63         }
64         rbacDefaults = new RBACDefaults( rbacManager );
65     }
66
67     public RBACManager getRbacManager()
68     {
69         return this.rbacManager;
70     }
71
72     public void setUp()
73         throws Exception
74     {
75         super.setUp();
76     }
77
78     public void tearDown()
79         throws Exception
80     {
81         super.tearDown();
82     }
83
84     private Role getAdminRole()
85         throws RbacManagerException
86     {
87         Role role = rbacManager.createRole( "ADMIN" );
88         role.setAssignable( false );
89
90         Permission perm = rbacManager.createPermission( "EDIT_ANY_USER", "EDIT", "User:*" );
91
92         role.addPermission( perm );
93
94         return role;
95     }
96
97     private Role getDeveloperRole()
98         throws RbacManagerException
99     {
100         Role role = rbacManager.createRole( "DEVELOPER" );
101         role.setAssignable( true );
102
103         Permission perm = rbacManager.createPermission( "EDIT_MY_USER", "EDIT", "User:Self" );
104
105         role.addPermission( perm );
106
107         return role;
108     }
109
110     private Role getProjectAdminRole()
111         throws RbacManagerException
112     {
113         Role role = rbacManager.createRole( "PROJECT_ADMIN" );
114         role.setAssignable( true );
115
116         Permission perm = rbacManager.createPermission( "EDIT_PROJECT", "EDIT", "Project:Foo" );
117
118         role.addPermission( perm );
119
120         return role;
121     }
122
123     private Role getSuperDeveloperRole()
124     {
125         Role role = rbacManager.createRole( "SUPER_DEVELOPER" );
126         role.setAssignable( true );
127
128         return role;
129     }
130
131     @Test
132     public void testStoreInitialization()
133         throws Exception
134     {
135         assertNotNull( rbacManager );
136
137         Role role = getAdminRole();
138
139         assertNotNull( role );
140
141         Role added = rbacManager.saveRole( role );
142
143         assertEquals( 1, rbacManager.getAllRoles().size() );
144
145         assertNotNull( added );
146
147         rbacManager.removeRole( added );
148
149         assertEquals( 0, rbacManager.getAllRoles().size() );
150
151         /* Assert some event tracker stuff */
152         assertNotNull( eventTracker );
153         //assertEquals( 1, eventTracker.initCount );
154         //assertTrue( eventTracker.lastDbFreshness.booleanValue() );
155
156         assertEquals( 1, eventTracker.addedRoleNames.size() );
157         assertEquals( 1, eventTracker.removedRoleNames.size() );
158         assertEquals( 1, eventTracker.addedPermissionNames.size() );
159         assertEquals( 0, eventTracker.removedPermissionNames.size() );
160     }
161
162     @Test
163     public void testResources()
164         throws Exception
165     {
166         assertNotNull( rbacManager );
167
168         rbacManager.eraseDatabase();
169         eventTracker.rbacInit( true );
170
171         Resource resource = rbacManager.createResource( "foo" );
172         Resource resource2 = rbacManager.createResource( "bar" );
173
174         assertNotNull( resource );
175
176         Resource added = rbacManager.saveResource( resource );
177         assertNotNull( added );
178         Resource added2 = rbacManager.saveResource( resource2 );
179         assertNotNull( added2 );
180
181         assertEquals( 2, rbacManager.getAllResources().size() );
182
183         rbacManager.removeResource( added );
184
185         assertEquals( 1, rbacManager.getAllResources().size() );
186
187         /* Assert some event tracker stuff */
188         assertNotNull( eventTracker );
189         assertEquals( 1, eventTracker.initCount );
190         assertTrue( eventTracker.lastDbFreshness.booleanValue() );
191
192         assertEquals( 0, eventTracker.addedRoleNames.size() );
193         assertEquals( 0, eventTracker.removedRoleNames.size() );
194         assertEquals( 0, eventTracker.addedPermissionNames.size() );
195         assertEquals( 0, eventTracker.removedPermissionNames.size() );
196     }
197
198     @Test
199     public void testAddGetPermission()
200         throws RbacManagerException
201     {
202         assertNotNull( rbacManager );
203
204         rbacManager.eraseDatabase();
205         eventTracker.rbacInit( true );
206
207         Role adminRole = rbacManager.saveRole( getAdminRole() );
208         rbacManager.saveRole( getDeveloperRole() );
209
210         assertEquals( 2, rbacManager.getAllRoles().size() );
211         assertEquals( 2, rbacManager.getAllPermissions().size() );
212
213         Permission createUserPerm = rbacManager.createPermission( "CREATE_USER", "CREATE", "User" );
214
215         // perm shouldn't exist in manager (yet)
216         assertEquals( 2, rbacManager.getAllPermissions().size() );
217
218         adminRole.addPermission( createUserPerm );
219         rbacManager.saveRole( adminRole );
220
221         // perm should exist in manager now.
222         assertEquals( 3, rbacManager.getAllPermissions().size() );
223         Permission fetched = rbacManager.getPermission( "CREATE_USER" );
224         assertNotNull( fetched );
225
226         /* Assert some event tracker stuff */
227         assertNotNull( eventTracker );
228         assertEquals( 1, eventTracker.initCount );
229         assertTrue( eventTracker.lastDbFreshness.booleanValue() );
230
231         assertEquals( 2, eventTracker.addedRoleNames.size() );
232         assertEquals( 0, eventTracker.removedRoleNames.size() );
233         assertEquals( 3, eventTracker.addedPermissionNames.size() );
234         assertEquals( 0, eventTracker.removedPermissionNames.size() );
235     }
236
237     @Test
238     public void testAddGetRole()
239         throws RbacManagerException
240     {
241         assertNotNull( rbacManager );
242
243         rbacManager.eraseDatabase();
244         eventTracker.rbacInit( true );
245
246         Role adminRole = rbacManager.saveRole( getAdminRole() );
247         Role develRole = rbacManager.saveRole( getDeveloperRole() );
248
249         assertEquals( 2, rbacManager.getAllRoles().size() );
250
251         Role actualAdmin = rbacManager.getRole( adminRole.getName() );
252         Role actualDevel = rbacManager.getRole( develRole.getName() );
253
254         assertEquals( adminRole, actualAdmin );
255         assertEquals( develRole, actualDevel );
256
257         /* Assert some event tracker stuff */
258         assertNotNull( eventTracker );
259         assertEquals( 1, eventTracker.initCount );
260         assertTrue( eventTracker.lastDbFreshness.booleanValue() );
261
262         assertEquals( 2, eventTracker.addedRoleNames.size() );
263         assertEquals( 0, eventTracker.removedRoleNames.size() );
264         assertEquals( 2, eventTracker.addedPermissionNames.size() );
265         assertEquals( 0, eventTracker.removedPermissionNames.size() );
266     }
267
268     @Test
269     public void testAllowRoleWithoutPermissions()
270         throws RbacManagerException
271     {
272         assertNotNull( rbacManager );
273
274         rbacManager.eraseDatabase();
275         eventTracker.rbacInit( true );
276
277         String rolename = "Test Role";
278
279         Role testRole = rbacManager.createRole( rolename );
280         testRole = rbacManager.saveRole( testRole );
281
282         assertNotNull( testRole );
283         assertEquals( 1, rbacManager.getAllRoles().size() );
284         assertEquals( 0, rbacManager.getAllPermissions().size() );
285
286         Role actualRole = rbacManager.getRole( rolename );
287
288         assertEquals( testRole, actualRole );
289         assertEquals( 1, rbacManager.getAllRoles().size() );
290         assertEquals( 0, rbacManager.getAllPermissions().size() );
291
292         /* Assert some event tracker stuff */
293         assertNotNull( eventTracker );
294         assertEquals( 1, eventTracker.initCount );
295         assertTrue( eventTracker.lastDbFreshness.booleanValue() );
296
297         assertEquals( 1, eventTracker.addedRoleNames.size() );
298         assertEquals( 0, eventTracker.removedRoleNames.size() );
299         assertEquals( 0, eventTracker.addedPermissionNames.size() );
300         assertEquals( 0, eventTracker.removedPermissionNames.size() );
301     }
302
303     @Test
304     public void testAddGetChildRole()
305         throws RbacManagerException
306     {
307         RBACManager manager = rbacManager;
308         assertNotNull( manager );
309
310         rbacManager.eraseDatabase();
311         eventTracker.rbacInit( true );
312
313         Role adminRole = manager.saveRole( getAdminRole() );
314         Role develRole = manager.saveRole( getDeveloperRole() );
315
316         assertEquals( 2, manager.getAllRoles().size() );
317
318         Role actualAdmin = manager.getRole( adminRole.getName() );
319         Role actualDevel = manager.getRole( develRole.getName() );
320
321         assertEquals( adminRole, actualAdmin );
322         assertEquals( develRole, actualDevel );
323
324         // Now add a child role.
325         manager.addChildRole( develRole, getProjectAdminRole() );
326
327         manager.saveRole( develRole );
328
329         assertEquals( 3, manager.getAllRoles().size() );
330
331         /* Assert some event tracker stuff */
332         assertNotNull( eventTracker );
333         assertEquals( 1, eventTracker.initCount );
334         assertTrue( eventTracker.lastDbFreshness.booleanValue() );
335
336         assertEquals( 3, eventTracker.addedRoleNames.size() );
337         assertEquals( 0, eventTracker.removedRoleNames.size() );
338         assertEquals( 3, eventTracker.addedPermissionNames.size() );
339         assertEquals( 0, eventTracker.removedPermissionNames.size() );
340     }
341
342     @Test
343     public void testAddGetChildRoleViaName()
344         throws RbacManagerException
345     {
346         RBACManager manager = rbacManager;
347         rbacManager.eraseDatabase();
348         eventTracker.rbacInit( true );
349         assertNotNull( manager );
350
351         Role adminRole = manager.saveRole( getAdminRole() );
352         Role develRole = manager.saveRole( getDeveloperRole() );
353
354         assertEquals( 2, manager.getAllRoles().size() );
355
356         Role actualAdmin = manager.getRole( adminRole.getName() );
357         Role actualDevel = manager.getRole( develRole.getName() );
358
359         assertEquals( adminRole, actualAdmin );
360         assertEquals( develRole, actualDevel );
361
362         // Now do a child role.
363         Role projectRole = getProjectAdminRole();
364         String projectRoleName = projectRole.getName();
365         manager.saveRole( projectRole );
366
367         develRole.addChildRoleName( projectRoleName );
368
369         manager.saveRole( develRole );
370
371         assertEquals( 3, manager.getAllRoles().size() );
372
373         /* Assert some event tracker stuff */
374         assertNotNull( eventTracker );
375         assertEquals( 1, eventTracker.initCount );
376         assertTrue( eventTracker.lastDbFreshness.booleanValue() );
377
378         assertEquals( 3, eventTracker.addedRoleNames.size() );
379         assertEquals( 0, eventTracker.removedRoleNames.size() );
380         assertEquals( 3, eventTracker.addedPermissionNames.size() );
381         assertEquals( 0, eventTracker.removedPermissionNames.size() );
382     }
383
384     @Test
385     public void testUserAssignmentAddRole()
386         throws RbacManagerException
387     {
388         RBACManager manager = rbacManager;
389
390         rbacManager.eraseDatabase();
391         eventTracker.rbacInit( true );
392
393         Role adminRole = manager.saveRole( getAdminRole() );
394
395         assertEquals( 1, manager.getAllRoles().size() );
396
397         String adminPrincipal = "admin";
398
399         UserAssignment assignment = manager.createUserAssignment( adminPrincipal );
400
401         assignment.addRoleName( adminRole );
402
403         manager.saveUserAssignment( assignment );
404
405         assertEquals( 1, manager.getAllUserAssignments().size() );
406         assertEquals( 1, manager.getAllRoles().size() );
407
408         UserAssignment ua = manager.getUserAssignment( adminPrincipal );
409         assertNotNull( ua );
410
411         Role fetched = manager.getRole( "ADMIN" );
412         assertNotNull( fetched );
413
414         /* Assert some event tracker stuff */
415         assertNotNull( eventTracker );
416         assertEquals( 1, eventTracker.initCount );
417         assertTrue( eventTracker.lastDbFreshness.booleanValue() );
418
419         assertEquals( 1, eventTracker.addedRoleNames.size() );
420         assertEquals( 0, eventTracker.removedRoleNames.size() );
421         assertEquals( 1, eventTracker.addedPermissionNames.size() );
422         assertEquals( 0, eventTracker.removedPermissionNames.size() );
423     }
424
425     @Test
426     public void testUserAssignmentWithChildRoles()
427         throws RbacManagerException
428     {
429         RBACManager manager = rbacManager;
430         rbacManager.eraseDatabase();
431         Role developerRole = manager.saveRole( getDeveloperRole() );
432
433         Role adminRole = getAdminRole();
434
435         adminRole.addChildRoleName( developerRole.getName() );
436
437         adminRole = manager.saveRole( adminRole );
438
439         String adminPrincipal = "admin";
440         UserAssignment assignment = manager.createUserAssignment( adminPrincipal );
441         assignment.addRoleName( adminRole );
442         assignment = manager.saveUserAssignment( assignment );
443
444         assertEquals( 1, assignment.getRoleNames().size() );
445         assertEquals( 1, manager.getAssignedRoles( adminPrincipal ).size() );
446     }
447
448     @Test
449     public void testGetAssignedPermissionsNoChildRoles()
450         throws RbacManagerException
451     {
452         RBACManager manager = rbacManager;
453
454         rbacManager.eraseDatabase();
455         eventTracker.rbacInit( true );
456
457         Role admin = getAdminRole();
458
459         admin = manager.saveRole( admin );
460
461         assertEquals( 1, manager.getAllRoles().size() );
462
463         String adminPrincipal = "admin";
464
465         UserAssignment ua = manager.createUserAssignment( adminPrincipal );
466
467         ua.addRoleName( admin );
468
469         manager.saveUserAssignment( ua );
470
471         assertEquals( 1, manager.getAllUserAssignments().size() );
472
473         Set<Permission> assignedPermissions = manager.getAssignedPermissions( adminPrincipal );
474
475         assertNotNull( assignedPermissions );
476         assertEquals( 1, assignedPermissions.size() );
477
478         /* Assert some event tracker stuff */
479         assertNotNull( eventTracker );
480         assertEquals( 1, eventTracker.initCount );
481         assertTrue( eventTracker.lastDbFreshness.booleanValue() );
482
483         assertEquals( 1, eventTracker.addedRoleNames.size() );
484         assertEquals( 0, eventTracker.removedRoleNames.size() );
485         assertEquals( 1, eventTracker.addedPermissionNames.size() );
486         assertEquals( 0, eventTracker.removedPermissionNames.size() );
487     }
488
489     @Test
490     public void testGlobalResource()
491         throws RbacManagerException
492     {
493         RBACManager manager = rbacManager;
494         rbacManager.eraseDatabase();
495         eventTracker.rbacInit( true );
496         Permission editConfiguration = manager.createPermission( "Edit Configuration" );
497         editConfiguration.setOperation( manager.createOperation( "edit-configuration" ) );
498         editConfiguration.setResource( manager.getGlobalResource() );
499         manager.savePermission( editConfiguration );
500
501         assertEquals( 1, manager.getAllPermissions().size() );
502         assertEquals( 1, manager.getAllOperations().size() );
503         assertEquals( 1, manager.getAllResources().size() );
504
505         Permission deleteConfiguration = manager.createPermission( "Delete Configuration" );
506         deleteConfiguration.setOperation( manager.createOperation( "delete-configuration" ) );
507         deleteConfiguration.setResource( manager.getGlobalResource() );
508         manager.savePermission( deleteConfiguration );
509
510         assertEquals( 2, manager.getAllPermissions().size() );
511         assertEquals( 2, manager.getAllOperations().size() );
512         assertEquals( 1, manager.getAllResources().size() );
513
514         /* Assert some event tracker stuff */
515         assertNotNull( eventTracker );
516         assertEquals( 1, eventTracker.initCount );
517         assertTrue( eventTracker.lastDbFreshness.booleanValue() );
518
519         assertEquals( 0, eventTracker.addedRoleNames.size() );
520         assertEquals( 0, eventTracker.removedRoleNames.size() );
521         assertEquals( 2, eventTracker.addedPermissionNames.size() );
522         assertEquals( 0, eventTracker.removedPermissionNames.size() );
523     }
524
525     @Test
526     public void testGlobalResourceOneLiner()
527         throws RbacManagerException
528     {
529         RBACManager manager = rbacManager;
530         rbacManager.eraseDatabase();
531         eventTracker.rbacInit( true );
532         manager.savePermission(
533             manager.createPermission( "Edit Configuration", "edit-configuration", Resource.GLOBAL ) );
534         manager.savePermission(
535             manager.createPermission( "Delete Configuration", "delete-configuration", Resource.GLOBAL ) );
536
537         /* Assert some event tracker stuff */
538         assertNotNull( eventTracker );
539         assertEquals( 1, eventTracker.initCount );
540         assertTrue( eventTracker.lastDbFreshness.booleanValue() );
541
542         assertEquals( 0, eventTracker.addedRoleNames.size() );
543         assertEquals( 0, eventTracker.removedRoleNames.size() );
544         assertEquals( 2, eventTracker.addedPermissionNames.size() );
545         assertEquals( 0, eventTracker.removedPermissionNames.size() );
546     }
547
548     @Test
549     public void testUserAssignmentAddRemoveSecondRole()
550         throws RbacManagerException
551     {
552         RBACManager manager = rbacManager;
553
554         rbacManager.eraseDatabase();
555         eventTracker.rbacInit( true );
556
557         Role developerRole = getDeveloperRole();
558         manager.saveRole( developerRole );
559
560         // Setup User / Assignment with 1 role.
561         String username = "bob";
562         UserAssignment assignment = manager.createUserAssignment( username );
563         assignment.addRoleName( developerRole );
564         manager.saveUserAssignment( assignment );
565
566         assertEquals( 1, manager.getAllUserAssignments().size() );
567         assertEquals( 1, manager.getAllRoles().size() );
568
569         // Create another role add it to manager.
570         Role projectAdmin = getProjectAdminRole();
571         String projectAdminRoleName = projectAdmin.getName();
572         manager.saveRole( projectAdmin );
573
574         // Get User Assignment, add a second role
575         UserAssignment bob = manager.getUserAssignment( username );
576         bob.addRoleName( projectAdminRoleName );
577         bob = manager.saveUserAssignment( bob );
578
579         assertEquals( 1, manager.getAllUserAssignments().size() );
580         assertEquals( 2, manager.getAllRoles().size() );
581         assertEquals( 2, bob.getRoleNames().size() );
582         assertEquals( 0, manager.getUnassignedRoles( bob.getPrincipal() ).size() );
583
584         List<String> roles = bob.getRoleNames();
585         assertEquals( 2, roles.size() );
586
587         // Remove 1 role from bob, end up with 1 role for bob.
588         roles.remove( projectAdminRoleName );
589         assertEquals( 1, roles.size() );
590         bob.setRoleNames( roles );
591         bob = manager.saveUserAssignment( bob );
592         assertEquals( "Should only have 1 role under bob now.", 1, bob.getRoleNames().size() );
593         assertEquals( "Should have 2 total roles still.", 2, manager.getAllRoles().size() );
594         assertEquals( "Should have 1 assignable role", 1, manager.getUnassignedRoles( bob.getPrincipal() ).size() );
595
596         // Fetch bob again. see if role is missing.
597         UserAssignment cousin = manager.getUserAssignment( username );
598         assertEquals( 1, cousin.getRoleNames().size() );
599
600         assertEquals( "Should only have 1 role under bob now.", 1, cousin.getRoleNames().size() );
601         assertEquals( "Should have 2 total roles still.", 2, manager.getAllRoles().size() );
602
603         // remove the last role
604         roles.remove( developerRole.getName() );
605         bob.setRoleNames( roles );
606         bob = manager.saveUserAssignment( bob );
607         assertEquals( "Should have 2 assignable roles.", 2, manager.getUnassignedRoles( bob.getPrincipal() ).size() );
608
609         /* Assert some event tracker stuff */
610         assertNotNull( eventTracker );
611         assertEquals( 1, eventTracker.initCount );
612         assertTrue( eventTracker.lastDbFreshness.booleanValue() );
613
614         assertEquals( 2, eventTracker.addedRoleNames.size() );
615         assertEquals( 0, eventTracker.removedRoleNames.size() );
616         assertEquals( 2, eventTracker.addedPermissionNames.size() );
617         assertEquals( 0, eventTracker.removedPermissionNames.size() );
618     }
619
620     @Test
621     public void testUserAssignmentMultipleRoles()
622         throws RbacManagerException
623     {
624         RBACManager manager = rbacManager;
625
626         rbacManager.eraseDatabase();
627         eventTracker.rbacInit( true );
628
629         Role devRole = getDeveloperRole();
630         manager.saveRole( devRole );
631
632         // Setup User / Assignment with 1 role.
633         String username = "bob";
634         UserAssignment assignment = manager.createUserAssignment( username );
635         assignment.addRoleName( devRole );
636         assignment = manager.saveUserAssignment( assignment );
637
638         assertEquals( 1, manager.getAllUserAssignments().size() );
639         assertEquals( 1, manager.getAllRoles().size() );
640
641         // assign the same role again to the same user
642         assignment.addRoleName( devRole.getName() );
643         manager.saveUserAssignment( assignment );
644
645         // we certainly shouldn't have 2 roles here now
646         assertEquals( 1, assignment.getRoleNames().size() );
647
648         /* Assert some event tracker stuff */
649         assertNotNull( eventTracker );
650         assertEquals( 1, eventTracker.initCount );
651         assertTrue( eventTracker.lastDbFreshness.booleanValue() );
652
653         assertEquals( 1, eventTracker.addedRoleNames.size() );
654         assertEquals( 0, eventTracker.removedRoleNames.size() );
655         assertEquals( 1, eventTracker.addedPermissionNames.size() );
656         assertEquals( 0, eventTracker.removedPermissionNames.size() );
657     }
658
659     @Test
660     public void testUserAssignmentMultipleRolesWithChildRoles()
661         throws RbacManagerException
662     {
663         RBACManager manager = rbacManager;
664
665         rbacManager.eraseDatabase();
666         eventTracker.rbacInit( true );
667
668         Role devRole = getDeveloperRole();
669         Role devPlusRole = getSuperDeveloperRole();
670         devPlusRole.setChildRoleNames( Collections.singletonList( devRole.getName() ) );
671         manager.saveRole( devRole );
672         manager.saveRole( devPlusRole );
673
674         // Setup User / Assignment with 1 role.
675         String username = "bob";
676         UserAssignment assignment = manager.createUserAssignment( username );
677         assignment.addRoleName( devRole );
678         assignment = manager.saveUserAssignment( assignment );
679
680         assertEquals( 1, manager.getAllUserAssignments().size() );
681         assertEquals( "should be only one role assigned", 1,
682                       manager.getAssignedRoles( assignment.getPrincipal() ).size() );
683         assertEquals( "should be one role left to assign", 1,
684                       manager.getUnassignedRoles( assignment.getPrincipal() ).size() );
685         assertEquals( 2, manager.getAllRoles().size() );
686
687         // assign the same role again to the same user
688         assignment.addRoleName( devRole.getName() );
689         manager.saveUserAssignment( assignment );
690
691         // we certainly shouldn't have 2 roles here now
692         assertEquals( 1, assignment.getRoleNames().size() );
693
694         /* Assert some event tracker stuff */
695         assertNotNull( eventTracker );
696         assertEquals( 1, eventTracker.initCount );
697         assertTrue( eventTracker.lastDbFreshness.booleanValue() );
698
699         assertEquals( 2, eventTracker.addedRoleNames.size() );
700         assertEquals( 0, eventTracker.removedRoleNames.size() );
701         assertEquals( 1, eventTracker.addedPermissionNames.size() );
702         assertEquals( 0, eventTracker.removedPermissionNames.size() );
703     }
704
705     @Test
706     public void testGetAssignedRoles()
707         throws RbacManagerException
708     {
709         RBACManager manager = rbacManager;
710         rbacManager.eraseDatabase();
711
712         Role adminRole = manager.saveRole( getAdminRole() );
713         Role projectAdminRole = manager.saveRole( getProjectAdminRole() );
714         Role developerRole = manager.saveRole( getDeveloperRole() );
715
716         // Setup 3 roles.
717         assertEquals( 3, manager.getAllRoles().size() );
718
719         // Setup User / Assignment with 3 roles.
720         String username = "bob";
721
722         UserAssignment assignment = manager.createUserAssignment( username );
723         assignment.addRoleName( developerRole.getName() );
724         assignment.addRoleName( projectAdminRole.getName() );
725         assignment.addRoleName( adminRole.getName() );
726         assignment = manager.saveUserAssignment( assignment );
727
728         assertEquals( 3, assignment.getRoleNames().size() );
729         assertEquals( 1, manager.getAllUserAssignments().size() );
730         assertEquals( 3, manager.getAllRoles().size() );
731
732         afterSetup();
733
734         // Get the List of Assigned Roles for user bob.
735         Collection<Role> assignedRoles = manager.getAssignedRoles( username );
736
737         assertNotNull( assignedRoles );
738         assertEquals( 3, assignedRoles.size() );
739     }
740
741     @Test
742     public void testGetAssignedPermissions()
743         throws RbacManagerException
744     {
745         RBACManager manager = rbacManager;
746         rbacManager.eraseDatabase();
747         // Setup 3 roles.
748         manager.saveRole( getAdminRole() );
749         manager.saveRole( getProjectAdminRole() );
750         Role added = manager.saveRole( getDeveloperRole() );
751         String roleName = added.getName();
752
753         assertEquals( 3, manager.getAllRoles().size() );
754         assertEquals( 3, manager.getAllPermissions().size() );
755
756         // Setup User / Assignment with 1 role.
757         String username = "bob";
758
759         UserAssignment assignment = manager.createUserAssignment( username );
760         assignment.addRoleName( roleName );
761         manager.saveUserAssignment( assignment );
762
763         assertEquals( 1, manager.getAllUserAssignments().size() );
764         assertEquals( 3, manager.getAllRoles().size() );
765         assertEquals( 3, manager.getAllPermissions().size() );
766
767         // Get the List of Assigned Roles for user bob.
768         Collection<Permission> assignedPermissions = manager.getAssignedPermissions( username );
769
770         assertNotNull( assignedPermissions );
771         assertEquals( 1, assignedPermissions.size() );
772     }
773
774     public Role getChildRole( RBACManager manager, Role role, String expectedChildRoleName, int childRoleCount )
775         throws RbacManagerException
776     {
777         assertTrue( role.hasChildRoles() );
778         List<String> childNames = role.getChildRoleNames();
779         assertNotNull( childNames );
780         assertEquals( 1, childNames.size() );
781         String childName = (String) childNames.get( 0 );
782         assertNotNull( childName );
783         Role childRole = manager.getRole( childName );
784         assertNotNull( childRole );
785         assertEquals( expectedChildRoleName, childRole.getName() );
786
787         return childRole;
788     }
789
790     @Test
791     public void testGetRolesDeep()
792         throws RbacManagerException
793     {
794         rbacManager.eraseDatabase();
795         rbacDefaults.createDefaults();
796
797         // Setup User / Assignment with 1 role.
798         String username = "bob";
799
800         UserAssignment assignment = rbacManager.createUserAssignment( username );
801         assignment.addRoleName( "Developer" );
802         rbacManager.saveUserAssignment( assignment );
803
804         assertEquals( 1, rbacManager.getAllUserAssignments().size() );
805         assertEquals( 4, rbacManager.getAllRoles().size() );
806         assertEquals( 6, rbacManager.getAllPermissions().size() );
807
808         // Get the List of Assigned Roles for user bob.
809         Role devel = rbacManager.getRole( "Developer" );
810         assertNotNull( devel );
811
812         // First Depth.
813         Role trusted = getChildRole( rbacManager, devel, "Trusted Developer", 1 );
814
815         // Second Depth.
816         Role sysAdmin = getChildRole( rbacManager, trusted, "System Administrator", 1 );
817
818         // Third Depth.
819         getChildRole( rbacManager, sysAdmin, "User Administrator", 1 );
820     }
821
822     @Test
823     public void testGetAssignedPermissionsDeep()
824         throws RbacManagerException
825     {
826         rbacDefaults.createDefaults();
827
828         // Setup User / Assignment with 1 role.
829         String username = "bob";
830
831         UserAssignment assignment = rbacManager.createUserAssignment( username );
832         assignment.addRoleName( "Developer" );
833         rbacManager.saveUserAssignment( assignment );
834
835         assertEquals( 1, rbacManager.getAllUserAssignments().size() );
836         assertEquals( 4, rbacManager.getAllRoles().size() );
837         assertEquals( 6, rbacManager.getAllPermissions().size() );
838
839         afterSetup();
840
841         // Get the List of Assigned Roles for user bob.
842         Collection<Permission> assignedPermissions = rbacManager.getAssignedPermissions( username );
843
844         assertNotNull( assignedPermissions );
845         assertEquals( 6, assignedPermissions.size() );
846     }
847
848     @Test
849     public void testLargeApplicationInit()
850         throws RbacManagerException
851     {
852
853         rbacManager.eraseDatabase();
854         rbacDefaults.createDefaults();
855         assertEquals( 6, rbacManager.getAllPermissions().size() );
856         assertEquals( 11, rbacManager.getAllOperations().size() );
857         assertEquals( 4, rbacManager.getAllRoles().size() );
858     }
859
860     @Test
861     public void testAddRemovePermanentPermission()
862         throws RbacManagerException
863     {
864         assertNotNull( rbacManager );
865
866         rbacManager.eraseDatabase();
867         eventTracker.rbacInit( true );
868
869         Role adminRole = rbacManager.saveRole( getAdminRole() );
870         rbacManager.saveRole( getDeveloperRole() );
871
872         assertEquals( 2, rbacManager.getAllRoles().size() );
873         assertEquals( 2, rbacManager.getAllPermissions().size() );
874
875         Permission createUserPerm = rbacManager.createPermission( "CREATE_USER", "CREATE", "User" );
876         createUserPerm.setPermanent( true );
877
878         // perm shouldn't exist in manager (yet)
879         assertEquals( 2, rbacManager.getAllPermissions().size() );
880
881         adminRole.addPermission( createUserPerm );
882         rbacManager.saveRole( adminRole );
883
884         // perm should exist in manager now.
885         assertEquals( 3, rbacManager.getAllPermissions().size() );
886         Permission fetched = rbacManager.getPermission( "CREATE_USER" );
887         assertNotNull( fetched );
888
889         // Attempt to remove perm now.
890         try
891         {
892             // Use permission name technique first.
893             rbacManager.removePermission( "CREATE_USER" );
894         }
895         catch ( RbacPermanentException e )
896         {
897             // expected path.
898         }
899
900         try
901         {
902             // Use permission object technique next.
903             rbacManager.removePermission( fetched );
904         }
905         catch ( RbacPermanentException e )
906         {
907             // expected path.
908         }
909
910         // Assert some event tracker stuff
911         assertNotNull( eventTracker );
912         assertEquals( 1, eventTracker.initCount );
913         assertTrue( eventTracker.lastDbFreshness.booleanValue() );
914
915         assertEquals( 2, eventTracker.addedRoleNames.size() );
916         assertEquals( 0, eventTracker.removedRoleNames.size() );
917         assertEquals( 3, eventTracker.addedPermissionNames.size() );
918         assertEquals( 0, eventTracker.removedPermissionNames.size() );
919     }
920
921     @Test
922     public void testAddRemovePermanentRole()
923         throws RbacManagerException
924     {
925         assertNotNull( rbacManager );
926         rbacManager.eraseDatabase();
927         eventTracker.rbacInit( true );
928
929         Role adminRole = getAdminRole();
930         adminRole.setPermanent( true );
931
932         adminRole = rbacManager.saveRole( adminRole );
933         Role develRole = rbacManager.saveRole( getDeveloperRole() );
934
935         assertEquals( 2, rbacManager.getAllRoles().size() );
936
937         Role actualAdmin = rbacManager.getRole( adminRole.getName() );
938         Role actualDevel = rbacManager.getRole( develRole.getName() );
939
940         assertEquals( adminRole, actualAdmin );
941         assertEquals( develRole, actualDevel );
942
943         // Attempt to remove perm now.
944         try
945         {
946             // Use role name technique first.
947             rbacManager.removeRole( adminRole.getName() );
948         }
949         catch ( RbacPermanentException e )
950         {
951             // expected path.
952         }
953
954         try
955         {
956             // Use role object technique next.
957             rbacManager.removeRole( adminRole );
958         }
959         catch ( RbacPermanentException e )
960         {
961             // expected path.
962         }
963
964         /* Assert some event tracker stuff */
965         assertNotNull( eventTracker );
966         assertEquals( 1, eventTracker.initCount );
967         assertTrue( eventTracker.lastDbFreshness.booleanValue() );
968
969         assertEquals( 2, eventTracker.addedRoleNames.size() );
970         assertEquals( 0, eventTracker.removedRoleNames.size() );
971         assertEquals( 2, eventTracker.addedPermissionNames.size() );
972         assertEquals( 0, eventTracker.removedPermissionNames.size() );
973     }
974
975     @Test
976     public void testAddRemovePermanentOperation()
977         throws RbacManagerException
978     {
979
980         rbacManager.eraseDatabase();
981         eventTracker.rbacInit( true );
982         assertNotNull( rbacManager );
983
984         Role adminRole = rbacManager.saveRole( getAdminRole() );
985         rbacManager.saveRole( getDeveloperRole() );
986
987         assertEquals( 2, rbacManager.getAllRoles().size() );
988         assertEquals( 2, rbacManager.getAllPermissions().size() );
989
990         Permission createUserPerm = rbacManager.createPermission( "CREATE_USER", "CREATE", "User" );
991         createUserPerm.getOperation().setPermanent( true );
992
993         // perm shouldn't exist in manager (yet)
994         assertEquals( 2, rbacManager.getAllPermissions().size() );
995         assertEquals( 1, rbacManager.getAllOperations().size() );
996
997         adminRole.addPermission( createUserPerm );
998         rbacManager.saveRole( adminRole );
999
1000         // perm should exist in manager now.
1001         assertEquals( 2, rbacManager.getAllOperations().size() );
1002         Operation fetched = rbacManager.getOperation( "CREATE" );
1003         assertNotNull( fetched );
1004
1005         // Attempt to remove operation now.
1006         try
1007         {
1008             // Use operation name technique first.
1009             rbacManager.removeOperation( "CREATE" );
1010         }
1011         catch ( RbacPermanentException e )
1012         {
1013             // expected path.
1014         }
1015
1016         try
1017         {
1018             // Use operation object technique next.
1019             rbacManager.removeOperation( fetched );
1020         }
1021         catch ( RbacPermanentException e )
1022         {
1023             // expected path.
1024         }
1025
1026         // Assert some event tracker stuff
1027         assertNotNull( eventTracker );
1028         assertEquals( 1, eventTracker.initCount );
1029         assertTrue( eventTracker.lastDbFreshness.booleanValue() );
1030
1031         assertEquals( 2, eventTracker.addedRoleNames.size() );
1032         assertEquals( 0, eventTracker.removedRoleNames.size() );
1033         assertEquals( 3, eventTracker.addedPermissionNames.size() );
1034         assertEquals( 0, eventTracker.removedPermissionNames.size() );
1035     }
1036
1037     /**
1038      * Allows subclasses to hook code after a test case has finished it's setup
1039      */
1040     protected void afterSetup()
1041     {
1042         // do nothing
1043     }
1044 }