/*
* ModeShape (http://www.modeshape.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.modeshape.jdbc;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.modeshape.common.FixFor;
/**
* Integration test with the http protocol of the {@link JcrDriver}. Please note that this class only performs a series of
* "smoke tests" against a running remote repository and is nowhere near complete from a point of view of testing a
* {@link java.sql.Driver} implementation.
*
* @author Horia Chiorean
*/
public class JcrHttpDriverIntegrationTest {
private Properties driverProperties = new Properties();
private JcrDriver driver = new JcrDriver(null);
@Before
public void before() throws Exception {
DriverManager.registerDriver(driver);
driverProperties.setProperty(JcrDriver.USERNAME_PROPERTY_NAME, getUserName());
driverProperties.setProperty(JcrDriver.PASSWORD_PROPERTY_NAME, getPassword());
}
@After
public void after() throws Exception {
DriverManager.deregisterDriver(driver);
}
@Test
public void shouldCreateConnectionToRemoteServer() throws SQLException {
Connection connection = connectToRemoteRepository();
assertTrue(connection instanceof JcrConnection);
assertTrue(connection.unwrap(JcrConnection.class) != null);
assertFalse(connection.isClosed());
}
@Test( expected = SQLException.class )
public void shouldNotConnectWithInvalidRepositoryName() throws Exception {
DriverManager.getConnection(getContextPathUrl() + "/dummy", driverProperties);
}
@Test
@FixFor( "MODE-2125" )
public void shouldRetrieveMetaData() throws SQLException {
Connection connection = connectToRemoteRepository();
DatabaseMetaData metadata = connection.getMetaData();
assertNotNull(metadata);
// reads tables and columns
readTables(metadata);
}
@SuppressWarnings( "unused" )
private void readTables( DatabaseMetaData metadata ) throws SQLException {
ResultSet tables = metadata.getTables(null, null, null, null);
try {
while (tables.next()) {
String tableCatalog = tables.getString(1);
String tableSchema = tables.getString(2);
String tableName = tables.getString(3);
String tableType = tables.getString(4);
String remarks = tables.getString(5);
String typeCat = tables.getString(6);
String typeSchema = tables.getString(7);
String typeName = tables.getString(8);
String selfRefColumnName = tables.getString(9);
String refGeneration = tables.getString(10);
readColumns(metadata, tableCatalog, tableSchema, tableName);
}
} finally {
tables.close();
}
}
@SuppressWarnings( "unused" )
private void readColumns( DatabaseMetaData metadata,
String catalog,
String schema,
String table ) throws SQLException {
ResultSet columns = metadata.getColumns(catalog, schema, table, null);
try {
while (columns.next()) {
String tableCatalog = columns.getString(1);
String tableSchema = columns.getString(2);
String tableName = columns.getString(3);
String columnName = columns.getString(4);
int type = columns.getInt(5);
String typeName = columns.getString(6);
int columnSize = columns.getInt(7);
int bufferLength = columns.getInt(8);
int decimalDigits = columns.getInt(9);
int radix = columns.getInt(10);
int nullable = columns.getInt(11);
String remarks = columns.getString(12);
String columnDef = columns.getString(13);
int sqlDataType = columns.getInt(14);
int sqlDataTimeSub = columns.getInt(15);
int charOctetLength = columns.getInt(16);
int ordinalPost = columns.getInt(17);
String isNullable = columns.getString(18);
String scopeCat = columns.getString(19);
String scopeSchema = columns.getString(20);
String scopeTable = columns.getString(21);
short scopeDataType = columns.getShort(22);
// String isAutoIncrement = columns.getString(23);
// String isGenerated = columns.getString(24);
}
} finally {
columns.close();
}
}
@Test
@FixFor( "MODE-872" )
public void shouldReturnResultsFromSimpleQuery() throws Exception {
Connection connection = connectToRemoteRepository();
String query = "SELECT [jcr:primaryType], [jcr:mixinTypes], [jcr:path], [jcr:name], [mode:localName], [mode:depth] FROM [nt:base] WHERE [jcr:path] LIKE '/%' AND [jcr:path] NOT LIKE '/%/%'ORDER BY [jcr:path]";
String[] expectedResults = new String[] {
"jcr:primaryType[STRING] jcr:mixinTypes[STRING] jcr:path[STRING] jcr:name[STRING] mode:localName[STRING] mode:depth[LONG]",
"mode:root null / null null 0",
"mode:system null /jcr:system jcr:system system 1"};
ConnectionResultsComparator.executeTest(connection, query, expectedResults, 3);
}
@Test
@FixFor( "MODE-872" )
public void shouldReturnEmptyResultSetWhenNoResultsFoundForQuery() throws Exception {
Connection connection = connectToRemoteRepository();
String query = "SELECT [jcr:primaryType], [jcr:mixinTypes], [jcr:path], [jcr:name], [mode:localName], [mode:depth] FROM [mix:versionable] ORDER BY [jcr:path]";
Statement statement = null;
ResultSet rs = null;
try {
statement = connection.createStatement();
rs = statement.executeQuery(query);
assertNotNull(rs);
assertFalse(rs.next());
} finally {
if (rs != null) {
rs.close();
}
if (statement != null) {
statement.close();
}
}
}
protected String getContextPathUrl() {
// must match Cargo's configuration
return "localhost:8090/modeshape";
}
protected String getRepositoryName() {
// must match the configuration from modeshape-web-jcr-rest-war
return "repo";
}
protected String getWorkspaceName() {
// must match the configuration from modeshape-web-jcr-rest-war
return "default";
}
protected String getUserName() {
// must match Cargo's configuration
return "dnauser";
}
protected String getPassword() {
// must match Cargo's configuration
return "password";
}
private String getRepositoryUrl() {
return JcrDriver.HTTP_URL_PREFIX + getContextPathUrl() + "/" + getRepositoryName() + "/" + getWorkspaceName();
}
private Connection connectToRemoteRepository() throws SQLException {
Connection connection = DriverManager.getConnection(getRepositoryUrl(), driverProperties);
assertNotNull(connection);
return connection;
}
}