- Update test to cover more complex grant /revoke  user/group/role role/permission

git-svn-id: https://svn.apache.org/repos/asf/turbine/maven/archetypes@1818035 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/test/java/services/security/TurbineSecurityServiceTest.java b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/test/java/services/security/TurbineSecurityServiceTest.java
index 9017ede..1006e6d 100644
--- a/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/test/java/services/security/TurbineSecurityServiceTest.java
+++ b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/test/java/services/security/TurbineSecurityServiceTest.java
@@ -20,126 +20,228 @@
  */
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
-import org.apache.fulcrum.security.SecurityService;
+import org.apache.fulcrum.security.entity.ExtendedUser;
 import org.apache.fulcrum.security.entity.Group;
+import org.apache.fulcrum.security.entity.Permission;
 import org.apache.fulcrum.security.entity.Role;
 import org.apache.fulcrum.security.model.turbine.TurbineModelManager;
 import org.apache.fulcrum.security.model.turbine.entity.TurbineUser;
 import org.apache.fulcrum.security.model.turbine.entity.TurbineUserGroupRole;
-import org.apache.fulcrum.security.model.turbine.entity.impl.TurbineUserImpl;
 import org.apache.fulcrum.security.util.DataBackendException;
 import org.apache.fulcrum.security.util.EntityExistsException;
 import org.apache.fulcrum.security.util.UnknownEntityException;
 import org.apache.fulcrum.testcontainer.BaseUnit4Test;
-import org.apache.turbine.om.security.TurbineUserDelegate;
+import org.apache.torque.ConstraintViolationException;
+import org.apache.turbine.annotation.AnnotationProcessor;
+import org.apache.turbine.annotation.TurbineService;
+import org.apache.turbine.om.security.DefaultUserImpl;
 import org.apache.turbine.om.security.User;
+import org.apache.turbine.services.security.SecurityService;
 import org.apache.turbine.services.ServiceManager;
 import org.apache.turbine.services.TurbineServices;
 import org.apache.turbine.util.TurbineConfig;
 import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.BeforeClass;
-import org.junit.Ignore;
 import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
- * Test that the SecurityService works properly by comparing behaviour of Turbine and Fulcrum security services using Torque and Turbine user manager.
- *
+ * Test that the SecurityService works properly by comparing behaviour of Turbine and Fulcrum security services using
+ * Torque and Turbine user manager. Requires MySQL
  *
  * @author gkallidis
  * @version $Id$
  */
 
