/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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. */ package sdb.test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import java.io.UnsupportedEncodingException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import org.junit.After; import org.junit.Before; import org.junit.Test; public class TestStringBase extends TestDB { private Params params ; private String tempTableName ; private String testLabel ; private String baseString ; public TestStringBase(String testLabel, String baseString, Connection jdbc, Params params, boolean verbose) { super(jdbc, verbose) ; this.params = params ; tempTableName = params.get(ParamsVocab.TempTableName) ; this.testLabel = testLabel ; this.baseString = baseString ; } @Before public void before() { execNoFail("DROP TABLE %s", tempTableName) ; } @After public void after() { } // -------- @Test public void text() throws Exception { runTextTest(testLabel+"/Text", baseString, params.get(ParamsVocab.VarcharCol), params.get(ParamsVocab.VarcharType)) ; } @Test public void binary() throws Exception { runBytesTest(testLabel+"/Binary", baseString, params.get(ParamsVocab.BinaryCol), params.get(ParamsVocab.BinaryType)) ; } private void runTextTest(String label, String testString, String colName, String colType) throws Exception { //testString = ":"+testString+":" ; if ( testString == null ) fail(label+": Test broken - null input") ; exec("CREATE TABLE %s (%s %s)", tempTableName, colName, colType) ; String $str = sqlFormat("INSERT INTO %s values (?)", tempTableName) ; if ( verbose ) System.out.println($str) ; PreparedStatement ps = jdbc.prepareStatement($str) ; ps.setString(1, testString) ; try { ps.execute() ; } // Idiom for debugging - can breakpoint the throw catch (SQLException ex) { throw ex ; } ps.close() ; try (ResultSet rs = execQuery("SELECT %s FROM %s ", colName, tempTableName )) { rs.next() ; // In Oracle an empty string is a NULL. This is not ANSI compliant. String s = rs.getString(1) ; if ( s == null ) s = "" ; byte[] b = rs.getBytes(1) ; // boolean wasNull = rs.wasNull() ; // if ( testString != null && wasNull ) // fail(testLabel+" : Got null back") ; if ( ! testString.equals(s) ) // Debug point { for ( int i = 0 ; i < s.length() ; i++ ) { System.out.printf("%x:%x ", (int)testString.charAt(i), (int)s.charAt(i)) ; } System.out.println() ; String $ = s ; // Pointless } assertEquals(testLabel+" : "+label, testString, s) ; //System.out.println("Passed: "+label) ; } } private void runBytesTest(String label, String testString, String colName, String colType) throws Exception { //testString = ":"+testString+":" ; if ( testString == null ) fail(label+": Test broken - null input") ; exec("CREATE TABLE %s (%s %s)", tempTableName, colName, colType) ; String $str = sqlFormat("INSERT INTO %s values (?)", tempTableName) ; if ( verbose ) System.out.println($str) ; PreparedStatement ps = jdbc.prepareStatement($str) ; ps.setBytes(1, stringToBytes(testString)) ; try { ps.execute() ; } // Idiom for debugging catch (SQLException ex) { throw ex ; } ps.close() ; try ( ResultSet rs = execQuery("SELECT %s FROM %s ", colName, tempTableName ) ) { rs.next() ; byte[]b = rs.getBytes(1) ; // boolean wasNull = rs.wasNull() ; // if ( testString != null && wasNull ) // fail(testLabel+": got an SQL null back") ; // In Oracle, an empty binary is a NULL. This is not ANSI compliant. String s = "" ; if ( b != null ) s = bytesToString(b) ; if ( ! testString.equals(s) ) // Debug point { String $ = s ; // Pointless } assertEquals(testLabel+" : "+label, testString, s) ; //System.out.println("Passed: "+label) ; } } // String(byte[], Charset) and .getBytes(Charset) are Java6-isms. String bytesToString(byte[] b) { if ( b == null ) fail(testLabel+": bytesToString(null)") ; try { return new String(b, "UTF-8") ; } catch (UnsupportedEncodingException ex) { ex.printStackTrace(); throw new RuntimeException("No UTF-8 - should not happen") ; } } byte[] stringToBytes(String s) { if ( s == null ) fail(testLabel+": stringToByte(null)") ; try { return s.getBytes("UTF-8") ; } catch (UnsupportedEncodingException ex) { ex.printStackTrace(); throw new RuntimeException("No UTF-8 - should not happen") ; } } }