/* * Copyright 2002-2005 the original author or authors. * * 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. */ package org.springframework.jdbc.core.support; import java.io.ByteArrayInputStream; import java.io.InputStreamReader; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Types; import java.util.Arrays; import java.util.Date; import junit.framework.TestCase; import org.easymock.ArgumentsMatcher; import org.easymock.MockControl; import org.springframework.jdbc.support.lob.LobCreator; import org.springframework.jdbc.support.lob.LobHandler; /** * Test cases for the sql lob value: * * BLOB: * 1. Types.BLOB: setBlobAsBytes (byte[]) * 2. String: setBlobAsBytes (byte[]) * 3. else: IllegalArgumentException * * CLOB: * 4. String or NULL: setClobAsString (String) * 5. InputStream: setClobAsAsciiStream (InputStream) * 6. Reader: setClobAsCharacterStream (Reader) * 7. else: IllegalArgumentException * * @author Alef Arendsen */ public class SqlLobValueTests extends TestCase { private MockControl psControl; private PreparedStatement ps; private MockControl lobHandlerControl; private LobHandler handler; private MockControl lobCreatorControl; private LobCreator creator; public void setUp() { // create preparedstatement psControl = MockControl.createControl(PreparedStatement.class); ps = (PreparedStatement) psControl.getMock(); // create handler controler lobHandlerControl = MockControl.createControl(LobHandler.class); handler = (LobHandler) lobHandlerControl.getMock(); // create creator control lobCreatorControl = MockControl.createControl(LobCreator.class); creator = (LobCreator) lobCreatorControl.getMock(); // set initial state handler.getLobCreator(); lobHandlerControl.setReturnValue(creator); } private void replay() { psControl.replay(); lobHandlerControl.replay(); lobCreatorControl.replay(); } public void test1() throws SQLException { byte[] testBytes = "Bla".getBytes(); creator.setBlobAsBytes(ps, 1, testBytes); replay(); SqlLobValue lob = new SqlLobValue(testBytes, handler); lob.setTypeValue(ps, 1, Types.BLOB, "test"); lobHandlerControl.verify(); lobCreatorControl.verify(); } public void test2() throws SQLException { String testString = "Bla"; creator.setBlobAsBytes(ps, 1, testString.getBytes()); // set a matcher to match the byte array! lobCreatorControl.setMatcher(new ArgumentsMatcher() { public boolean matches(Object[] arg0, Object[] arg1) { byte[] one = (byte[]) arg0[2]; byte[] two = (byte[]) arg1[2]; return Arrays.equals(one, two); } public String toString(Object[] arg0) { return "bla"; } }); replay(); SqlLobValue lob = new SqlLobValue(testString, handler); lob.setTypeValue(ps, 1, Types.BLOB, "test"); lobHandlerControl.verify(); lobCreatorControl.verify(); } public void test3() throws SQLException { Date testContent = new Date(); SqlLobValue lob = new SqlLobValue(new InputStreamReader(new ByteArrayInputStream("Bla".getBytes())), 12); try { lob.setTypeValue(ps, 1, Types.BLOB, "test"); fail("IllegalArgumentException should have been thrown"); } catch (IllegalArgumentException e) { // expected } } public void test4() throws SQLException { String testContent = "Bla"; creator.setClobAsString(ps, 1, testContent); replay(); SqlLobValue lob = new SqlLobValue(testContent, handler); lob.setTypeValue(ps, 1, Types.CLOB, "test"); lobHandlerControl.verify(); lobCreatorControl.verify(); } public void test5() throws SQLException { byte[] testContent = "Bla".getBytes(); ByteArrayInputStream bais = new ByteArrayInputStream(testContent); creator.setClobAsAsciiStream(ps, 1, bais, 3); lobCreatorControl.setMatcher(new ArgumentsMatcher() { public boolean matches(Object[] arg0, Object[] arg1) { // for now, match always return true; } public String toString(Object[] arg0) { return null; } }); replay(); SqlLobValue lob = new SqlLobValue(new ByteArrayInputStream(testContent), 3, handler); lob.setTypeValue(ps, 1, Types.CLOB, "test"); lobHandlerControl.verify(); lobCreatorControl.verify(); } public void test6()throws SQLException { byte[] testContent = "Bla".getBytes(); ByteArrayInputStream bais = new ByteArrayInputStream(testContent); InputStreamReader reader = new InputStreamReader(bais); creator.setClobAsCharacterStream(ps, 1, reader, 3); lobCreatorControl.setMatcher(new ArgumentsMatcher() { public boolean matches(Object[] arg0, Object[] arg1) { // for now, match always return true; } public String toString(Object[] arg0) { return null; } }); replay(); SqlLobValue lob = new SqlLobValue(reader, 3, handler); lob.setTypeValue(ps, 1, Types.CLOB, "test"); lobHandlerControl.verify(); lobCreatorControl.verify(); } public void test7() throws SQLException { Date testContent = new Date(); SqlLobValue lob = new SqlLobValue("bla".getBytes()); try { lob.setTypeValue(ps, 1, Types.CLOB, "test"); fail("IllegalArgumentException should have been thrown"); } catch (IllegalArgumentException e) { // expected } } public void testOtherConstructors() throws SQLException { // a bit BS, but we need to test them, as long as they don't throw exceptions SqlLobValue lob = new SqlLobValue("bla"); lob.setTypeValue(ps, 1, Types.CLOB, "test"); try { lob = new SqlLobValue("bla".getBytes()); lob.setTypeValue(ps, 1, Types.CLOB, "test"); fail("IllegalArgumentException should have been thrown"); } catch (IllegalArgumentException e) { // expected } lob = new SqlLobValue(new ByteArrayInputStream("bla".getBytes()), 3); lob.setTypeValue(ps, 1, Types.CLOB, "test"); lob = new SqlLobValue(new InputStreamReader( new ByteArrayInputStream("bla".getBytes())), 3); lob.setTypeValue(ps, 1, Types.CLOB, "test"); // same for BLOB lob = new SqlLobValue("bla"); lob.setTypeValue(ps, 1, Types.BLOB, "test"); lob = new SqlLobValue("bla".getBytes()); lob.setTypeValue(ps, 1, Types.BLOB, "test"); lob = new SqlLobValue(new ByteArrayInputStream("bla".getBytes()), 3); lob.setTypeValue(ps, 1, Types.BLOB, "test"); lob = new SqlLobValue(new InputStreamReader( new ByteArrayInputStream("bla".getBytes())), 3); try { lob.setTypeValue(ps, 1, Types.BLOB, "test"); fail("IllegalArgumentException should have been thrown"); } catch (IllegalArgumentException e) { // expected } } public void testCorrectCleanup() throws SQLException { creator.setClobAsString(ps, 1, "Bla"); creator.close(); replay(); SqlLobValue lob = new SqlLobValue("Bla", handler); lob.setTypeValue(ps, 1, Types.CLOB, "test"); lob.cleanup(); lobCreatorControl.verify(); } public void testOtherSqlType() throws SQLException { replay(); SqlLobValue lob = new SqlLobValue("Bla", handler); try { lob.setTypeValue(ps, 1, Types.SMALLINT, "test"); fail("IllegalArgumentException should have been thrown"); } catch (IllegalArgumentException e) { // expected } } }