-public class TurbineSecurityServiceTest extends BaseUnit4Test
+public class TurbineSecurityServiceTest
+    extends BaseUnit4Test
 {
 
-    SecurityService fulcrumSecurityService;
-    org.apache.turbine.services.security.SecurityService turbineSecurityService;
+    org.apache.fulcrum.security.SecurityService fulcrumSecurityService;
+    
+    @TurbineService
+    SecurityService turbineSecurityService;
+
     static TurbineConfig tc;
 
+    boolean onDeleteCascade = true;
+
+    // By default org.slf4j.LoggerFactory is optional in 4.0, but included in webapp
+    Logger log = LoggerFactory.getLogger( getClass().getName() );
 
     @BeforeClass
-    public static void init() throws Exception
+    public static void init()
+        throws Exception
     {
-        tc = new TurbineConfig(".", "src/test/conf/torque/turbine/CompleteTurbineResources.properties");
+        tc = new TurbineConfig( ".", "src/test/conf/torque/turbine/CompleteTurbineResources.properties" );
         tc.initialize();
     }
 
     @Before
-    public void setUpBefore() throws Exception
+    public void setUpBefore()
+        throws Exception
     {
-    
+        AnnotationProcessor.process(this);
+//      turbineSecurityService = (SecurityService) TurbineServices.getInstance().getService( SecurityService.SERVICE_NAME );
+        
         ServiceManager serviceManager = TurbineServices.getInstance();
-        //
-        fulcrumSecurityService = (SecurityService) serviceManager.getService(SecurityService.ROLE);
-    
-        turbineSecurityService = (org.apache.turbine.services.security.SecurityService)
-        		TurbineServices.getInstance().getService(org.apache.turbine.services.security.SecurityService.SERVICE_NAME);
+        fulcrumSecurityService = (org.apache.fulcrum.security.SecurityService) serviceManager.getService( org.apache.fulcrum.security.SecurityService.ROLE );
+//      setConfigurationFileName("src/test/conf/torque/fulcrumComponentConfiguration.xml");
+//      setRoleFileName("src/test/conf/torque/fulcrumRoleConfiguration.xml");
+//      fulcrumSecurityService  = (org.apache.fulcrum.security.SecurityService) lookup(org.apache.fulcrum.security.SecurityService.ROLE);
+//
+    }
+
+    @Test
+    public void testAccountExists()
+        throws Exception
+    {
+
+        // User user = new org.apache.turbine.om.security.DefaultUserImpl(new TurbineUserImpl());
+        User user = turbineSecurityService.getUserInstance();
+        user.setAccessCounter( 5 );
+        assertFalse( turbineSecurityService.accountExists( user ) );
+        assertFalse( fulcrumSecurityService.getUserManager().checkExists( user ) );
+
+    }
+
+    @Test
+    // @Ignore(value="Turbine security service supported requires Turbine 4.0.1")
+    public void testCreateUser()
+        throws Exception
+    {
+        User user = turbineSecurityService.getUserInstance();
+        user.setAccessCounter( 5 );
+        user.setName( "ringo" );
+        // required not null constraint
+        ( (ExtendedUser) user ).setFirstName( user.getName() );
+        ( (ExtendedUser) user ).setLastName( user.getName() );
+        turbineSecurityService.addUser( user, "fakepasswrod" );
+        assertTrue( turbineSecurityService.accountExists( user ) );
+        assertTrue( fulcrumSecurityService.getUserManager().checkExists( user ) );
+        deleteUser( user );
     }
     
     @Test
-    public void testAccountExists() throws Exception
+    // @Ignore(value="Turbine security service supported requires Turbine 4.0.1")
+    public void testPermissionRole()
     {
-    
-        User user = new org.apache.turbine.om.security.DefaultUserImpl(new TurbineUserImpl());
-        user.setAccessCounter(5);
-        assertFalse(turbineSecurityService.accountExists(user));
-        assertFalse(fulcrumSecurityService.getUserManager().checkExists(user));
-    
+        Role role = null;
+        Permission permission = null;
+        Permission permission2 = null;
+        try {
+            role = turbineSecurityService.getRoleInstance( "TEST_SECRETARY" );
+            role = turbineSecurityService.addRole( role );
+            permission = turbineSecurityService.getPermissionInstance("TEST_ANSWER_FAX");
+            permission = turbineSecurityService.addPermission( permission );
+            
+            permission2 = turbineSecurityService.getPermissionInstance("TEST_ANSWER_PHONE");
+            turbineSecurityService.addPermission( permission2 );
+            
+            turbineSecurityService.grant( role, permission );
+            turbineSecurityService.grant( role, permission2 );
+            
+            role = turbineSecurityService.getRoleById( (Integer) role.getId());
+            
+            turbineSecurityService.revokeAll( role );
+            turbineSecurityService.removeRole( role );
+            // not necessarily required
+            permission = turbineSecurityService.getPermissionById( (Integer) permission.getId() );
+            turbineSecurityService.removePermission( permission );
+            //permission2 = turbineSecurityService.getPermissionByName( permission2.getName() );
+            //turbineSecurityService.removePermission( permission2 );
+        } catch (EntityExistsException e) {
+            if (role != null)  deleteRole( role );
+            if (permission != null)  deletePermission( permission );
+            if (permission2 != null)  deletePermission( permission2 );
+        } catch (Exception e) {
+            log.error( "error" , e);
+            fail();
+        }
     }
-    
-    @Test
-    @Ignore(value="Turbine security service supported requires Turbine 4.0.1")
-    public void testCreateUser() throws Exception
-    {
-    
-    	User user = new org.apache.turbine.om.security.DefaultUserImpl(new TurbineUserImpl());
-    	user.setAccessCounter(5);
-    	user.setName("ringo");
-    	turbineSecurityService.addUser(user,"fakepasswrod");
-    	assertTrue(turbineSecurityService.accountExists(user));
-    	assertTrue(fulcrumSecurityService.getUserManager().checkExists(user));
-    
-    }
-    
+
     /**
      * Tests Turbine and Fulcrum.
-     *
-     * Fulcrum part is similar/duplicated from {@link AbstractTurbineModelManagerTest#testGrantUserGroupRole()}
-     *
-     *
+     * 
      * @throws Exception
      */
     @Test
-    @Ignore(value="Turbine security service supported requires Turbine 4.0.1")
-    public void testGrantUserGroupRole() throws Exception
+    // @Ignore(value="Turbine security service supported requires Turbine 4.0.1")
+    public void testGrantUserGroupRole()
+        throws Exception
     {
-        Group group = fulcrumSecurityService.getGroupManager().getGroupInstance();
-        group.setName("TEST_GROUP");
-        fulcrumSecurityService.getGroupManager().addGroup(group);
-        Role role = fulcrumSecurityService.getRoleManager().getRoleInstance();
-        role.setName("TEST_Role");
-        fulcrumSecurityService.getRoleManager().addRole(role);
-    
-        //  Turbine security service returns a wrapped instance: org.apache.turbine.om.security.DefaultUserImpl
-        // which implements org.apache.turbine.om.security.User and contains
-        User user = turbineSecurityService.getUserInstance("Clint");
-    	// memory
-        turbineSecurityService.addUser(user, "clint");
-        turbineSecurityService.grant(user, group, role);
-    
-        // this cast may not be required any more in turbine 4.0.1
-    	addUserAndCheck(group, role, ( (TurbineUserDelegate) user).getUserDelegate());
-    
-        // Fulcrum security service returns a raw org.apache.fulcrum.security.model.turbine.entity.impl.TurbineUserImpl,
-    	org.apache.fulcrum.security.UserManager  userManager = fulcrumSecurityService.getUserManager();
-    	TurbineUser fulcrumUser = userManager.getUserInstance("Clint2");
-        userManager.addUser(fulcrumUser, "clint2");         // memory
-        ((TurbineModelManager)fulcrumSecurityService.getModelManager()).grant(fulcrumUser, group, role);
-    
-        addUserAndCheck(group, role, fulcrumUser);
-    
+        Group group = null;
+        Role role = null;
+        User user = null;
+        TurbineUser fulcrumUser = null;
+        try
+        {
+            group = turbineSecurityService.getGroupInstance( "TEST_GROUP" );
+            group = turbineSecurityService.addGroup( group ); // assign here to delete later as
+            role = turbineSecurityService.getRoleInstance( "TEST_Role" );
+            role = turbineSecurityService.addRole( role );
+
+            // Turbine security service returns a wrapped instance: org.apache.turbine.om.security.DefaultUserImpl
+            // which implements org.apache.turbine.om.security.User
+            user = turbineSecurityService.getUserInstance( "Clint" );
+            // required not null constraint
+            ( (ExtendedUser) user ).setFirstName( user.getName() );
+            ( (ExtendedUser) user ).setLastName( user.getName() );
+
+            turbineSecurityService.addUser( user, "clint" );
+            turbineSecurityService.grant( user, group, role );
+
+            // existing role
+            Group existingGroup = turbineSecurityService.getGroupByName( "global" );
+            Role existingRole = turbineSecurityService.getRoleByName( "turbineuser" );
+            turbineSecurityService.grant( user, existingGroup, existingRole );
+            assertTrue( user.getUserGroupRoleSet().size() == 2 );
+            // get fresh db user
+            user = turbineSecurityService.getUser( "Clint" );
+            existingGroup = turbineSecurityService.getGroupByName( "turbine" );
+            existingRole = turbineSecurityService.getRoleByName( "turbineadmin" );
+            turbineSecurityService.grant( user, existingGroup, existingRole );
+            assertTrue( user.getUserGroupRoleSet().size() == 3 );
+            turbineSecurityService.revoke( user, existingGroup, existingRole );
+            user = turbineSecurityService.getUser( "Clint" );
+            assertTrue( user.getUserGroupRoleSet().size() == 2 );
+            userGroupRoleCheck( group, role, user.getUserDelegate() );
+            // compare
+            // Fulcrum security service returns a raw
+            // org.apache.fulcrum.security.model.turbine.entity.impl.TurbineUserImpl,
+            org.apache.fulcrum.security.UserManager userManager = fulcrumSecurityService.getUserManager();
+            fulcrumUser = userManager.getUserInstance( "Clint2" );
+            // required not null constraint
+            ( (ExtendedUser) fulcrumUser ).setFirstName( fulcrumUser.getName() );
+            ( (ExtendedUser) fulcrumUser ).setLastName( fulcrumUser.getName() );
+            userManager.addUser( fulcrumUser, "clint2" );
+            ( (TurbineModelManager) fulcrumSecurityService.getModelManager() ).grant( fulcrumUser, group, role );
+            userGroupRoleCheck( group, role, fulcrumUser );
+        } catch (EntityExistsException e) {
+          // cft. finally   
+        } catch (Exception e) {
+            log.error( "error" , e);
+            fail();
+        }
+        finally
+        {
+            if ( fulcrumUser != null )
+                deleteUser( new DefaultUserImpl( fulcrumUser ) );
+            if ( user != null )
+                deleteUser( user );
+            // not needed as user remove revokes all :
+            // if (group != null && role != null && user != null) turbineSecurityService.revoke(user, group, role);
+            if ( group != null )
+                deleteGroup( group );
+            if ( role != null )
+                deleteRole( role );
+
+        }
+
     }
 
     /**
@@ -152,36 +254,127 @@
      * @throws DataBackendException
      * @throws UnknownEntityException
      */
-    private void addUserAndCheck(Group group, Role role, TurbineUser user)
-        throws EntityExistsException, DataBackendException,
-        UnknownEntityException
+    private void userGroupRoleCheck( Group group, Role role, TurbineUser user )
     {
-    
+
         boolean ugrFound = false;
         TurbineUserGroupRole ugrTest = null;
-        for (TurbineUserGroupRole ugr : ((TurbineUser) user).getUserGroupRoleSet())
+        for ( TurbineUserGroupRole ugr : ( (TurbineUser) user ).getUserGroupRoleSet() )
         {
-            if (ugr.getUser().equals(user) && ugr.getGroup().equals(group) && ugr.getRole().equals(role))
+            if ( ugr.getUser().equals( user ) && ugr.getGroup().equals( group ) && ugr.getRole().equals( role ) )
             {
                 ugrFound = true;
                 ugrTest = ugr;
                 break;
             }
         }
-        assertTrue(ugrFound);
-        assertTrue(ugrTest.getGroup().equals(group));
-        assertTrue(ugrTest.getUser().equals(user));
+        assertTrue( ugrFound );
+        assertTrue( ugrTest.getGroup().equals( group ) );
+        assertTrue( ugrTest.getUser().equals( user ) );
     }
-    
-    
+
     @AfterClass
     public static void setupAfter()
     {
         ServiceManager serviceManager = TurbineServices.getInstance();
-        serviceManager.shutdownService(org.apache.turbine.services.security.SecurityService.SERVICE_NAME);
+        serviceManager.shutdownService( org.apache.turbine.services.security.SecurityService.SERVICE_NAME );
         serviceManager.shutdownServices();
         // TODO cleanup added users, roles, permissions ..
     }
+    
+    private void deletePermission( Permission permission )
+    {
+        try
+        {
+            if (permission.getId() == null) {
+                permission = turbineSecurityService.getPermissionByName(permission.getName() );
+            }
+            log.info( "deleting permission " + permission.getName() );
+            turbineSecurityService.removePermission(  permission );
+            permission = null;// not needed
+        }
+        catch ( UnknownEntityException e )
+        {
+           // not found / existing
+            log.error( e.getMessage(), e );
+        }
+        catch (Exception e ) {
+            log.error( e.getMessage(), e );
+            fail();
+        }
+    }
 
+    private void deleteRole( Role role )
+    {
+        try
+        {
+            if (role.getId() == null) {
+                role = turbineSecurityService.getRoleByName(role.getName() );
+            }
+            log.info( "deleting role " + role.getName() );
+            turbineSecurityService.removeRole( role );
+            role = null;
+        }
+        catch ( UnknownEntityException e )
+        {
+           // not found / existing
+            log.error( e.getMessage(), e );
+        }
+        catch (Exception e ) {
+            log.error( e.getMessage(), e );
+            fail();
+        }
+    }
+
+    private void deleteGroup( Group group )
+    {
+        try
+        {
+            if (group.getId() == null) {
+                group = turbineSecurityService.getGroupByName(group.getName() );
+            }
+            log.info( "deleting group " + group.getName() );
+            turbineSecurityService.removeGroup( group );
+            group = null;
+        }
+        catch ( UnknownEntityException e )
+        {
+           // not found / existing
+            log.error( e.getMessage(), e );
+        }
+        catch (Exception e ) {
+            log.error( e.getMessage(), e );
+            fail();
+        }
+    }
+
+    private void deleteUser( User user )
+    {
+        if ( onDeleteCascade )
+        {
+            try
+            {
+                // revokeAll is called before user delete
+                turbineSecurityService.removeUser( user );
+                log.info( "try to delete user " + user.getName() );
+            }
+            catch ( Exception e )
+            {
+                log.error( "deleting user " + user.getName() + " failed. " + e.getMessage() );
+                if ( e.getCause() != null && e.getCause() instanceof ConstraintViolationException )
+                {
+                    log.info( "error due to " + e.getCause().getMessage() );
+                }
+                else
+                {
+                    log.info( "error due to " + e.getMessage() );
+                }
+            }
+        }
+        else
+        {
+            log.info( "onDeleteCascade false, user " + user.getName() + " not deleted!" );
+        }
+    }
 
 }