/*
* Copyright (c) 2007, 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.ByteArrayInputStream;
import java.nio.ByteBuffer;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Random;
public class BinaryStreamTest extends BaseTest4 {
private ByteBuffer _testData;
@Override
public void setUp() throws Exception {
super.setUp();
assumeByteaSupported();
TestUtil.createTable(con, "images", "img bytea");
Random random = new Random(31459);
_testData = ByteBuffer.allocate(200 * 1024);
while (_testData.remaining() > 0) {
_testData.putLong(random.nextLong());
}
}
@Override
public void tearDown() throws SQLException {
TestUtil.dropTable(con, "images");
super.tearDown();
}
private void insertStreamKownLength(byte[] data) throws Exception {
PreparedStatement updatePS = con.prepareStatement(TestUtil.insertSQL("images", "img", "?"));
try {
updatePS.setBinaryStream(1, new ByteArrayInputStream(data), data.length);
updatePS.executeUpdate();
} finally {
updatePS.close();
}
}
private void insertStreamUnkownLength(byte[] data) throws Exception {
PreparedStatement updatePS = con.prepareStatement(TestUtil.insertSQL("images", "img", "?"));
try {
updatePS.setBinaryStream(1, new ByteArrayInputStream(data));
updatePS.executeUpdate();
} finally {
updatePS.close();
}
}
private void validateContent(byte[] data) throws Exception {
PreparedStatement selectPS = con.prepareStatement(TestUtil.selectSQL("images", "img"));
try {
ResultSet rs = selectPS.executeQuery();
try {
rs.next();
byte[] actualData = rs.getBytes(1);
Assert.assertArrayEquals("Sent and received data are not the same", data, actualData);
} finally {
rs.close();
}
} finally {
selectPS.close();
}
PreparedStatement deletePS = con.prepareStatement("DELETE FROM images");
try {
deletePS.executeUpdate();
} finally {
deletePS.close();
}
}
private byte[] getTestData(int size) {
_testData.rewind();
byte[] data = new byte[size];
_testData.get(data);
return data;
}
@Test
public void testKnownLengthEmpty() throws Exception {
byte[] data = new byte[0];
insertStreamKownLength(data);
validateContent(data);
}
@Test
public void testKnownLength2Kb() throws Exception {
byte[] data = getTestData(2 * 1024);
insertStreamKownLength(data);
validateContent(data);
}
@Test
public void testKnownLength10Kb() throws Exception {
byte[] data = getTestData(10 * 1024);
insertStreamKownLength(data);
validateContent(data);
}
@Test
public void testKnownLength100Kb() throws Exception {
byte[] data = getTestData(100 * 1024);
insertStreamKownLength(data);
validateContent(data);
}
@Test
public void testKnownLength200Kb() throws Exception {
byte[] data = getTestData(200 * 1024);
insertStreamKownLength(data);
validateContent(data);
}
@Test
public void testUnknownLengthEmpty() throws Exception {
byte[] data = getTestData(2 * 1024);
insertStreamUnkownLength(data);
validateContent(data);
}
@Test
public void testUnknownLength2Kb() throws Exception {
byte[] data = getTestData(2 * 1024);
insertStreamUnkownLength(data);
validateContent(data);
}
@Test
public void testUnknownLength10Kb() throws Exception {
byte[] data = getTestData(10 * 1024);
insertStreamUnkownLength(data);
validateContent(data);
}
@Test
public void testUnknownLength100Kb() throws Exception {
byte[] data = getTestData(100 * 1024);
insertStreamUnkownLength(data);
validateContent(data);
}
@Test
public void testUnknownLength200Kb() throws Exception {
byte[] data = getTestData(200 * 1024);
insertStreamUnkownLength(data);
validateContent(data);
}
}