You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by fm...@apache.org on 2014/06/26 17:45:36 UTC

svn commit: r1605825 - in /syncope/trunk/core/src: main/java/org/apache/syncope/core/sync/impl/ test/java/org/apache/syncope/core/rest/ test/resources/

Author: fmartelli
Date: Thu Jun 26 15:45:35 2014
New Revision: 1605825

URL: http://svn.apache.org/r1605825
Log:
[SYNCOPE-392, SYNCOPE-471] provided integration tests for push task with matching and unmatching rules

Modified:
    syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/AbstractSubjectPushResultHandler.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/RolePushResultHandler.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/UserPushResultHandler.java
    syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/TaskTestITCase.java
    syncope/trunk/core/src/test/resources/content.xml

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/AbstractSubjectPushResultHandler.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/AbstractSubjectPushResultHandler.java?rev=1605825&r1=1605824&r2=1605825&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/AbstractSubjectPushResultHandler.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/AbstractSubjectPushResultHandler.java Thu Jun 26 15:45:35 2014
@@ -26,7 +26,9 @@ import org.apache.syncope.common.to.Abst
 import org.apache.syncope.common.types.AttributableType;
 import org.apache.syncope.common.types.AuditElements;
 import org.apache.syncope.common.types.AuditElements.Result;
+import org.apache.syncope.common.types.MatchingRule;
 import org.apache.syncope.common.types.ResourceOperation;
+import org.apache.syncope.common.types.UnmatchingRule;
 import org.apache.syncope.core.persistence.beans.AbstractSubject;
 import org.apache.syncope.core.persistence.beans.PushTask;
 import org.apache.syncope.core.persistence.beans.user.SyncopeUser;
@@ -86,7 +88,7 @@ public abstract class AbstractSubjectPus
         }
 
         final AbstractSubject toBeHandled = getSubject(subject.getId());
-        
+
         final AttributableUtil attrUtil = AttributableUtil.getInstance(toBeHandled);
 
         final SyncResult result = new SyncResult();
@@ -94,8 +96,8 @@ public abstract class AbstractSubjectPus
 
         result.setId(toBeHandled.getId());
         result.setSubjectType(attrUtil.getType());
-
         result.setName(getName(toBeHandled));
+        
         final Boolean enabled = toBeHandled instanceof SyncopeUser && profile.getSyncTask().isSyncStatus()
                 ? ((SyncopeUser) toBeHandled).isSuspended() ? Boolean.FALSE : Boolean.TRUE
                 : null;
@@ -106,130 +108,156 @@ public abstract class AbstractSubjectPus
         Object output = null;
         Result resultStatus = null;
         ConnectorObject beforeObj = null;
-        Map.Entry<String, Set<Attribute>> values = null;
-
         String operation = null;
 
