| /* |
| * Copyright (C) 2007 The Android Open Source Project |
| * |
| * 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 libcore.java.sql; |
| |
| import java.sql.ResultSet; |
| import java.sql.ResultSetMetaData; |
| import java.sql.SQLException; |
| import java.sql.Statement; |
| import java.sql.Types; |
| |
| public final class OldResultSetMetaDataTest extends OldSQLTest { |
| |
| ResultSetMetaData rsmd = null; |
| Statement st = null; |
| ResultSet rs = null; |
| |
| @Override |
| public void setUp() throws Exception { |
| super.setUp(); |
| try { |
| conn.setAutoCommit(false); |
| assertFalse(conn.getAutoCommit()); |
| String query = "select * from zoo"; |
| st = conn.createStatement(); |
| st.execute(query); |
| rs = st.getResultSet(); |
| rsmd = rs.getMetaData(); |
| } catch (SQLException e) { |
| fail("Couldn't get ResultSetMetaData object"); |
| } |
| } |
| |
| @Override |
| public void tearDown() throws SQLException { |
| try { |
| rs.close(); |
| st.close(); |
| } catch (SQLException e) { |
| fail("Couldn't close Statement object"); |
| } |
| super.tearDown(); |
| } |
| |
| // not supported |
| public void testGetCatalogName() throws SQLException { |
| try { |
| assertNotNull(rsmd.getCatalogName(1)); |
| } catch (SQLException e) { |
| fail("SQLException is thrown: " + e.getMessage()); |
| } |
| |
| try { |
| conn.close(); |
| rsmd.getCatalogName(0); |
| fail("Exception expected"); |
| } catch (SQLException e) { |
| //ok |
| } |
| } |
| |
| public void testGetColumnClassName() { |
| try { |
| assertNotNull(rsmd); |
| assertEquals(Short.class.getName(), rsmd.getColumnClassName(1)); |
| assertEquals(String.class.getName(), rsmd.getColumnClassName(2)); |
| assertEquals(String.class.getName(), rsmd.getColumnClassName(3)); |
| } catch (SQLException e) { |
| fail("SQLException is thrown: " + e.getMessage()); |
| } |
| |
| try { |
| String name = rsmd.getColumnClassName(0); |
| assertNull(name); |
| } catch (SQLException e) { |
| fail("SQLException is thrown"); |
| } |
| |
| try { |
| String name = rsmd.getColumnClassName(4); |
| assertNull(name); |
| } catch (SQLException e) { |
| fail("SQLException is thrown"); |
| } |
| } |
| |
| // SQLException checking test fails |
| public void testGetColumnCount() { |
| try { |
| assertEquals(3, rsmd.getColumnCount()); |
| } catch (SQLException e) { |
| fail("SQLException is thrown: " + e.getMessage()); |
| } |
| |
| try { |
| rs.close(); |
| rsmd.getColumnCount(); |
| fail("Exception expected"); |
| } catch (SQLException e) { |
| //ok |
| } |
| |
| } |
| |
| // Column label has format TABLE.COLUMN expected: COLUMN |
| public void testGetColumnLabel() { |
| String[] labels = { "id", "name", "family" }; |
| try { |
| for (int i = 0; i < rsmd.getColumnCount(); i++) { |
| String label = rsmd.getColumnLabel(i + 1); |
| assertTrue("expected "+labels[i] + "got "+label,labels[i].contains(label)); |
| } |
| } catch (SQLException e) { |
| fail("SQLException is thrown: " + e.getMessage()); |
| } |
| |
| try { |
| String label = rsmd.getColumnLabel(0); |
| fail("SQLException expected"); |
| } catch (SQLException e) { |
| //ok |
| } |
| |
| try { |
| String label = rsmd.getColumnLabel(5); |
| fail("SQLException expected"); |
| } catch (SQLException e) { |
| //ok |
| } |
| } |
| |
| // Column label has format TABLE.COLUMN expected: COLUMN |
| public void testGetColumnName() { |
| String[] labels = { "id", "name", "family" }; |
| try { |
| for (int i = 0; i < rsmd.getColumnCount(); i++) { |
| String name = rsmd.getColumnName(i + 1); |
| assertEquals(labels[i], name); |
| } |
| } catch (SQLException e) { |
| fail("SQLException is thrown: " + e.getMessage()); |
| } |
| |
| try { |
| String label = rsmd.getColumnName(0); |
| fail("SQLException is not thrown"); |
| } catch (SQLException e) { |
| //ok |
| } |
| |
| try { |
| String label = rsmd.getColumnName(5); |
| fail("SQLException is not thrown"); |
| } catch (SQLException e) { |
| //ok |
| } |
| } |
| |
| /** |
| * For extensive tests see: ResultSetGetterTest.testGetMetaData |
| */ |
| public void testGetColumnType() { |
| int[] types = { Types.SMALLINT, Types.VARCHAR, Types.VARCHAR}; |
| try { |
| for (int i = 0; i < rsmd.getColumnCount(); i++) { |
| int type = rsmd.getColumnType(i + 1); |
| assertEquals(types[i], type); |
| } |
| } catch (SQLException e) { |
| fail("SQLException is thrown: " + e.getMessage()); |
| } |
| |
| try { |
| rsmd.getColumnType(0); |
| fail("SQLException is not thrown"); |
| } catch (SQLException e) { |
| // expected |
| } |
| try { |
| rsmd.getColumnType(5); |
| fail("SQLException is not thrown"); |
| } catch (SQLException e) { |
| // expected |
| } |
| } |
| |
| /** |
| * for extensive tests see: ResultSetGetterTest.testGetMetaData |
| */ |
| public void testGetColumnTypeName() { |
| try { |
| assertTrue("smallint".equalsIgnoreCase(rsmd.getColumnTypeName(1))); |
| assertTrue("varchar".equalsIgnoreCase(rsmd.getColumnTypeName(2))); |
| assertTrue("varchar".equalsIgnoreCase(rsmd.getColumnTypeName(3))); |
| } catch (SQLException e) { |
| fail("SQLException is thrown: " + e.getMessage()); |
| } |
| |
| try { |
| rsmd.getColumnTypeName(0); |
| fail("SQLException is not thrown"); |
| } catch (SQLException e) { |
| // expected |
| } |
| try { |
| rsmd.getColumnTypeName(5); |
| fail("SQLException is not thrown"); |
| } catch (SQLException e) { |
| // expected |
| } |
| } |
| |
| // For int = 0, exception expected |
| public void testGetTableName() throws SQLException { |
| try { |
| assertEquals("zoo", rsmd.getTableName(1)); |
| } catch (SQLException e) { |
| fail("SQLException is thrown: " + e.getMessage()); |
| } |
| Statement st1 = null; |
| ResultSet rs1 = null; |
| try { |
| |
| String create = "create table hutch (id integer not null, animal_id integer, address char(20), primary key (id));"; |
| String insert1 = "insert into hutch (id, animal_id, address) values (1, 2, 'Birds-house, 1');"; |
| String insert2 = "insert into hutch (id, animal_id, address) values (2, 1, 'Horse-house, 5');"; |
| String query = "select name, animal_id from hutch, zoo where zoo.id = 1" ; |
| st1 = conn.createStatement(); |
| st1.executeUpdate(create); |
| st1.executeUpdate(insert1); |
| st1.executeUpdate(insert2); |
| |
| rs1 = st1.executeQuery(query); |
| assertNotNull(rs1); |
| ResultSetMetaData rsmd1 = rs1.getMetaData(); |
| assertEquals("zoo", rsmd1.getTableName(1)); |
| assertEquals("hutch", rsmd1.getTableName(2)); |
| } catch (SQLException e) { |
| fail("SQLException is thrown: " + e.getMessage()); |
| } finally { |
| try { |
| if (rs1 != null) rs1.close(); |
| if (st1 != null) { |
| st1.executeUpdate("drop table if exists hutch"); |
| st1.close(); |
| } |
| } catch (SQLException sqle) { |
| } |
| } |
| //Exception Text |
| try { |
| String name = rsmd.getTableName(0); |
| fail("SQLException Expected"); |
| } catch (SQLException e) { |
| // ok |
| } |
| } |
| |
| // not supported |
| public void testGetPrecision() throws SQLException { |
| Statement st2 = null; |
| Statement st3 = null; |
| ResultSetMetaData rsmd2 = null; |
| try { |
| int precisionNum = 10; |
| int scale = 3; |
| int precicisionReal = 10; |
| String createTable = "create table DecimalNumbers ( valueDouble DOUBLE,"+ |
| "valueFloat FLOAT , scaleTest NUMERIC("+precisionNum+","+scale+"),"+ |
| " valueReal REAL("+precicisionReal+") );"; |
| String insert = "insert into DecimalNumbers values (1.5, 20.55, 30.666, 100000);"; |
| String select = "select * from DecimalNumbers;"; |
| st2 = conn.createStatement(); |
| st2.executeUpdate(createTable); |
| st2.executeUpdate(insert); |
| |
| st2.close(); |
| |
| st3 = conn.createStatement(); |
| rs = st3.executeQuery(select); |
| assertTrue(rs.next()); |
| rsmd2 = rs.getMetaData(); |
| |
| assertNotNull(rsmd2); |
| assertEquals(precicisionReal, rsmd2.getPrecision(4)); |
| assertEquals(precisionNum,rsmd2.getPrecision(3)); |
| assertTrue(rsmd2.getPrecision(2) > 0); |
| assertTrue(rsmd2.getPrecision(1) > 0); |
| |
| // non numeric field |
| try { |
| rsmd.getPrecision(3); |
| } catch (SQLException e1) { |
| System.out.println("ResultSetMetaDataTest.testGetPrecision()"+e1.getMessage()); |
| e1.printStackTrace(); |
| } |
| |
| |
| try { |
| rsmd.getPrecision(0); |
| fail("SQLException is not thrown"); |
| } catch (SQLException e) { |
| // expected |
| } |
| try { |
| rsmd.getPrecision(5); |
| fail("SQLException is not thrown"); |
| } catch (SQLException e) { |
| // expected |
| } |
| |
| try { |
| rs.close(); |
| rsmd.getPrecision(1); |
| fail("Exception expected"); |
| } catch (SQLException e) { |
| //ok |
| } |
| } finally { |
| if (st2 != null) st2.close(); |
| if (st3 != null) st3.close(); |
| } |
| } |
| |
| /** |
| * Always returns 0, exception tests fail no positive test case for |
| * black-box test possible: no default value indicated. |
| * |
| * Not supported |
| */ |
| public void testGetScale() throws SQLException { |
| try { |
| int scale = 3; |
| String createTable = "create table DecimalNumbers ( valueDouble DOUBLE,"+ |
| "valueFloat FLOAT , scaleTest NUMERIC(10,"+scale+") );"; |
| String insert = "insert into DecimalNumbers values (1.5, 20.55, 30.666);"; |
| String select = "select * from DecimalNumbers;"; |
| |
| Statement st = conn.createStatement(); |
| st.executeUpdate(createTable); |
| st.executeUpdate(insert); |
| |
| rs = st.executeQuery(select); |
| ResultSetMetaData rsmd2 = rs.getMetaData(); |
| |
| assertNotNull(rsmd2); |
| assertEquals(scale,rsmd2.getScale(3)); |
| assertTrue(rsmd2.getScale(1) > 0); |
| assertTrue(rsmd2.getScale(2) > 0); |
| |
| try { |
| rsmd.getScale(0); |
| fail("SQLException is not thrown"); |
| } catch (SQLException e) { |
| // expected |
| } |
| try { |
| rsmd.getScale(5); |
| fail("SQLException is not thrown"); |
| } catch (SQLException e) { |
| // expected |
| } |
| |
| |
| try { |
| conn.close(); |
| rsmd.getScale(1); |
| fail("Exception expected"); |
| } catch (SQLException e) { |
| //ok |
| } |
| } finally { |
| st.cancel(); |
| } |
| } |
| |
| // not supported |
| public void testGetSchema() { |
| try { |
| assertNull("Functionality is now supported. Change test",rsmd.getSchemaName(2)); |
| } catch (SQLException e1) { |
| fail("ResultSetMetaDataTest.testGetScale()"+e1.getMessage()); |
| e1.printStackTrace(); |
| } |
| |
| try { |
| rsmd.getSchemaName(0); |
| fail("SQLException is not thrown"); |
| } catch (SQLException e) { |
| // expected |
| } |
| try { |
| rsmd.getSchemaName(5); |
| fail("SQLException is not thrown"); |
| } catch (SQLException e) { |
| // expected |
| } |
| |
| try { |
| conn.close(); |
| rsmd.getSchemaName(2); |
| fail("Exception expected"); |
| } catch (SQLException e) { |
| //ok |
| } |
| |
| } |
| |
| /** |
| * Tests fail: always returns false, failing statements commented out. |
| * Feature only partially implemented.Missing: Test positive case |
| * |
| * Not supported. |
| */ |
| public void testisAutoIncrement() { |
| try { |
| assertFalse(rsmd.isAutoIncrement(1)); |
| } catch (SQLException e1) { |
| fail("ResultSetMetaDataTest.testGetScale()"+e1.getMessage()); |
| e1.printStackTrace(); |
| } |
| |
| /* |
| // Exception testing |
| |
| try { |
| rsmd.isAutoIncrement(0); |
| fail("SQLException is not thrown"); |
| } catch (SQLException e) { |
| // expected |
| } |
| try { |
| rsmd.isAutoIncrement(5); |
| fail("SQLException is not thrown"); |
| } catch (SQLException e) { |
| // expected |
| } |
| */ |
| |
| try { |
| conn.close(); |
| rsmd.getSchemaName(2); |
| fail("Exception expected"); |
| } catch (SQLException e) { |
| //ok |
| } |
| |
| } |
| |
| // not supported |
| public void testIsCaseSensitive() { |
| try { |
| assertFalse(rsmd.isCaseSensitive(1)); |
| assertFalse(rsmd.isCaseSensitive(2)); |
| assertFalse(rsmd.isCaseSensitive(3)); |
| } catch (SQLException e1) { |
| fail("ResultSetMetaDataTest.testGetScale()"+e1.getMessage()); |
| e1.printStackTrace(); |
| } |
| |
| /* |
| // Exception testing |
| |
| try { |
| rsmd.isCaseSensitive(0); |
| fail("SQLException is not thrown"); |
| } catch (SQLException e) { |
| // expected |
| } |
| try { |
| rsmd.isCaseSensitive(5); |
| fail("SQLException is not thrown"); |
| } catch (SQLException e) { |
| // expected |
| } |
| */ |
| |
| try { |
| conn.close(); |
| rsmd.isCaseSensitive(1); |
| fail("Exception expected"); |
| } catch (SQLException e) { |
| //ok |
| } |
| } |
| |
| /** |
| * Tests fail: always returns false. Exceptions and tests non Numeric fields |
| * fail, failing statements commented out. Feature only partially |
| * implemented. May be an optional feature. |
| * |
| * Not supported. |
| */ |
| public void testIsCurrency() { |
| try { |
| assertFalse(rsmd.isCurrency(1)); |
| } catch (SQLException e1) { |
| fail("ResultSetMetaDataTest.testGetScale()"+e1.getMessage()); |
| e1.printStackTrace(); |
| } |
| |
| // Exception testing |
| try { |
| rsmd.isCurrency(0); |
| fail("SQLException is not thrown"); |
| } catch (SQLException e) { |
| // expected |
| } |
| try { |
| rsmd.isCurrency(5); |
| fail("SQLException is not thrown"); |
| } catch (SQLException e) { |
| // expected |
| } |
| |
| try { |
| rs.close(); |
| rsmd.isCurrency(1); |
| fail("Exception expected"); |
| } catch (SQLException e) { |
| //ok |
| } |
| } |
| |
| // not supported |
| public void testIsDefinitlyWritable() { |
| try { |
| assertTrue(rsmd.isDefinitelyWritable(1)); |
| } catch (SQLException e1) { |
| fail("ResultSetMetaDataTest.testisDefinitelyWritable()" |
| + e1.getMessage()); |
| e1.printStackTrace(); |
| } |
| |
| // Exception testing |
| |
| try { |
| rsmd.isDefinitelyWritable(0); |
| fail("SQLException is not thrown"); |
| } catch (SQLException e) { |
| // expected |
| } |
| try { |
| rsmd.isDefinitelyWritable(5); |
| fail("SQLException is not thrown"); |
| } catch (SQLException e) { |
| // expected |
| } |
| } |
| |
| /** |
| * Tests fail: always returns ResultSetMetaData.columnNullableUnknown. |
| * Exceptions fail, failing statements commented out. Feature only |
| * partially implemented. May be an optional feature. |
| * |
| * Not supported. |
| */ |
| public void testIsNullable() { |
| try { |
| assertEquals(ResultSetMetaData.columnNullable, rsmd |
| .isNullable(1)); |
| assertEquals(ResultSetMetaData.columnNullable, rsmd |
| .isNullable(2)); |
| assertEquals(ResultSetMetaData.columnNullable, rsmd |
| .isNullable(3)); |
| } catch (SQLException e1) { |
| fail("ResultSetMetaDataTest.isNullable()" + e1.getMessage()); |
| e1.printStackTrace(); |
| } |
| |
| /* |
| // Exception testing |
| |
| try { |
| rsmd.isNullable(0); |
| fail("SQLException is not thrown"); |
| } catch (SQLException e) { |
| // expected |
| } |
| try { |
| rsmd.isNullable(5); |
| fail("SQLException is not thrown"); |
| } catch (SQLException e) { |
| // expected |
| } |
| */ |
| |
| } |
| |
| /** |
| * Cannot know from blackbox test if readonly or writable. Exceptions fail, |
| * Feature only partially implemented. |
| */ |
| public void testIsReadOnly() { |
| try { |
| assertFalse(rsmd.isReadOnly(1)); |
| } catch (SQLException e1) { |
| fail("ResultSetMetaDataTest.isReadOnly" + e1.getMessage()); |
| e1.printStackTrace(); |
| } |
| |
| // Exception testing |
| |
| try { |
| rsmd.isReadOnly(0); |
| fail("SQLException is not thrown"); |
| } catch (SQLException e) { |
| // expected |
| } |
| } |
| |
| /** |
| * Tests fail: always returns false. Exceptions fail, Feature only partially |
| * implemented. Missing: test for searchable field. |
| */ |
| public void testIsSearchable() { |
| try { |
| assertTrue(rsmd.isSearchable(1)); |
| assertTrue(rsmd.isSearchable(2)); |
| assertTrue(rsmd.isSearchable(3)); |
| } catch (SQLException e1) { |
| fail("ResultSetMetaDataTest.isReadOnly" + e1.getMessage()); |
| e1.printStackTrace(); |
| } |
| |
| // Exception testing |
| |
| try { |
| rsmd.isSearchable(0); |
| fail("SQLException is not thrown"); |
| } catch (SQLException e) { |
| // expected |
| } |
| } |
| |
| /** |
| * Tests fail: always returns false. Exceptions and tests on non numeric |
| * fields fail, Feature only partially implemented. Missing: test positive |
| * result |
| */ |
| public void testIsSigned() { |
| try { |
| assertFalse(rsmd.isSigned(1)); |
| } catch (SQLException e1) { |
| fail("ResultSetMetaDataTest.isSigned" + e1.getMessage()); |
| e1.printStackTrace(); |
| } |
| |
| // Exception testing |
| |
| try { |
| rsmd.isSigned(0); |
| fail("SQLException is not thrown"); |
| } catch (SQLException e) { |
| // expected |
| } |
| } |
| |
| /** |
| * Analogous to is Readonly. Exceptions and tests on non numeric fields |
| * fail, Failing statements commented out. Feature only partially |
| * implemented. |
| */ |
| public void testIsWritable() { |
| try { |
| assertTrue(rsmd.isWritable(1)); |
| assertTrue(rsmd.isWritable(2)); |
| assertTrue(rsmd.isWritable(3)); |
| } catch (SQLException e1) { |
| fail("ResultSetMetaDataTest.isWritable" + e1.getMessage()); |
| e1.printStackTrace(); |
| } |
| |
| // Exception testing |
| |
| try { |
| rsmd.isWritable(0); |
| fail("SQLException is not thrown"); |
| } catch (SQLException e) { |
| // expected |
| } |
| } |
| |
| |
| /** |
| * Tests fail. always returns 0. Missing case where display size greater than 0 |
| */ |
| public void testGetColumnDisplaySize() { |
| try { |
| for (int i = 0; i < rsmd.getColumnCount(); i++) { |
| int size = rsmd.getColumnDisplaySize(i + 1); |
| assertTrue(size > 0); |
| } |
| } catch (SQLException e) { |
| fail("SQLException is thrown: " + e.getMessage()); |
| } |
| |
| // Exception testing |
| |
| try { |
| rsmd.getColumnDisplaySize(0); |
| fail("SQLException is not thrown"); |
| } catch (SQLException e) { |
| // expected |
| } |
| try { |
| rsmd.getColumnDisplaySize(5); |
| fail("SQLException is not thrown"); |
| } catch (SQLException e) { |
| // expected |
| } |
| } |
| |
| } |