/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright (c) 2014 ForgeRock AS. All Rights Reserved * * The contents of this file are subject to the terms * of the Common Development and Distribution License * (the License). You may not use this file except in * compliance with the License. * * You can obtain a copy of the License at * http://forgerock.org/license/CDDLv1.0.html * See the License for the specific language governing * permission and limitations under the License. * * When distributing Covered Code, include this CDDL * Header Notice in each file and include the License file * at http://forgerock.org/license/CDDLv1.0.html * If applicable, add the following below the CDDL Header, * with the fields enclosed by brackets [] replaced by * your own identifying information: * "Portions Copyrighted [year] [name of copyright owner]" */ package org.forgerock.openicf.connectors; import static org.fest.assertions.api.Assertions.assertThat; import static org.forgerock.openicf.connectors.RESTTestBase.createConnectorFacade; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.HashSet; import java.util.Set; import org.apache.commons.io.IOUtils; import org.forgerock.openicf.connectors.scriptedsql.ScriptedSQLConnector; import org.forgerock.openicf.misc.scriptedcommon.ScriptedConnectorBase; import org.identityconnectors.common.logging.Log; import org.identityconnectors.framework.api.ConnectorFacade; import org.identityconnectors.framework.common.objects.Attribute; import org.identityconnectors.framework.common.objects.AttributeBuilder; import org.identityconnectors.framework.common.objects.AttributeUtil; import org.identityconnectors.framework.common.objects.ConnectorObject; import org.identityconnectors.framework.common.objects.Name; import org.identityconnectors.framework.common.objects.ObjectClass; import org.identityconnectors.framework.common.objects.OperationOptionsBuilder; import org.identityconnectors.framework.common.objects.Schema; import org.identityconnectors.framework.common.objects.ScriptContextBuilder; import org.identityconnectors.framework.common.objects.Uid; import org.identityconnectors.framework.impl.api.local.LocalConnectorFacadeImpl; import org.identityconnectors.test.common.PropertyBag; import org.identityconnectors.test.common.TestHelpers; import org.testng.Assert; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; /** * A NAME does ... * * @author Laszlo Hordos */ public class ScriptedSQLConnectorTest { /** * Setup logging for the {@link ScriptedSQLConnectorTest}. */ private static final Log logger = Log.getLog(ScriptedSQLConnectorTest.class); protected static final String TEST_NAME = "SQL"; private ConnectorFacade facadeInstance; @BeforeClass public void startServer() throws Exception { Connection con = getConnection(); Statement stmt = con.createStatement(); try { InputStream in = ScriptedSQLConnectorTest.class.getResourceAsStream("/sql/testDatabase.ddl"); Assert.assertNotNull(in); stmt.execute(IOUtils.toString(in)); } finally { stmt.close(); con.close(); } } @AfterClass public void stopServer() throws Exception { Connection con = getConnection(); Statement stmt = con.createStatement(); try { stmt.execute("SHUTDOWN"); } finally { stmt.close(); con.close(); } } @Test public void validate() throws Exception { final ConnectorFacade facade = getFacade(TEST_NAME); facade.validate(); } @Test public void testTest() throws Exception { final ConnectorFacade facade = getFacade(TEST_NAME); facade.test(); } @Test public void testSchema() throws Exception { final ConnectorFacade facade = getFacade(TEST_NAME); Schema schema = facade.schema(); Assert.assertEquals(schema.getObjectClassInfo().size(), 3); } @Test public void testCreateUpdateDeleteUser() throws Exception { final ConnectorFacade facade = getFacade(TEST_NAME); Set<Attribute> createAttributes = createUserAttributes(1, "John", "Doe"); Uid uid = facade.create(ObjectClass.ACCOUNT, createAttributes, null); ConnectorObject co = facade.getObject(ObjectClass.ACCOUNT, uid, null); assertThat(AttributeUtil.filterUid(co.getAttributes())).containsAll(createAttributes); Set<Attribute> updateAttributes = new HashSet<Attribute>(); for (Attribute attr : createAttributes) { if (attr.is("firstname")){ updateAttributes.add(AttributeBuilder.build("firstname", "Johny")); } else { updateAttributes.add(attr); } } uid = facade.update(ObjectClass.ACCOUNT, co.getUid(), updateAttributes, null); co = facade.getObject(ObjectClass.ACCOUNT, uid, null); assertThat(AttributeUtil.filterUid(co.getAttributes())).containsAll(updateAttributes); facade.delete(ObjectClass.ACCOUNT, uid, null); Assert.assertNull(facade.getObject(ObjectClass.ACCOUNT, uid, null)); } @Test public void testCreateUpdateDeleteGroup() throws Exception { final ConnectorFacade facade = getFacade(TEST_NAME); Set<Attribute> createAttributes = createGroupAttributes(1, "GROUP#1"); Uid uid = facade.create(ObjectClass.GROUP, createAttributes, null); ConnectorObject co = facade.getObject(ObjectClass.GROUP, uid, null); assertThat(AttributeUtil.filterUid(co.getAttributes())).containsAll(createAttributes); Set<Attribute> updateAttributes = new HashSet<Attribute>(); for (Attribute attr : createAttributes) { if (attr.is("description")){ updateAttributes.add(AttributeBuilder.build("description", "Updated Description")); } else { updateAttributes.add(attr); } } uid = facade.update(ObjectClass.GROUP, co.getUid(), updateAttributes, null); co = facade.getObject(ObjectClass.GROUP, uid, null); assertThat(AttributeUtil.filterUid(co.getAttributes())).containsAll(updateAttributes); facade.delete(ObjectClass.GROUP, uid, null); Assert.assertNull(facade.getObject(ObjectClass.GROUP, uid, null)); } @Test public void testCreateUpdateDeleteOrg() throws Exception { final ConnectorFacade facade = getFacade(TEST_NAME); final ObjectClass ORG = new ObjectClass("organization"); Set<Attribute> createAttributes = createOrgAttributes(1, "ORG#1"); Uid uid = facade.create(ORG, createAttributes, null); ConnectorObject co = facade.getObject(ORG, uid, null); assertThat(AttributeUtil.filterUid(co.getAttributes())).containsAll(createAttributes); Set<Attribute> updateAttributes = new HashSet<Attribute>(); for (Attribute attr : createAttributes) { if (attr.is("description")){ updateAttributes.add(AttributeBuilder.build("description", "Updated Description")); } else { updateAttributes.add(attr); } } uid = facade.update(ORG, co.getUid(), updateAttributes, null); co = facade.getObject(ORG, uid, null); assertThat(AttributeUtil.filterUid(co.getAttributes())).containsAll(updateAttributes); facade.delete(ORG, uid, null); Assert.assertNull(facade.getObject(ORG, uid, null)); } @Test public void testScriptOnConnector() throws Exception { final ConnectorFacade facade = getFacade(TEST_NAME); ScriptContextBuilder builder = new ScriptContextBuilder(); builder.setScriptLanguage(ScriptedConnectorBase.GROOVY); builder.setScriptText("assert null != connection\n assert null != options\n assert null != log\n assert isOK"); builder.addScriptArgument("isOK", true); facade.runScriptOnConnector(builder.build(), new OperationOptionsBuilder().build()); } private Set<Attribute> createUserAttributes(int index, String firstName, String lastName) { Set<Attribute> createAttributes = new HashSet<Attribute>(); createAttributes.add(new Name(lastName.toLowerCase())); createAttributes.add(AttributeBuilder.build("firstname", firstName)); createAttributes.add(AttributeBuilder.build("lastname", lastName)); createAttributes.add(AttributeBuilder.build("displayName", firstName + " " + lastName)); createAttributes.add(AttributeBuilder.build("email", lastName.toLowerCase() + "@example.com")); createAttributes.add(AttributeBuilder.build("employeeNumber", String.format( "072-5570-%04d", index))); createAttributes.add(AttributeBuilder.build("employeeType", index % 3 == 0 ? "employee" : "contractor")); createAttributes.add(AttributeBuilder.build("description", "Sample Description")); createAttributes.add(AttributeBuilder.build("mobilePhone", String.format("1-555-555-%04d", index))); return createAttributes; } private Set<Attribute> createGroupAttributes(int index, String name) { Set<Attribute> createAttributes = new HashSet<Attribute>(); createAttributes.add(new Name(name.toLowerCase())); createAttributes.add(AttributeBuilder.build("gid", String.format("GID%04d", index))); createAttributes.add(AttributeBuilder.build("description", "Sample Description")); return createAttributes; } private Set<Attribute> createOrgAttributes(int index, String name) { Set<Attribute> createAttributes = new HashSet<Attribute>(); createAttributes.add(new Name(name.toLowerCase())); createAttributes.add(AttributeBuilder.build("description", String.format( "Sample Description of Org %04d", index))); return createAttributes; } private Connection getConnection() throws ClassNotFoundException, SQLException { PropertyBag propertyBag = TestHelpers.getProperties(ScriptedConnectorBase.class, TEST_NAME); String jdbcUrl = propertyBag.getStringProperty("configuration.url"); Assert.assertNotNull(jdbcUrl); Class.forName("org.h2.Driver"); return DriverManager.getConnection(jdbcUrl, "sa", "sa"); } protected ConnectorFacade getFacade(String environment) { if (null == facadeInstance) { facadeInstance = createConnectorFacade(ScriptedSQLConnector.class, environment); } return facadeInstance; } @AfterClass public synchronized void afterClass() { ((LocalConnectorFacadeImpl) facadeInstance).dispose(); facadeInstance = null; } @Test public void sampleTest() throws Exception { Connection con = getConnection(); Statement stmt = con.createStatement(); try { ResultSet rs = stmt.executeQuery("SELECT id, UID FROM Users"); while (rs.next()) { String name = rs.getString("uid"); System.out.println(name); } } finally { stmt.close(); con.close(); } } }