add test cases
diff --git a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/HerdDBDictionary.java b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/HerdDBDictionary.java
index 0165d87..f463049 100644
--- a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/HerdDBDictionary.java
+++ b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/HerdDBDictionary.java
@@ -33,6 +33,7 @@
         delimitedCase = SCHEMA_CASE_LOWER;
 
         supportsCascadeUpdateAction = false;
+        supportsDeferredConstraints = false;
 
         // make OpenJPA escape everything, because Apache Calcite has a lot of reserved words, like 'User', 'Value'...
         setDelimitIdentifiers(true);
diff --git a/openjpa-jdbc/src/test/java/org/apache/openjpa/jdbc/sql/TestHerdDBDictionary.java b/openjpa-jdbc/src/test/java/org/apache/openjpa/jdbc/sql/TestHerdDBDictionary.java
index 8939113..f497f4a 100644
--- a/openjpa-jdbc/src/test/java/org/apache/openjpa/jdbc/sql/TestHerdDBDictionary.java
+++ b/openjpa-jdbc/src/test/java/org/apache/openjpa/jdbc/sql/TestHerdDBDictionary.java
@@ -18,6 +18,7 @@
  */
 package org.apache.openjpa.jdbc.sql;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
@@ -27,7 +28,17 @@
 import java.sql.Statement;
 import javax.sql.DataSource;
 import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
+import org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl;
+import org.apache.openjpa.jdbc.identifier.DBIdentifier;
+import org.apache.openjpa.jdbc.identifier.DBIdentifierUtil;
+import org.apache.openjpa.jdbc.identifier.DBIdentifierUtilImpl;
+import org.apache.openjpa.jdbc.schema.Column;
+import org.apache.openjpa.jdbc.schema.ForeignKey;
+import org.apache.openjpa.jdbc.schema.Schema;
+import org.apache.openjpa.jdbc.schema.SchemaGroup;
+import org.apache.openjpa.jdbc.schema.Table;
 import org.apache.openjpa.kernel.StoreContext;
+import org.hsqldb.types.Types;
 import org.jmock.Expectations;
 import org.jmock.integration.junit4.JUnitRuleMockery;
 import org.junit.Rule;
@@ -37,7 +48,6 @@
     @Rule
     public JUnitRuleMockery context = new JUnitRuleMockery();
 
-    final JDBCConfiguration mockConfiguration = context.mock(JDBCConfiguration.class);
     final Statement mockStatement = context.mock(Statement.class);
     final Connection mockConnection = context.mock(Connection.class);
     final ResultSet mockRS = context.mock(ResultSet.class);
@@ -54,18 +64,116 @@
         context.checking(new Expectations()
         {
             {
-                allowing(mockConfiguration);
+
+                allowing(mockConnection).getMetaData();
+                will(returnValue(mockMetaData));
+
+                allowing(mockMetaData).getDatabaseProductName();
+                will(returnValue("MockDB"));
+
+                allowing(mockMetaData).getDriverName();
+                will(returnValue("MockDB"));
+
+                allowing(mockMetaData).getDriverVersion();
+                will(returnValue("1.0"));
+
+                allowing(mockMetaData).getDatabaseProductVersion();
+                will(returnValue("10"));
+
+                allowing(mockMetaData).getDatabaseMajorVersion();
+                will(returnValue(10));
+
+                allowing(mockMetaData).getDatabaseMinorVersion();
+                will(returnValue(0));
+
+                allowing(mockMetaData).getJDBCMajorVersion();
+                will(returnValue(4));
+
+                allowing(mockMetaData).getJDBCMinorVersion();
+                will(returnValue(0));
+
+                allowing(mockMetaData).supportsMixedCaseIdentifiers();
+                will(returnValue(true));
+
+                allowing(mockMetaData).supportsMixedCaseQuotedIdentifiers();
+                will(returnValue(true));
+
+                allowing(mockMetaData).storesLowerCaseQuotedIdentifiers();
+                will(returnValue(true));
+
+                allowing(mockMetaData).storesUpperCaseQuotedIdentifiers();
+                will(returnValue(false));
+
+                allowing(mockMetaData).storesMixedCaseQuotedIdentifiers();
+                will(returnValue(false));
+
+                allowing(mockMetaData).supportsGetGeneratedKeys();
+                will(returnValue(false));
+
             }
         });
