Return-Path: Delivered-To: apmail-db-derby-commits-archive@www.apache.org Received: (qmail 89622 invoked from network); 6 Jul 2007 22:11:34 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 6 Jul 2007 22:11:34 -0000 Received: (qmail 79029 invoked by uid 500); 6 Jul 2007 22:11:37 -0000 Delivered-To: apmail-db-derby-commits-archive@db.apache.org Received: (qmail 78961 invoked by uid 500); 6 Jul 2007 22:11:37 -0000 Mailing-List: contact derby-commits-help@db.apache.org; run by ezmlm Precedence: bulk list-help: list-unsubscribe: List-Post: Reply-To: "Derby Development" List-Id: Delivered-To: mailing list derby-commits@db.apache.org Received: (qmail 78939 invoked by uid 99); 6 Jul 2007 22:11:37 -0000 Received: from herse.apache.org (HELO herse.apache.org) (140.211.11.133) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 06 Jul 2007 15:11:37 -0700 X-ASF-Spam-Status: No, hits=-99.5 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from [140.211.11.3] (HELO eris.apache.org) (140.211.11.3) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 06 Jul 2007 15:11:33 -0700 Received: by eris.apache.org (Postfix, from userid 65534) id AE3A11A981A; Fri, 6 Jul 2007 15:11:13 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r554073 - in /db/derby/code/trunk/java/testing/org/apache/derbyTesting: functionTests/tests/jdbcapi/LargeDataLocksTest.java functionTests/tests/jdbcapi/_Suite.java junit/Utilities.java Date: Fri, 06 Jul 2007 22:11:13 -0000 To: derby-commits@db.apache.org From: kmarsden@apache.org X-Mailer: svnmailer-1.1.0 Message-Id: <20070706221113.AE3A11A981A@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: kmarsden Date: Fri Jul 6 15:11:12 2007 New Revision: 554073 URL: http://svn.apache.org/viewvc?view=rev&rev=554073 Log: Add test for verification of DERBY-255 fix that ResultSet.getString(), ResultSet.getCharacterStream(), ResultSet.getBytes(), and ResultSet.getBinaryStream() do not hold locks after the ResultSet is closed. Added: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/LargeDataLocksTest.java Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/_Suite.java db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/Utilities.java Added: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/LargeDataLocksTest.java URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/LargeDataLocksTest.java?view=auto&rev=554073 ============================================================================== --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/LargeDataLocksTest.java (added) +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/LargeDataLocksTest.java Fri Jul 6 15:11:12 2007 @@ -0,0 +1,215 @@ +/** + * Derby - Class org.apache.derbyTesting.functionTests.tests.jdbcapi.LargeDataLocksTest + * + * 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 org.apache.derbyTesting.functionTests.tests.jdbcapi; + +import java.io.IOException; +import java.io.InputStream; +import java.sql.Clob; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.sql.SQLException; +import java.sql.Statement; + +import junit.framework.Test; +import junit.framework.TestSuite; + +import org.apache.derbyTesting.functionTests.tests.lang.ScrollCursors1Test; +import org.apache.derbyTesting.functionTests.tests.lang.UpdateCursorTest; +import org.apache.derbyTesting.junit.BaseJDBCTestCase; +import org.apache.derbyTesting.junit.CleanDatabaseTestSetup; +import org.apache.derbyTesting.junit.DatabasePropertyTestSetup; +import org.apache.derbyTesting.junit.JDBC; +import org.apache.derbyTesting.junit.SystemPropertyTestSetup; +import org.apache.derbyTesting.junit.Utilities; +import org.apache.derbyTesting.junit.TestConfiguration; + +public class LargeDataLocksTest extends BaseJDBCTestCase { + + + public LargeDataLocksTest(String name) { + super(name); + } + + + /** + * Test that ResultSet.getCharacterStream does not hold locks after the + * ResultSet is closed + * @throws SQLException + * @throws IOException + */ +public void testGetCharacterStream() throws SQLException, IOException { + // getCharacterStream() no locks expected after retrieval + int numChars = 0; + Statement stmt=createStatement(); + String sql = "SELECT bc from t1"; + // First with getCharacterStream + ResultSet rs = stmt.executeQuery(sql); + rs.next(); + java.io.Reader characterStream = rs.getCharacterStream(1); + // Extract all the characters + int read = characterStream.read(); + while (read != -1) { + read = characterStream.read(); + numChars ++; + } + assertEquals(38000,numChars); + rs.close(); + assertEquals(0,countLocks()); + commit(); + } + +/** + * Verify that getBytes does not hold locks after ResultSet is closed. + * @throws SQLException + */ +public void testGetBytes() throws SQLException { + // getBytes() no locks expected after retrieval + Statement stmt=createStatement(); + String sql = "SELECT bincol from t1" ; + ResultSet rs = stmt.executeQuery(sql); + rs.next(); + byte[] value = rs.getBytes(1); + assertEquals(38000,value.length); + rs.close(); + assertEquals(0,countLocks()); + commit(); + +} + + /** + * Verify that getBinaryStream() does not hold locks after retrieval + * @throws SQLException + * @throws IOException + */ +public void testGetBinaryStream() throws SQLException, IOException { + int numBytes = 0; + Statement stmt=createStatement(); + String sql = "SELECT bincol from t1" ; + ResultSet rs = stmt.executeQuery(sql); + rs.next(); + InputStream stream = rs.getBinaryStream(1); + int read = stream.read(); + while (read != -1) { + read = stream.read(); + numBytes ++; + } + assertEquals(38000,numBytes); + rs.close(); + assertEquals(0,countLocks()); + commit(); + } + + /** + * Test that ResultSet.getString() does not hold locks after the ResultSet is closed + * @throws SQLException + * @throws IOException + */ +public void testGetString() throws SQLException, IOException { + // getString() no locks expected after retrieval + Statement stmt=createStatement(); + String sql = "SELECT bc from t1" ; + ResultSet rs = stmt.executeQuery(sql); + rs.next(); + String value = rs.getString(1); + assertEquals(38000,value.length()); + rs.close(); + assertEquals(0,countLocks()); + commit(); + } + + + + + /** + * Create a new connection and count the number of locks held. + * @return number of locks held + * + * @throws SQLException + */ +public int countLocks() throws SQLException + { + Connection conn = openDefaultConnection(); + String sql; + Statement stmt = conn.createStatement(); + + sql = "Select count(*) from new org.apache.derby.diag.LockTable() as LT"; + ResultSet lockrs = stmt.executeQuery(sql); + lockrs.next(); + int count = lockrs.getInt(1); + lockrs.close(); + stmt.close(); + conn.close(); + return count; + } + + + + + public static Test baseSuite(String name) { + + TestSuite suite = new TestSuite(name); + suite.addTestSuite(LargeDataLocksTest.class); + + return new CleanDatabaseTestSetup(suite) { + + /** + * Create and populate table + * + * @see org.apache.derbyTesting.junit.CleanDatabaseTestSetup#decorateSQL(java.sql.Statement) + */ + protected void decorateSQL(Statement s) throws SQLException { + Connection conn = getConnection(); + conn.setAutoCommit(false); + PreparedStatement ps = null; + String sql; + + + sql = "CREATE TABLE t1 (bc CLOB(1M), bincol BLOB(1M), datalen int)"; + s.executeUpdate(sql); + + // Insert big and little values + sql = "INSERT into t1 values(?,?,?)"; + ps = conn.prepareStatement(sql); + + ps.setCharacterStream(1, new + java.io.StringReader(Utilities.repeatChar("a",38000)),38000); + ps.setBytes(2,Utilities.repeatChar("a",38000).getBytes()); + ps.setInt(3,38000); + ps.executeUpdate(); + ps.close(); + conn.commit(); + } + }; + } + + public static Test suite() { + TestSuite suite = new TestSuite("LargeDataLocksTest"); + suite.addTest(baseSuite("LargeDataLocksTest:embedded")); + suite.addTest(TestConfiguration.clientServerDecorator(baseSuite("LargeDataLocksTest:client"))); + return suite; + + } + +} + Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/_Suite.java URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/_Suite.java?view=diff&rev=554073&r1=554072&r2=554073 ============================================================================== --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/_Suite.java (original) +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/_Suite.java Fri Jul 6 15:11:12 2007 @@ -78,6 +78,7 @@ suite.addTest(ClobTest.suite()); suite.addTest(BlobUpdatableStreamTest.suite()); suite.addTest(AIjdbcTest.suite()); + suite.addTest(LargeDataLocksTest.suite()); // Old harness .java tests that run using the HarnessJavaTest // adapter and continue to use a single master file. Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/Utilities.java URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/Utilities.java?view=diff&rev=554073&r1=554072&r2=554073 ============================================================================== --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/Utilities.java (original) +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/Utilities.java Fri Jul 6 15:11:12 2007 @@ -81,6 +81,27 @@ return str.toString() +"'"; } + /** + * repeatChar is used to create strings of varying lengths. + * called from various tests to test edge cases and such. + * + * @param c character to repeat + * @param repeatCount Number of times to repeat character + * @return String of repeatCount characters c + */ + public static String repeatChar(String c, int repeatCount) + { + char ch = c.charAt(0); + + char[] chArray = new char[repeatCount]; + for (int i = 0; i < repeatCount; i++) + { + chArray[i] = ch; + } + + return new String(chArray); + + } /** * Print out resultSet in two dimensional array format, for use by