/* * Copyright (c) 2016, PostgreSQL Global Development Group * See the LICENSE file in the project root for more information. */ package org.postgresql.test.jdbc4; import org.postgresql.test.TestUtil; import org.postgresql.test.jdbc2.BaseTest4; import org.junit.Assert; import org.junit.Test; import java.io.Reader; import java.io.StringReader; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.SQLFeatureNotSupportedException; public class CharacterStreamTest extends BaseTest4 { private static final String TEST_TABLE_NAME = "charstream"; private static final String TEST_COLUMN_NAME = "cs"; private static final String _delete; private static final String _insert; private static final String _select; static { _delete = String.format("DELETE FROM %s", TEST_TABLE_NAME); _insert = String.format("INSERT INTO %s (%s) VALUES (?)", TEST_TABLE_NAME, TEST_COLUMN_NAME); _select = String.format("SELECT %s FROM %s", TEST_COLUMN_NAME, TEST_TABLE_NAME); } @Override public void setUp() throws Exception { super.setUp(); TestUtil.createTable(con, TEST_TABLE_NAME, "cs text"); } @Override public void tearDown() throws SQLException { TestUtil.dropTable(con, TEST_TABLE_NAME); super.tearDown(); } private void insertStreamKnownIntLength(String data) throws Exception { PreparedStatement insertPS = con.prepareStatement(_insert); try { Reader reader = (data != null) ? new StringReader(data) : null; int length = (data != null) ? data.length() : 0; insertPS.setCharacterStream(1, reader, length); insertPS.executeUpdate(); } finally { TestUtil.closeQuietly(insertPS); } } private void insertStreamKnownLongLength(String data) throws Exception { PreparedStatement insertPS = con.prepareStatement(_insert); try { Reader reader = (data != null) ? new StringReader(data) : null; long length = (data != null) ? data.length() : 0; insertPS.setCharacterStream(1, reader, length); insertPS.executeUpdate(); } finally { TestUtil.closeQuietly(insertPS); } } private void insertStreamUnknownLength(String data) throws Exception { PreparedStatement insertPS = con.prepareStatement(_insert); try { Reader reader = (data != null) ? new StringReader(data) : null; insertPS.setCharacterStream(1, reader); insertPS.executeUpdate(); } finally { TestUtil.closeQuietly(insertPS); } } private void validateContent(String data) throws Exception { PreparedStatement selectPS = con.prepareStatement(_select); try { ResultSet rs = selectPS.executeQuery(); try { if (rs.next()) { String actualData = rs.getString(1); Assert.assertEquals("Sent and received data are not the same", data, actualData); } else { Assert.fail("query returned zero rows"); } } finally { TestUtil.closeQuietly(rs); } } finally { TestUtil.closeQuietly(selectPS); } } private String getTestData(int size) { StringBuilder buf = new StringBuilder(size); String s = "This is a test string.\n"; int slen = s.length(); int len = 0; while ((len + slen) < size) { buf.append(s); len += slen; } while (len < size) { buf.append('.'); len++; } return buf.toString(); } @Test public void testKnownIntLengthNull() throws Exception { String data = null; insertStreamKnownIntLength(data); validateContent(data); } @Test(expected = SQLFeatureNotSupportedException.class) public void testKnownLongLengthNull() throws Exception { String data = null; insertStreamKnownLongLength(data); validateContent(data); } @Test public void testUnknownLengthNull() throws Exception { String data = null; insertStreamUnknownLength(data); validateContent(data); } @Test public void testKnownIntLengthEmpty() throws Exception { String data = ""; insertStreamKnownIntLength(data); validateContent(data); } @Test(expected = SQLFeatureNotSupportedException.class) public void testKnownLongLengthEmpty() throws Exception { String data = ""; insertStreamKnownLongLength(data); validateContent(data); } @Test public void testUnknownLengthEmpty() throws Exception { String data = ""; insertStreamUnknownLength(data); validateContent(data); } @Test public void testKnownIntLength2Kb() throws Exception { String data = getTestData(2 * 1024); insertStreamKnownIntLength(data); validateContent(data); } @Test(expected = SQLFeatureNotSupportedException.class) public void testKnownLongLength2Kb() throws Exception { String data = getTestData(2 * 1024); insertStreamKnownLongLength(data); validateContent(data); } @Test public void testUnknownLength2Kb() throws Exception { String data = getTestData(2 * 1024); insertStreamUnknownLength(data); validateContent(data); } @Test public void testKnownIntLength10Kb() throws Exception { String data = getTestData(10 * 1024); insertStreamKnownIntLength(data); validateContent(data); } @Test(expected = SQLFeatureNotSupportedException.class) public void testKnownLongLength10Kb() throws Exception { String data = getTestData(10 * 1024); insertStreamKnownLongLength(data); validateContent(data); } @Test public void testUnknownLength10Kb() throws Exception { String data = getTestData(10 * 1024); insertStreamUnknownLength(data); validateContent(data); } @Test public void testKnownIntLength100Kb() throws Exception { String data = getTestData(100 * 1024); insertStreamKnownIntLength(data); validateContent(data); } @Test(expected = SQLFeatureNotSupportedException.class) public void testKnownLongLength100Kb() throws Exception { String data = getTestData(100 * 1024); insertStreamKnownLongLength(data); validateContent(data); } @Test public void testUnknownLength100Kb() throws Exception { String data = getTestData(100 * 1024); insertStreamUnknownLength(data); validateContent(data); } @Test public void testKnownIntLength200Kb() throws Exception { String data = getTestData(200 * 1024); insertStreamKnownIntLength(data); validateContent(data); } @Test(expected = SQLFeatureNotSupportedException.class) public void testKnownLongLength200Kb() throws Exception { String data = getTestData(200 * 1024); insertStreamKnownLongLength(data); validateContent(data); } @Test public void testUnknownLength200Kb() throws Exception { String data = getTestData(200 * 1024); insertStreamUnknownLength(data); validateContent(data); } }