+        JDBCConfiguration jdbcConfiguration = new JDBCConfigurationImpl(false);
 
         DBDictionary dict = new HerdDBDictionary();
-        dict.setConfiguration(mockConfiguration);
+        dict.setConfiguration(jdbcConfiguration);
         assertNull(dict.getDefaultSchemaName());
+        dict.connectedConfiguration(mockConnection);
 
         assertTrue(dict.supportsForeignKeys);
         assertTrue(dict.supportsUniqueConstraints);
         assertTrue(dict.supportsCascadeDeleteAction);
         assertFalse(dict.supportsCascadeUpdateAction);
+        assertFalse(dict.supportsDeferredConstraints);
+
+        SchemaGroup schemaGroup = new SchemaGroup();
+        Schema schema = new Schema(DBIdentifier.newSchema("herddb", true), schemaGroup);
+
+        Table parentTable = new Table(DBIdentifier.newTable("parentTable", true), schema);
+        Column p1 = parentTable.addColumn(DBIdentifier.newColumn("p1", true));
+        p1.setType(Types.VARCHAR);
+
+        Table childTable = new Table(DBIdentifier.newTable("childTable", true), schema);
+        childTable.setComment("This is a comment");
+        Column k1 = childTable.addColumn(DBIdentifier.newColumn("k1", true));
+        k1.setType(Types.VARCHAR);
+        Column n1 = childTable.addColumn(DBIdentifier.newColumn("n1", true));
+        n1.setType(Types.INTEGER);
+        childTable.addPrimaryKey().addColumn(k1);
+
+        childTable.addUnique(DBIdentifier.newConstraint("un1")).addColumn(n1);
+
+        ForeignKey fk1 = childTable.addForeignKey(DBIdentifier.newForeignKey("fk1", true));
+        fk1.setDeleteAction(ForeignKey.ACTION_CASCADE);
+        fk1.join(n1, p1);
+
+        String[] createTableSQL = dict.getCreateTableSQL(childTable);
+        assertEquals("CREATE TABLE `herddb`.`childTable` (`k1` VARCHAR NOT NULL, `n1` INTEGER, PRIMARY KEY (`k1`), CONSTRAINT `un1` UNIQUE (`n1`))", createTableSQL[0]);
+        assertEquals(1, createTableSQL.length);
+
+        String[] addForeignKeySQL = dict.getAddForeignKeySQL(fk1);
+        assertEquals("ALTER TABLE `herddb`.`childTable` ADD CONSTRAINT `fk1` FOREIGN KEY (`n1`) REFERENCES `herddb`.`parentTable` (`p1`) ON DELETE CASCADE", addForeignKeySQL[0]);
+        assertEquals(1, addForeignKeySQL.length);
+
+        String[] dropForeignKeySQL = dict.getDropForeignKeySQL(fk1, mockConnection);
+        assertEquals("ALTER TABLE `herddb`.`childTable` DROP CONSTRAINT `fk1`", dropForeignKeySQL[0]);
+        assertEquals(1, dropForeignKeySQL.length);
+
+
+        ForeignKey fk2 = childTable.addForeignKey(DBIdentifier.newForeignKey("fk2", true));
+        fk2.setDeleteAction(ForeignKey.ACTION_RESTRICT);
+        fk2.setUpdateAction(ForeignKey.ACTION_CASCADE); // not supported
+        fk2.join(n1, p1);
+
+        // ON UPDATE CASCADE is not supported, so we are not adding the constraint
+        String[] addForeignKeySQL2 = dict.getAddForeignKeySQL(fk2);
+        assertEquals(0, addForeignKeySQL2.length);
+
+        // ON UPDATE SET NULL is supported
+        // ON DELETE RESTRICT is the default behaviour, so no need to write it in DDL
+        fk2.setUpdateAction(ForeignKey.ACTION_NULL);
+        String[] addForeignKeySQL3 = dict.getAddForeignKeySQL(fk2);
+        assertEquals("ALTER TABLE `herddb`.`childTable` ADD CONSTRAINT `fk2` FOREIGN KEY (`n1`) REFERENCES `herddb`.`parentTable` (`p1`) ON UPDATE SET NULL", addForeignKeySQL3[0]);
+        assertEquals(1, addForeignKeySQL3.length);
     }
 
 }