/*
* DO NOT 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://opensource.org/licenses/CDDL-1.0
* 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://opensource.org/licenses/CDDL-1.0
* 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]"
*/
#set( $symbol_pound = '#' )
#set( $symbol_dollar = '$' )
#set( $symbol_escape = '\' )
#if ($ALL_OPERATIONS == 'Y' || $ALL_OPERATIONS == 'y')
#set( $all_operations_safe = true)
#end
#if ( $poolableConnector == 'Y' || $poolableConnector == 'y' )
#set( $poolable_connector_safe = true)
#end
#if ( $attributeNormalizer == 'Y' || $attributeNormalizer == 'y')
#set( $attribute_normalizer_safe = true)
#end
#if ( $all_operations_safe || $OP_AUTHENTICATE == 'Y' || $OP_AUTHENTICATE == 'y' )
#set( $op_authenticate_safe = true)
#end
#if ( $all_operations_safe || $OP_CREATE == 'Y' || $OP_CREATE == 'y')
#set( $op_create_safe = true)
#end
#if ( $all_operations_safe || $OP_DELETE == 'Y' || $OP_DELETE == 'y' )
#set( $op_delete_safe = true)
#end
#if ( $all_operations_safe || $OP_RESOLVEUSERNAME == 'Y' || $OP_RESOLVEUSERNAME == 'y')
#set( $op_resolveusername_safe = true)
#end
#if ( $all_operations_safe || $OP_SCHEMA == 'Y' || $OP_SCHEMA == 'y' )
#set( $op_schema_safe = true)
#end
#if ( $all_operations_safe || $OP_SCRIPTONCONNECTOR == 'Y' || $OP_SCRIPTONCONNECTOR == 'y')
#set( $op_scriptonconnector_safe = true)
#end
#if ( $all_operations_safe || $OP_SCRIPTONRESOURCE == 'Y' || $OP_SCRIPTONRESOURCE == 'y' )
#set( $op_scriptonresource_safe = true)
#end
#if ( $all_operations_safe || $OP_SEARCH == 'Y' || $OP_SEARCH == 'y')
#set( $op_search_safe = true)
#end
#if ( $all_operations_safe || $OP_SYNC == 'Y' || $OP_SYNC == 'y' )
#set( $op_sync_safe = true)
#end
#if ( $all_operations_safe || $OP_TEST == 'Y' || $OP_TEST == 'y')
#set( $op_test_safe = true)
#end
#if ( $all_operations_safe || $OP_UPDATEATTRIBUTEVALUES == 'Y' || $OP_UPDATEATTRIBUTEVALUES == 'y' )
#set( $op_updateattributevalues_safe = true)
#end
#if ( $all_operations_safe || $OP_UPDATE == 'Y' || $OP_UPDATE == 'y')
#set( $op_update_safe = true)
#end
package ${package};
import java.util.HashSet;
import java.util.Set;
import org.identityconnectors.common.logging.Log;
import org.identityconnectors.common.security.GuardedString;
import org.identityconnectors.framework.api.APIConfiguration;
import org.identityconnectors.framework.api.ConnectorFacade;
import org.identityconnectors.framework.api.ConnectorFacadeFactory;
import org.identityconnectors.framework.common.objects.Attribute;
import org.identityconnectors.framework.common.objects.AttributeBuilder;
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.PredefinedAttributes;
import org.identityconnectors.framework.common.objects.ResultsHandler;
import org.identityconnectors.framework.common.objects.Schema;
import org.identityconnectors.framework.common.objects.ScriptContextBuilder;
import org.identityconnectors.framework.common.objects.SearchResult;
import org.identityconnectors.framework.common.objects.SyncDelta;
import org.identityconnectors.framework.common.objects.SyncResultsHandler;
import org.identityconnectors.framework.common.objects.SyncToken;
import org.identityconnectors.framework.common.objects.Uid;
import org.identityconnectors.framework.common.objects.filter.FilterBuilder;
import org.identityconnectors.framework.impl.api.local.LocalConnectorFacadeImpl;
import org.identityconnectors.framework.spi.Connector;
import org.identityconnectors.test.common.PropertyBag;
import org.identityconnectors.test.common.TestHelpers;
import org.identityconnectors.test.common.ToListResultsHandler;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
/**
* Attempts to test the {@link ${connectorName}Connector} with the framework.
*
*/
public class ${connectorName}ConnectorTests {
/**
* Setup logging for the {@link ${connectorName}ConnectorTests}.
*/
private static final Log logger = Log.getLog(${connectorName}ConnectorTests.class);
private ConnectorFacade connectorFacade = null;
/*
* Example test properties.
* See the Javadoc of the TestHelpers class for the location of the public and private configuration files.
*/
private static final PropertyBag PROPERTIES = TestHelpers.getProperties(${connectorName}Connector.class);
@BeforeClass
public void setUp() {
//
//other setup work to do before running tests
//
//Configuration config = new ${connectorName}Configuration();
//Map<String, ? extends Object> configData = (Map<String, ? extends Object>) PROPERTIES.getProperty("configuration",Map.class)
//TestHelpers.fillConfiguration(
}
@AfterClass
public void tearDown() {
//
// clean up resources
//
if (connectorFacade instanceof LocalConnectorFacadeImpl) {
((LocalConnectorFacadeImpl) connectorFacade).dispose();
}
}
@Test
public void exampleTest1() {
logger.info("Running Test 1...");
//You can use TestHelpers to do some of the boilerplate work in running a search
//TestHelpers.search(theConnector, ObjectClass.ACCOUNT, filter, handler, null);
}
@Test
public void exampleTest2() {
logger.info("Running Test 2...");
//Another example using TestHelpers
//List<ConnectorObject> results = TestHelpers.searchToList(theConnector, ObjectClass.GROUP, filter);
}
#if ( $op_authenticate_safe )
@Test
public void authenticateTest() {
logger.info("Running Authentication Test");
final ConnectorFacade facade = getFacade(${connectorName}Connector.class, null);
final OperationOptionsBuilder builder = new OperationOptionsBuilder();
Uid uid =
facade.authenticate(ObjectClass.ACCOUNT, "username", new GuardedString("Passw0rd"
.toCharArray()), builder.build());
Assert.assertEquals(uid.getUidValue(), "username");
}
#end
#if ( $op_create_safe )
@Test
public void createTest() {
logger.info("Running Create Test");
final ConnectorFacade facade = getFacade(${connectorName}Connector.class, null);
final OperationOptionsBuilder builder = new OperationOptionsBuilder();
Set<Attribute> createAttributes = new HashSet<Attribute>();
createAttributes.add(new Name("Foo"));
createAttributes.add(AttributeBuilder.buildPassword("Password".toCharArray()));
createAttributes.add(AttributeBuilder.buildEnabled(true));
Uid uid = facade.create(ObjectClass.ACCOUNT, createAttributes, builder.build());
Assert.assertEquals(uid.getUidValue(), "foo");
}
#end
#if ( $op_delete_safe )
@Test
public void deleteTest() {
logger.info("Running Delete Test");
final ConnectorFacade facade = getFacade(${connectorName}Connector.class, null);
final OperationOptionsBuilder builder = new OperationOptionsBuilder();
facade.delete(ObjectClass.ACCOUNT, new Uid("username"), builder.build());
}
#end
#if ( $op_resolveusername_safe )
@Test
public void resolveUsernameTest() {
logger.info("Running ResolveUsername Test");
final ConnectorFacade facade = getFacade(${connectorName}Connector.class, null);
final OperationOptionsBuilder builder = new OperationOptionsBuilder();
Uid uid = facade.resolveUsername(ObjectClass.ACCOUNT, "username", builder.build());
Assert.assertEquals(uid.getUidValue(), "username");
}
#end
#if ( $op_schema_safe )
@Test
public void schemaTest() {
logger.info("Running Schema Test");
final ConnectorFacade facade = getFacade(${connectorName}Connector.class, null);
Schema schema = facade.schema();
Assert.assertNotNull(schema.findObjectClassInfo(ObjectClass.ACCOUNT_NAME));
}
#end
#if ( $op_scriptonconnector_safe )
@Test
public void runScriptOnConnectorTest() {
logger.info("Running RunScriptOnConnector Test");
final ConnectorFacade facade = getFacade(${connectorName}Connector.class, null);
final OperationOptionsBuilder builder = new OperationOptionsBuilder();
builder.setRunAsUser("admin");
builder.setRunWithPassword(new GuardedString("Passw0rd".toCharArray()));
final ScriptContextBuilder scriptBuilder =
new ScriptContextBuilder("Groovy", "return argument");
scriptBuilder.addScriptArgument("argument", "value");
Object result = facade.runScriptOnConnector(scriptBuilder.build(), builder.build());
Assert.assertEquals(result, "value");
}
#end
#if ( $op_scriptonresource_safe )
@Test
public void runScriptOnResourceTest() {
logger.info("Running RunScriptOnResource Test");
final ConnectorFacade facade = getFacade(${connectorName}Connector.class, null);
final OperationOptionsBuilder builder = new OperationOptionsBuilder();
builder.setRunAsUser("admin");
builder.setRunWithPassword(new GuardedString("Passw0rd".toCharArray()));
final ScriptContextBuilder scriptBuilder = new ScriptContextBuilder("bash", "whoami");
Object result = facade.runScriptOnResource(scriptBuilder.build(), builder.build());
Assert.assertEquals(result, "admin");
}
#end
#if ( $op_search_safe )
@Test
public void getObjectTest() {
logger.info("Running GetObject Test");
final ConnectorFacade facade = getFacade(${connectorName}Connector.class, null);
final OperationOptionsBuilder builder = new OperationOptionsBuilder();
builder.setAttributesToGet(Name.NAME);
ConnectorObject co =
facade.getObject(ObjectClass.ACCOUNT, new Uid(
"3f50eca0-f5e9-11e3-a3ac-0800200c9a66"), builder.build());
Assert.assertEquals(co.getName().getNameValue(), "Foo");
}
@Test
public void searchTest() {
logger.info("Running Search Test");
final ConnectorFacade facade = getFacade(${connectorName}Connector.class, null);
final OperationOptionsBuilder builder = new OperationOptionsBuilder();
builder.setPageSize(10);
final ResultsHandler handler = new ToListResultsHandler();
SearchResult result =
facade.search(ObjectClass.ACCOUNT, FilterBuilder.equalTo(new Name("Foo")), handler,
builder.build());
Assert.assertEquals(result.getPagedResultsCookie(), "0");
Assert.assertEquals(((ToListResultsHandler) handler).getObjects().size(), 1);
}
#end
#if ( $op_sync_safe )
@Test
public void getLatestSyncTokenTest() {
logger.info("Running GetLatestSyncToken Test");
final ConnectorFacade facade = getFacade(${connectorName}Connector.class, null);
SyncToken token = facade.getLatestSyncToken(ObjectClass.ACCOUNT);
Assert.assertEquals(token.getValue(), 10);
}
@Test
public void syncTest() {
logger.info("Running Sync Test");
final ConnectorFacade facade = getFacade(${connectorName}Connector.class, null);
final OperationOptionsBuilder builder = new OperationOptionsBuilder();
builder.setPageSize(10);
final SyncResultsHandler handler = new SyncResultsHandler() {
public boolean handle(SyncDelta delta) {
return false;
}
};
SyncToken token =
facade.sync(ObjectClass.ACCOUNT, new SyncToken(10), handler, builder.build());
Assert.assertEquals(token.getValue(), 10);
}
#end
#if ( $op_test_safe )
@Test
public void testTest() {
logger.info("Running Test Test");
final ConnectorFacade facade = getFacade(${connectorName}Connector.class, null);
facade.test();
}
@Test
public void validateTest() {
logger.info("Running Validate Test");
final ConnectorFacade facade = getFacade(${connectorName}Connector.class, null);
facade.validate();
}
#end
#if ( $op_update_safe )
@Test
public void updateTest() {
logger.info("Running Update Test");
final ConnectorFacade facade = getFacade(${connectorName}Connector.class, null);
final OperationOptionsBuilder builder = new OperationOptionsBuilder();
Set<Attribute> updateAttributes = new HashSet<Attribute>();
updateAttributes.add(new Name("Foo"));
Uid uid = facade.update(ObjectClass.ACCOUNT, new Uid("Foo"), updateAttributes, builder.build());
Assert.assertEquals(uid.getUidValue(), "foo");
}
#end
#if ( $op_updateattributevalues_safe )
@Test
public void addAttributeValuesTest() {
logger.info("Running AddAttributeValues Test");
final ConnectorFacade facade = getFacade(${connectorName}Connector.class, null);
final OperationOptionsBuilder builder = new OperationOptionsBuilder();
Set<Attribute> updateAttributes = new HashSet<Attribute>();
// add 'group2' to existing groups
updateAttributes.add(AttributeBuilder.build(PredefinedAttributes.GROUPS_NAME, "group2"));
Uid uid = facade.addAttributeValues(ObjectClass.ACCOUNT, new Uid("Foo"), updateAttributes, builder.build());
Assert.assertEquals(uid.getUidValue(), "foo");
}
@Test
public void removeAttributeValuesTest() {
logger.info("Running RemoveAttributeValues Test");
final ConnectorFacade facade = getFacade(${connectorName}Connector.class, null);
final OperationOptionsBuilder builder = new OperationOptionsBuilder();
Set<Attribute> updateAttributes = new HashSet<Attribute>();
// remove 'group2' from existing groups
updateAttributes.add(AttributeBuilder.build(PredefinedAttributes.GROUPS_NAME, "group2"));
Uid uid = facade.removeAttributeValues(ObjectClass.ACCOUNT, new Uid("Foo"), updateAttributes, builder.build());
Assert.assertEquals(uid.getUidValue(), "foo");
}
#end
protected ConnectorFacade getFacade(${connectorName}Configuration config) {
ConnectorFacadeFactory factory = ConnectorFacadeFactory.getInstance();
// **test only**
APIConfiguration impl = TestHelpers.createTestConfiguration(${connectorName}Connector.class, config);
return factory.newInstance(impl);
}
protected ConnectorFacade getFacade(Class<? extends Connector> clazz, String environment) {
if (null == connectorFacade) {
synchronized (this) {
if (null == connectorFacade) {
connectorFacade = createConnectorFacade(clazz, environment);
}
}
}
return connectorFacade;
}
public ConnectorFacade createConnectorFacade(Class<? extends Connector> clazz,
String environment) {
PropertyBag propertyBag = TestHelpers.getProperties(clazz, environment);
APIConfiguration impl =
TestHelpers.createTestConfiguration(clazz, propertyBag, "configuration");
impl.setProducerBufferSize(0);
impl.getResultsHandlerConfiguration().setEnableAttributesToGetSearchResultsHandler(false);
impl.getResultsHandlerConfiguration().setEnableCaseInsensitiveFilter(false);
impl.getResultsHandlerConfiguration().setEnableFilteredResultsHandler(false);
impl.getResultsHandlerConfiguration().setEnableNormalizingResultsHandler(false);
//impl.setTimeout(CreateApiOp.class, 25000);
//impl.setTimeout(UpdateApiOp.class, 25000);
//impl.setTimeout(DeleteApiOp.class, 25000);
return ConnectorFacadeFactory.getInstance().newInstance(impl);
}
}