/*
* JBoss, Home of Professional Open Source
*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.picketlink.test.idm.relationship;
import org.junit.Test;
import org.picketlink.idm.IdentityManager;
import org.picketlink.idm.PartitionManager;
import org.picketlink.idm.RelationshipManager;
import org.picketlink.idm.model.Attribute;
import org.picketlink.idm.model.basic.BasicModel;
import org.picketlink.idm.model.basic.Group;
import org.picketlink.idm.model.basic.GroupMembership;
import org.picketlink.idm.model.basic.User;
import org.picketlink.idm.query.RelationshipQuery;
import org.picketlink.test.idm.AbstractPartitionManagerTestCase;
import org.picketlink.test.idm.Configuration;
import org.picketlink.test.idm.testers.FileStoreConfigurationTester;
import org.picketlink.test.idm.testers.IdentityConfigurationTester;
import org.picketlink.test.idm.testers.JPAStoreConfigurationTester;
import org.picketlink.test.idm.testers.LDAPStoreConfigurationTester;
import org.picketlink.test.idm.testers.LDAPUserGroupJPARoleConfigurationTester;
import org.picketlink.test.idm.testers.SingleConfigLDAPJPAStoreConfigurationTester;
import java.io.Serializable;
import java.util.Arrays;
import java.util.List;
import static junit.framework.Assert.assertNull;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
/**
* <p>
* Test case for {@link GroupMembership} basic management operations.
* </p>
*
* @author <a href="mailto:psilva@redhat.com">Pedro Silva</a>
*/
@Configuration(include = {JPAStoreConfigurationTester.class, FileStoreConfigurationTester.class,
LDAPStoreConfigurationTester.class, SingleConfigLDAPJPAStoreConfigurationTester.class,
LDAPUserGroupJPARoleConfigurationTester.class})
public class GroupMembershipTestCase extends AbstractPartitionManagerTestCase {
public GroupMembershipTestCase(IdentityConfigurationTester builder) {
super(builder);
}
@Test
public void testCreate() throws Exception {
User someUser = createUser();
Group someGroup = createGroup();
GroupMembership groupMembership = new GroupMembership(someUser, someGroup);
RelationshipManager relationshipManager = getPartitionManager().createRelationshipManager();
relationshipManager.add(groupMembership);
List<GroupMembership> result = getGroupMembership(someUser, someGroup);
assertEquals(1, result.size());
groupMembership = result.get(0);
assertEquals(someUser.getId(), groupMembership.getMember().getId());
assertEquals(someGroup.getId(), groupMembership.getGroup().getId());
}
@Test
@Configuration(exclude = {LDAPStoreConfigurationTester.class, LDAPUserGroupJPARoleConfigurationTester.class})
public void testUpdate() throws Exception {
User someUser = createUser();
Group someGroup = createGroup();
GroupMembership groupMembership = new GroupMembership(someUser, someGroup);
RelationshipManager relationshipManager = getPartitionManager().createRelationshipManager();
relationshipManager.add(groupMembership);
List<GroupMembership> result = getGroupMembership(someUser, someGroup);
assertEquals(1, result.size());
groupMembership = result.get(0);
assertEquals(someUser.getId(), groupMembership.getMember().getId());
assertEquals(someGroup.getId(), groupMembership.getGroup().getId());
groupMembership.setAttribute(new Attribute<String>("attribute1", "1"));
groupMembership.setAttribute(new Attribute<String[]>("attribute2", new String[]{"1", "2", "3"}));
relationshipManager.update(groupMembership);
result = getGroupMembership(someUser, someGroup);
assertEquals(1, result.size());
groupMembership = result.get(0);
assertEquals(someUser.getId(), groupMembership.getMember().getId());
assertEquals(someGroup.getId(), groupMembership.getGroup().getId());
assertNotNull(groupMembership.getAttribute("attribute1"));
assertNotNull(groupMembership.getAttribute("attribute2"));
assertEquals("1", groupMembership.getAttribute("attribute1").getValue());
assertEquals(3, groupMembership.<String[]>getAttribute("attribute2").getValue().length);
}
@Test
public void testAddUserToGroup() throws Exception {
User someUser = createUser("someUser");
Group someGroup = createGroup("someGroup", null);
RelationshipManager relationshipManager = getPartitionManager().createRelationshipManager();
BasicModel.addToGroup(relationshipManager, someUser, someGroup);
assertTrue(BasicModel.isMember(relationshipManager, someUser, someGroup));
Group someAnotherGroup = createGroup("someAnotherGroup", null);
assertFalse(BasicModel.isMember(relationshipManager, someUser, someAnotherGroup));
BasicModel.addToGroup(relationshipManager, someUser, someAnotherGroup);
assertTrue(BasicModel.isMember(relationshipManager, someUser, someAnotherGroup));
}
@Test
public void testAddUserToParentGroup() throws Exception {
User someUser = createUser("someUser");
Group groupB = createGroup("b", "a");
Group groupA = groupB.getParentGroup();
assertNotNull(groupA);
IdentityManager identityManager = getIdentityManager();
RelationshipManager relationshipManager = getPartitionManager().createRelationshipManager();
BasicModel.addToGroup(relationshipManager, someUser, groupB);
assertTrue(BasicModel.isMember(relationshipManager, someUser, groupA));
assertTrue(BasicModel.isMember(relationshipManager, someUser, groupB));
identityManager.remove(groupB);
identityManager.remove(groupA);
// group testing path is /a/b
assertFalse(BasicModel.isMember(relationshipManager, someUser, groupB));
groupB = createGroup("b", "a");
groupA = groupB.getParentGroup();
Group groupC = createGroupWithParent("c", groupB);
BasicModel.addToGroup(relationshipManager, someUser, groupC);
// group testing path is /a/b/c
assertTrue(BasicModel.isMember(relationshipManager, someUser, groupA));
assertTrue(BasicModel.isMember(relationshipManager, someUser, groupB));
assertTrue(BasicModel.isMember(relationshipManager, someUser, groupC));
identityManager.remove(groupC);
identityManager.remove(groupB);
identityManager.remove(groupA);
groupA = createGroup("a", null);
groupB = createGroupWithParent("b", groupA);
groupC = createGroupWithParent("c", groupB);
Group groupD = createGroupWithParent("d", groupC);
Group qaGroup = createGroupWithParent("QA Group", groupC);
Group anotherGroupB = createGroupWithParent("b", qaGroup);
// group testing paths are: /a/b/c/QA Group/b and /a/b/c/d
BasicModel.addToGroup(relationshipManager, someUser, anotherGroupB);
assertTrue(BasicModel.isMember(relationshipManager, someUser, anotherGroupB));
assertTrue(BasicModel.isMember(relationshipManager, someUser, groupA));
assertTrue(BasicModel.isMember(relationshipManager, someUser, groupB));
assertTrue(BasicModel.isMember(relationshipManager, someUser, groupC));
assertTrue(BasicModel.isMember(relationshipManager, someUser, qaGroup));
assertFalse(BasicModel.isMember(relationshipManager, someUser, groupD));
BasicModel.removeFromGroup(relationshipManager, someUser, anotherGroupB);
BasicModel.addToGroup(relationshipManager, someUser, groupD);
assertTrue(BasicModel.isMember(relationshipManager, someUser, groupA));
assertTrue(BasicModel.isMember(relationshipManager, someUser, groupB));
assertTrue(BasicModel.isMember(relationshipManager, someUser, groupD));
assertFalse(BasicModel.isMember(relationshipManager, someUser, anotherGroupB));
}
@Test
public void testRemoveUserWithRelationships() throws Exception {
User someUser = createUser("someUser");
Group someGroup = createGroup("someGroup", null);
IdentityManager identityManager = getIdentityManager();
RelationshipManager relationshipManager = getPartitionManager().createRelationshipManager();
BasicModel.addToGroup(relationshipManager, someUser, someGroup);
identityManager.remove(someUser);
assertFalse(BasicModel.isMember(relationshipManager, someUser, someGroup));
}
@Test
public void testRemoveUserFromGroup() throws Exception {
User someUser = createUser("someUser");
Group someGroup = createGroup("someGroup", null);
Group someAnotherGroup = createGroup("someAnotherGroup", null);
IdentityManager identityManager = getIdentityManager();
RelationshipManager relationshipManager = getPartitionManager().createRelationshipManager();
BasicModel.addToGroup(relationshipManager, someUser, someGroup);
BasicModel.addToGroup(relationshipManager, someUser, someAnotherGroup);
assertTrue(BasicModel.isMember(relationshipManager, someUser, someGroup));
assertTrue(BasicModel.isMember(relationshipManager, someUser, someAnotherGroup));
BasicModel.removeFromGroup(relationshipManager, someUser, someGroup);
assertFalse(BasicModel.isMember(relationshipManager, someUser, someGroup));
assertTrue(BasicModel.isMember(relationshipManager, someUser, someAnotherGroup));
BasicModel.removeFromGroup(relationshipManager, someUser, someAnotherGroup);
assertFalse(BasicModel.isMember(relationshipManager, someUser, someAnotherGroup));
}
@Test
@Configuration(exclude = {LDAPStoreConfigurationTester.class, LDAPUserGroupJPARoleConfigurationTester.class})
public void testLargeAttributeValue() throws Exception {
User someUser = createUser();
Group someGroup = createGroup();
GroupMembership groupMembership = new GroupMembership(someUser, someGroup);
RelationshipManager relationshipManager = getPartitionManager().createRelationshipManager();
relationshipManager.add(groupMembership);
// Create a large array of values
Integer[] val = new Integer[100];
for (int i = 0; i < 100; i++) {
val[i] = i;
}
groupMembership.setAttribute(new Attribute<Serializable>("Values", val));
relationshipManager.update(groupMembership);
RelationshipQuery<GroupMembership> query = relationshipManager.createRelationshipQuery(GroupMembership.class);
query.setParameter(GroupMembership.MEMBER, someUser);
query.setParameter(GroupMembership.GROUP, someGroup);
List<GroupMembership> result = query.getResultList();
assertFalse(result.isEmpty());
GroupMembership updatedIdentityType = result.get(0);
Integer[] retrievedVal = updatedIdentityType.<Integer[]>getAttribute("Values").getValue();
for (Integer value : retrievedVal) {
assertTrue(contains(retrievedVal, value));
}
}
@Test
@Configuration(exclude = {LDAPStoreConfigurationTester.class, LDAPUserGroupJPARoleConfigurationTester.class})
public void testSetOneValuedAttribute() throws Exception {
User someUser = createUser();
Group someGroup = createGroup();
GroupMembership groupMembership = new GroupMembership(someUser, someGroup);
RelationshipManager relationshipManager = getPartitionManager().createRelationshipManager();
relationshipManager.add(groupMembership);
groupMembership.setAttribute(new Attribute<String>("one-valued", "1"));
relationshipManager.update(groupMembership);
RelationshipQuery<GroupMembership> query = relationshipManager.createRelationshipQuery(GroupMembership.class);
query.setParameter(GroupMembership.MEMBER, someUser);
query.setParameter(GroupMembership.GROUP, someGroup);
List<GroupMembership> result = query.getResultList();
assertFalse(result.isEmpty());
GroupMembership updatedIdentityType = result.get(0);
Attribute<String> oneValuedAttribute = updatedIdentityType.getAttribute("one-valued");
assertNotNull(oneValuedAttribute);
assertEquals("1", oneValuedAttribute.getValue());
}
@Test
@Configuration(exclude = {LDAPStoreConfigurationTester.class, LDAPUserGroupJPARoleConfigurationTester.class})
public void testSetMultiValuedAttribute() throws Exception {
User someUser = createUser();
Group someGroup = createGroup();
GroupMembership groupMembership = new GroupMembership(someUser, someGroup);
RelationshipManager relationshipManager = getPartitionManager().createRelationshipManager();
relationshipManager.add(groupMembership);
groupMembership.setAttribute(new Attribute<String[]>("multi-valued", new String[]{"1", "2", "3"}));
relationshipManager.update(groupMembership);
RelationshipQuery<GroupMembership> query = relationshipManager.createRelationshipQuery(GroupMembership.class);
query.setParameter(GroupMembership.MEMBER, someUser);
query.setParameter(GroupMembership.GROUP, someGroup);
List<GroupMembership> result = query.getResultList();
assertFalse(result.isEmpty());
GroupMembership updatedIdentityType = result.get(0);
Attribute<String[]> multiValuedAttribute = updatedIdentityType.getAttribute("multi-valued");
assertNotNull(multiValuedAttribute);
assertNotNull(multiValuedAttribute.getValue());
assertEquals(3, multiValuedAttribute.getValue().length);
String[] values = multiValuedAttribute.getValue();
Arrays.sort(values);
assertTrue(Arrays.equals(values, new String[]{"1", "2", "3"}));
}
@Test
@Configuration(exclude = {LDAPStoreConfigurationTester.class, LDAPUserGroupJPARoleConfigurationTester.class})
public void testSetMultipleAttributes() throws Exception {
User someUser = createUser();
Group someGroup = createGroup();
GroupMembership groupMembership = new GroupMembership(someUser, someGroup);
RelationshipManager relationshipManager = getPartitionManager().createRelationshipManager();
relationshipManager.add(groupMembership);
groupMembership.setAttribute(new Attribute<String>("QuestionTotal", "2"));
groupMembership.setAttribute(new Attribute<String>("Question1", "What is favorite toy?"));
groupMembership.setAttribute(new Attribute<String>("Question1Answer", "Gum"));
groupMembership.setAttribute(new Attribute<String>("Question2", "What is favorite word?"));
groupMembership.setAttribute(new Attribute<String>("Question2Answer", "Hi"));
relationshipManager.update(groupMembership);
RelationshipQuery<GroupMembership> query = relationshipManager.createRelationshipQuery(GroupMembership.class);
query.setParameter(GroupMembership.MEMBER, someUser);
query.setParameter(GroupMembership.GROUP, someGroup);
List<GroupMembership> result = query.getResultList();
assertFalse(result.isEmpty());
GroupMembership updatedIdentityType = result.get(0);
assertNotNull(updatedIdentityType.<String>getAttribute("QuestionTotal"));
assertNotNull(updatedIdentityType.<String>getAttribute("Question1"));
assertNotNull(updatedIdentityType.<String>getAttribute("Question1Answer"));
assertNotNull(updatedIdentityType.<String>getAttribute("Question2"));
assertNotNull(updatedIdentityType.<String>getAttribute("Question2Answer"));
assertEquals("2", updatedIdentityType.<String>getAttribute("QuestionTotal").getValue());
assertEquals("What is favorite toy?", updatedIdentityType.<String>getAttribute("Question1").getValue());
assertEquals("Gum", updatedIdentityType.<String>getAttribute("Question1Answer").getValue());
assertEquals("What is favorite word?", updatedIdentityType.<String>getAttribute("Question2").getValue());
assertEquals("Hi", updatedIdentityType.<String>getAttribute("Question2Answer").getValue());
}
@Test
@Configuration(exclude = {LDAPStoreConfigurationTester.class, LDAPUserGroupJPARoleConfigurationTester.class})
public void testUpdateAttribute() throws Exception {
User someUser = createUser();
Group someGroup = createGroup();
GroupMembership groupMembership = new GroupMembership(someUser, someGroup);
RelationshipManager relationshipManager = getPartitionManager().createRelationshipManager();
relationshipManager.add(groupMembership);
groupMembership.setAttribute(new Attribute<String[]>("multi-valued", new String[]{"1", "2", "3"}));
relationshipManager.update(groupMembership);
RelationshipQuery<GroupMembership> query = relationshipManager.createRelationshipQuery(GroupMembership.class);
query.setParameter(GroupMembership.MEMBER, someUser);
query.setParameter(GroupMembership.GROUP, someGroup);
List<GroupMembership> result = query.getResultList();
assertFalse(result.isEmpty());
GroupMembership updatedIdentityType = result.get(0);
Attribute<String[]> multiValuedAttribute = updatedIdentityType.getAttribute("multi-valued");
assertNotNull(multiValuedAttribute);
multiValuedAttribute.setValue(new String[]{"3", "4", "5"});
updatedIdentityType.setAttribute(multiValuedAttribute);
relationshipManager.update(updatedIdentityType);
query = relationshipManager.createRelationshipQuery(GroupMembership.class);
query.setParameter(GroupMembership.MEMBER, someUser);
query.setParameter(GroupMembership.GROUP, someGroup);
result = query.getResultList();
assertFalse(result.isEmpty());
updatedIdentityType = result.get(0);
multiValuedAttribute = updatedIdentityType.getAttribute("multi-valued");
assertNotNull(multiValuedAttribute);
assertEquals(3, multiValuedAttribute.getValue().length);
String[] values = multiValuedAttribute.getValue();
Arrays.sort(values);
assertTrue(Arrays.equals(values, new String[]{"3", "4", "5"}));
}
@Test
@Configuration(exclude = {LDAPStoreConfigurationTester.class, LDAPUserGroupJPARoleConfigurationTester.class})
public void testRemoveAttribute() throws Exception {
User someUser = createUser();
Group someGroup = createGroup();
GroupMembership groupMembership = new GroupMembership(someUser, someGroup);
RelationshipManager relationshipManager = getPartitionManager().createRelationshipManager();
relationshipManager.add(groupMembership);
groupMembership.setAttribute(new Attribute<String[]>("multi-valued", new String[]{"1", "2", "3"}));
relationshipManager.update(groupMembership);
RelationshipQuery<GroupMembership> query = relationshipManager.createRelationshipQuery(GroupMembership.class);
query.setParameter(GroupMembership.MEMBER, someUser);
query.setParameter(GroupMembership.GROUP, someGroup);
List<GroupMembership> result = query.getResultList();
assertFalse(result.isEmpty());
GroupMembership updatedIdentityType = result.get(0);
Attribute<String[]> multiValuedAttribute = updatedIdentityType.getAttribute("multi-valued");
assertNotNull(multiValuedAttribute);
updatedIdentityType.removeAttribute("multi-valued");
relationshipManager.update(updatedIdentityType);
query = relationshipManager.createRelationshipQuery(GroupMembership.class);
query.setParameter(GroupMembership.MEMBER, someUser);
query.setParameter(GroupMembership.GROUP, someGroup);
result = query.getResultList();
assertFalse(result.isEmpty());
updatedIdentityType = result.get(0);
multiValuedAttribute = updatedIdentityType.getAttribute("multi-valued");
assertNull(multiValuedAttribute);
}
@Test
public void testFindUserGroups() throws Exception {
Group someGroup = createGroup("someGroup", null);
Group someAnotherGroup = createGroup("someAnotherGroup", null);
Group someImportantGroup = createGroup("someImportantGroup", null);
User user = createUser("someUser");
PartitionManager partitionManager = getPartitionManager();
RelationshipManager relationshipManager = partitionManager.createRelationshipManager();
RelationshipQuery<GroupMembership> query = relationshipManager.createRelationshipQuery(GroupMembership.class);
query.setParameter(GroupMembership.MEMBER, new Object[]{user});
List<GroupMembership> result = query.getResultList();
assertFalse(contains(result, "someGroup"));
assertFalse(contains(result, "someAnotherGroup"));
assertFalse(contains(result, "someImportantGroup"));
BasicModel.addToGroup(relationshipManager, user, someGroup);
query = relationshipManager.createRelationshipQuery(GroupMembership.class);
query.setParameter(GroupMembership.MEMBER, new Object[]{user});
result = query.getResultList();
assertFalse(result.isEmpty());
assertTrue(contains(result, "someGroup"));
assertFalse(contains(result, "someAnotherGroup"));
assertFalse(contains(result, "someImportantGroup"));
BasicModel.addToGroup(relationshipManager, user, someAnotherGroup);
query = relationshipManager.createRelationshipQuery(GroupMembership.class);
query.setParameter(GroupMembership.MEMBER, new Object[]{user});
result = query.getResultList();
assertFalse(result.isEmpty());
assertTrue(contains(result, "someGroup"));
assertTrue(contains(result, "someAnotherGroup"));
assertFalse(contains(result, "someImportantGroup"));
BasicModel.addToGroup(relationshipManager, user, someImportantGroup);
query = relationshipManager.createRelationshipQuery(GroupMembership.class);
query.setParameter(GroupMembership.MEMBER, new Object[]{user});
result = query.getResultList();
assertFalse(result.isEmpty());
assertTrue(contains(result, "someGroup"));
assertTrue(contains(result, "someAnotherGroup"));
assertTrue(contains(result, "someImportantGroup"));
}
private Group createGroup() {
return createGroup("someGroup", null);
}
private User createUser() {
return createUser("someUser");
}
private List<GroupMembership> getGroupMembership(User someUser, Group someGroup) {
RelationshipManager relationshipManager = getPartitionManager().createRelationshipManager();
RelationshipQuery<GroupMembership> query = relationshipManager.createRelationshipQuery(GroupMembership.class);
query.setParameter(GroupMembership.MEMBER, someUser);
query.setParameter(GroupMembership.GROUP, someGroup);
return query.getResultList();
}
private boolean contains(List<GroupMembership> result, String groupName) {
for (GroupMembership resultGroup : result) {
if (resultGroup.getGroup().getName().equals(groupName)) {
return true;
}
}
return false;
}
private boolean contains(Integer[] result, Integer value) {
for (Integer resultValue : result) {
if (resultValue.equals(value)) {
return true;
}
}
return false;
}
}