Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Tests | Fix LobsStreamingTest to close all streams and resources appropriately #1019

Merged
merged 1 commit into from
Apr 3, 2019
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.stream.IntStream;

import org.junit.jupiter.api.BeforeEach;
Expand Down Expand Up @@ -48,10 +49,8 @@ private String getRandomString(int length, String validCharacters) {
return saltStr;
}

// closing the scanner closes the Inputstream, and the driver needs the stream to fill LoBs
@SuppressWarnings("resource")
private String getStringFromInputStream(InputStream is) {
java.util.Scanner s = new java.util.Scanner(is, java.nio.charset.StandardCharsets.US_ASCII).useDelimiter("\\A");
// closing the scanner closes the InputStream, and the driver needs the stream to fill LoBs
private String getStringFromInputStream(InputStream is, Scanner s) {
return s.hasNext() ? s.next() : "";
}

Expand Down Expand Up @@ -99,18 +98,21 @@ public void testLengthAfterStream() throws SQLException, IOException {
try (Connection conn = getConnection();) {
try (Statement stmt = conn.createStatement()) {
TestUtils.dropTableIfExists(tableName, stmt);
createLobTable(stmt, tableName, Constants.LOB.CLOB);
ArrayList<String> lob_data = createRandomStringArray(Constants.LOB.CLOB);

createLobTable(stmt, tableName, Constants.LOB.CLOB);
insertData(conn, tableName, lob_data);

try (ResultSet rs = stmt.executeQuery("SELECT * FROM [" + tableName + "] ORDER BY id ASC")) {
while (rs.next()) {
Clob c = rs.getClob(2);
Reader r = c.getCharacterStream();
long clobLength = c.length();
String received = getStringFromReader(r, clobLength);// streaming string
c.free();
assertEquals(lob_data.get(rs.getInt(1)), received);// compare streamed string to initial string
try (Reader r = c.getCharacterStream()) {
long clobLength = c.length();
String received = getStringFromReader(r, clobLength);// streaming string
c.free();
assertEquals(lob_data.get(rs.getInt(1)), received);// compare streamed string to initial
// string
}
}
}
} finally {
Expand All @@ -123,61 +125,72 @@ public void testLengthAfterStream() throws SQLException, IOException {

@Test
@DisplayName("testClobsVarcharASCII")
public void testClobsVarcharASCII() throws SQLException {
@SuppressWarnings("resource")
public void testClobsVarcharASCII() throws SQLException, IOException {
try (Connection conn = getConnection()) {
try (Statement stmt = conn.createStatement()) {
TestUtils.dropTableIfExists(tableName, stmt);
createLobTable(stmt, tableName, Constants.LOB.CLOB);

ArrayList<String> lob_data = createRandomStringArray(Constants.LOB.CLOB);
ArrayList<String> recievedDataFromServer = new ArrayList<>();

createLobTable(stmt, tableName, Constants.LOB.CLOB);
insertData(conn, tableName, lob_data);

ArrayList<Clob> lobsFromServer = new ArrayList<>();
try (ResultSet rs = stmt.executeQuery("SELECT * FROM [" + tableName + "] ORDER BY id ASC")) {
while (rs.next()) {
int index = rs.getInt(1);
Clob c = rs.getClob(2);
assertEquals(c.length(), lob_data.get(index).length());
lobsFromServer.add(c);
String received = getStringFromInputStream(c.getAsciiStream());// streaming string
assertEquals(lob_data.get(index), received);// compare streamed string to initial string
try (InputStream is = c.getAsciiStream();
Scanner s = new Scanner(is, java.nio.charset.StandardCharsets.US_ASCII)
.useDelimiter("\\A")) {
String received = getStringFromInputStream(is, s);// streaming string
assertEquals(lob_data.get(index), received);// compare streamed string to initial string
c.free();
recievedDataFromServer.add(received);
}
}
for (int i = 0; i < lob_data.size(); i++) {
assertEquals(recievedDataFromServer.get(i), lob_data.get(i));// compare static string to
// streamed
// string
}
}
for (int i = 0; i < lob_data.size(); i++) {
String received = getStringFromInputStream(lobsFromServer.get(i).getAsciiStream());// non-streaming
// string
assertEquals(received, lob_data.get(i));// compare static string to streamed string
}
for (Clob c : lobsFromServer) {
c.free();
}
} finally {
try (Statement stmt = conn.createStatement()) {
TestUtils.dropTableIfExists(tableName, stmt);
}
}
}

}

@SuppressWarnings("resource")
@Test
@DisplayName("testNClobsNVarcharASCII")
public void testNClobsVarcharASCII() throws SQLException, IOException {
try (Connection conn = getConnection()) {
try (Statement stmt = conn.createStatement()) {
TestUtils.dropTableIfExists(tableName, stmt);
createLobTable(stmt, tableName, Constants.LOB.NCLOB);
// Testing AsciiStream, use Clob string set or characters will be converted to '?'
ArrayList<String> lob_data = createRandomStringArray(Constants.LOB.CLOB);

createLobTable(stmt, tableName, Constants.LOB.NCLOB);
insertData(conn, tableName, lob_data);

try (ResultSet rs = stmt.executeQuery("SELECT * FROM [" + tableName + "] ORDER BY id ASC")) {
while (rs.next()) {
int index = rs.getInt(1);
NClob c = rs.getNClob(2);
assertEquals(c.length(), lob_data.get(index).length());
String received = getStringFromInputStream(c.getAsciiStream());// NClob AsciiStream is never
// streamed
c.free();
assertEquals(lob_data.get(index), received);// compare string to initial string
try (InputStream is = c.getAsciiStream();
Scanner s = new Scanner(is, java.nio.charset.StandardCharsets.US_ASCII)
.useDelimiter("\\A")) {
String received = getStringFromInputStream(is, s);// NClob AsciiStream is never streamed
c.free();
assertEquals(lob_data.get(index), received);// compare string to initial string
}
}
}
} finally {
Expand All @@ -194,28 +207,29 @@ public void testClobsVarcharCHARA() throws SQLException, IOException {
try (Connection conn = getConnection()) {
try (Statement stmt = conn.createStatement()) {
TestUtils.dropTableIfExists(tableName, stmt);
createLobTable(stmt, tableName, Constants.LOB.CLOB);

ArrayList<String> lob_data = createRandomStringArray(Constants.LOB.CLOB);
ArrayList<String> receivedDataFromServer = new ArrayList<>();

createLobTable(stmt, tableName, Constants.LOB.CLOB);
insertData(conn, tableName, lob_data);

ArrayList<Clob> lobsFromServer = new ArrayList<>();
try (ResultSet rs = stmt.executeQuery("SELECT * FROM [" + tableName + "] ORDER BY id ASC")) {
while (rs.next()) {
int index = rs.getInt(1);
Clob c = rs.getClob(2);
assertEquals(c.length(), lob_data.get(index).length());
lobsFromServer.add(c);
String received = getStringFromReader(c.getCharacterStream(), c.length());// streaming string
assertEquals(lob_data.get(index), received);// compare streamed string to initial string
try (Reader reader = c.getCharacterStream()) {
String received = getStringFromReader(reader, c.length());// streaming string
receivedDataFromServer.add(received);
assertEquals(lob_data.get(index), received);// compare streamed string to initial string
c.free();
}
}
}
for (int i = 0; i < lob_data.size(); i++) {
String received = getStringFromReader(lobsFromServer.get(i).getCharacterStream(),
lobsFromServer.get(i).length());// non-streaming string
assertEquals(received, lob_data.get(i));// compare static string to streamed string
}
for (Clob c : lobsFromServer) {
c.free();
assertEquals(receivedDataFromServer.get(i), lob_data.get(i));// compare static string to streamed
// string
}
} finally {
try (Statement stmt = conn.createStatement()) {
Expand All @@ -231,28 +245,29 @@ public void testNClobsVarcharCHARA() throws SQLException, IOException {
try (Connection conn = getConnection()) {
try (Statement stmt = conn.createStatement()) {
TestUtils.dropTableIfExists(tableName, stmt);
createLobTable(stmt, tableName, Constants.LOB.NCLOB);

ArrayList<String> lob_data = createRandomStringArray(Constants.LOB.NCLOB);
ArrayList<String> receivedDataFromServer = new ArrayList<>();

createLobTable(stmt, tableName, Constants.LOB.NCLOB);
insertData(conn, tableName, lob_data);

ArrayList<NClob> lobsFromServer = new ArrayList<>();
try (ResultSet rs = stmt.executeQuery("SELECT * FROM [" + tableName + "] ORDER BY id ASC")) {
while (rs.next()) {
int index = rs.getInt(1);
NClob c = rs.getNClob(2);
assertEquals(c.length(), lob_data.get(index).length());
lobsFromServer.add(c);
String received = getStringFromReader(c.getCharacterStream(), c.length());// streaming string
assertEquals(lob_data.get(index), received);// compare streamed string to initial string
try (Reader reader = c.getCharacterStream()) {
String received = getStringFromReader(reader, c.length());// streaming string
receivedDataFromServer.add(received);
assertEquals(lob_data.get(index), received);// compare streamed string to initial string
c.free();
}
}
}
for (int i = 0; i < lob_data.size(); i++) {
String received = getStringFromReader(lobsFromServer.get(i).getCharacterStream(),
lobsFromServer.get(i).length());// non-streaming string
assertEquals(received, lob_data.get(i));// compare static string to streamed string
}
for (Clob c : lobsFromServer) {
c.free();
assertEquals(receivedDataFromServer.get(i), lob_data.get(i));// compare static string to streamed
// string
}
} finally {
try (Statement stmt = conn.createStatement()) {
Expand Down