Author: jawi
Date: Wed Nov 14 08:56:04 2012
New Revision: 1409119

URL: http://svn.apache.org/viewvc?rev=1409119&view=rev
Log:
FELIX-3755: removing roles did not remove them as group member;

- remove the role from all groups it is member of;
- some additional cleanups and unused code removed.


Modified:
    
felix/trunk/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/impl/AuthorizationImpl.java
    
felix/trunk/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/impl/RoleChecker.java
    
felix/trunk/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/impl/RoleRepository.java
    
felix/trunk/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/impl/role/GroupImpl.java
    
felix/trunk/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/impl/role/RoleImpl.java
    
felix/trunk/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/impl/role/UserImpl.java
    
felix/trunk/useradmin/useradmin/src/test/java/org/apache/felix/useradmin/impl/UserAdminImplTest.java

Modified: 
felix/trunk/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/impl/AuthorizationImpl.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/impl/AuthorizationImpl.java?rev=1409119&r1=1409118&r2=1409119&view=diff
==============================================================================
--- 
felix/trunk/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/impl/AuthorizationImpl.java
 (original)
+++ 
felix/trunk/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/impl/AuthorizationImpl.java
 Wed Nov 14 08:56:04 2012
@@ -21,8 +21,6 @@ import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
-
-import org.apache.felix.useradmin.impl.role.RoleImpl;
 import org.osgi.service.useradmin.Authorization;
 import org.osgi.service.useradmin.Role;
 import org.osgi.service.useradmin.User;
@@ -86,7 +84,7 @@ public class AuthorizationImpl implement
 
         Iterator rolesIter = m_roleManager.getRoles(null /* filter 
*/).iterator();
         while (rolesIter.hasNext()) {
-            RoleImpl role = (RoleImpl) rolesIter.next();
+            Role role = (Role) rolesIter.next();
             if (!Role.USER_ANYONE.equals(role.getName()) && 
m_roleChecker.isImpliedBy(role, m_user)) {
                 result.add(role.getName());
             }

Modified: 
felix/trunk/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/impl/RoleChecker.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/impl/RoleChecker.java?rev=1409119&r1=1409118&r2=1409119&view=diff
==============================================================================
--- 
felix/trunk/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/impl/RoleChecker.java
 (original)
+++ 
felix/trunk/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/impl/RoleChecker.java
 Wed Nov 14 08:56:04 2012
@@ -19,11 +19,8 @@ package org.apache.felix.useradmin.impl;
 import java.util.ArrayList;
 import java.util.List;
 
-
-import org.apache.felix.useradmin.impl.role.UserImpl;
 import org.osgi.service.useradmin.Group;
 import org.osgi.service.useradmin.Role;
-import org.osgi.service.useradmin.User;
 
 /**
  * Helper class to check for implied role memberships.
@@ -40,9 +37,7 @@ final class RoleChecker {
     public boolean isImpliedBy(Role role, Role impliedRole) {
         if (role instanceof Group) {
             return isGroupImpliedBy((Group) role, impliedRole, new 
ArrayList());
-        } else if (role instanceof User) {
-            return isUserImpliedBy((User) role, impliedRole);
-        } else {
+        } else /* if ((role instanceof User) || (role instanceof Role)) */ {
             return isRoleImpliedBy(role, impliedRole);
         }
     }
@@ -72,10 +67,8 @@ final class RoleChecker {
             if (requiredRole instanceof Group) {
                 seenGroups.add(requiredRole);
                 isImplied = isGroupImpliedBy((Group) requiredRole, 
impliedRole, seenGroups);
-            } else if (requiredRole instanceof User) {
-                isImplied  = isUserImpliedBy((User) requiredRole, impliedRole);
-            } else /* if (requiredRoles[i] instanceof RoleImpl) */ {
-                isImplied = isRoleImpliedBy(requiredRole, impliedRole);
+            } else /* if ((requiredRole instanceof User) || (requiredRole 
instanceof Role)) */ {
+                isImplied  = isRoleImpliedBy(requiredRole, impliedRole);
             }
         }
 
