userTemplate.addVirtualAttribute(attributeTO("virtualReadOnly", ""));
task.setUserTemplate(userTemplate);
// add role template
final RoleTO roleTemplate = new RoleTO();
roleTemplate.setParent(8L);
roleTemplate.addAttribute(attributeTO("show", "'true'"));
task.setRoleTemplate(roleTemplate);
taskService.update(task.getId(), task);
SyncTaskTO actual = taskService.read(TaskType.SYNCHRONIZATION, task.getId());
assertNotNull(actual);
assertEquals(task.getId(), actual.getId());
assertEquals(roleTemplate, actual.getRoleTemplate());
assertEquals(userTemplate, actual.getUserTemplate());
TaskExecTO execution = execSyncTask(actual.getId(), 20, false);
// 1. verify execution status
final String status = execution.getStatus();
assertNotNull(status);
assertTrue(PropagationTaskExecStatus.valueOf(status).isSuccessful());
// 2. verify that synchronized role is found, with expected attributes
final AttributableCond rolenameLeafCond = new AttributableCond(AttributableCond.Type.EQ);
rolenameLeafCond.setSchema("name");
rolenameLeafCond.setExpression("testLDAPGroup");
final List<RoleTO> matchingRoles = roleService.search(NodeCond.getLeafCond(rolenameLeafCond));
assertNotNull(matchingRoles);
assertEquals(1, matchingRoles.size());
final AttributableCond usernameLeafCond = new AttributableCond(AttributeCond.Type.EQ);
usernameLeafCond.setSchema("username");
usernameLeafCond.setExpression("syncFromLDAP");
final List<UserTO> matchingUsers = userService.search(NodeCond.getLeafCond(usernameLeafCond));
assertNotNull(matchingUsers);
assertEquals(1, matchingUsers.size());
// Check for SYNCOPE-436
assertEquals("syncFromLDAP", matchingUsers.get(0).
getVirtualAttributeMap().get("virtualReadOnly").getValues().get(0));
final RoleTO roleTO = matchingRoles.iterator().next();
assertNotNull(roleTO);
assertEquals("testLDAPGroup", roleTO.getName());
assertEquals(8L, roleTO.getParent());
assertEquals("true", roleTO.getAttributeMap().get("show").getValues().get(0));
assertEquals(matchingUsers.iterator().next().getId(), (long) roleTO.getUserOwner());
assertNull(roleTO.getRoleOwner());
// 3. verify that LDAP group membership is propagated as Syncope role membership
final MembershipCond membershipCond = new MembershipCond();
membershipCond.setRoleId(roleTO.getId());
final List<UserTO> members = userService.search(NodeCond.getLeafCond(membershipCond));
assertNotNull(members);
assertEquals(1, members.size());
}