MetadataLeakTest.java

package org.sqlite;

import static org.assertj.core.api.Assertions.assertThat;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import org.junit.jupiter.api.Test;

/** A test to make sure that getMetadata is properly freed */
public class MetadataLeakTest {
    /**
     * Check that statement is properly closed when result set is closed. See
     * https://github.com/xerial/sqlite-jdbc/issues/423
     *
     * @throws Exception on failure
     */
    @Test
    void testMemoryIsFreed() throws Exception {
        try (Connection con = DriverManager.getConnection("jdbc:sqlite::memory:")) {
            DatabaseMetaData meta = con.getMetaData();

            Statement statement;
            try (ResultSet tables = meta.getTables(null, null, null, null); ) {
                statement = tables.getStatement();
                assertThat(statement.isClosed()).isFalse();
            }
            assertThat(statement.isClosed()).isTrue();
        }
    }
}