/*
* #%L
* P6Spy
* %%
* Copyright (C) 2013 P6Spy
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
package com.p6spy.engine.spy;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.sql.Blob;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import com.p6spy.engine.logging.P6LogOptions;
import com.p6spy.engine.test.P6TestFramework;
@RunWith(Parameterized.class)
public class P6TestResultSetWithBinary extends P6TestFramework {
ResultSet resultSet = null;
private boolean originalExcludeBinaryFlag;
public P6TestResultSetWithBinary(String db) throws SQLException, IOException {
super(db);
}
@Before
public void before() {
this.originalExcludeBinaryFlag = P6LogOptions.getActiveInstance().getExcludebinary();
}
@After
public void after() {
P6LogOptions.getActiveInstance().setExcludebinary(this.originalExcludeBinaryFlag);
}
@Before
public void setup() throws SQLException {
P6LogOptions.getActiveInstance().setExcludebinary(true);
String update = "insert into img values (?, ?, ?)";
PreparedStatement prep = getPreparedStatement(update);
prep.setInt(1, 1000);
prep.setBytes(2, "foo".getBytes(StandardCharsets.UTF_8));
if( // java.sql.SQLFeatureNotSupportedException: Method org.postgresql.jdbc4.Jdbc4Connection.createBlob() is not yet implemented.
"PostgreSQL".equals(db) //
// org.firebirdsql.jdbc.FBDriverNotCapableException: Not yet implemented.
// at org.firebirdsql.jdbc.FBBlob.setBytes(FBBlob.java:472)
|| "Firebird".equals(db) //
// java.lang.AbstractMethodError
// at com.p6spy.engine.wrapper.ConnectionWrapper.createBlob(ConnectionWrapper.java:315)
|| "SQLite".equals(db)) {
prep.setBytes(3, "foo".getBytes(StandardCharsets.UTF_8));
} else {
Blob data = connection.createBlob();
data.setBytes(1, "foo".getBytes(StandardCharsets.UTF_8));
prep.setBlob(3, data);
}
prep.execute();
resultSet = executeQuery("select val from img where id=1000");
P6LogOptions.getActiveInstance().setExcludecategories("info,debug,result");
clearLogEntries();
clearLastLogStackTrace();
}
private ResultSet executeQuery(String sql) throws SQLException {
Statement statement = connection.createStatement();
return statement.executeQuery(sql);
}
@Test
public void binaryExcludedTrue() throws SQLException {
boolean original = P6LogOptions.getActiveInstance().getExcludebinary();
try {
// given
P6LogOptions.getActiveInstance().setExcludebinary(true);
resultSet.next();
// when
resultSet.getBytes("val");
resultSet.next();
// then
assertTrue(super.getLastLogEntry().contains("val = '[binary]'"));
} finally {
P6LogOptions.getActiveInstance().setExcludebinary(original);
}
}
@Test
public void binaryExcludedFalse() throws SQLException {
boolean original = P6LogOptions.getActiveInstance().getExcludebinary();
try {
// given
P6LogOptions.getActiveInstance().setExcludebinary(false);
resultSet.next();
// when
resultSet.getBytes("val");
resultSet.next();
// then
assertTrue(super.getLastLogEntry().contains("val = '666F6F'"));
} finally {
P6LogOptions.getActiveInstance().setExcludebinary(original);
}
}
protected PreparedStatement getPreparedStatement(String query) throws SQLException {
return connection.prepareStatement(query);
}
}