...with this change, testSyncExternalUsersLastSyncedProperty fails reliably on my machines, because the two timestamps are the same.

Maybe there's code missing ensuring that System.currentTimeMillis() actually changed before doing the operation that's suppose to lead to a new timestamp?

Best regards, Julian


On 2016-05-11 09:12, [email protected] wrote:
Author: angela
Date: Wed May 11 07:12:43 2016
New Revision: 1743322

URL: http://svn.apache.org/viewvc?rev=1743322&view=rev
Log:
OAK-4264 : Improve testing of SyncMBeanImpl (WIP)

Modified:
    
jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/TestIdentityProvider.java
    
jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/jmx/SyncMBeanImplTest.java

Modified: 
jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/TestIdentityProvider.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/TestIdentityProvider.java?rev=1743322&r1=1743321&r2=1743322&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/TestIdentityProvider.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/TestIdentityProvider.java
 Wed May 11 07:12:43 2016
@@ -40,14 +40,14 @@ public class TestIdentityProvider implem
     private final Map<String, ExternalUser> externalUsers = new HashMap<String, 
ExternalUser>();

     public TestIdentityProvider() {
-        addGroup(new TestGroup("aa"));
-        addGroup(new TestGroup("aaa"));
-        addGroup(new TestGroup("a").withGroups("aa", "aaa"));
-        addGroup(new TestGroup("b").withGroups("a"));
-        addGroup(new TestGroup("c"));
-        addGroup(new TestGroup("secondGroup"));
+        addGroup(new TestGroup("aa", getName()));
+        addGroup(new TestGroup("aaa", getName()));
+        addGroup(new TestGroup("a", getName()).withGroups("aa", "aaa"));
+        addGroup(new TestGroup("b", getName()).withGroups("a"));
+        addGroup(new TestGroup("c", getName()));
+        addGroup(new TestGroup("secondGroup", getName()));

-        addUser(new TestUser(ID_TEST_USER)
+        addUser(new TestUser(ID_TEST_USER, getName())
                 .withProperty("name", "Test User")
                 .withProperty("profile/name", "Public Name")
                 .withProperty("profile/age", 72)
@@ -55,7 +55,7 @@ public class TestIdentityProvider implem
                 .withGroups("a", "b", "c")
         );

-        addUser(new TestUser(ID_SECOND_USER)
+        addUser(new TestUser(ID_SECOND_USER, getName())
                 .withProperty("profile/name", "Second User")
                 .withProperty("age", 24)
                 .withProperty("col", ImmutableList.of("v1", "v2", "v3"))
@@ -141,17 +141,17 @@ public class TestIdentityProvider implem
         private final Map<String, Object> props = new HashMap<String, 
Object>();

         public TestIdentity() {
-            this("externalId", "principalName");
+            this("externalId", "principalName", "test");
         }

         public TestIdentity(@Nonnull String userId) {
-            this(userId, userId);
+            this(userId, userId, "test");
         }

-        public TestIdentity(@Nonnull String userId, @Nonnull String 
principalName) {
+        public TestIdentity(@Nonnull String userId, @Nonnull String 
principalName, @Nonnull String idpName) {
             this.userId = userId;
             this.principalName = principalName;
-            id = new ExternalIdentityRef(userId, "test");
+            id = new ExternalIdentityRef(userId, idpName);
         }

         public TestIdentity(@Nonnull ExternalIdentity base) {
@@ -202,7 +202,7 @@ public class TestIdentityProvider implem

         protected TestIdentity withGroups(String ... grps) {
             for (String grp: grps) {
-                groups.add(new ExternalIdentityRef(grp, "test"));
+                groups.add(new ExternalIdentityRef(grp, id.getProviderName()));
             }
             return this;
         }
@@ -210,8 +210,8 @@ public class TestIdentityProvider implem

     private static class TestUser extends TestIdentity implements ExternalUser 
{

-        private TestUser(String userId) {
-            super(userId);
+        private TestUser(String userId, @Nonnull String idpName) {
+            super(userId, userId, idpName);
         }

         public String getPassword() {
@@ -222,8 +222,8 @@ public class TestIdentityProvider implem

     private static class TestGroup extends TestIdentity implements 
ExternalGroup {

-        private TestGroup(String userId) {
-            super(userId);
+        private TestGroup(@Nonnull String userId, @Nonnull String idpName) {
+            super(userId, userId, idpName);
         }

         @Nonnull
@@ -236,26 +236,14 @@ public class TestIdentityProvider implem
     public static final class ForeignExternalUser extends 
TestIdentityProvider.TestIdentity implements ExternalUser {

         public ForeignExternalUser() {
-            super();
-        }
-
-        @Nonnull
-        @Override
-        public ExternalIdentityRef getExternalId() {
-            return new ExternalIdentityRef(getId(), "AnotherExternalIDP");
+            super("externalId", "principalName", "AnotherExternalIDP");
         }
     }

     public static final class ForeignExternalGroup extends 
TestIdentityProvider.TestIdentity implements ExternalGroup {

         public ForeignExternalGroup() {
-            super();
-        }
-
-        @Nonnull
-        @Override
-        public ExternalIdentityRef getExternalId() {
-            return new ExternalIdentityRef(getId(), "AnotherExternalIDP");
+            super("externalId", "principalName", "AnotherExternalIDP");
         }

         @Nonnull

Modified: 
jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/jmx/SyncMBeanImplTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/jmx/SyncMBeanImplTest.java?rev=1743322&r1=1743321&r2=1743322&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/jmx/SyncMBeanImplTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/jmx/SyncMBeanImplTest.java
 Wed May 11 07:12:43 2016
@@ -16,23 +16,45 @@
  */
 package 
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.jmx;

+import java.util.Iterator;
 import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
 import javax.jcr.Repository;
+import javax.jcr.Session;
+import javax.jcr.SimpleCredentials;

+import com.google.common.collect.Iterators;
+import org.apache.jackrabbit.api.JackrabbitSession;
+import org.apache.jackrabbit.api.security.user.Authorizable;
+import org.apache.jackrabbit.api.security.user.Group;
+import org.apache.jackrabbit.api.security.user.User;
+import org.apache.jackrabbit.api.security.user.UserManager;
 import org.apache.jackrabbit.oak.jcr.Jcr;
+import 
org.apache.jackrabbit.oak.spi.security.authentication.external.ExternalGroup;
+import 
org.apache.jackrabbit.oak.spi.security.authentication.external.ExternalIdentity;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.ExternalIdentityProvider;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.ExternalIdentityProviderManager;
+import 
org.apache.jackrabbit.oak.spi.security.authentication.external.ExternalIdentityRef;
+import 
org.apache.jackrabbit.oak.spi.security.authentication.external.ExternalUser;
+import 
org.apache.jackrabbit.oak.spi.security.authentication.external.SyncContext;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.SyncHandler;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.SyncManager;
+import 
org.apache.jackrabbit.oak.spi.security.authentication.external.SyncResult;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.TestIdentityProvider;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.basic.DefaultSyncConfig;
+import 
org.apache.jackrabbit.oak.spi.security.authentication.external.basic.DefaultSyncContext;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.DefaultSyncHandler;
+import org.apache.jackrabbit.oak.spi.security.user.UserConstants;
+import org.junit.After;
 import org.junit.Before;
 import org.junit.BeforeClass;
+import org.junit.Ignore;
 import org.junit.Test;

 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;

 public class SyncMBeanImplTest {
@@ -42,10 +64,15 @@ public class SyncMBeanImplTest {
     private static Repository REPOSITORY;

     private ExternalIdentityProvider idp;
+    private ExternalIdentityProvider foreignIDP;
+    private DefaultSyncConfig syncConfig;
+    private SyncMBeanImpl syncMBean;
+
     private SyncManager syncMgr;
-    ExternalIdentityProviderManager idpMgr;
+    private ExternalIdentityProviderManager idpMgr;

-    private SyncMBeanImpl syncMBean;
+    private Session session;
+    private UserManager userManager;

     @BeforeClass
     public static void beforeClass() {
@@ -53,15 +80,24 @@ public class SyncMBeanImplTest {
     }

     @Before
-    public void before() {
-        // TODO : proper setup
+    public void before() throws Exception {
         idp = new TestIdentityProvider();
+        foreignIDP = new TestIdentityProvider() {
+            @Nonnull
+            public String getName() {
+                return "anotherIDP";
+            }
+
+        };
+        syncConfig = new DefaultSyncConfig();
+        syncConfig.user().setMembershipNestingDepth(1);
+
         syncMgr = new SyncManager() {
             @CheckForNull
             @Override
             public SyncHandler getSyncHandler(@Nonnull String name) {
                 if (SYNC_NAME.equals(name)) {
-                    return new DefaultSyncHandler(new DefaultSyncConfig());
+                    return new DefaultSyncHandler(syncConfig);
                 } else {
                     return null;
                 }
@@ -79,8 +115,49 @@ public class SyncMBeanImplTest {
             }
         };
         syncMBean = new SyncMBeanImpl(REPOSITORY, syncMgr, SYNC_NAME, idpMgr, 
idp.getName());
+
+        session = REPOSITORY.login(new SimpleCredentials("admin", 
"admin".toCharArray()));
+        if (!(session instanceof JackrabbitSession)) {
+            throw new IllegalStateException();
+        } else {
+            userManager = ((JackrabbitSession) session).getUserManager();
+        }
     }

+    @After
+    public void after() throws Exception {
+        try {
+            session.refresh(false);
+            Iterator<ExternalIdentity> extIdentities = 
Iterators.concat(idp.listGroups(), idp.listUsers());
+            while (extIdentities.hasNext()) {
+                Authorizable a = 
userManager.getAuthorizable(extIdentities.next().getId());
+                if (a != null) {
+                    a.remove();
+                }
+            }
+            session.save();
+        } finally {
+            session.logout();
+        }
+    }
+
+    private static void assertResultMessages(@Nonnull String[] resultMessages, 
int expectedSize, @Nonnull String... expectedOperations) {
+        assertEquals(expectedSize, resultMessages.length);
+        for (int i = 0; i < resultMessages.length; i++) {
+            String rm = resultMessages[i];
+            String op = rm.substring(rm.indexOf(":") + 2, rm.indexOf("\","));
+            assertEquals(expectedOperations[i], op);
+        }
+    }
+
+    private SyncResult sync(@Nonnull ExternalIdentityProvider idp, @Nonnull 
String id, boolean isGroup) throws Exception {
+        SyncContext ctx = new DefaultSyncContext(syncConfig, idp, userManager, 
session.getValueFactory());
+        SyncResult res = ctx.sync((isGroup) ? idp.getGroup(id) : 
idp.getUser(id));
+        session.save();
+        return res;
+    }
+
+
     @Test
     public void testGetSyncHandlerName() {
         assertEquals(SYNC_NAME, syncMBean.getSyncHandlerName());
@@ -119,18 +196,245 @@ public class SyncMBeanImplTest {
         }
     }

+    /**
+     * test users have never been synced before => result must be NSA
+     */
     @Test
-    public void testSyncUsers() {
-        // TODO
+    public void testSyncUsersBefore() {
+        String[] userIds = new String[] {TestIdentityProvider.ID_TEST_USER, 
TestIdentityProvider.ID_SECOND_USER};
+
+        String[] result = syncMBean.syncUsers(userIds, false);
+        assertResultMessages(result, userIds.length, "nsa", "nsa");
+
+        result = syncMBean.syncUsers(userIds, true);
+        assertResultMessages(result, userIds.length, "nsa", "nsa");
     }

     @Test
-    public void testSyncAllUsers() {
-        // TODO
+    public void testSyncUsers() throws Exception {
+        sync(idp, TestIdentityProvider.ID_TEST_USER, false);
+
+        String[] userIds = new String[]{TestIdentityProvider.ID_TEST_USER, 
TestIdentityProvider.ID_SECOND_USER};
+        String[] result = syncMBean.syncUsers(userIds, false);
+        assertResultMessages(result, userIds.length, "upd", "nsa");
+
+        result = syncMBean.syncUsers(userIds, true);
+        assertResultMessages(result, userIds.length, "upd", "nsa");
+    }
+
+    @Test
+    public void testSyncUsersAlwaysForcesSync() throws Exception {
+        sync(idp, TestIdentityProvider.ID_TEST_USER, false);
+
+        String[] userIds = new String[]{TestIdentityProvider.ID_TEST_USER, 
TestIdentityProvider.ID_SECOND_USER};
+        syncConfig.user().setExpirationTime(Long.MAX_VALUE);
+
+        String[]result = syncMBean.syncUsers(userIds, false);
+        assertResultMessages(result, userIds.length, "upd", "nsa");
+    }
+
+    @Test
+    public void testSyncGroups() throws Exception {
+        sync(idp, "a", true);
+
+        String[] ids = new String[]{"a"};
+        syncConfig.group().setExpirationTime(Long.MAX_VALUE);
+
+        // force group sync is true by default => exp time is ignored
+        String[] result = syncMBean.syncUsers(ids, false);
+        assertResultMessages(result, ids.length, "upd");
+    }
+
+    @Test
+    public void testSyncUsersPurge() throws Exception {
+        User u = userManager.createUser("thirdUser", null);
+        u.setProperty(DefaultSyncContext.REP_EXTERNAL_ID, 
session.getValueFactory().createValue(new ExternalIdentityRef(u.getID(), 
idp.getName()).getString()));
+        session.save();
+
+        String[] ids = new String[]{u.getID()};
+        String[] result = syncMBean.syncUsers(ids, false);
+        assertResultMessages(result, ids.length, "mis");
+        assertNotNull(userManager.getAuthorizable(u.getID()));
+
+        result = syncMBean.syncUsers(ids, true);
+        assertResultMessages(result, ids.length, "del");
+        assertNull(userManager.getAuthorizable(u.getID()));
+    }
+
+    @Test
+    public void testSyncUsersNonExisting() {
+        String[] result = syncMBean.syncUsers(new String[] {"nonExisting"}, 
false);
+        assertResultMessages(result, 1, "nsa");
+    }
+
+    @Test
+    public void testSyncUsersLocal() {
+        String[] result = syncMBean.syncUsers(new String[] 
{UserConstants.DEFAULT_ANONYMOUS_ID}, false);
+        assertResultMessages(result, 1, "for");
+    }
+
+    @Test
+    public void testSyncUsersLocalPurge() throws Exception {
+        String[] result = syncMBean.syncUsers(new String[] 
{UserConstants.DEFAULT_ANONYMOUS_ID}, true);
+        assertResultMessages(result, 1, "for");
+
+        
assertNotNull(userManager.getAuthorizable(UserConstants.DEFAULT_ANONYMOUS_ID));
     }

     @Test
-    public void testSyncExternalUsers() {
+    public void testSyncUsersForeign() throws Exception {
+        // sync user from foreign IDP into the repository
+        SyncResult res = sync(foreignIDP, TestIdentityProvider.ID_TEST_USER, 
false);
+        
assertNotNull(userManager.getAuthorizable(TestIdentityProvider.ID_TEST_USER));
+        
assertEquals(foreignIDP.getUser(TestIdentityProvider.ID_TEST_USER).getExternalId(),
 res.getIdentity().getExternalIdRef());
+
+        // syncUsers with testIDP must detect the foreign status
+        String[] result = syncMBean.syncUsers(new 
String[]{TestIdentityProvider.ID_TEST_USER}, false);
+        assertResultMessages(result, 1, "for");
+        
assertNotNull(userManager.getAuthorizable(TestIdentityProvider.ID_TEST_USER));
+
+        // same expected with 'purge' set to true
+        result = syncMBean.syncUsers(new String[] 
{TestIdentityProvider.ID_TEST_USER}, true);
+        assertResultMessages(result, 1, "for");
+        
assertNotNull(userManager.getAuthorizable(TestIdentityProvider.ID_TEST_USER));
+    }
+
+    @Test
+    public void testSyncGroupsForeign() throws Exception {
+        // sync user from foreign IDP into the repository
+        SyncResult res = sync(foreignIDP, "a", true);
+        assertNotNull(userManager.getAuthorizable("a"));
+        assertEquals(foreignIDP.getGroup("a").getExternalId(), 
res.getIdentity().getExternalIdRef());
+
+        // syncUsers with testIDP must detect the foreign status
+        String[] result = syncMBean.syncUsers(new String[]{"a"}, false);
+        assertResultMessages(result, 1, "for");
+        assertNotNull(userManager.getAuthorizable("a"));
+
+        // same expected with 'purge' set to true
+        result = syncMBean.syncUsers(new String[] {"a"}, true);
+        assertResultMessages(result, 1, "for");
+        assertNotNull(userManager.getAuthorizable("a"));
+    }
+
+    @Test
+    public void testInitialSyncExternalUsers() throws Exception {
+        ExternalUser externalUser = 
idp.getUser(TestIdentityProvider.ID_TEST_USER);
+        String[] externalId = new String[] 
{externalUser.getExternalId().getString()};
+
+        String[] result = syncMBean.syncExternalUsers(externalId);
+        assertResultMessages(result, 1, "add");
+
+        User testUser = userManager.getAuthorizable(externalUser.getId(), 
User.class);
+        assertNotNull(testUser);
+
+        for (ExternalIdentityRef groupRef : externalUser.getDeclaredGroups()) {
+            assertNotNull(userManager.getAuthorizable(groupRef.getId()));
+        }
+    }
+
+    @Test
+    public void testInitialSyncExternalUsersNoNesting() throws Exception {
+        syncConfig.user().setMembershipNestingDepth(-1);
+
+        ExternalUser externalUser = 
idp.getUser(TestIdentityProvider.ID_TEST_USER);
+        String[] externalId = new String[] 
{externalUser.getExternalId().getString()};
+
+        String[] result = syncMBean.syncExternalUsers(externalId);
+        assertResultMessages(result, 1, "add");
+
+        User testUser = userManager.getAuthorizable(externalUser.getId(), 
User.class);
+        assertNotNull(testUser);
+
+        for (ExternalIdentityRef groupRef : externalUser.getDeclaredGroups()) {
+            assertNull(userManager.getAuthorizable(groupRef.getId()));
+        }
+    }
+
+    @Test
+    public void testSyncExternalUsersLastSyncedProperty() throws Exception {
+        ExternalUser externalUser = 
idp.getUser(TestIdentityProvider.ID_TEST_USER);
+        String[] externalId = new 
String[]{externalUser.getExternalId().getString()};
+
+        syncMBean.syncExternalUsers(externalId);
+        User testUser = userManager.getAuthorizable(externalUser.getId(), 
User.class);
+
+        long lastSynced = 
testUser.getProperty(DefaultSyncContext.REP_LAST_SYNCED)[0].getLong();
+        for (ExternalIdentityRef groupRef : externalUser.getDeclaredGroups()) {
+            Group gr = userManager.getAuthorizable(groupRef.getId(), 
Group.class);
+            long groupLastSynced = 
gr.getProperty(DefaultSyncContext.REP_LAST_SYNCED)[0].getLong();
+
+            assertTrue(lastSynced == groupLastSynced);
+        }
+
+        // default value for forceGroup sync is defined to be 'true' => verify 
result
+        syncMBean.syncExternalUsers(externalId);
+        testUser = userManager.getAuthorizable(externalUser.getId(), 
User.class);
+        long lastSynced2 = 
testUser.getProperty(DefaultSyncContext.REP_LAST_SYNCED)[0].getLong();
+
+        assertTrue(lastSynced < lastSynced2);
+        for (ExternalIdentityRef groupRef : externalUser.getDeclaredGroups()) {
+            Group gr = userManager.getAuthorizable(groupRef.getId(), 
Group.class);
+            long groupLastSynced = 
gr.getProperty(DefaultSyncContext.REP_LAST_SYNCED)[0].getLong();
+
+            assertTrue(lastSynced2 == groupLastSynced);
+        }
+    }
+
+    @Test
+    public void testInitialSyncExternalGroup() throws Exception {
+        ExternalGroup externalGroup = idp.getGroup("a");
+        String[] externalId = new String[] 
{externalGroup.getExternalId().getString()};
+
+        String[] result = syncMBean.syncExternalUsers(externalId);
+        assertResultMessages(result, 1, "add");
+
+        Group aGroup = userManager.getAuthorizable(externalGroup.getId(), 
Group.class);
+        assertNotNull(aGroup);
+
+        // membership of groups are not synced (unless imposed by user-sync 
with membership depth)
+        for (ExternalIdentityRef groupRef : externalGroup.getDeclaredGroups()) 
{
+            assertNull(userManager.getAuthorizable(groupRef.getId()));
+        }
+    }
+
+    @Test
+    public void testSyncExternalNonExisting() throws Exception {
+        ExternalIdentityRef ref = new ExternalIdentityRef("nonExisting", 
idp.getName());
+
+        String[] result = syncMBean.syncExternalUsers(new 
String[]{ref.getString()});
+        assertResultMessages(result, 1, "nsi");
+    }
+
+    /**
+     * @see <a 
href="https://issues.apache.org/jira/browse/OAK-4346";>OAK-4346</a>
+     */
+    @Ignore("OAK-4346")
+    @Test
+    public void testSyncExternalLocal() throws Exception {
+        ExternalIdentityRef ref = new 
ExternalIdentityRef(UserConstants.DEFAULT_ANONYMOUS_ID, null);
+
+        String[] result = syncMBean.syncExternalUsers(new 
String[]{ref.getString()});
+        assertResultMessages(result, 1, "for");
+    }
+
+    /**
+     * @see <a 
href="https://issues.apache.org/jira/browse/OAK-4346";>OAK-4346</a>
+     */
+    @Ignore("OAK-4346")
+    @Test
+    public void testSyncExternalForeign() throws Exception {
+        ExternalIdentityRef ref = new 
ExternalIdentityRef(TestIdentityProvider.ID_TEST_USER, "anotherIDP");
+
+        String[] result = syncMBean.syncExternalUsers(new 
String[]{ref.getString()});
+        assertResultMessages(result, 1, "for");
+
+        result = syncMBean.syncExternalUsers(new String[] {ref.getString()});
+        assertResultMessages(result, 1, "for");
+    }
+
+    @Test
+    public void testSyncAllUsers() {
         // TODO
     }






--
<green/>bytes GmbH, Hafenweg 16, D-48155 Münster, Germany
Amtsgericht Münster: HRB5782

Reply via email to