@@ -98,9 +91,7 @@ final class RoleChecker {
             if (basicRole instanceof Group) {
                 seenGroups.add(basicRole);
                 isImplied = isGroupImpliedBy((Group) basicRole, impliedRole, 
seenGroups);
-            } else if (basicRole instanceof UserImpl) {
-                isImplied = isUserImpliedBy((User) basicRole, impliedRole);
-            } else /* if (requiredRoles[i] instanceof RoleImpl) */ {
+            } else /* if ((basicRole instanceof User) || (basicRole instanceof 
Role)) */ {
                 isImplied = isRoleImpliedBy(basicRole, impliedRole);
             }
         }
@@ -109,17 +100,6 @@ final class RoleChecker {
     }
 
     /**
-     * Verifies whether the given user is implied by the given role.
-     * 
-     * @param user the user to check, cannot be <code>null</code>;
-     * @param impliedRole the implied role to check for, cannot be 
<code>null</code>;
-     * @return <code>true</code> if the given user is implied by the given 
role, <code>false</code> otherwise.
-     */
-    private boolean isUserImpliedBy(User user, Role impliedRole) {
-        return Role.USER_ANYONE.equals(user.getName()) || (impliedRole != null 
&& impliedRole.getName().equals(user.getName()));
-    }
-
-    /**
      * Verifies whether the given role is implied by the given role.
      * 
      * @param role the role to check, cannot be <code>null</code>;

Modified: 
felix/trunk/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/impl/RoleRepository.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/impl/RoleRepository.java?rev=1409119&r1=1409118&r2=1409119&view=diff
==============================================================================
--- 
felix/trunk/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/impl/RoleRepository.java
 (original)
+++ 
felix/trunk/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/impl/RoleRepository.java
 Wed Nov 14 08:56:04 2012
@@ -29,6 +29,7 @@ import org.apache.felix.useradmin.RoleFa
 import org.apache.felix.useradmin.RoleRepositoryStore;
 import org.apache.felix.useradmin.impl.role.RoleImpl;
 import org.osgi.framework.Filter;
+import org.osgi.service.useradmin.Group;
 import org.osgi.service.useradmin.Role;
 import org.osgi.service.useradmin.UserAdminPermission;
 
@@ -44,50 +45,50 @@ public final class RoleRepository {
         /**
          * {@inheritDoc}
          */
