/*******************************************************************************
* Cloud Foundry
* Copyright (c) [2009-2016] Pivotal Software, Inc. All Rights Reserved.
*
* This product is licensed to you under the Apache License, Version 2.0 (the "License").
* You may not use this product except in compliance with the License.
*
* This product includes a number of subcomponents with
* separate copyright notices and license terms. Your use of these
* subcomponents is subject to the terms and conditions of the
* subcomponent's license, as noted in the LICENSE file.
*******************************************************************************/
package org.cloudfoundry.identity.uaa.scim.bootstrap;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import org.cloudfoundry.identity.uaa.constants.OriginKeys;
import org.cloudfoundry.identity.uaa.resources.jdbc.JdbcPagingListFactory;
import org.cloudfoundry.identity.uaa.scim.ScimGroup;
import org.cloudfoundry.identity.uaa.scim.ScimGroupExternalMembershipManager;
import org.cloudfoundry.identity.uaa.scim.jdbc.JdbcScimGroupExternalMembershipManager;
import org.cloudfoundry.identity.uaa.scim.jdbc.JdbcScimGroupProvisioning;
import org.cloudfoundry.identity.uaa.test.JdbcTestBase;
import org.cloudfoundry.identity.uaa.zone.IdentityZone;
import org.junit.Before;
import org.junit.Test;
public class ScimExternalGroupBootstrapTests extends JdbcTestBase {
private JdbcScimGroupProvisioning gDB;
private ScimGroupExternalMembershipManager eDB;
private ScimExternalGroupBootstrap bootstrap;
@Before
public void initScimExternalGroupBootstrapTests() {
JdbcPagingListFactory pagingListFactory = new JdbcPagingListFactory(jdbcTemplate, limitSqlAdapter);
gDB = new JdbcScimGroupProvisioning(jdbcTemplate, pagingListFactory);
eDB = new JdbcScimGroupExternalMembershipManager(jdbcTemplate, pagingListFactory);
((JdbcScimGroupExternalMembershipManager) eDB).setScimGroupProvisioning(gDB);
assertEquals(0, gDB.retrieveAll().size());
gDB.create(new ScimGroup(null, "acme", IdentityZone.getUaa().getId()));
gDB.create(new ScimGroup(null, "acme.dev", IdentityZone.getUaa().getId()));
bootstrap = new ScimExternalGroupBootstrap(gDB, eDB);
}
@Test
public void canAddExternalGroups() throws Exception {
Map<String, Map<String, List>> originMap = new HashMap<>();
Map<String, List> externalGroupMap = new HashMap<>();
externalGroupMap.put("cn=Engineering,ou=groups,dc=example,dc=com", Arrays.asList("acme", "acme.dev"));
externalGroupMap.put("cn=HR,ou=groups,dc=example,dc=com", Collections.singletonList("acme"));
externalGroupMap.put("cn=mgmt,ou=groups,dc=example,dc=com", Collections.singletonList("acme"));
originMap.put(OriginKeys.LDAP, externalGroupMap);
bootstrap.setExternalGroupMaps(originMap);
bootstrap.afterPropertiesSet();
assertEquals(2, eDB.getExternalGroupMapsByExternalGroup("cn=Engineering,ou=groups,dc=example,dc=com", OriginKeys.LDAP).size());
assertEquals(1, eDB.getExternalGroupMapsByExternalGroup("cn=HR,ou=groups,dc=example,dc=com", OriginKeys.LDAP).size());
assertEquals(1, eDB.getExternalGroupMapsByExternalGroup("cn=mgmt,ou=groups,dc=example,dc=com", OriginKeys.LDAP).size());
assertEquals(3, eDB.getExternalGroupMapsByGroupName("acme", OriginKeys.LDAP).size());
assertEquals(1, eDB.getExternalGroupMapsByGroupName("acme.dev", OriginKeys.LDAP).size());
}
@Test
public void cannotAddExternalGroupsThatDoNotExist() throws Exception {
Map<String, Map<String, List>> originMap = new HashMap<>();
Map<String, List> externalGroupMap = new HashMap<>();
externalGroupMap.put("cn=Engineering,ou=groups,dc=example,dc=com", Arrays.asList("acme", "acme.dev"));
externalGroupMap.put("cn=HR,ou=groups,dc=example,dc=com", Collections.singletonList("acme"));
externalGroupMap.put("cn=mgmt,ou=groups,dc=example,dc=com", Collections.singletonList("acme"));
originMap.put(OriginKeys.UAA, externalGroupMap);
bootstrap.setExternalGroupMaps(originMap);
bootstrap.afterPropertiesSet();
assertEquals(0, eDB.getExternalGroupMapsByExternalGroup("cn=Engineering,ou=groups,dc=example,dc=com", OriginKeys.LDAP).size());
assertEquals(0, eDB.getExternalGroupMapsByExternalGroup("cn=HR,ou=groups,dc=example,dc=com", OriginKeys.LDAP).size());
assertEquals(0, eDB.getExternalGroupMapsByExternalGroup("cn=mgmt,ou=groups,dc=example,dc=com", OriginKeys.LDAP).size());
assertNull(eDB.getExternalGroupMapsByGroupName("acme1", OriginKeys.LDAP));
assertNull(eDB.getExternalGroupMapsByGroupName("acme1.dev", OriginKeys.LDAP));
}
@Test
public void cannotAddExternalGroupsThatMapToNull() throws Exception {
Map<String, Map<String, List>> originMap = new HashMap<>();
Map<String, List> externalGroupMap = new HashMap<>();
externalGroupMap.put("cn=Engineering,ou=groups,dc=example,dc=com", null);
originMap.put(OriginKeys.LDAP, externalGroupMap);
bootstrap.setExternalGroupMaps(originMap);
bootstrap.afterPropertiesSet();
assertEquals(0, eDB.getExternalGroupMapsByExternalGroup("cn=Engineering,ou=groups,dc=example,dc=com", OriginKeys.LDAP).size());
}
@Test
public void cannotAddOriginMapToNull() throws Exception {
Map<String, Map<String, List>> originMap = new HashMap<>();
originMap.put(OriginKeys.LDAP, null);
bootstrap.setExternalGroupMaps(originMap);
bootstrap.afterPropertiesSet();
}
}