-        try {
-            values = MappingUtil.prepareAttributes(
-                    attrUtil, // attributable util
-                    toBeHandled, // attributable (user or role)
-                    null, // current password if decode is possible; generate otherwise
-                    true, // propagate password (if required)
-                    null, // no vir attrs to be removed
-                    null, // propagate current vir attr values
-                    null, // no membership vir attrs to be removed
-                    null, // propagate current membership vir attr values
-                    enabled, // propagate status (suspended or not) if required
-                    profile.getSyncTask().getResource()); // target external resource
-
-            // Try to read remote object (user / group) BEFORE any actual operation
-            beforeObj = getRemoteObject(values.getKey());
+        Map.Entry<String, Set<Attribute>> values = MappingUtil.prepareAttributes(
+                attrUtil, // attributable util
+                toBeHandled, // attributable (user or role)
+                null, // current password if decode is possible; generate otherwise
+                true, // propagate password (if required)
+                null, // no vir attrs to be removed
+                null, // propagate current vir attr values
+                null, // no membership vir attrs to be removed
+                null, // propagate current membership vir attr values
+                enabled, // propagate status (suspended or not) if required
+                profile.getSyncTask().getResource()); // target external resource
 
+        // Try to read remote object (user / group) BEFORE any actual operation
+        beforeObj = getRemoteObject(values.getKey());
+        
+        if (profile.isDryRun()) {
             if (beforeObj == null) {
-                operation = profile.getSyncTask().getUnmatchigRule().name().toLowerCase();
-                switch (profile.getSyncTask().getUnmatchigRule()) {
-                    case ASSIGN:
-                        result.setOperation(ResourceOperation.CREATE);
-                        for (PushActions action : profile.getActions()) {
-                            action.beforeAssign(this.getProfile(), values, toBeHandled);
-                        }
-                        assign(toBeHandled, enabled, result);
-                        break;
-                    case PROVISION:
-                        result.setOperation(ResourceOperation.CREATE);
-                        for (PushActions action : profile.getActions()) {
-                            action.beforeProvision(this.getProfile(), values, toBeHandled);
-                        }
-                        provision(toBeHandled, enabled, result);
-                        break;
-                    case UNLINK:
-                        result.setOperation(ResourceOperation.NONE);
-                        for (PushActions action : profile.getActions()) {
-                            action.beforeUnlink(this.getProfile(), values, toBeHandled);
-                        }
-                        link(toBeHandled, false, result);
-                        break;
-                    default:
-                    // do nothing
+                result.setOperation(getResourceOperation(profile.getSyncTask().getUnmatchigRule()));
+            } else {
+                result.setOperation(getResourceOperation(profile.getSyncTask().getMatchigRule()));
+            }
+            result.setStatus(SyncResult.Status.SUCCESS);
+        } else {
+            try {
+                if (beforeObj == null) {
+                    operation = profile.getSyncTask().getUnmatchigRule().name().toLowerCase();
+                    result.setOperation(getResourceOperation(profile.getSyncTask().getUnmatchigRule()));
+
+                    switch (profile.getSyncTask().getUnmatchigRule()) {
+                        case ASSIGN:
+                            for (PushActions action : profile.getActions()) {
+                                action.beforeAssign(this.getProfile(), values, toBeHandled);
+                            }
+                            assign(toBeHandled, enabled, result);
+                            break;
+                        case PROVISION:
+                            for (PushActions action : profile.getActions()) {
+                                action.beforeProvision(this.getProfile(), values, toBeHandled);
+                            }
+                            provision(toBeHandled, enabled, result);
+                            break;
+                        case UNLINK:
+                            for (PushActions action : profile.getActions()) {
+                                action.beforeUnlink(this.getProfile(), values, toBeHandled);
+                            }
+                            link(toBeHandled, true, result);
+                            break;
+                        default:
+                        // do nothing
+                    }
+
+                } else {
+                    operation = profile.getSyncTask().getMatchigRule().name().toLowerCase();
+                    result.setOperation(getResourceOperation(profile.getSyncTask().getMatchigRule()));
+
+                    switch (profile.getSyncTask().getMatchigRule()) {
+                        case UPDATE:
+                            for (PushActions action : profile.getActions()) {
+                                action.beforeUpdate(this.getProfile(), values, toBeHandled);
+                            }
+                            update(toBeHandled, values.getKey(), values.getValue(), beforeObj, result);
+                            break;
+                        case DEPROVISION:
+                            for (PushActions action : profile.getActions()) {
+                                action.beforeDeprovision(this.getProfile(), values, toBeHandled);
+                            }
+                            deprovision(toBeHandled, result);
+                            break;
+                        case UNASSIGN:
+                            for (PushActions action : profile.getActions()) {
+                                action.beforeUnassign(this.getProfile(), values, toBeHandled);
+                            }
+                            unassign(toBeHandled, result);
+                            break;
+                        case LINK:
+                            for (PushActions action : profile.getActions()) {
+                                action.beforeLink(this.getProfile(), values, toBeHandled);
+                            }
+                            link(toBeHandled, false, result);
+                            break;
+                        case UNLINK:
+                            for (PushActions action : profile.getActions()) {
+                                action.beforeUnlink(this.getProfile(), values, toBeHandled);
+                            }
+                            link(toBeHandled, true, result);
+                            break;
+                        default:
+                        // do nothing
+                    }
                 }
 
-            } else {
-                operation = profile.getSyncTask().getMatchigRule().name().toLowerCase();
-                switch (profile.getSyncTask().getMatchigRule()) {
-                    case UPDATE:
-                        result.setOperation(ResourceOperation.UPDATE);
-                        for (PushActions action : profile.getActions()) {
-                            action.beforeUpdate(this.getProfile(), values, toBeHandled);
-                        }
-                        update(toBeHandled, values.getKey(), values.getValue(), beforeObj, result);
-                        break;
-                    case DEPROVISION:
-                        result.setOperation(ResourceOperation.DELETE);
-                        for (PushActions action : profile.getActions()) {
-                            action.beforeDeprovision(this.getProfile(), values, toBeHandled);
-                        }
-                        deprovision(toBeHandled, result);
-                        break;
-                    case UNASSIGN:
-                        result.setOperation(ResourceOperation.DELETE);
-                        for (PushActions action : profile.getActions()) {
-                            action.beforeUnassign(this.getProfile(), values, toBeHandled);
-                        }
-                        unassign(toBeHandled, result);
-                        break;
-                    case LINK:
-                        result.setOperation(ResourceOperation.NONE);
-                        for (PushActions action : profile.getActions()) {
-                            action.beforeLink(this.getProfile(), values, toBeHandled);
-                        }
-                        link(toBeHandled, true, result);
-                        break;
-                    case UNLINK:
-                        result.setOperation(ResourceOperation.NONE);
-                        for (PushActions action : profile.getActions()) {
-                            action.beforeUnlink(this.getProfile(), values, toBeHandled);
-                        }
-                        link(toBeHandled, false, result);
-                        break;
-                    default:
-                    // do nothing
+                for (PushActions action : profile.getActions()) {
+                    action.after(this.getProfile(), values, toBeHandled, result);
                 }
-            }
 
-            result.setStatus(SyncResult.Status.SUCCESS);
-            resultStatus = AuditElements.Result.SUCCESS;
-            output = getRemoteObject(values.getKey());
-        } catch (Exception e) {
-            result.setStatus(SyncResult.Status.FAILURE);
-            result.setMessage(ExceptionUtils.getRootCauseMessage(e));
-            resultStatus = AuditElements.Result.FAILURE;
-            output = e;
-
-            LOG.warn("Error pushing {} towards {}", toBeHandled, profile.getSyncTask().getResource(), e);
-            throw new JobExecutionException(e);
-        } finally {
-            for (PushActions action : profile.getActions()) {
-                action.after(this.getProfile(), values, toBeHandled, result);
+                result.setStatus(SyncResult.Status.SUCCESS);
+                resultStatus = AuditElements.Result.SUCCESS;
+                output = getRemoteObject(values.getKey());
+            } catch (Exception e) {
+                result.setStatus(SyncResult.Status.FAILURE);
+                result.setMessage(ExceptionUtils.getRootCauseMessage(e));
+                resultStatus = AuditElements.Result.FAILURE;
+                output = e;
+
+                LOG.warn("Error pushing {} towards {}", toBeHandled, profile.getSyncTask().getResource(), e);
+                throw new JobExecutionException(e);
+            } finally {
+                notificationManager.createTasks(
+                        AuditElements.EventCategoryType.PUSH,
+                        AttributableType.USER.name().toLowerCase(),
+                        profile.getSyncTask().getResource().getName(),
+                        operation,
+                        resultStatus,
+                        beforeObj,
+                        output,
+                        toBeHandled);
+                auditManager.audit(
+                        AuditElements.EventCategoryType.PUSH,
+                        AttributableType.USER.name().toLowerCase(),
+                        profile.getSyncTask().getResource().getName(),
+                        operation,
+                        resultStatus,
+                        beforeObj,
+                        output,
+                        toBeHandled);
             }
-            notificationManager.createTasks(
-                    AuditElements.EventCategoryType.PUSH,
-                    AttributableType.USER.name().toLowerCase(),
-                    profile.getSyncTask().getResource().getName(),
-                    operation,
-                    resultStatus,
-                    beforeObj,
-                    output,
-                    toBeHandled);
-            auditManager.audit(
-                    AuditElements.EventCategoryType.PUSH,
-                    AttributableType.USER.name().toLowerCase(),
-                    profile.getSyncTask().getResource().getName(),
-                    operation,
-                    resultStatus,
-                    beforeObj,
-                    output,
-                    toBeHandled);
+        }
+    }
+
+    private ResourceOperation getResourceOperation(final UnmatchingRule rule) {
+        switch (rule) {
+            case ASSIGN:
+            case PROVISION:
+                return ResourceOperation.CREATE;
+            default:
+                return ResourceOperation.NONE;
+        }
+    }
+
+    private ResourceOperation getResourceOperation(final MatchingRule rule) {
+        switch (rule) {
+            case UPDATE:
+                return ResourceOperation.UPDATE;
+            case DEPROVISION:
+            case UNASSIGN:
+                return ResourceOperation.DELETE;
+            default:
+                return ResourceOperation.NONE;
         }
     }
 }

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/RolePushResultHandler.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/RolePushResultHandler.java?rev=1605825&r1=1605824&r2=1605825&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/RolePushResultHandler.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/RolePushResultHandler.java Thu Jun 26 15:45:35 2014
@@ -18,8 +18,6 @@
  */
 package org.apache.syncope.core.sync.impl;
 
-import static org.apache.syncope.core.sync.impl.AbstractSyncopeResultHandler.LOG;
-
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
@@ -52,7 +50,6 @@ public class RolePushResultHandler exten
 
         taskExecutor.execute(propagationManager.getRoleDeleteTaskIds(before.getId(), noPropResources));
 
-        result.setId(before.getId());
         return roleDataBinder.getRoleFromId(before.getId());
     }
 
