Methods Summary |
---|
protected void | addMappings(java.lang.String[] files, org.hibernate.cfg.Configuration cfg)
for ( int i = 0; i < files.length; i++ ) {
if ( !files[i].startsWith( "net/" ) ) {
files[i] = getBaseForMappings() + files[i];
}
cfg.addResource( files[i], TestCase.class.getClassLoader() );
}
|
protected void | afterSessionFactoryBuilt()
// for subclasses to override in order to perform extra "stuff" only
// when SF (re)built...
|
protected boolean | allowsPhysicalColumnNameInHaving(java.lang.String testDescription)Does the db/dialect support using a column's physical name in the having clause
even after it has been aliased in the select/group-by clause. This is not actually
required by the SQL spec, although virtually ever DB in the world supports this.
// I only *know* of this being a limitation on Derby, although I highly suspect
// it is a limitation on any IBM/DB2 variant
if ( DerbyDialect.class.isInstance( getDialect() ) ) {
// https://issues.apache.org/jira/browse/DERBY-1624
reportSkip( "Dialect does not support physical column name in having clause after it is aliased", testDescription );
return false;
}
return true;
|
protected boolean | allowsPhysicalColumnNameInOrderby(java.lang.String testDescription)Does the db/dialect support using a column's physical name in the order-by clause
even after it has been aliased in the select clause. This is not actually
required by the SQL spec, although virtually ever DB in the world supports this
(the most glaring omission here being IBM-variant DBs ala DB2 and Derby).
if ( DB2Dialect.class.isInstance( getDialect() ) ) {
// https://issues.apache.org/jira/browse/DERBY-1624
reportSkip( "Dialect does not support physical column name in order-by clause after it is aliased", testDescription );
return false;
}
return true;
|
public boolean | appliesTo(org.hibernate.dialect.Dialect dialect)Intended to indicate that this test class as a whole is intended for
a dialect or series of dialects. Skips here (appliesTo = false) therefore
simply indicate that the given tests target a particular feature of the
checked database and none of the tests on this class should be run for the
checked dialect.
return true;
|
protected void | assertAllDataRemoved()
if ( !recreateSchema() ) {
return; // no tables were created...
}
if ( !Boolean.getBoolean( "hibernate.test.validateDataCleanup" ) ) {
return;
}
Session tmpSession = sessions.openSession();
try {
List list = tmpSession.createQuery( "select o from java.lang.Object o" ).list();
Map items = new HashMap();
if ( !list.isEmpty() ) {
for ( Iterator iter = list.iterator(); iter.hasNext(); ) {
Object element = iter.next();
Integer l = ( Integer ) items.get( tmpSession.getEntityName( element ) );
if ( l == null ) {
l = new Integer( 0 );
}
l = new Integer( l.intValue() + 1 );
items.put( tmpSession.getEntityName( element ), l );
System.out.println( "Data left: " + element );
}
fail( "Data is left in the database: " + items.toString() );
}
}
finally {
try {
tmpSession.close();
}
catch( Throwable t ) {
// intentionally empty
}
}
|
public static void | assertClassAssignability(java.lang.Class source, java.lang.Class target)
if ( !target.isAssignableFrom( source ) ) {
throw new AssertionFailedError(
"Classes were not assignment-compatible : source<" + source.getName() +
"> target<" + target.getName() + ">"
);
}
|
public static void | assertElementTypeAssignability(java.util.Collection collection, java.lang.Class clazz)
Iterator itr = collection.iterator();
while ( itr.hasNext() ) {
assertClassAssignability( itr.next().getClass(), clazz );
}
|
private void | buildSessionFactory()
if ( getSessions()!=null ) {
getSessions().close();
}
TestCase.dialect = Dialect.getDialect();
if ( ! appliesTo( getDialect() ) ) {
return;
}
try {
TestCase.cfg = new Configuration();
cfg.setProperty( Environment.CACHE_PROVIDER, "org.hibernate.cache.HashtableCacheProvider" );
if( recreateSchema() ) {
cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
}
addMappings( getMappings(), cfg );
configure( cfg );
if ( getCacheConcurrencyStrategy() != null ) {
Iterator iter = cfg.getClassMappings();
while ( iter.hasNext() ) {
PersistentClass clazz = (PersistentClass) iter.next();
Iterator props = clazz.getPropertyClosureIterator();
boolean hasLob = false;
while ( props.hasNext() ) {
Property prop = (Property) props.next();
if ( prop.getValue().isSimpleValue() ) {
String type = ( (SimpleValue) prop.getValue() ).getTypeName();
if ( "blob".equals(type) || "clob".equals(type) ) hasLob = true;
if ( Blob.class.getName().equals(type) || Clob.class.getName().equals(type) ) hasLob = true;
}
}
if ( !hasLob && !clazz.isInherited() && overrideCacheStrategy() ) {
cfg.setCacheConcurrencyStrategy(
clazz.getEntityName(),
getCacheConcurrencyStrategy()
);
}
}
iter = cfg.getCollectionMappings();
while ( iter.hasNext() ) {
Collection coll = (Collection) iter.next();
cfg.setCollectionCacheConcurrencyStrategy(
coll.getRole(),
getCacheConcurrencyStrategy()
);
}
}
// make sure we use the same dialect...
cfg.setProperty( Environment.DIALECT, TestCase.dialect.getClass().getName() );
TestCase.sessions = cfg.buildSessionFactory();
afterSessionFactoryBuilt();
}
catch ( Exception e ) {
e.printStackTrace();
throw e;
}
|
protected void | configure(org.hibernate.cfg.Configuration cfg)Apply any test-specific configuration prior to building the factory.
|
protected boolean | dialectIs(java.lang.Class dialectClass)
return dialectClass.isInstance( getDialect() );
|
protected boolean | dialectIsCaseSensitive(java.lang.String testDescription)Is the db/dialect sensitive in terms of string comparisons?
if ( getDialect().areStringComparisonsCaseInsensitive() ) {
reportSkip( "Dialect is case sensitive. ", testDescription );
return true;
}
return false;
|
protected boolean | dialectIsNot(java.lang.Class dialectClass)
return ! dialectIs( dialectClass );
|
protected boolean | dialectIsNot(java.lang.Class[] dialectClasses)
return ! dialectIsOneOf( dialectClasses );
|
protected boolean | dialectIsOneOf(java.lang.Class[] dialectClasses)
for ( int i = 0; i < dialectClasses.length; i++ ) {
if ( dialectClasses[i].isInstance( getDialect() ) ) {
return true;
}
}
return false;
|
protected boolean | dialectSupportsEmptyInList(java.lang.String testDescription)Does the db/dialect support empty lists in the IN operator?
For example, is "... a.b IN () ..." supported?
if ( ! getDialect().supportsEmptyInList() ) {
reportSkip( "Dialect does not support SQL empty in list : x in ()", testDescription );
return false;
}
return true;
|
protected boolean | dropAfterFailure()
return true;
|
public java.lang.String | fullTestName()
return this.getName() + " (" + this.getClass().getName() + ")";
|
protected java.lang.String | getBaseForMappings()The base name for relative mapping resources. The default is
org/hibernate/test/
return "org/hibernate/test/";
|
protected java.lang.String | getCacheConcurrencyStrategy()
return "nonstrict-read-write";
|
protected org.hibernate.cfg.Configuration | getCfg()
return cfg;
|
protected org.hibernate.dialect.Dialect | getDialect()
if ( dialect == null ) {
dialect = Dialect.getDialect();
}
return dialect;
|
protected abstract java.lang.String[] | getMappings()Get the mapping resources to be used to build the configuration.
Resources should be relative to {@link #getBaseForMappings()}
|
protected org.hibernate.SessionFactory | getSessions()Get the factory for this test environment.
return sessions;
|
public org.hibernate.classic.Session | openSession()
session = getSessions().openSession();
return session;
|
public org.hibernate.classic.Session | openSession(org.hibernate.Interceptor interceptor)
session = getSessions().openSession(interceptor);
return session;
|
protected boolean | overrideCacheStrategy()
return true;
|
protected boolean | readCommittedIsolationMaintained(java.lang.String scenario)Is connection at least read committed?
Not, that this skip check relies on the JDBC driver reporting
the true isolation level correctly. HSQLDB, for example, will
report whatever you specify as the isolation
(Connection.setTransationIsolation()), even though it only supports
read-uncommitted.
int isolation = java.sql.Connection.TRANSACTION_READ_UNCOMMITTED;
Session testSession = null;
try {
testSession = openSession();
isolation = testSession.connection().getTransactionIsolation();
}
catch( Throwable ignore ) {
}
finally {
if ( testSession != null ) {
try {
testSession.close();
}
catch( Throwable ignore ) {
}
}
}
if ( isolation < java.sql.Connection.TRANSACTION_READ_COMMITTED ) {
reportSkip( "environment does not support at least read committed isolation", scenario );
return false;
}
else {
return true;
}
|
protected boolean | recreateSchema()Should the database schema be (re)created
return true;
|
protected void | reportSkip(java.lang.String reason, java.lang.String testDescription)
SKIP_LOG.warn( "*** skipping [" + fullTestName() + "] - " + testDescription + " : " + reason, new Exception() );
|
public void | runBare()
String sysPropName = "hibernate.test.validatefailureexpected";
assertNotNull( getName() );
if ( Boolean.getBoolean( sysPropName ) ) {
if ( getName().endsWith( "FailureExpected" ) ) {
Throwable t = null;
try {
super.runBare();
}
catch ( Throwable afe ) {
t = afe;
}
if ( t == null ) {
fail( "Test where marked as FailureExpected, but did not fail!" );
}
else {
reportSkip( "ignoring *FailuredExpected methods", "Failed with: " + t.toString() );
}
}
else {
super.runBare();
}
}
else {
super.runBare();
}
|
protected void | runTest()
final boolean stats = sessions.getStatistics().isStatisticsEnabled();
try {
if ( stats ) {
sessions.getStatistics().clear();
}
super.runTest();
if ( stats ) {
sessions.getStatistics().logSummary();
}
if ( session != null && session.isOpen() ) {
if ( session.isConnected() ) {
session.connection().rollback();
}
session.close();
session = null;
fail( "unclosed session" );
}
else {
session = null;
}
assertAllDataRemoved();
}
catch ( Throwable e ) {
try {
if ( session != null && session.isOpen() ) {
if ( session.isConnected() ) {
session.connection().rollback();
}
session.close();
}
}
catch ( Exception ignore ) {
}
try {
if ( dropAfterFailure() && sessions != null ) {
sessions.close();
sessions = null;
}
}
catch ( Exception ignore ) {
}
throw e;
}
|
protected void | setUp()The Hibernate test suite tries to only build the db schema once
per test class (not test case which = instance) hence all the
static vars.
Here is the crux of that attempt. We only build a factory when one was
not previously built, or when we start a new test class.
if ( getSessions() == null || lastTestClass != getClass() ) {
buildSessionFactory();
lastTestClass = getClass();
}
|
protected org.hibernate.engine.SessionFactoryImplementor | sfi()Get the factory for this test environment, casted to {@link SessionFactoryImplementor}.
Shorthand for ( {@link SessionFactoryImplementor} ) {@link #getSessions()}...
return ( SessionFactoryImplementor ) getSessions();
|
protected boolean | supportsCircularCascadeDelete()
if ( ! getDialect().supportsCircularCascadeDeleteConstraints() ) {
reportSkip( "db/dialect does not support 'circular' cascade delete constraints", "cascade delete constraint support" );
return false;
}
return true;
|
protected boolean | supportsExpectedLobUsagePattern()Expected LOB usage pattern is such that I can perform an insert
via prepared statement with a parameter binding for a LOB value
without crazy casting to JDBC driver implementation-specific classes...
Part of the trickiness here is the fact that this is largely
driver dependent. For Oracle, which is notoriously bad with
LOB support in their drivers actually does a pretty good job with
LOB support as of the 10.2.x versions of their drivers...
if ( ! getDialect().supportsExpectedLobUsagePattern() ) {
reportSkip( "database/driver does not support expected LOB usage pattern", "LOB support" );
return false;
}
return true;
|
protected boolean | supportsLobValueChangePropogation()Does the current dialect support propogating changes to LOB
values back to the database? Talking about mutating the
underlying value as opposed to supplying a new
LOB instance...
if ( ! getDialect().supportsLobValueChangePropogation() ) {
reportSkip( "database/driver does not support propogating LOB value change back to database", "LOB support" );
return false;
}
return true;
|
protected boolean | supportsResultSetPositionQueryMethodsOnForwardOnlyCursor()
if ( ! getDialect().supportsResultSetPositionQueryMethodsOnForwardOnlyCursor() ) {
reportSkip( "Driver does not support 'position query' methods on forward-only cursors", "query support" );
return false;
}
return true;
|
protected boolean | supportsRowValueConstructorSyntaxInInList()
if ( ! getDialect().supportsRowValueConstructorSyntaxInInList() ) {
reportSkip( "Dialect does not support 'tuple' syntax as part of an IN value list", "query support" );
return false;
}
return true;
|
protected boolean | supportsSubqueryOnMutatingTable()
if ( !getDialect().supportsSubqueryOnMutatingTable() ) {
reportSkip( "database/driver does not support referencing mutating table in subquery", "bulk DML support" );
return false;
}
return true;
|
protected boolean | supportsSubselectOnLeftSideIn()
if ( ! getDialect().supportsSubselectAsInPredicateLHS() ) {
reportSkip( "Database does not support (<subselect>) in ( ... ) ", "query support" );
return false;
}
return true;
|
protected boolean | supportsUnboundedLobLocatorMaterialization()Is it supported to materialize a LOB locator outside the transaction in
which it was created?
Again, part of the trickiness here is the fact that this is largely
driver dependent.
NOTE: all database I have tested which {@link #supportsExpectedLobUsagePattern()}
also support the ability to materialize a LOB outside the owning transaction...
if ( !getDialect().supportsUnboundedLobLocatorMaterialization() ) {
reportSkip( "database/driver does not support materializing a LOB locator outside the 'owning' transaction", "LOB support" );
return false;
}
return true;
|