diff --git a/checker/tests/resourceleak/JdbcResourceLeak.java b/checker/tests/resourceleak/JdbcResourceLeak.java new file mode 100644 index 000000000000..2d9511605c6f --- /dev/null +++ b/checker/tests/resourceleak/JdbcResourceLeak.java @@ -0,0 +1,68 @@ +// Tests for JDBC types resource leak detection +// Test case for issue 6354: +// https://github.com/typetools/checker-framework/issues/6354 + +import java.sql.*; + +class JdbcResourceLeak { + + // ========== ResultSet Tests ========== + + void resultSetNotClosed(Statement stmt) throws SQLException { + ResultSet rs = stmt.executeQuery("SELECT 1"); + // :: error: [required.method.not.called] + } + + void resultSetClosed(Statement stmt) throws SQLException { + ResultSet rs = stmt.executeQuery("SELECT 1"); + rs.close(); + } + + // ========== Statement Tests ========== + + void statementNotClosed(Connection conn) throws SQLException { + Statement stmt = conn.createStatement(); + // :: error: [required.method.not.called] + } + + void statementClosed(Connection conn) throws SQLException { + Statement stmt = conn.createStatement(); + stmt.close(); + } + + // ========== PreparedStatement Tests ========== + + void preparedStatementNotClosed(Connection conn) throws SQLException { + PreparedStatement ps = conn.prepareStatement("SELECT ?"); + // :: error: [required.method.not.called] + } + + void preparedStatementClosed(Connection conn) throws SQLException { + PreparedStatement ps = conn.prepareStatement("SELECT ?"); + ps.close(); + } + + // ========== Nested Resources ========== + + void nestedBothClosed(Connection conn) throws SQLException { + Statement stmt = conn.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT 1"); + rs.close(); + stmt.close(); + } + + void nestedStatementNotClosed(Connection conn) throws SQLException { + Statement stmt = conn.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT 1"); + rs.close(); + // :: error: [required.method.not.called] + } + + void nestedResultSetNotClosed(Connection conn) throws SQLException { + Statement stmt = conn.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT 1"); + stmt.close(); + // :: error: [required.method.not.called] + } + +} diff --git a/checker/tests/resourceleak/RowSetResourceLeak.java b/checker/tests/resourceleak/RowSetResourceLeak.java new file mode 100644 index 000000000000..4d583a2f809d --- /dev/null +++ b/checker/tests/resourceleak/RowSetResourceLeak.java @@ -0,0 +1,91 @@ +// Tests for RowSet types resource leak detection +// Test case for issue 6354: +// https://github.com/typetools/checker-framework/issues/6354 + +import javax.sql.rowset.*; +import com.sun.rowset.*; +import java.sql.*; + +class RowSetResourceLeak { + + // ========== JdbcRowSet Tests ========== + + void jdbcRowSetNotClosed(ResultSet rs) throws SQLException { + JdbcRowSet jrs = new JdbcRowSetImpl(rs); + // :: error: [required.method.not.called] + } + + void jdbcRowSetClosed(ResultSet rs) throws SQLException { + JdbcRowSet jrs = new JdbcRowSetImpl(rs); + jrs.close(); + } + + // ========== CachedRowSet Tests ========== + + void cachedRowSetNotClosed() throws SQLException { + CachedRowSet crs = new CachedRowSetImpl(); + // :: error: [required.method.not.called] + } + + void cachedRowSetClosed() throws SQLException { + CachedRowSet crs = new CachedRowSetImpl(); + crs.close(); + } + + void cachedRowSetToResultSetNotClosed() throws SQLException { + CachedRowSet crs = new CachedRowSetImpl(); + ResultSet rs = crs.toResultSet(); + crs.close(); + // :: error: [required.method.not.called] + } + + void cachedRowSetToResultSetBothClosed() throws SQLException { + CachedRowSet crs = new CachedRowSetImpl(); + ResultSet rs = crs.toResultSet(); + rs.close(); + crs.close(); + } + + void cachedRowSetToResultSetBothNotClosed() throws SQLException { + CachedRowSet crs = new CachedRowSetImpl(); + ResultSet rs = crs.toResultSet(); + // :: error: [required.method.not.called] + // :: error: [required.method.not.called] + } + + // ========== FilteredRowSet Tests ========== + + void filteredRowSetNotClosed() throws SQLException { + FilteredRowSet frs = new FilteredRowSetImpl(); + // :: error: [required.method.not.called] + } + + void filteredRowSetClosed() throws SQLException { + FilteredRowSet frs = new FilteredRowSetImpl(); + frs.close(); + } + + // ========== WebRowSet Tests ========== + + void webRowSetNotClosed() throws SQLException { + WebRowSet wrs = new WebRowSetImpl(); + // :: error: [required.method.not.called] + } + + void webRowSetClosed() throws SQLException { + WebRowSet wrs = new WebRowSetImpl(); + wrs.close(); + } + + // ========== JoinRowSet Tests ========== + + void joinRowSetNotClosed() throws SQLException { + JoinRowSet jrs = new JoinRowSetImpl(); + // :: error: [required.method.not.called] + } + + void joinRowSetClosed() throws SQLException { + JoinRowSet jrs = new JoinRowSetImpl(); + jrs.close(); + } +}