@@ -72,7 +69,6 @@ public class RolePushResultHandler exten
                 propByRes,
                 noPropResources));
 
-        result.setId(before.getId());
         return roleDataBinder.getRoleFromId(before.getId());
     }
 
@@ -91,7 +87,6 @@ public class RolePushResultHandler exten
 
         rwfAdapter.update(roleMod);
 
-        result.setId(sbj.getId());
         return roleDataBinder.getRoleFromId(sbj.getId());
     }
 
@@ -132,7 +127,6 @@ public class RolePushResultHandler exten
                 new HashSet<String>(),
                 connObjectUtil);
 
-        result.setId(sbj.getId());
         return userDataBinder.getUserFromId(sbj.getId());
     }
 

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/UserPushResultHandler.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/UserPushResultHandler.java?rev=1605825&r1=1605824&r2=1605825&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/UserPushResultHandler.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/UserPushResultHandler.java Thu Jun 26 15:45:35 2014
@@ -18,7 +18,6 @@
  */
 package org.apache.syncope.core.sync.impl;
 
-import static org.apache.syncope.core.sync.impl.AbstractSyncopeResultHandler.LOG;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
@@ -49,9 +48,9 @@ public class UserPushResultHandler exten
         final List<String> noPropResources = new ArrayList<String>(before.getResources());
         noPropResources.remove(profile.getSyncTask().getResource().getName());
 
