| /* |
| * 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 |