A) Appendix

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer sapien purus, congue a tincidunt non, mollis vitae diam. Fusce pharetra massa interdum nisl ultrices mattis. Cras eget est ultricies magna auctor condimentum. Phasellus sed elit erat, a ultricies arcu. Proin vitae volutpat ante. Quisque porta tempor elit, non aliquam tortor sodales nec. Sed imperdiet metus sed orci adipiscing faucibus. Nulla facilisi. Nulla massa tortor, dapibus a vehicula vel, cursus vel mi. Integer sed lacus velit. Etiam dignissim varius turpis ut ullamcorper. Integer lobortis imperdiet dui, ut porta nulla interdum ac. Nulla neque lorem, bibendum et venenatis a, convallis in arcu. In sagittis neque ac mauris venenatis id elementum elit lacinia. Phasellus porttitor turpis eu ipsum pharetra eleifend. Integer ac magna sit amet mi luctus scelerisque at a odio. Quisque sed mi nibh, ac pretium felis. Nunc congue sapien sit amet ipsum elementum ac euismod justo mollis. Etiam dictum elementum libero sed sagittis.

A.1 Javadoc for RandomGenerator pattern

Lazy.random() uses the pattern described further.

Random generator uses a pattern to generate a random sequence based on given pattern. The supported characters are (can appear in pattern string):

  •  # - numeric
  • a - lowercase letter
  • A - uppercase letter
  • ? - lowercase and uppercase letter
  • . - any character
Any other character inside the pattern is directly printed to the output. Backslash  ( \ ) is used to escape any character. For instance pattern "###\\.##" prints a floating point random number

A.2 Database table connector Groovy configuration files

We will observe four groovy scripts used in database table connector, one is generic, the second is specific for MySQL database, third is private generic and fourth is private for MySQL database contains connection username/password.

A.2.1 Public generic:${connectorName}/config/config.groovy

Contains the test public settings.

/*  +---------------------------------------------------+
 *  ----------- Contract Tests configuration ------------
 *  +---------------------------------------------------+
 */

import org.identityconnectors.contract.data.groovy.Lazy
import org.identityconnectors.contract.data.groovy.Random
import org.identityconnectors.contract.data.groovy.Get
import org.identityconnectors.contract.exceptions.ObjectNotFoundException;


// Connector WRONG configuration for ValidateApiOpTests
connector.i1.wrong.host=""
connector.i2.wrong.login=""
connector.i3.wrong.password=""


