blob: 96e524a1d461e36b887f9ecebe7b45f131006075 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to you 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.apache.calcite.avatica;
import org.apache.calcite.avatica.remote.MockJsonService;
import org.apache.calcite.avatica.remote.MockProtobufService.MockProtobufServiceFactory;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
/**
* RemoteDriver tests that use a Mock implementation of a Connection.
*/
@RunWith(Parameterized.class)
public class RemoteDriverMockTest {
public static final String MJS = MockJsonService.Factory.class.getName();
public static final String MPBS = MockProtobufServiceFactory.class.getName();
private static Connection mjs() throws SQLException {
return DriverManager.getConnection("jdbc:avatica:remote:factory=" + MJS);
}
private static Connection mpbs() throws SQLException {
return DriverManager.getConnection("jdbc:avatica:remote:factory=" + MPBS);
}
@Parameters
public static List<Object[]> parameters() {
List<Object[]> parameters = new ArrayList<>();
parameters.add(new Object[] {new Callable<Connection>() {
public Connection call() throws SQLException {
return mjs();
}
} });
parameters.add(new Object[] {new Callable<Connection>() {
public Connection call() throws SQLException {
return mpbs();
}
} });
return parameters;
}
private final Callable<Connection> connectionFunctor;
public RemoteDriverMockTest(Callable<Connection> functor) {
this.connectionFunctor = functor;
}
private Connection getMockConnection() {
try {
return connectionFunctor.call();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Test public void testRegister() throws Exception {
final Connection connection = getMockConnection();
assertThat(connection.isClosed(), is(false));
connection.close();
assertThat(connection.isClosed(), is(true));
}
@Test public void testSchemas() throws Exception {
final Connection connection = getMockConnection();
final ResultSet resultSet =
connection.getMetaData().getSchemas(null, null);
assertFalse(resultSet.next());
final ResultSetMetaData metaData = resultSet.getMetaData();
assertTrue(metaData.getColumnCount() >= 2);
assertEquals("TABLE_SCHEM", metaData.getColumnName(1));
assertEquals("TABLE_CATALOG", metaData.getColumnName(2));
resultSet.close();
connection.close();
}
@Test public void testTables() throws Exception {
final Connection connection = getMockConnection();
final ResultSet resultSet =
connection.getMetaData().getTables(null, null, null, new String[0]);
assertFalse(resultSet.next());
final ResultSetMetaData metaData = resultSet.getMetaData();
assertTrue(metaData.getColumnCount() >= 3);
assertEquals("TABLE_CAT", metaData.getColumnName(1));
assertEquals("TABLE_SCHEM", metaData.getColumnName(2));
assertEquals("TABLE_NAME", metaData.getColumnName(3));
resultSet.close();
connection.close();
}
@Ignore
@Test public void testNoFactory() throws Exception {
final Connection connection =
DriverManager.getConnection("jdbc:avatica:remote:");
assertThat(connection.isClosed(), is(false));
final ResultSet resultSet = connection.getMetaData().getSchemas();
assertFalse(resultSet.next());
final ResultSetMetaData metaData = resultSet.getMetaData();
assertEquals(2, metaData.getColumnCount());
assertEquals("TABLE_SCHEM", metaData.getColumnName(1));
assertEquals("TABLE_CATALOG", metaData.getColumnName(2));
resultSet.close();
connection.close();
assertThat(connection.isClosed(), is(true));
}
@Ignore
@Test public void testCatalogsMock() throws Exception {
final Connection connection = getMockConnection();
assertThat(connection.isClosed(), is(false));
final ResultSet resultSet = connection.getMetaData().getSchemas();
assertFalse(resultSet.next());
final ResultSetMetaData metaData = resultSet.getMetaData();
assertEquals(2, metaData.getColumnCount());
assertEquals("TABLE_SCHEM", metaData.getColumnName(1));
assertEquals("TABLE_CATALOG", metaData.getColumnName(2));
resultSet.close();
connection.close();
assertThat(connection.isClosed(), is(true));
}
@Ignore
@Test public void testStatementExecuteQueryMock() throws Exception {
checkStatementExecuteQuery(getMockConnection(), false);
}
@Ignore
@Test public void testPrepareExecuteQueryMock() throws Exception {
checkStatementExecuteQuery(getMockConnection(), true);
}
private void checkStatementExecuteQuery(Connection connection,
boolean prepare) throws SQLException {
final String sql = "select * from (\n"
+ " values (1, 'a'), (null, 'b'), (3, 'c')) as t (c1, c2)";
final Statement statement;
final ResultSet resultSet;
final ParameterMetaData parameterMetaData;
if (prepare) {
final PreparedStatement ps = connection.prepareStatement(sql);
statement = ps;
parameterMetaData = ps.getParameterMetaData();
resultSet = ps.executeQuery();
} else {
statement = connection.createStatement();
parameterMetaData = null;
resultSet = statement.executeQuery(sql);
}
if (parameterMetaData != null) {
assertThat(parameterMetaData.getParameterCount(), equalTo(0));
}
final ResultSetMetaData metaData = resultSet.getMetaData();
assertEquals(2, metaData.getColumnCount());
assertEquals("C1", metaData.getColumnName(1));
assertEquals("C2", metaData.getColumnName(2));
assertTrue(resultSet.next());
assertTrue(resultSet.next());
assertTrue(resultSet.next());
assertFalse(resultSet.next());
resultSet.close();
statement.close();
connection.close();
}
@Test public void testResultSetsFinagled() throws Exception {
// These values specified in MockJsonService
final String table = "my_table";
final long value = 10;
final Connection connection = getMockConnection();
// Not an accurate ResultSet per JDBC, but close enough for testing.
ResultSet results = connection.getMetaData().getColumns(null, null, table, null);
assertTrue(results.next());
assertEquals(table, results.getString(1));
assertEquals(value, results.getLong(2));
}
}
// End RemoteDriverMockTest.java