diff --git a/checker/tests/resourceleak/JdbcResourceLeak.java b/checker/tests/resourceleak/JdbcResourceLeak.java new file mode 100644 index 000000000000..d4f1e315c336 --- /dev/null +++ b/checker/tests/resourceleak/JdbcResourceLeak.java @@ -0,0 +1,78 @@ +// Tests for JDBC types resource leak detection +// Test case for issue 6354: +// https://github.com/typetools/checker-framework/issues/6354 + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +class JdbcResourceLeak { + + // ========== 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(); + } + + // ========== 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(); + } + + // ========== 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] + } + + void nestedNeitherClosed(Connection conn) throws SQLException { + Statement stmt = conn.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT 1"); + // :: error: [required.method.not.called] + // :: 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..4f6b7b38d59a --- /dev/null +++ b/checker/tests/resourceleak/RowSetResourceLeak.java @@ -0,0 +1,69 @@ +// Tests for RowSet types resource leak detection +// Test case for issue 6354: +// https://github.com/typetools/checker-framework/issues/6354 + +import java.sql.SQLException; +import javax.sql.rowset.*; + +class RowSetResourceLeak { + + // ========== JdbcRowSet Tests ========== + + void jdbcRowSetNotClosed() throws SQLException { + JdbcRowSet jrs = RowSetProvider.newFactory().createJdbcRowSet(); + // :: error: [required.method.not.called] + } + + void jdbcRowSetClosed() throws SQLException { + JdbcRowSet jrs = RowSetProvider.newFactory().createJdbcRowSet(); + jrs.close(); + } + + // ========== CachedRowSet Tests ========== + + void cachedRowSetNotClosed() throws SQLException { + CachedRowSet crs = RowSetProvider.newFactory().createCachedRowSet(); + // :: error: [required.method.not.called] + } + + void cachedRowSetClosed() throws SQLException { + CachedRowSet crs = RowSetProvider.newFactory().createCachedRowSet(); + crs.close(); + } + + // ========== FilteredRowSet Tests ========== + + void filteredRowSetNotClosed() throws SQLException { + FilteredRowSet frs = RowSetProvider.newFactory().createFilteredRowSet(); + // :: error: [required.method.not.called] + } + + void filteredRowSetClosed() throws SQLException { + FilteredRowSet frs = RowSetProvider.newFactory().createFilteredRowSet(); + frs.close(); + } + + // ========== WebRowSet Tests ========== + + void webRowSetNotClosed() throws SQLException { + WebRowSet wrs = RowSetProvider.newFactory().createWebRowSet(); + // :: error: [required.method.not.called] + } + + void webRowSetClosed() throws SQLException { + WebRowSet wrs = RowSetProvider.newFactory().createWebRowSet(); + wrs.close(); + } + + // ========== JoinRowSet Tests ========== + + void joinRowSetNotClosed() throws SQLException { + JoinRowSet jrs = RowSetProvider.newFactory().createJoinRowSet(); + // :: error: [required.method.not.called] + } + + void joinRowSetClosed() throws SQLException { + JoinRowSet jrs = RowSetProvider.newFactory().createJoinRowSet(); + jrs.close(); + } +}