/*
* HA-JDBC: High-Availability JDBC
* Copyright (C) 2012 Paul Ferraro
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package net.sf.hajdbc.dialect;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import net.sf.hajdbc.ForeignKeyConstraint;
import net.sf.hajdbc.QualifiedName;
import net.sf.hajdbc.SequenceProperties;
import net.sf.hajdbc.SequencePropertiesFactory;
import net.sf.hajdbc.dialect.h2.H2DialectFactory;
import org.h2.api.ErrorCode;
/**
* @author Paul Ferraro
*/
@SuppressWarnings("nls")
public class H2DialectTest extends StandardDialectTest
{
public H2DialectTest()
{
super(new H2DialectFactory());
}
/**
* {@inheritDoc}
* @see net.sf.hajdbc.dialect.StandardDialectTest#getSequenceSupport()
*/
@Override
public void getSequenceSupport()
{
assertSame(this.dialect, this.dialect.getSequenceSupport());
}
/**
* {@inheritDoc}
* @see net.sf.hajdbc.dialect.StandardDialectTest#getCreateForeignKeyConstraintSQL()
*/
@Override
public void getCreateForeignKeyConstraintSQL() throws SQLException
{
QualifiedName table = mock(QualifiedName.class);
QualifiedName foreignTable = mock(QualifiedName.class);
ForeignKeyConstraint constraint = mock(ForeignKeyConstraint.class);
when(table.getDDLName()).thenReturn("table");
when(foreignTable.getDDLName()).thenReturn("foreign_table");
when(constraint.getName()).thenReturn("name");
when(constraint.getTable()).thenReturn(table);
when(constraint.getColumnList()).thenReturn(Arrays.asList("column1", "column2"));
when(constraint.getForeignTable()).thenReturn(foreignTable);
when(constraint.getForeignColumnList()).thenReturn(Arrays.asList("foreign_column1", "foreign_column2"));
when(constraint.getDeferrability()).thenReturn(DatabaseMetaData.importedKeyInitiallyDeferred);
when(constraint.getDeleteRule()).thenReturn(DatabaseMetaData.importedKeyCascade);
when(constraint.getUpdateRule()).thenReturn(DatabaseMetaData.importedKeyRestrict);
String result = this.dialect.getCreateForeignKeyConstraintSQL(constraint);
assertEquals("ALTER TABLE table ADD CONSTRAINT name FOREIGN KEY (column1, column2) REFERENCES foreign_table (foreign_column1, foreign_column2) ON DELETE CASCADE ON UPDATE RESTRICT", result);
}
/**
* {@inheritDoc}
* @see net.sf.hajdbc.dialect.StandardDialectTest#getSequences()
*/
@Override
public void getSequences() throws SQLException
{
SequencePropertiesFactory factory = mock(SequencePropertiesFactory.class);
SequenceProperties sequence1 = mock(SequenceProperties.class);
SequenceProperties sequence2 = mock(SequenceProperties.class);
DatabaseMetaData metaData = mock(DatabaseMetaData.class);
Connection connection = mock(Connection.class);
Statement statement = mock(Statement.class);
ResultSet resultSet = mock(ResultSet.class);
when(metaData.getConnection()).thenReturn(connection);
when(connection.createStatement()).thenReturn(statement);
when(statement.executeQuery("SELECT SEQUENCE_SCHEMA, SEQUENCE_NAME, INCREMENT FROM INFORMATION_SCHEMA.SEQUENCES")).thenReturn(resultSet);
when(resultSet.next()).thenReturn(true).thenReturn(true).thenReturn(false);
when(resultSet.getString(1)).thenReturn("schema1").thenReturn("schema2");
when(resultSet.getString(2)).thenReturn("sequence1").thenReturn("sequence2");
when(resultSet.getInt(3)).thenReturn(1).thenReturn(2);
when(factory.createSequenceProperties("schema1", "sequence1", 1)).thenReturn(sequence1);
when(factory.createSequenceProperties("schema2", "sequence2", 2)).thenReturn(sequence2);
Collection<SequenceProperties> results = this.dialect.getSequenceSupport().getSequences(metaData, factory);
verify(statement).close();
assertEquals(2, results.size());
Iterator<SequenceProperties> sequences = results.iterator();
assertSame(sequence1, sequences.next());
assertSame(sequence2, sequences.next());
}
/**
* {@inheritDoc}
* @see net.sf.hajdbc.dialect.StandardDialectTest#getNextSequenceValueSQL()
*/
@Override
public void getNextSequenceValueSQL() throws SQLException
{
SequenceProperties sequence = mock(SequenceProperties.class);
QualifiedName name = mock(QualifiedName.class);
when(sequence.getName()).thenReturn(name);
when(name.getDMLName()).thenReturn("sequence");
String result = this.dialect.getSequenceSupport().getNextSequenceValueSQL(sequence);
assertEquals("CALL NEXT VALUE FOR sequence", result);
}
/**
* {@inheritDoc}
* @see net.sf.hajdbc.dialect.StandardDialectTest#getDefaultSchemas()
*/
@Override
public void getDefaultSchemas() throws SQLException
{
DatabaseMetaData metaData = mock(DatabaseMetaData.class);
List<String> result = this.dialect.getDefaultSchemas(metaData);
assertEquals(1, result.size());
assertEquals("PUBLIC", result.get(0));
}
/**
* {@inheritDoc}
* @see net.sf.hajdbc.dialect.StandardDialectTest#evaluateCurrentDate()
*/
@Override
public void evaluateCurrentDate()
{
java.sql.Date date = new java.sql.Date(System.currentTimeMillis());
assertEquals(String.format("SELECT DATE '%s' FROM test", date.toString()), this.dialect.evaluateCurrentDate("SELECT CURRENT_DATE FROM test", date));
assertEquals(String.format("SELECT DATE '%s' FROM test", date.toString()), this.dialect.evaluateCurrentDate("SELECT CURRENT_DATE() FROM test", date));
assertEquals(String.format("SELECT DATE '%s' FROM test", date.toString()), this.dialect.evaluateCurrentDate("SELECT CURRENT_DATE ( ) FROM test", date));
assertEquals("SELECT CURDATE FROM test", this.dialect.evaluateCurrentDate("SELECT CURDATE FROM test", date));
assertEquals(String.format("SELECT DATE '%s' FROM test", date.toString()), this.dialect.evaluateCurrentDate("SELECT CURDATE() FROM test", date));
assertEquals(String.format("SELECT DATE '%s' FROM test", date.toString()), this.dialect.evaluateCurrentDate("SELECT CURDATE ( ) FROM test", date));
assertEquals("SELECT CCURRENT_DATE FROM test", this.dialect.evaluateCurrentDate("SELECT CCURRENT_DATE FROM test", date));
assertEquals("SELECT CURRENT_DATES FROM test", this.dialect.evaluateCurrentDate("SELECT CURRENT_DATES FROM test", date));
assertEquals("SELECT CURRENT_TIME FROM test", this.dialect.evaluateCurrentDate("SELECT CURRENT_TIME FROM test", date));
assertEquals("SELECT CURRENT_TIMESTAMP FROM test", this.dialect.evaluateCurrentDate("SELECT CURRENT_TIMESTAMP FROM test", date));
assertEquals("SELECT 1 FROM test", this.dialect.evaluateCurrentDate("SELECT 1 FROM test", date));
}
/**
* {@inheritDoc}
* @see net.sf.hajdbc.dialect.StandardDialectTest#evaluateCurrentTime()
*/
@Override
public void evaluateCurrentTime()
{
java.sql.Time time = new java.sql.Time(System.currentTimeMillis());
assertEquals(String.format("SELECT TIME '%s' FROM test", time.toString()), this.dialect.evaluateCurrentTime("SELECT CURRENT_TIME FROM test", time));
assertEquals(String.format("SELECT TIME '%s' FROM test", time.toString()), this.dialect.evaluateCurrentTime("SELECT CURRENT_TIME() FROM test", time));
assertEquals(String.format("SELECT TIME '%s' FROM test", time.toString()), this.dialect.evaluateCurrentTime("SELECT CURRENT_TIME ( ) FROM test", time));
assertEquals("SELECT CURTIME FROM test", this.dialect.evaluateCurrentTime("SELECT CURTIME FROM test", time));
assertEquals(String.format("SELECT TIME '%s' FROM test", time.toString()), this.dialect.evaluateCurrentTime("SELECT CURTIME() FROM test", time));
assertEquals(String.format("SELECT TIME '%s' FROM test", time.toString()), this.dialect.evaluateCurrentTime("SELECT CURTIME ( ) FROM test", time));
assertEquals("SELECT LOCALTIME FROM test", this.dialect.evaluateCurrentTime("SELECT LOCALTIME FROM test", time));
assertEquals("SELECT LOCALTIME(2) FROM test", this.dialect.evaluateCurrentTime("SELECT LOCALTIME(2) FROM test", time));
assertEquals("SELECT LOCALTIME ( 2 ) FROM test", this.dialect.evaluateCurrentTime("SELECT LOCALTIME ( 2 ) FROM test", time));
assertEquals("SELECT CCURRENT_TIME FROM test", this.dialect.evaluateCurrentTime("SELECT CCURRENT_TIME FROM test", time));
assertEquals("SELECT LLOCALTIME FROM test", this.dialect.evaluateCurrentTime("SELECT LLOCALTIME FROM test", time));
assertEquals("SELECT CURRENT_DATE FROM test", this.dialect.evaluateCurrentTime("SELECT CURRENT_DATE FROM test", time));
assertEquals("SELECT CURRENT_TIMESTAMP FROM test", this.dialect.evaluateCurrentTime("SELECT CURRENT_TIMESTAMP FROM test", time));
assertEquals("SELECT LOCALTIMESTAMP FROM test", this.dialect.evaluateCurrentTime("SELECT LOCALTIMESTAMP FROM test", time));
assertEquals("SELECT 1 FROM test", this.dialect.evaluateCurrentTime("SELECT 1 FROM test", time));
}
/**
* {@inheritDoc}
* @see net.sf.hajdbc.dialect.StandardDialectTest#evaluateCurrentTimestamp()
*/
@Override
public void evaluateCurrentTimestamp()
{
java.sql.Timestamp timestamp = new java.sql.Timestamp(System.currentTimeMillis());
assertEquals(String.format("SELECT TIMESTAMP '%s' FROM test", timestamp.toString()), this.dialect.evaluateCurrentTimestamp("SELECT CURRENT_TIMESTAMP FROM test", timestamp));
assertEquals(String.format("SELECT TIMESTAMP '%s' FROM test", timestamp.toString()), this.dialect.evaluateCurrentTimestamp("SELECT CURRENT_TIMESTAMP() FROM test", timestamp));
assertEquals(String.format("SELECT TIMESTAMP '%s' FROM test", timestamp.toString()), this.dialect.evaluateCurrentTimestamp("SELECT CURRENT_TIMESTAMP ( ) FROM test", timestamp));
assertEquals("SELECT NOW FROM test", this.dialect.evaluateCurrentTimestamp("SELECT NOW FROM test", timestamp));
assertEquals(String.format("SELECT TIMESTAMP '%s' FROM test", timestamp.toString()), this.dialect.evaluateCurrentTimestamp("SELECT NOW() FROM test", timestamp));
assertEquals(String.format("SELECT TIMESTAMP '%s' FROM test", timestamp.toString()), this.dialect.evaluateCurrentTimestamp("SELECT NOW ( ) FROM test", timestamp));
assertEquals("SELECT LOCALTIMESTAMP FROM test", this.dialect.evaluateCurrentTimestamp("SELECT LOCALTIMESTAMP FROM test", timestamp));
assertEquals("SELECT LOCALTIMESTAMP(2) FROM test", this.dialect.evaluateCurrentTimestamp("SELECT LOCALTIMESTAMP(2) FROM test", timestamp));
assertEquals("SELECT LOCALTIMESTAMP ( 2 ) FROM test", this.dialect.evaluateCurrentTimestamp("SELECT LOCALTIMESTAMP ( 2 ) FROM test", timestamp));
assertEquals("SELECT CCURRENT_TIMESTAMP FROM test", this.dialect.evaluateCurrentTimestamp("SELECT CCURRENT_TIMESTAMP FROM test", timestamp));
assertEquals("SELECT LLOCALTIMESTAMP FROM test", this.dialect.evaluateCurrentTimestamp("SELECT LLOCALTIMESTAMP FROM test", timestamp));
assertEquals("SELECT CURRENT_DATE FROM test", this.dialect.evaluateCurrentTimestamp("SELECT CURRENT_DATE FROM test", timestamp));
assertEquals("SELECT CURRENT_TIME FROM test", this.dialect.evaluateCurrentTimestamp("SELECT CURRENT_TIME FROM test", timestamp));
assertEquals("SELECT LOCALTIME FROM test", this.dialect.evaluateCurrentTimestamp("SELECT LOCALTIME FROM test", timestamp));
assertEquals("SELECT 1 FROM test", this.dialect.evaluateCurrentTimestamp("SELECT 1 FROM test", timestamp));
}
@Override
public void indicatesFailureSQLException()
{
assertFalse(this.dialect.indicatesFailure(new SQLException("", "", ErrorCode.UNKNOWN_MODE_1)));
assertTrue(this.dialect.indicatesFailure(new SQLException("", "", ErrorCode.FILE_CORRUPTED_1)));
assertTrue(this.dialect.indicatesFailure(new SQLException("", "", ErrorCode.CONNECTION_BROKEN_1)));
assertTrue(this.dialect.indicatesFailure(new SQLException("", "", ErrorCode.DATABASE_NOT_FOUND_1)));
assertTrue(this.dialect.indicatesFailure(new SQLException("", "", ErrorCode.OUT_OF_MEMORY)));
assertTrue(this.dialect.indicatesFailure(new SQLException("", "", ErrorCode.REMOTE_CONNECTION_NOT_ALLOWED)));
assertTrue(this.dialect.indicatesFailure(new SQLException("", "", ErrorCode.DATABASE_CALLED_AT_SHUTDOWN)));
assertTrue(this.dialect.indicatesFailure(new SQLException("", "", ErrorCode.URL_FORMAT_ERROR_2)));
}
}