-        taskExecutor.execute(propagationManager.getUserDeleteTaskIds(before.getId(), noPropResources));
+        taskExecutor.execute(propagationManager.getUserDeleteTaskIds(before.getId(),
+                Collections.singleton(profile.getSyncTask().getResource().getName()), noPropResources));
 
-        result.setId(before.getId());
         return userDataBinder.getUserFromId(before.getId());
     }
 
@@ -74,7 +73,6 @@ public class UserPushResultHandler exten
                 Collections.unmodifiableCollection(before.getMemberships()),
                 noPropResources));
 
-        result.setId(before.getId());
         return userDataBinder.getUserFromId(before.getId());
     }
 
@@ -93,7 +91,6 @@ public class UserPushResultHandler exten
 
         uwfAdapter.update(userMod);
 
-        result.setId(sbj.getId());
         return userDataBinder.getUserFromId(sbj.getId());
     }
 
@@ -134,7 +131,6 @@ public class UserPushResultHandler exten
                 new HashSet<String>(),
                 connObjectUtil);
 
-        result.setId(sbj.getId());
         return userDataBinder.getUserFromId(sbj.getId());
     }
 
@@ -168,10 +164,9 @@ public class UserPushResultHandler exten
         ConnectorObject obj = null;
 
         try {
-
             final Uid uid = new Uid(accountId);
 
-            profile.getConnector().getObject(
+            obj = profile.getConnector().getObject(
                     ObjectClass.ACCOUNT,
                     uid,
                     profile.getConnector().getOperationOptions(Collections.<AbstractMappingItem>emptySet()));

Modified: syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/TaskTestITCase.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/TaskTestITCase.java?rev=1605825&r1=1605824&r2=1605825&view=diff
==============================================================================
--- syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/TaskTestITCase.java (original)
+++ syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/TaskTestITCase.java Thu Jun 26 15:45:35 2014
@@ -977,43 +977,232 @@ public class TaskTestITCase extends Abst
     }
 
     @Test
-    public void pushUsers() {
-        // Read sync task
+    public void pushUnmatchingUsers() {
+        // ------------------------------------------
+        // Matching --> Assign --> dryRuyn
+        // ------------------------------------------
+        UserTO userTO = userService.read(3L);
+        assertEquals("Vivaldi", userTO.getAttrMap().get("surname").getValues().get(0));
+        assertFalse(userTO.getResources().contains(RESOURCE_NAME_TESTDB2));
+
         PushTaskTO task = taskService.<PushTaskTO>read(13L);
         assertNotNull(task);
-
-        assertEquals("Vivaldi", userService.read(3L).getAttrMap().get("surname").getValues().get(0));
-
         task.setUserFilter(SyncopeClient.getUserSearchConditionBuilder().is("surname").equalTo("Vivaldi").query());
         taskService.update(13L, task);
+
         assertEquals(task.getUserFilter(), taskService.<PushTaskTO>read(13L).getUserFilter());
 
-        execSyncTask(task.getId(), 50, false);
+        execSyncTask(task.getId(), 50, true);
 
         final JdbcTemplate jdbcTemplate = new JdbcTemplate(testDataSource);
+        assertEquals(0, jdbcTemplate.queryForList("SELECT ID FROM test2 WHERE ID='vivaldi'").size());
+
+        assertFalse(userService.read(3L).getResources().contains(RESOURCE_NAME_TESTDB2));
+
+        jdbcTemplate.execute("DELETE FROM test2 WHERE ID='vivaldi'");
+        // ------------------------------------------
+
+        // ------------------------------------------
+        // Matching --> Assign
+        // ------------------------------------------
+        execSyncTask(task.getId(), 50, false);
+
+        assertEquals(1, jdbcTemplate.queryForList("SELECT ID FROM test2 WHERE ID='vivaldi'").size());
         assertEquals(1, jdbcTemplate.queryForList("SELECT ID FROM test2 WHERE ID<>'vivaldi'").size());
-        assertEquals(0, jdbcTemplate.queryForList("SELECT ID FROM test2 WHERE ID='bellini'").size());
-        assertEquals(0, jdbcTemplate.queryForList("SELECT ID FROM test2 WHERE ID='rossini'").size());
-        assertEquals(0, jdbcTemplate.queryForList("SELECT ID FROM test2 WHERE ID='puccini'").size());
 
+        assertTrue(userService.read(3L).getResources().contains(RESOURCE_NAME_TESTDB2));
         assertEquals("vivaldi",
                 jdbcTemplate.queryForObject("SELECT ID FROM test2 WHERE ID=?", String.class, "vivaldi"));
 
         jdbcTemplate.execute("DELETE FROM test2 WHERE ID='vivaldi'");
+        // ------------------------------------------
 
-        task.setUserFilter(null);
+        // ------------------------------------------
+        // Matching --> Provision
+        // ------------------------------------------
+        assertEquals("Bellini", userService.read(4L).getAttrMap().get("surname").getValues().get(0));
+
+        task.setUserFilter(SyncopeClient.getUserSearchConditionBuilder().is("surname").equalTo("Bellini").query());
+        task.setUnmatchigRule(UnmatchingRule.PROVISION);
         taskService.update(13L, task);
-        assertNull(taskService.<PushTaskTO>read(13L).getUserFilter());
+        assertEquals(task.getUserFilter(), taskService.<PushTaskTO>read(13L).getUserFilter());
 
         execSyncTask(task.getId(), 50, false);
 
-        assertEquals("vivaldi",
-                jdbcTemplate.queryForObject("SELECT ID FROM test2 WHERE ID=?", String.class, "vivaldi"));
+        assertEquals(1, jdbcTemplate.queryForList("SELECT ID FROM test2 WHERE ID='bellini'").size());
+        assertEquals(1, jdbcTemplate.queryForList("SELECT ID FROM test2 WHERE ID<>'bellini'").size());
+
+        assertFalse(userService.read(4L).getResources().contains(RESOURCE_NAME_TESTDB2));
         assertEquals("bellini",
                 jdbcTemplate.queryForObject("SELECT ID FROM test2 WHERE ID=?", String.class, "bellini"));
-        assertEquals("rossini",
-                jdbcTemplate.queryForObject("SELECT ID FROM test2 WHERE ID=?", String.class, "rossini"));
-        assertEquals("puccini",
-                jdbcTemplate.queryForObject("SELECT ID FROM test2 WHERE ID=?", String.class, "puccini"));
+
+        jdbcTemplate.execute("DELETE FROM test2 WHERE ID='bellini'");
+        // ------------------------------------------
+
+        // ------------------------------------------
+        // Matching --> Unlink
+        // ------------------------------------------
+        userTO = userService.read(5L);
+        assertEquals("Puccini", userTO.getAttrMap().get("surname").getValues().get(0));
+        assertFalse(userTO.getResources().contains(RESOURCE_NAME_TESTDB2));
+
+        task.setUserFilter(SyncopeClient.getUserSearchConditionBuilder().is("surname").equalTo("Puccini").query());
+        task.setUnmatchigRule(UnmatchingRule.UNLINK);
+        taskService.update(13L, task);
+        assertEquals(task.getUserFilter(), taskService.<PushTaskTO>read(13L).getUserFilter());
+
+        execSyncTask(task.getId(), 50, false);
+
+        assertEquals(0, jdbcTemplate.queryForList("SELECT ID FROM test2 WHERE ID='puccini'").size());
+
+        assertFalse(userService.read(5L).getResources().contains(RESOURCE_NAME_TESTDB2));
+        // ------------------------------------------
+
+        // ------------------------------------------
+        // Matching --> Ignore
+        // ------------------------------------------
+        userTO = userService.read(5L);
+        assertEquals("Puccini", userTO.getAttrMap().get("surname").getValues().get(0));
+        assertFalse(userTO.getResources().contains(RESOURCE_NAME_TESTDB2));
+
+        task.setUserFilter(SyncopeClient.getUserSearchConditionBuilder().is("surname").equalTo("Rossini").query());
+        task.setUnmatchigRule(UnmatchingRule.IGNORE);
+        taskService.update(13L, task);
+        assertEquals(task.getUserFilter(), taskService.<PushTaskTO>read(13L).getUserFilter());
+
+        execSyncTask(task.getId(), 50, false);
+
+        assertEquals(0, jdbcTemplate.queryForList("SELECT ID FROM test2 WHERE ID='rossini'").size());
+
+        assertFalse(userService.read(1L).getResources().contains(RESOURCE_NAME_TESTDB2));
+        // ------------------------------------------
+    }
+
+    @Test
+    public void pushMatchingUser() {
+        // ------------------------------------------
+        // Assign Verdi to test2 --> dryRun
+        // ------------------------------------------
+        UserTO userTO = userService.read(2L);
+        assertEquals("Verdi", userTO.getAttrMap().get("surname").getValues().get(0));
+        assertFalse(userTO.getResources().contains(RESOURCE_NAME_TESTDB2));
+
+        PushTaskTO task = taskService.<PushTaskTO>read(13L);
+        assertNotNull(task);
+
+        task.setUserFilter(SyncopeClient.getUserSearchConditionBuilder().is("surname").equalTo("Verdi").query());
+        task.setUnmatchigRule(UnmatchingRule.ASSIGN);
+        taskService.update(13L, task);
+
+        assertEquals(UnmatchingRule.ASSIGN, taskService.<PushTaskTO>read(13L).getUnmatchigRule());
+
+        execSyncTask(task.getId(), 50, true);
+
+        assertFalse(userService.read(2L).getResources().contains(RESOURCE_NAME_TESTDB2));
+
+        JdbcTemplate jdbcTemplate = new JdbcTemplate(testDataSource);
+        assertEquals(0, jdbcTemplate.queryForList("SELECT ID FROM test2 WHERE ID='verdi'").size());
+        // ------------------------------------------
+
+        // ------------------------------------------
+        // Assign Verdi to test2
+        // ------------------------------------------
+        userTO = userService.read(2L);
+        assertEquals("Verdi", userTO.getAttrMap().get("surname").getValues().get(0));
+        assertFalse(userTO.getResources().contains(RESOURCE_NAME_TESTDB2));
+
+        execSyncTask(task.getId(), 50, false);
+
+        assertTrue(userService.read(2L).getResources().contains(RESOURCE_NAME_TESTDB2));
+        assertEquals("verdi", jdbcTemplate.queryForObject("SELECT ID FROM test2 WHERE ID=?", String.class, "verdi"));
+        // ------------------------------------------
+
+        // ------------------------------------------
+        // Matching --> Deprovision
+        // ------------------------------------------
+        assertEquals(1, jdbcTemplate.queryForList("SELECT ID FROM test2 WHERE ID='verdi'").size());
+
+        task.setMatchigRule(MatchingRule.DEPROVISION);
+        taskService.update(13L, task);
+        assertEquals(MatchingRule.DEPROVISION, taskService.<PushTaskTO>read(13L).getMatchigRule());
+
+        execSyncTask(task.getId(), 50, false);
+
+        assertTrue(userService.read(2L).getResources().contains(RESOURCE_NAME_TESTDB2));
+        // DELETE Capability not available ....
+        assertEquals(1, jdbcTemplate.queryForList("SELECT ID FROM test2 WHERE ID='verdi'").size());
+        // ------------------------------------------
+
+        // ------------------------------------------
+        // Matching --> Unassign
+        // ------------------------------------------
+        task.setMatchigRule(MatchingRule.UNASSIGN);
+        taskService.update(13L, task);
+        assertEquals(MatchingRule.UNASSIGN, taskService.<PushTaskTO>read(13L).getMatchigRule());
+
+        execSyncTask(task.getId(), 50, false);
+
+        assertFalse(userService.read(2L).getResources().contains(RESOURCE_NAME_TESTDB2));
+        // DELETE Capability not available ....
+        assertEquals(1, jdbcTemplate.queryForList("SELECT ID FROM test2 WHERE ID='verdi'").size());
+        // ------------------------------------------
+
+        // ------------------------------------------
+        // Matching --> Link
+        // ------------------------------------------
+        task.setMatchigRule(MatchingRule.LINK);
+        taskService.update(13L, task);
+        assertEquals(MatchingRule.LINK, taskService.<PushTaskTO>read(13L).getMatchigRule());
+
+        execSyncTask(task.getId(), 50, false);
+
+        assertTrue(userService.read(2L).getResources().contains(RESOURCE_NAME_TESTDB2));
+        assertEquals(1, jdbcTemplate.queryForList("SELECT ID FROM test2 WHERE ID='verdi'").size());
+        // ------------------------------------------
+
+        // ------------------------------------------
+        // Matching --> Unlink
+        // ------------------------------------------
+        task.setMatchigRule(MatchingRule.UNLINK);
+        taskService.update(13L, task);
+        assertEquals(MatchingRule.UNLINK, taskService.<PushTaskTO>read(13L).getMatchigRule());
+
+        execSyncTask(task.getId(), 50, false);
+
+        assertFalse(userService.read(2L).getResources().contains(RESOURCE_NAME_TESTDB2));
+        assertEquals("verdi", jdbcTemplate.queryForObject("SELECT ID FROM test2 WHERE ID=?", String.class, "verdi"));
+        // ------------------------------------------
+
+        // ------------------------------------------
+        // Matching --> Update
+        // ------------------------------------------
+        task.setMatchigRule(MatchingRule.UPDATE);
+        taskService.update(13L, task);
+        assertEquals(MatchingRule.UPDATE, taskService.<PushTaskTO>read(13L).getMatchigRule());
+
+        execSyncTask(task.getId(), 50, false);
+
+        assertFalse(userService.read(2L).getResources().contains(RESOURCE_NAME_TESTDB2));
+        assertEquals(1, jdbcTemplate.queryForList("SELECT ID FROM test2 WHERE ID='verdi'").size());
+        // ------------------------------------------
+
+        // ------------------------------------------
+        // Matching --> Ignore
+        // ------------------------------------------
+        task.setMatchigRule(MatchingRule.IGNORE);
+        taskService.update(13L, task);
+        assertEquals(MatchingRule.IGNORE, taskService.<PushTaskTO>read(13L).getMatchigRule());
+
+        execSyncTask(task.getId(), 50, false);
+
+        assertFalse(userService.read(2L).getResources().contains(RESOURCE_NAME_TESTDB2));
+        assertEquals("verdi", jdbcTemplate.queryForObject("SELECT ID FROM test2 WHERE ID=?", String.class, "verdi"));
+        // ------------------------------------------
+
+        task.setMatchigRule(MatchingRule.UPDATE);
+        task.setUserFilter(null);
+        taskService.update(13L, task);
+
+        jdbcTemplate.execute("DELETE FROM test2 WHERE ID='verdi'");
     }
 }

Modified: syncope/trunk/core/src/test/resources/content.xml
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/test/resources/content.xml?rev=1605825&r1=1605824&r2=1605825&view=diff
==============================================================================
--- syncope/trunk/core/src/test/resources/content.xml (original)
+++ syncope/trunk/core/src/test/resources/content.xml Thu Jun 26 15:45:35 2014
@@ -893,7 +893,7 @@ under the License.
   <Task DTYPE="SyncTask" id="12" name="VirAttrCache test" resource_name="resource-csv"
         performCreate="0" performUpdate="1" performDelete="0" syncStatus="0" fullReconciliation="1"
         jobClassName="org.apache.syncope.core.sync.impl.SyncJob"/>
-  <Task DTYPE="PushTask" id="13" name="Export on resource-testdb" resource_name="resource-testdb2"
+  <Task DTYPE="PushTask" id="13" name="Export on resource-testdb2" resource_name="resource-testdb2"
         performCreate="1" performUpdate="1" performDelete="1" syncStatus="1"
         jobClassName="org.apache.syncope.core.sync.impl.PushJob"/>