-        public void roleAdded(Role role) {
+        public void propertyAdded(Role role, Object key, Object value) {
             Iterator iterator = createListenerIterator();
             while (iterator.hasNext()) {
-                ((RoleChangeListener) iterator.next()).roleAdded(role);
+                ((RoleChangeListener) iterator.next()).propertyAdded(role, 
key, value);
             }
         }
         
         /**
          * {@inheritDoc}
          */
-        public void roleRemoved(Role role) {
+        public void propertyChanged(Role role, Object key, Object oldValue, 
Object newValue) {
             Iterator iterator = createListenerIterator();
             while (iterator.hasNext()) {
-                ((RoleChangeListener) iterator.next()).roleRemoved(role);
+                ((RoleChangeListener) iterator.next()).propertyChanged(role, 
key, oldValue, newValue);
             }
         }
         
         /**
          * {@inheritDoc}
          */
-        public void propertyAdded(Role role, Object key, Object value) {
+        public void propertyRemoved(Role role, Object key) {
             Iterator iterator = createListenerIterator();
             while (iterator.hasNext()) {
-                ((RoleChangeListener) iterator.next()).propertyAdded(role, 
key, value);
+                ((RoleChangeListener) iterator.next()).propertyRemoved(role, 
key);
             }
         }
 
         /**
          * {@inheritDoc}
          */
-        public void propertyRemoved(Role role, Object key) {
+        public void roleAdded(Role role) {
             Iterator iterator = createListenerIterator();
             while (iterator.hasNext()) {
-                ((RoleChangeListener) iterator.next()).propertyRemoved(role, 
key);
+                ((RoleChangeListener) iterator.next()).roleAdded(role);
             }
         }
 
         /**
          * {@inheritDoc}
          */
-        public void propertyChanged(Role role, Object key, Object oldValue, 
Object newValue) {
+        public void roleRemoved(Role role) {
             Iterator iterator = createListenerIterator();
             while (iterator.hasNext()) {
-                ((RoleChangeListener) iterator.next()).propertyChanged(role, 
key, oldValue, newValue);
+                ((RoleChangeListener) iterator.next()).roleRemoved(role);
             }
         }
     }
@@ -251,6 +252,9 @@ public final class RoleRepository {
 
         try {
             if (m_store.removeRole(role)) {
+               // FELIX-3755: Remove the role as (required)member from all 
groups...
+               removeRoleFromAllGroups(role);
+               
                 unwireChangeListener(role);
                 m_roleChangeReflector.roleRemoved(role);
                 
@@ -278,7 +282,7 @@ public final class RoleRepository {
         m_listeners.remove(listener);
     }
 
-    /**
+       /**
      * Starts this repository.
      */
     public void start() {
@@ -292,7 +296,7 @@ public final class RoleRepository {
             e.printStackTrace();
         }
     }
-    
+
     /**
      * Stops this repository, allowing it to clean up.
      */
@@ -304,7 +308,7 @@ public final class RoleRepository {
             // Ignore; nothing we can do about this here...
         }
     }
-
+    
     /**
      * Creates a new iterator for iterating over all listeners.
      * 
@@ -325,7 +329,7 @@ public final class RoleRepository {
             securityManager.checkPermission(new 
UserAdminPermission(UserAdminPermission.ADMIN, null));
         }
     }
-    
+
     /**
      * Returns whether or not the given role is a predefined role.
      * <p>
@@ -338,6 +342,39 @@ public final class RoleRepository {
     private boolean isPredefinedRole(Role role) {
         return Role.USER_ANYONE.equals(role.getName());
     }
+    
+    /**
+     * Removes a given role as (required)member from any groups it is member 
of.
+     * 
+        * @param removedRole the role that is removed from the store already, 
cannot be <code>null</code>.
+        * @throws BackendException in case of problems accessing the store.
+        */
+       private void removeRoleFromAllGroups(Role removedRole) {
+        try {
+            Role[] roles = m_store.getAllRoles();
+            for (int i = 0; i < roles.length; i++) {
+                if (roles[i].getType() == Role.GROUP) {
+                       Group group = (Group) roles[i];
+                       // Don't check whether the given role is actually a 
member 
+                       // of the group, but let the group itself figure this 
out...
+                       group.removeMember(removedRole);
+                }
+            }
+        }
+        catch (IOException e) {
+            throw new BackendException("Failed to get all roles!", e);
+        }
+       }
+
+    /**
+     * Unwires the given role to this repository so it no longer listens for 
its changes.
+     * 
+     * @param role the role to unwire, cannot be <code>null</code>.
+     * @throws IllegalArgumentException in case the given object was not a 
{@link RoleImpl} instance.
+     */
+    private void unwireChangeListener(Object role) {
+        ((RoleImpl) role).setRoleChangeListener(null);
+    }
 
     /**
      * Wires the given role to this repository so it can listen for its 
changes.
@@ -353,15 +390,4 @@ public final class RoleRepository {
         }
         return result;
     }
-
-    /**
-     * Unwires the given role to this repository so it no longer listens for 
its changes.
-     * 
-     * @param role the role to unwire, cannot be <code>null</code>.
-     * @throws IllegalArgumentException in case the given object was not a 
{@link RoleImpl} instance.
-     */
-    private void unwireChangeListener(Object role) {
-        RoleImpl result = (RoleImpl) role;
-        result.setRoleChangeListener(null);
-    }
 }

Modified: 
felix/trunk/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/impl/role/GroupImpl.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/impl/role/GroupImpl.java?rev=1409119&r1=1409118&r2=1409119&view=diff
==============================================================================
--- 
felix/trunk/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/impl/role/GroupImpl.java
 (original)
+++ 
felix/trunk/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/impl/role/GroupImpl.java
 Wed Nov 14 08:56:04 2012
@@ -17,7 +17,6 @@
 package org.apache.felix.useradmin.impl.role;
 
 import java.util.Collection;
-import java.util.Dictionary;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -53,29 +52,19 @@ public class GroupImpl extends UserImpl 
     }
 
     /**
-     * Creates a new {@link GroupImpl} instance of type {@link Role#GROUP}.
-     * 
-     * @param name the name of this group role, cannot be <code>null</code> or 
empty.
-     */
-    public GroupImpl(String name, Dictionary properties, Dictionary 
credentials) {
-        super(Role.GROUP, name, properties, credentials);
-
-        m_members = new HashMap();
-        m_requiredMembers = new HashMap();
-    }
-
-    /**
      * {@inheritDoc}
      */
     public boolean addMember(Role role) {
         checkPermissions();
         
+        String name = role.getName();
+
         Object result;
         synchronized (m_lock) {
-            if (m_members.containsKey(role.getName()) || 
m_requiredMembers.containsKey(role.getName())) {
+                       if (m_members.containsKey(name) || 
m_requiredMembers.containsKey(name)) {
                 return false;
             }
-            result = m_members.put(role.getName(), role);
+            result = m_members.put(name, role);
         }
 
         if (result == null) {
@@ -92,12 +81,14 @@ public class GroupImpl extends UserImpl 
     public boolean addRequiredMember(Role role) {
         checkPermissions();
 
+        String name = role.getName();
+
         Object result;
         synchronized (m_lock) {
-            if (m_requiredMembers.containsKey(role.getName()) || 
m_members.containsKey(role.getName())) {
+                       if (m_requiredMembers.containsKey(name) || 
m_members.containsKey(name)) {
                 return false;
             }
-            result = m_requiredMembers.put(role.getName(), role);
+            result = m_requiredMembers.put(name, role);
         }
 
         if (result == null) {
@@ -140,17 +131,19 @@ public class GroupImpl extends UserImpl 
     public boolean removeMember(Role role) {
         checkPermissions();
 
+        String name = role.getName();
+
         String key = null;
         Object result = null;
         
         synchronized (m_lock) {
-            if (m_requiredMembers.containsKey(role.getName())) {
+                       if (m_requiredMembers.containsKey(name)) {
                 key = REQUIRED_MEMBER;
-                result = m_requiredMembers.remove(role.getName());
+                result = m_requiredMembers.remove(name);
             }
-            else if (m_members.containsKey(role.getName())) {
+            else if (m_members.containsKey(name)) {
                 key = BASIC_MEMBER;
-                result = m_members.remove(role.getName());
+                result = m_members.remove(name);
             }
         }
 

Modified: 
felix/trunk/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/impl/role/RoleImpl.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/impl/role/RoleImpl.java?rev=1409119&r1=1409118&r2=1409119&view=diff
==============================================================================
--- 
felix/trunk/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/impl/role/RoleImpl.java
 (original)
+++ 
felix/trunk/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/impl/role/RoleImpl.java
 Wed Nov 14 08:56:04 2012
@@ -64,23 +64,6 @@ public class RoleImpl implements Seriali
     }
 
     /**
-     * Creates a new {@link RoleImpl} instance with a given type, name and 
properties.
-     * 
-     * @param type the type of this role, should be {@link Role#ROLE}, {@link 
Role#USER} or {@link Role#GROUP};
-     * @param name the name of this role, cannot be <code>null</code> or empty;
-     * @param properties the initial properties of this role, cannot be 
<code>null</code>.
-     */
-    protected RoleImpl(int type, String name, Dictionary properties) {
-        if (name == null || "".equals(name.trim())) {
-            throw new IllegalArgumentException("Name cannot be null or 
empty!");
-        }
-        m_type = type;
-        m_name = name;
-        m_properties = new ObservableProperties(null, 
UserAdminPermission.CHANGE_PROPERTY, properties);
-        m_properties.setDictionaryChangeListener(this);
-    }
-
-    /**
      * {@inheritDoc}
      */
     public final void entryAdded(Object key, Object value) {

Modified: 
felix/trunk/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/impl/role/UserImpl.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/impl/role/UserImpl.java?rev=1409119&r1=1409118&r2=1409119&view=diff
==============================================================================
--- 
felix/trunk/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/impl/role/UserImpl.java
 (original)
+++ 
felix/trunk/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/impl/role/UserImpl.java
 Wed Nov 14 08:56:04 2012
@@ -55,18 +55,6 @@ public class UserImpl extends RoleImpl i
     }
 
     /**
-     * Creates a new {@link UserImpl} instance with type {@link Role#USER}.
-     * 
-     * @param name the name of this user role, cannot be <code>null</code> or 
empty.
-     */
-    protected UserImpl(int type, String name, Dictionary properties, 
Dictionary credentials) {
-        super(type, name, properties);
-
-        m_credentials = new 
ObservableProperties(UserAdminPermission.GET_CREDENTIAL, 
UserAdminPermission.CHANGE_CREDENTIAL, credentials);
-        m_credentials.setDictionaryChangeListener(this);
-    }
-
-    /**
      * {@inheritDoc}
      */
     public Dictionary getCredentials() {
@@ -89,7 +77,7 @@ public class UserImpl extends RoleImpl i
             } else if (value instanceof String) {
                 s2 = (String) value;
             } else {
-                // Not a string or a byte-array!
+                // Not a string, nor a byte-array!
                 return false;
             }
             
@@ -102,7 +90,7 @@ public class UserImpl extends RoleImpl i
             } else if (value instanceof String) {
                 b2 = ((String) value).getBytes();
             } else {
-                // Not a string or a byte-array!
+                // Not a string, nor a byte-array!
                 return false;
             }
 

Modified: 
felix/trunk/useradmin/useradmin/src/test/java/org/apache/felix/useradmin/impl/UserAdminImplTest.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/useradmin/useradmin/src/test/java/org/apache/felix/useradmin/impl/UserAdminImplTest.java?rev=1409119&r1=1409118&r2=1409119&view=diff
==============================================================================
--- 
felix/trunk/useradmin/useradmin/src/test/java/org/apache/felix/useradmin/impl/UserAdminImplTest.java
 (original)
+++ 
felix/trunk/useradmin/useradmin/src/test/java/org/apache/felix/useradmin/impl/UserAdminImplTest.java
 Wed Nov 14 08:56:04 2012
@@ -245,19 +245,6 @@ public class UserAdminImplTest extends T
     }
 
     /**
-     * Tests that creating a role with an invalid type does not succeed and 
yields an exception.
-     */
-    public void testCreateInvalidRoleTypeFail() {
-        try {
-            m_userAdmin.createRole("role1", Role.ROLE);
-            
-            fail("Expected an IllegalArgumentException!");
-        } catch (IllegalArgumentException e) {
-            // Ok; expected
-        }
-    }
-
-    /**
      * Tests that creating a role without a name does not succeed and yields 
an exception.
      */
     public void testCreateInvalidRoleNameFail() {
@@ -271,11 +258,11 @@ public class UserAdminImplTest extends T
     }
 
     /**
-     * Tests that creating a role without a name does not succeed and yields 
an exception.
+     * Tests that creating a role with an invalid type does not succeed and 
yields an exception.
      */
-    public void testCreateRoleWithEmptyNameFail() {
+    public void testCreateInvalidRoleTypeFail() {
         try {
-            m_userAdmin.createRole("", Role.USER);
+            m_userAdmin.createRole("role1", Role.ROLE);
             
             fail("Expected an IllegalArgumentException!");
         } catch (IllegalArgumentException e) {
@@ -306,6 +293,19 @@ public class UserAdminImplTest extends T
     }
 
     /**
+     * Tests that creating a role without a name does not succeed and yields 
an exception.
+     */
+    public void testCreateRoleWithEmptyNameFail() {
+        try {
+            m_userAdmin.createRole("", Role.USER);
+            
+            fail("Expected an IllegalArgumentException!");
+        } catch (IllegalArgumentException e) {
+            // Ok; expected
+        }
+    }
+
+    /**
      * Tests that creating a {@link UserAdminImpl} with a null event 
dispatcher fails.
      */
     public void testCreateUserAdminImplWithNullDispatcherFail() {
@@ -690,6 +690,75 @@ public class UserAdminImplTest extends T
     }
 
     /**
+     * Tests that remove of a role also removes that role as member from any 
group (FELIX-3755).
+     */
+    public void testRemoveRoleRemovesItAsGroupMemberOk() {
+        Role user1 = m_userAdmin.createRole("user1", Role.USER);
+        Role user2 = m_userAdmin.createRole("user2", Role.USER);
+
+        Group group1 = (Group) m_userAdmin.createRole("group1", Role.GROUP);
+        group1.addMember(user1);
+
+        Group group2 = (Group) m_userAdmin.createRole("group2", Role.GROUP);
+        group2.addMember(user1);
+        group2.addMember(user2);
+        
+        // Remove user...
+        m_userAdmin.removeRole(user1.getName());
+
+        // Retrieve an up-to-date instance of the first group...
+        group1 = (Group) m_userAdmin.getRole("group1");
+        assertNull(group1.getMembers());
+
+        // Retrieve an up-to-date instance of the second group...
+        group2 = (Group) m_userAdmin.getRole("group2");
+
+        Role[] members = group2.getMembers();
+               assertNotNull(members);
+               assertEquals(1, members.length);
+        assertEquals(user2, members[0]);
+    }
+
+    /**
+     * Tests that remove of a role also removes that role as required member 
from any group (FELIX-3755).
+     */
+    public void testRemoveRoleRemovesItAsRequiredGroupMemberOk() {
+        Role user1 = m_userAdmin.createRole("user1", Role.USER);
+        Role user2 = m_userAdmin.createRole("user2", Role.USER);
+
+        Group group1 = (Group) m_userAdmin.createRole("group1", Role.GROUP);
+        group1.addRequiredMember(user1);
+        group1.addMember(user2);
+
+        Group group2 = (Group) m_userAdmin.createRole("group2", Role.GROUP);
+        group2.addRequiredMember(user1);
+        group2.addRequiredMember(user2);
+
+        // Remove user...
+        m_userAdmin.removeRole(user1.getName());
+        
+        // Retrieve an up-to-date instance of the group...
+        group1 = (Group) m_userAdmin.getRole("group1");
+        
+        assertNull(group1.getRequiredMembers());
+
+        Role[] members = group1.getMembers();
+               assertNotNull(members);
+        assertEquals(1, members.length);
+        assertEquals(user2, members[0]);
+        
+        // Retrieve an up-to-date instance of the group...
+        group2 = (Group) m_userAdmin.getRole("group2");
+        
+        assertNull(group2.getMembers());
+
+        members = group2.getRequiredMembers();
+               assertNotNull(members);
+        assertEquals(1, members.length);
+        assertEquals(user2, members[0]);
+    }
+
+    /**
      * Tests that remove a credential of a user works.
      */
     public void testRemoveUserCredentialOk() {


Reply via email to