/* * 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.query; import org.junit.Test; import org.picketlink.idm.IdentityManager; import org.picketlink.idm.model.Account; import org.picketlink.idm.model.Attribute; import org.picketlink.idm.model.AttributedType; import org.picketlink.idm.model.IdentityType; import org.picketlink.idm.model.Partition; import org.picketlink.idm.model.basic.Agent; import org.picketlink.idm.model.basic.Grant; import org.picketlink.idm.model.basic.Group; import org.picketlink.idm.model.basic.GroupMembership; import org.picketlink.idm.model.basic.Realm; import org.picketlink.idm.model.basic.Role; import org.picketlink.idm.model.basic.Tier; import org.picketlink.idm.query.IdentityQuery; import org.picketlink.idm.query.IdentityQueryBuilder; import org.picketlink.test.idm.AbstractPartitionManagerTestCase; import org.picketlink.test.idm.Configuration; import org.picketlink.test.idm.testers.IdentityConfigurationTester; import org.picketlink.test.idm.testers.LDAPStoreConfigurationTester; import org.picketlink.test.idm.testers.LDAPUserGroupJPARoleConfigurationTester; import org.picketlink.test.idm.testers.MultipleIdentityConfigurationTester; import org.picketlink.test.idm.testers.SingleConfigLDAPJPAStoreConfigurationTester; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertTrue; import static org.junit.Assert.assertNotNull; /** * @author Pedro Silva */ public abstract class AbstractIdentityQueryTestCase<T extends IdentityType> extends AbstractPartitionManagerTestCase { public AbstractIdentityQueryTestCase(IdentityConfigurationTester builder) { super(builder); } protected abstract T createIdentityType(String name, Partition partition); protected abstract T getIdentityType(); protected abstract T createInstance(String name); @Test public void testFindById() throws Exception { T identityType = createIdentityType(null, null); IdentityManager identityManager = getIdentityManager(); IdentityQuery<T> query = identityManager.<T>createIdentityQuery((Class<T>) identityType.getClass()); query.setParameter(AttributedType.ID, identityType.getId()); List<T> result = query.getResultList(); assertFalse(result.isEmpty()); assertEquals(1, result.size()); assertEquals(identityType.getId(), result.get(0).getId()); } @Test @Configuration(exclude = {LDAPStoreConfigurationTester.class, SingleConfigLDAPJPAStoreConfigurationTester.class, LDAPUserGroupJPARoleConfigurationTester.class}) public void testPagination() throws Exception { T identityType = null; for (int i = 0; i < 50; i++) { identityType = createIdentityType("someIdentityType" + (i + 1), null); } IdentityManager identityManager = getIdentityManager(); IdentityQuery<T> query = identityManager.createIdentityQuery((Class<T>) identityType.getClass()); query.setLimit(10); query.setOffset(0); int resultCount = query.getResultCount(); assertEquals(50, resultCount); List<T> firstPage = query.getResultList(); assertEquals(10, firstPage.size()); List<String> agentIds = new ArrayList<String>(); for (T result : firstPage) { agentIds.add(result.getId()); } query.setOffset(10); List<T> secondPage = query.getResultList(); assertEquals(10, secondPage.size()); for (T result : secondPage) { assertFalse(agentIds.contains(result.getId())); agentIds.add(result.getId()); } query.setOffset(20); List<T> thirdPage = query.getResultList(); assertEquals(10, thirdPage.size()); for (T result : thirdPage) { assertFalse(agentIds.contains(result.getId())); agentIds.add(result.getId()); } query.setOffset(30); List<T> fourthPage = query.getResultList(); assertEquals(10, fourthPage.size()); for (T result : fourthPage) { assertFalse(agentIds.contains(result.getId())); agentIds.add(result.getId()); } query.setOffset(40); List<T> fifthyPage = query.getResultList(); assertEquals(10, fifthyPage.size()); for (T result : fifthyPage) { assertFalse(agentIds.contains(result.getId())); agentIds.add(result.getId()); } assertEquals(50, agentIds.size()); query.setOffset(50); List<T> invalidPage = query.getResultList(); assertTrue(invalidPage.isEmpty()); } @Test @Configuration(exclude = {LDAPStoreConfigurationTester.class, SingleConfigLDAPJPAStoreConfigurationTester.class, LDAPUserGroupJPARoleConfigurationTester.class}) public void testFindByRealm() throws Exception { IdentityManager identityManager = getIdentityManager(); T someTypeDefaultRealm = createIdentityType(null, null); IdentityQuery<T> query = identityManager.createIdentityQuery((Class<T>) someTypeDefaultRealm.getClass()); Realm defaultRealm = getPartitionManager().getPartition(Realm.class, Realm.DEFAULT_REALM); assertNotNull(defaultRealm); query.setParameter(IdentityType.PARTITION, defaultRealm); List<T> result = query.getResultList(); assertFalse(result.isEmpty()); assertEquals(1, result.size()); assertEquals(someTypeDefaultRealm.getId(), result.get(0).getId()); getPartitionManager().add(new Realm("Testing Realm")); Realm testingRealm = getPartitionManager().getPartition(Realm.class, "Testing Realm"); assertNotNull(testingRealm); T someAnotherTypeTestingRealm = createIdentityType("someAnotherType", testingRealm); query = getPartitionManager().createIdentityManager(testingRealm).createIdentityQuery( (Class<T>) someTypeDefaultRealm.getClass()); query.setParameter(Agent.PARTITION, testingRealm); result = query.getResultList(); assertFalse(result.isEmpty()); assertEquals(1, result.size()); assertEquals(someAnotherTypeTestingRealm.getId(), result.get(0).getId()); } @Test @Configuration(exclude = {LDAPStoreConfigurationTester.class, SingleConfigLDAPJPAStoreConfigurationTester.class, LDAPUserGroupJPARoleConfigurationTester.class}) public void testFindEnabledAndDisabled() throws Exception { T someType = createIdentityType(null, null); T someAnotherType = createIdentityType("someAnotherAgent", null); someType.setEnabled(true); someAnotherType.setEnabled(true); IdentityManager identityManager = getIdentityManager(); identityManager.update(someType); identityManager.update(someAnotherType); IdentityQuery<T> query = identityManager.<T>createIdentityQuery((Class<T>) someType.getClass()); query.setParameter(IdentityType.ENABLED, true); // all enabled users List<T> result = query.getResultList(); assertFalse(result.isEmpty()); assertEquals(2, result.size()); assertTrue(contains(result, someType.getId())); assertTrue(contains(result, someAnotherType.getId())); query = identityManager.<T>createIdentityQuery((Class<T>) someType.getClass()); query.setParameter(IdentityType.ENABLED, false); // only disabled users. No users are disabled. result = query.getResultList(); assertTrue(result.isEmpty()); someType.setEnabled(false); // let's disabled the user and try to find him identityManager.update(someType); query = identityManager.<T>createIdentityQuery((Class<T>) someType.getClass()); query.setParameter(IdentityType.ENABLED, false); // get the previously disabled user result = query.getResultList(); assertFalse(result.isEmpty()); assertEquals(1, result.size()); assertTrue(contains(result, someType.getId())); someAnotherType.setEnabled(false); // let's disabled the user and try to find him identityManager.update(someAnotherType); query = identityManager.<T>createIdentityQuery((Class<T>) someType.getClass()); query.setParameter(IdentityType.ENABLED, true); result = query.getResultList(); assertTrue(result.isEmpty()); } @Test @Configuration(exclude = {LDAPStoreConfigurationTester.class, SingleConfigLDAPJPAStoreConfigurationTester.class, LDAPUserGroupJPARoleConfigurationTester.class, MultipleIdentityConfigurationTester.class}) public void testFindCreationDate() throws Exception { T identityType = createIdentityType(null, null); IdentityManager identityManager = getIdentityManager(); IdentityQuery<T> query = identityManager.<T>createIdentityQuery((Class<T>) identityType.getClass()); query.setParameter(IdentityType.CREATED_DATE, identityType.getCreatedDate()); Thread.sleep(1000); // only the previously created user List<T> result = query.getResultList(); assertFalse(result.isEmpty()); assertEquals(1, result.size()); assertEquals(identityType.getId(), result.get(0).getId()); query = identityManager.<T>createIdentityQuery((Class<T>) identityType.getClass()); Calendar futureDate = Calendar.getInstance(); futureDate.add(Calendar.MINUTE, 1); query.setParameter(IdentityType.CREATED_DATE, futureDate.getTime()); assertTrue(query.getResultList().isEmpty()); } @Test @Configuration(exclude = {LDAPStoreConfigurationTester.class, SingleConfigLDAPJPAStoreConfigurationTester.class, LDAPUserGroupJPARoleConfigurationTester.class}) public void testFindExpiryDate() throws Exception { T identityType = createIdentityType(null, null); Date expirationDate = new Date(); IdentityManager identityManager = getIdentityManager(); identityType = getIdentityType(); identityType.setExpirationDate(expirationDate); identityManager.update(identityType); IdentityQuery<T> query = identityManager.<T>createIdentityQuery((Class<T>) identityType.getClass()); query.setParameter(IdentityType.EXPIRY_DATE, identityType.getExpirationDate()); // all expired users List<T> result = query.getResultList(); assertFalse(result.isEmpty()); assertEquals(1, result.size()); assertEquals(identityType.getId(), result.get(0).getId()); query = identityManager.<T>createIdentityQuery((Class<T>) identityType.getClass()); Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.MINUTE, 1); query.setParameter(IdentityType.EXPIRY_DATE, calendar.getTime()); // no users result = query.getResultList(); assertTrue(result.isEmpty()); } @Test public void testFindBetweenCreationDate() throws Exception { T identityType = createIdentityType(null, null); T someAnotherIdentityType = createIdentityType("someAnotherAgent", null); IdentityManager identityManager = getIdentityManager(); IdentityQuery<T> query = identityManager.<T>createIdentityQuery((Class<T>) identityType.getClass()); Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.SECOND, -10); // users between the given time period query.setParameter(IdentityType.CREATED_AFTER, calendar.getTime()); query.setParameter(IdentityType.CREATED_BEFORE, new Date()); List<T> result = query.getResultList(); assertFalse(result.isEmpty()); assertEquals(2, result.size()); assertTrue(contains(result, identityType.getId())); assertTrue(contains(result, someAnotherIdentityType.getId())); query = identityManager.<T>createIdentityQuery((Class<T>) identityType.getClass()); T someFutureType = createIdentityType("someFutureAgent", null); T someAnotherFutureType = createIdentityType("someAnotherFutureAgent", null); // users created after the given time query.setParameter(IdentityType.CREATED_AFTER, calendar.getTime()); result = query.getResultList(); assertFalse(result.isEmpty()); assertEquals(4, result.size()); assertTrue(contains(result, identityType.getId())); assertTrue(contains(result, someAnotherIdentityType.getId())); assertTrue(contains(result, someFutureType.getId())); assertTrue(contains(result, someAnotherFutureType.getId())); query = identityManager.<T>createIdentityQuery((Class<T>) identityType.getClass()); // users created before the given time query.setParameter(IdentityType.CREATED_BEFORE, new Date()); result = query.getResultList(); assertFalse(result.isEmpty()); assertEquals(4, result.size()); assertTrue(contains(result, identityType.getId())); assertTrue(contains(result, someAnotherIdentityType.getId())); assertTrue(contains(result, someFutureType.getId())); assertTrue(contains(result, someAnotherFutureType.getId())); query = identityManager.<T>createIdentityQuery((Class<T>) identityType.getClass()); calendar = Calendar.getInstance(); calendar.add(Calendar.MINUTE, 1); query.setParameter(IdentityType.CREATED_AFTER, calendar.getTime()); result = query.getResultList(); assertTrue(result.isEmpty()); } @Test @Configuration(exclude = {LDAPStoreConfigurationTester.class, SingleConfigLDAPJPAStoreConfigurationTester.class, LDAPUserGroupJPARoleConfigurationTester.class}) public void testFindBetweenExpirationDate() throws Exception { T identityType = createIdentityType(null, null); Date currentDate = new Date(); identityType.setExpirationDate(currentDate); IdentityManager identityManager = getIdentityManager(); identityManager.update(identityType); T someAnotherType = createIdentityType("someAnotherAgent", null); someAnotherType.setExpirationDate(currentDate); identityManager.update(someAnotherType); IdentityQuery<T> query = identityManager.<T>createIdentityQuery((Class<T>) identityType.getClass()); Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.YEAR, -1); Date expiryDate = calendar.getTime(); // users between the given time period query.setParameter(IdentityType.EXPIRY_AFTER, expiryDate); query.setParameter(IdentityType.EXPIRY_BEFORE, currentDate); T someFutureType = createIdentityType("someFutureAgent", null); calendar = Calendar.getInstance(); calendar.add(Calendar.MINUTE, 1); someFutureType.setExpirationDate(calendar.getTime()); identityManager.update(someFutureType); T someAnotherFutureType = createIdentityType("someAnotherFutureAgent", null); someAnotherFutureType.setExpirationDate(calendar.getTime()); identityManager.update(someAnotherFutureType); List<T> result = query.getResultList(); assertFalse(result.isEmpty()); assertEquals(2, result.size()); assertTrue(contains(result, identityType.getId())); assertTrue(contains(result, someAnotherType.getId())); query = identityManager.<T>createIdentityQuery((Class<T>) identityType.getClass()); // users expired after the given time query.setParameter(IdentityType.EXPIRY_AFTER, expiryDate); result = query.getResultList(); assertFalse(result.isEmpty()); assertEquals(4, result.size()); assertTrue(contains(result, identityType.getId())); assertTrue(contains(result, someAnotherType.getId())); assertTrue(contains(result, someFutureType.getId())); assertTrue(contains(result, someAnotherFutureType.getId())); query = identityManager.<T>createIdentityQuery((Class<T>) identityType.getClass()); calendar = Calendar.getInstance(); calendar.add(Calendar.MINUTE, 1); // users expired before the given time query.setParameter(IdentityType.EXPIRY_BEFORE, calendar.getTime()); result = query.getResultList(); assertFalse(result.isEmpty()); assertEquals(4, result.size()); assertTrue(contains(result, identityType.getId())); assertTrue(contains(result, someAnotherType.getId())); assertTrue(contains(result, someFutureType.getId())); assertTrue(contains(result, someAnotherFutureType.getId())); query = identityManager.<T>createIdentityQuery((Class<T>) identityType.getClass()); calendar = Calendar.getInstance(); calendar.add(Calendar.MINUTE, 2); // users expired after the given time. Should return an empty list. query.setParameter(IdentityType.EXPIRY_AFTER, calendar.getTime()); result = query.getResultList(); assertTrue(result.isEmpty()); } @Test @Configuration(exclude = {LDAPStoreConfigurationTester.class, SingleConfigLDAPJPAStoreConfigurationTester.class, LDAPUserGroupJPARoleConfigurationTester.class}) public void testFindByMultipleParameters() throws Exception { T identityType = createIdentityType(null, null); IdentityManager identityManager = getIdentityManager(); identityManager.update(identityType); identityType.setAttribute(new Attribute<String>("someAttribute", "someAttributeValue")); identityManager.update(identityType); IdentityQuery<T> query = identityManager.<T>createIdentityQuery((Class<T>) identityType.getClass()); query.setParameter(IdentityType.QUERY_ATTRIBUTE.byName("someAttribute"), "someAttributeValue"); List<T> result = query.getResultList(); assertFalse(result.isEmpty()); assertEquals(1, result.size()); assertTrue(contains(result, identityType.getId())); query = identityManager.<T>createIdentityQuery((Class<T>) identityType.getClass()); query.setParameter(IdentityType.ENABLED, identityType.isEnabled()); query.setParameter(IdentityType.QUERY_ATTRIBUTE.byName("someAttribute"), "someAttributeValue2"); result = query.getResultList(); assertTrue(result.isEmpty()); query = identityManager.<T>createIdentityQuery((Class<T>) identityType.getClass()); query.setParameter(IdentityType.QUERY_ATTRIBUTE.byName("someAttribute"), "someAttributeValue"); result = query.getResultList(); assertFalse(result.isEmpty()); assertEquals(1, result.size()); assertTrue(contains(result, identityType.getId())); query = identityManager.<T>createIdentityQuery((Class<T>) identityType.getClass()); query.setParameter(IdentityType.QUERY_ATTRIBUTE.byName("someAttribute"), "someAttributeValue"); query.setParameter(IdentityType.ENABLED, !identityType.isEnabled()); result = query.getResultList(); assertTrue(result.isEmpty()); } @Test @Configuration(exclude = {LDAPStoreConfigurationTester.class, SingleConfigLDAPJPAStoreConfigurationTester.class, LDAPUserGroupJPARoleConfigurationTester.class}) public void testFindByDefinedAttributes() throws Exception { T identityType = createIdentityType(null, null); identityType.setAttribute(new Attribute<String>("someAttribute", "someAttributeValue")); IdentityManager identityManager = getIdentityManager(); identityManager.update(identityType); IdentityQuery<T> query = identityManager.<T>createIdentityQuery((Class<T>) identityType.getClass()); query.setParameter(IdentityType.QUERY_ATTRIBUTE.byName("someAttribute"), "someAttributeValue"); List<T> result = query.getResultList(); assertFalse(result.isEmpty()); assertEquals(1, result.size()); assertTrue(contains(result, identityType.getId())); identityType.setAttribute(new Attribute<String>("someAttribute", "someAttributeValueChanged")); identityManager.update(identityType); query = identityManager.<T>createIdentityQuery((Class<T>) identityType.getClass()); query.setParameter(IdentityType.QUERY_ATTRIBUTE.byName("someAttribute"), "someAttributeValue"); result = query.getResultList(); assertTrue(result.isEmpty()); identityType.setAttribute(new Attribute<String>("someAttribute2", "someAttributeValue2")); identityManager.update(identityType); query = identityManager.<T>createIdentityQuery((Class<T>) identityType.getClass()); query.setParameter(IdentityType.QUERY_ATTRIBUTE.byName("someAttribute"), "someAttributeValueChanged"); query.setParameter(IdentityType.QUERY_ATTRIBUTE.byName("someAttribute2"), "someAttributeValue2"); result = query.getResultList(); assertFalse(result.isEmpty()); assertEquals(1, result.size()); assertTrue(contains(result, identityType.getId())); } @Test @Configuration(exclude = {LDAPStoreConfigurationTester.class, SingleConfigLDAPJPAStoreConfigurationTester.class, LDAPUserGroupJPARoleConfigurationTester.class}) public void testFindByMultiValuedAttributes() throws Exception { T identityType = createIdentityType(null, null); identityType.setAttribute(new Attribute<String[]>("someAttribute", new String[]{"someAttributeValue1", "someAttributeValue2"})); IdentityManager identityManager = getIdentityManager(); identityManager.update(identityType); IdentityQueryBuilder queryBuilder = identityManager.getQueryBuilder(); IdentityQuery<T> query = queryBuilder.createIdentityQuery((Class<T>) identityType.getClass()); query.where(queryBuilder.in(IdentityType.QUERY_ATTRIBUTE.byName("someAttribute"), new Object[]{"someAttributeValue1", "someAttributeValue2"})); List<T> result = query.getResultList(); assertFalse(result.isEmpty()); assertEquals(1, result.size()); assertTrue(contains(result, identityType.getId())); query = queryBuilder.<T>createIdentityQuery((Class<T>) identityType.getClass()); query.where(queryBuilder.in(IdentityType.QUERY_ATTRIBUTE.byName("someAttribute2"), new Object[]{"someAttributeValue1", "someAttributeValue2"})); result = query.getResultList(); assertTrue(result.isEmpty()); query = queryBuilder.<T>createIdentityQuery((Class<T>) identityType.getClass()); query.where(queryBuilder.in(IdentityType.QUERY_ATTRIBUTE.byName("someAttribute"), new Object[]{"someAttributeValueChanged", "someAttributeValue2"})); result = query.getResultList(); assertTrue(result.isEmpty()); query = queryBuilder.<T>createIdentityQuery((Class<T>) identityType.getClass()); query.where(queryBuilder.in(IdentityType.QUERY_ATTRIBUTE.byName("someAttribute"), new Object[]{"someAttributeValue"})); result = query.getResultList(); assertTrue(result.isEmpty()); identityType.setAttribute(new Attribute<String[]>("someAttribute", new String[]{"someAttributeValue1", "someAttributeValueChanged"})); identityType.setAttribute(new Attribute<String[]>("someAttribute2", new String[]{"someAttribute2Value1", "someAttribute2Value2"})); identityManager.update(identityType); query = queryBuilder.<T>createIdentityQuery((Class<T>) identityType.getClass()); query.where(queryBuilder.in(IdentityType.QUERY_ATTRIBUTE.byName("someAttribute"), new Object[]{"someAttributeValue1", "someAttributeValueChanged"})); query.where(queryBuilder.in(IdentityType.QUERY_ATTRIBUTE.byName("someAttribute2"), new Object[]{"someAttribute2Value1", "someAttribute2Value2"})); result = query.getResultList(); assertFalse(result.isEmpty()); assertEquals(1, result.size()); assertTrue(contains(result, identityType.getId())); query = queryBuilder.<T>createIdentityQuery((Class<T>) identityType.getClass()); query.where(queryBuilder.in(IdentityType.QUERY_ATTRIBUTE.byName("someAttribute"), new Object[]{"someAttributeValue1", "someAttributeValueChanged"})); query.where(queryBuilder.in(IdentityType.QUERY_ATTRIBUTE.byName("someAttribute2"), new Object[]{"someAttribute2ValueChanged", "someAttribute2Value2"})); result = query.getResultList(); assertTrue(result.isEmpty()); } @Test @Configuration(exclude = {LDAPStoreConfigurationTester.class, SingleConfigLDAPJPAStoreConfigurationTester.class, LDAPUserGroupJPARoleConfigurationTester.class}) public void testFindByTier() throws Exception { T someType = createInstance("someType"); getPartitionManager().add(new Tier("Application A")); Tier applicationATier = getPartitionManager().getPartition(Tier.class, "Application A"); IdentityManager applicationA = getPartitionManager().createIdentityManager(applicationATier); applicationA.add(someType); IdentityQuery<T> query = (IdentityQuery<T>) applicationA.createIdentityQuery(someType.getClass()); query.setParameter(IdentityType.PARTITION, applicationATier); List<T> result = query.getResultList(); assertFalse(result.isEmpty()); assertEquals(1, result.size()); assertTrue(contains(result, someType.getId())); getPartitionManager().add(new Tier("Application B")); Tier applicationBTier = getPartitionManager().getPartition(Tier.class, "Application B"); IdentityManager applicationB = getPartitionManager().createIdentityManager(applicationBTier); T anotherRole = createInstance("anotherType"); applicationB.add(anotherRole); query = (IdentityQuery<T>) applicationB.createIdentityQuery(someType.getClass()); query.setParameter(Role.PARTITION, applicationBTier); result = query.getResultList(); assertFalse(result.isEmpty()); assertEquals(1, result.size()); assertTrue(contains(result, anotherRole.getId())); } protected boolean containsMembership(List<GroupMembership> result, Account account) { for (GroupMembership identityType : result) { if (identityType.getMember().getId().equals(account.getId())) { return true; } } return false; } protected boolean containsMembership(List<GroupMembership> result, Group group) { for (GroupMembership identityType : result) { if (identityType.getGroup().getId().equals(group.getId())) { return true; } } return false; } protected boolean containsGrant(List<Grant> result, IdentityType identityType) { for (Grant grant : result) { if (Account.class.isInstance(identityType)) { if (grant.getAssignee().getId().equals(identityType.getId())) { return true; } } else { if (grant.getRole().getId().equals(identityType.getId())) { return true; } } } return false; } protected boolean contains(List<T> result, String id) { for (T identityType : result) { if (identityType.getId().equals(id)) { return true; } } return false; } }