testsuite {
    // path to bundle jar - property is set by ant - leave it as it is
    bundleJar=System.getProperty("bundleJar")
    bundleName=System.getProperty("bundleName")
    bundleVersion=System.getProperty("bundleVersion")
    connectorName="org.identityconnectors.databasetable.DatabaseTableConnector"

    // ValidateApiOpTests:
    Validate.iterations="3"

    // AuthenticationApiOpTests:
    Authentication.__ACCOUNT__.username=Lazy.get("i0.Authentication.__ACCOUNT__.__NAME__")
    Authentication.__ACCOUNT__.wrong.password=new org.identityconnectors.common.security.GuardedString("bogus".toCharArray())

    // SyncApiOpTests:
    Sync.disable.delete=true

    // SchemaApiOpTests:
    Schema.oclasses=['__ACCOUNT__']
    Schema.attributes.__ACCOUNT__.oclasses=['__NAME__', '__PASSWORD__', 'MANAGER',
        'MIDDLENAME', 'FIRSTNAME', 'LASTNAME', 'EMAIL', 'DEPARTMENT', 'TITLE', 'AGE', 'SALARY', 'JPEGPHOTO']


    Schema.__NAME__.attribute.__ACCOUNT__.oclasses=[
        type: java.lang.String.class,
        readable: true,
        createable: true,
        updateable: true,
        required: true,
        multiValue: false,
        returnedByDefault: true
    ]

    Schema.__PASSWORD__.attribute.__ACCOUNT__.oclasses=[
        type: "org.identityconnectors.common.security.GuardedString",
        readable: false,
        createable: true,
        updateable: true,
        required: true,
        multiValue: false,
        returnedByDefault: true
    ]
    // many attributes have similar values
    Schema.common.attribute=[
        type: java.lang.String.class,
        readable: true,
        createable: true,
        updateable: true,
        required: false,
        multiValue: false,
        returnedByDefault: true
    ]
    Schema.MIDDLENAME.attribute.__ACCOUNT__.oclasses=Lazy.get("testsuite.Schema.common.attribute")
    Schema.FIRSTNAME.attribute.__ACCOUNT__.oclasses=Lazy.get("testsuite.Schema.common.attribute")
    Schema.MANAGER.attribute.__ACCOUNT__.oclasses=Lazy.get("testsuite.Schema.common.attribute")
    Schema.EMAIL.attribute.__ACCOUNT__.oclasses=Lazy.get("testsuite.Schema.common.attribute")
    Schema.DEPARTMENT.attribute.__ACCOUNT__.oclasses=Lazy.get("testsuite.Schema.common.attribute")
    Schema.TITLE.attribute.__ACCOUNT__.oclasses=Lazy.get("testsuite.Schema.common.attribute")
    Schema.LASTNAME.attribute.__ACCOUNT__.oclasses=Lazy.get("testsuite.Schema.common.attribute")

    Schema.AGE.attribute.__ACCOUNT__.oclasses=[
        type: java.lang.Integer.class,
        readable: true,
        createable: true,
        updateable: true,
        required: false,
        multiValue: false,
        returnedByDefault: true
    ]

    Schema.SALARY.attribute.__ACCOUNT__.oclasses=[
        type: "java.math.BigDecimal",
        readable: true,
        createable: true,
        updateable: true,
        required: false,
        multiValue: false,
        returnedByDefault: true
    ]

    Schema.JPEGPHOTO.attribute.__ACCOUNT__.oclasses=[
        type: "[B",
        readable: true,
        createable: true,
        updateable: true,
        required: false,
        multiValue: false,
        returnedByDefault: false
    ]

    // object classes supported by operations
    Schema.operations=[
        GetApiOp: ['__ACCOUNT__'],
        SchemaApiOp: ['__ACCOUNT__'],
        ValidateApiOp: ['__ACCOUNT__'],
        CreateApiOp: ['__ACCOUNT__'],
        SearchApiOp: ['__ACCOUNT__'],
        DeleteApiOp: ['__ACCOUNT__'],
        ScriptOnConnectorApiOp: ['__ACCOUNT__'],
        UpdateApiOp: ['__ACCOUNT__'],
        AuthenticationApiOp: ['__ACCOUNT__'],
        TestApiOp: ['__ACCOUNT__'],
        SyncApiOp: [] // sync column is missing in the tables.
    ]

} // testsuite


// ATTRIBUTES' VALUES:
// longer bytearray value
JPEGPHOTO=Lazy.random("????????????????????????????????????????", byte[].class)
                    

A.2.2 Public configuration specific (mysql):${connectorName}/config/mysql/config.groovy

Contains the configuration specific public settings.

/*  +---------------------------------------------------+
 *  ----------- Contract Tests configuration ------------
 *  +---------------------------------------------------+ 
 */

import org.identityconnectors.contract.data.groovy.Lazy
import org.identityconnectors.contract.data.groovy.Random
import org.identityconnectors.contract.data.groovy.Get
import org.identityconnectors.contract.exceptions.ObjectNotFoundException;

// Connector configuration
connector{
    driver="com.mysql.jdbc.Driver"
    keyColumn="ACCOUNTID"
    DBTable="idm_sync"
}
                    

A.2.3 Private generic:${connectorName}/config-private/config.groovy

Could contains the private settings.

/*  +---------------------------------------------------+
 *  ----------- Contract Tests configuration ------------
 *  +---------------------------------------------------+ 
 */
                    

A.2.4 private configuration specific (mysql):${connectorName}/config-private/mysql/config.groovy

Contains the configuration private settings like a database url and private credentials.

/*  +---------------------------------------------------+
 *  ----------- Contract Tests configuration ------------
 *  +---------------------------------------------------+ 
 */

import org.identityconnectors.contract.data.groovy.Lazy
import org.identityconnectors.contract.data.groovy.Random
import org.identityconnectors.contract.data.groovy.Get
connectionUrl="jdbc:mysql://localhost/database"
    login="loginname"
    password="password"
}