[jboss-svn-commits] JBL Code SVN: r5780 - in labs/jbossesb/trunk/qa/junit/src/org/jboss/soa/esb: listeners util

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Aug 11 12:54:28 EDT 2006


Author: tfennelly
Date: 2006-08-11 12:54:24 -0400 (Fri, 11 Aug 2006)
New Revision: 5780

Added:
   labs/jbossesb/trunk/qa/junit/src/org/jboss/soa/esb/util/DbUtils.java
Modified:
   labs/jbossesb/trunk/qa/junit/src/org/jboss/soa/esb/listeners/SQLTablePollerConfig1.xml
   labs/jbossesb/trunk/qa/junit/src/org/jboss/soa/esb/listeners/SQLTablePollerTest.java
   labs/jbossesb/trunk/qa/junit/src/org/jboss/soa/esb/util/ListenerUtils.java
Log:
Added the SQL Table Poller tests and te DbUtils.

Modified: labs/jbossesb/trunk/qa/junit/src/org/jboss/soa/esb/listeners/SQLTablePollerConfig1.xml
===================================================================
--- labs/jbossesb/trunk/qa/junit/src/org/jboss/soa/esb/listeners/SQLTablePollerConfig1.xml	2006-08-11 16:43:04 UTC (rev 5779)
+++ labs/jbossesb/trunk/qa/junit/src/org/jboss/soa/esb/listeners/SQLTablePollerConfig1.xml	2006-08-11 16:54:24 UTC (rev 5780)
@@ -8,19 +8,20 @@
 >
 
    <PollSqlTableExample
-   	listenerClass="org.jboss.soa.esb.listeners.SqlTablePoller"
-   	actionClass="org.jboss.soa.esb.actions.DummySqlRowAction"
-   	pollLatencySecs="2"
-	maxThreads="2"
+	   	listenerClass="org.jboss.soa.esb.listeners.SqlTablePoller"
+	   	actionClass="org.jboss.soa.esb.actions.DummySqlRowAction"
+	   	pollLatencySecs="2"
+		maxThreads="2"
     	connection-url="@db.url@"
     	driver-class="@db.driver@"
     	user-name="@db.user@"
     	password="@db.password@"
-    	tableName="test_notif_table"
-    	selectFields="oid,ref,msg"
-    	keyFields="oid,ref"
-    	inProcessField="status"
-    	whereCondition="src='pepe'"
+
+        tableName="test_poll_table"
+        selectFields="ref,msg,val2"
+        keyFields="ref"
+        inProcessField="status"
+        whereCondition="src='pepe'"
    > 
 	<NotificationList type="OK"> 
 		<target class="NotifyFiles">

Modified: labs/jbossesb/trunk/qa/junit/src/org/jboss/soa/esb/listeners/SQLTablePollerTest.java
===================================================================
--- labs/jbossesb/trunk/qa/junit/src/org/jboss/soa/esb/listeners/SQLTablePollerTest.java	2006-08-11 16:43:04 UTC (rev 5779)
+++ labs/jbossesb/trunk/qa/junit/src/org/jboss/soa/esb/listeners/SQLTablePollerTest.java	2006-08-11 16:54:24 UTC (rev 5780)
@@ -22,9 +22,12 @@
 package org.jboss.soa.esb.listeners;
 
 import java.io.File;
+import java.sql.ResultSet;
+import java.sql.SQLException;
 
 import org.jboss.soa.esb.helpers.KeyValuePair;
 import org.jboss.soa.esb.util.ClassUtils;
+import org.jboss.soa.esb.util.DbUtils;
 import org.jboss.soa.esb.util.FileUtils;
 import org.jboss.soa.esb.util.JMSClientUtil;
 import org.jboss.soa.esb.util.ListenerUtils;
@@ -44,13 +47,21 @@
 	protected void setUp() throws Exception {
 		// Create the directories required by the test...
 		notifyDir = FileUtils.createTestDir("notifyDir");
+
+		createTable();
 		
 		// Start the listener...
 		listenersMgr = ListenerUtils.startListeners(ClassUtils.toResourcePath(getClass().getPackage()) + "/SQLTablePollerConfig1.xml");
 	}
 
-	public void test() throws InterruptedException {
+	public void test() throws InterruptedException, SQLException {
+		// Insert the row into the table and wait for the status to go to "P" (Pending) to "D" (Done)...
+		int insertCount = DbUtils.executeUpdate("insert into test_poll_table values ('SSSS','ref1','An arbitrary message', '1111111111','2222222222','P')");
+
+		assertEquals("Failed to create row in table.", 1, insertCount);
+		DbUtils.assertNonEmptyResultSet("select * from test_poll_table where src='SSSS' and ref='ref1' and status='D'", 10000);
 		
+		
 		// There should have been no exceptions...
 		listenersMgr.assertNotInException();
 		
@@ -60,7 +71,16 @@
 	}
 
 	protected void tearDown() throws Exception {
+		dropTable();
+
 		// Remove the directories required by the test...
 		FileUtils.assertCanDelete(notifyDir, 10000);
 	}
+
+	private void createTable() {
+		DbUtils.execute("CREATE TABLE test_poll_table (src text, ref text, msg text, val1 text, val2 text, status text)");
+	}
+	private void dropTable() {
+		DbUtils.execute("DROP TABLE test_poll_table");
+	}
 }

Added: labs/jbossesb/trunk/qa/junit/src/org/jboss/soa/esb/util/DbUtils.java
===================================================================
--- labs/jbossesb/trunk/qa/junit/src/org/jboss/soa/esb/util/DbUtils.java	2006-08-11 16:43:04 UTC (rev 5779)
+++ labs/jbossesb/trunk/qa/junit/src/org/jboss/soa/esb/util/DbUtils.java	2006-08-11 16:54:24 UTC (rev 5780)
@@ -0,0 +1,258 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2006, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.soa.esb.util;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Properties;
+
+import org.apache.log4j.Logger;
+import org.jboss.soa.esb.connection.ConnectionPool;
+import org.jboss.soa.esb.connection.ConnectionPoolFactory;
+import org.jboss.soa.esb.connection.ConnectionProperties;
+
+/**
+ * Database Utilitise.
+ * 
+ * @author <a href="mailto:tom.fennelly at jboss.com">tom.fennelly at jboss.com</a>
+ */
+public abstract class DbUtils {
+
+	private static Logger logger = Logger.getLogger(DbUtils.class);
+
+	private static String DB_DRIVER = "org.jboss.esb.db.driver";
+	private static String DB_URL = "org.jboss.esb.db.url";
+	private static String DB_USER = "org.jboss.esb.db.user";
+	private static String DB_PASSWORD = "org.jboss.esb.db.password";
+
+	public static String dbDriver = System.getProperty(DB_DRIVER);
+	public static String dbUrl = System.getProperty(DB_URL);
+	public static String dbUser = System.getProperty(DB_USER);
+	public static String dbPassword = System.getProperty(DB_PASSWORD);
+
+	private static Properties properties = new Properties();
+
+	static {
+		properties.put(ConnectionProperties.DRIVER_CLASSNAME, dbDriver);
+		properties.put(ConnectionProperties.CONNECTION_URL, dbUrl);
+		properties.put(ConnectionProperties.USERNAME, dbUser);
+		properties.put(ConnectionProperties.PASSWORD, dbPassword);
+	}
+
+	/**
+	 * Execute an SQL statement.
+	 * <p/>
+	 * Calls {@link Statement#execute(java.lang.String)}.  Manages getting and cleaning up of all
+	 * DB resources needed to execute the SQL.
+	 * 
+	 * @param sql SQL to Execute.
+	 * @return The return value from {@link Statement#execute(java.lang.String)}.
+	 */
+	public static boolean execute(String sql) {
+		DbResources dbResources = null;
+
+		try {
+			dbResources = new DbResources();
+			return dbResources.stat.execute(sql);
+		} catch (SQLException e) {
+			TestCaseUtils.logAndFail("SQL execution failed: " + sql, logger, e);
+		} finally {
+			dbResources.close();
+		}
+
+		return false;
+	}
+
+	/**
+	 * Execute an SQL statement.
+	 * <p/>
+	 * Calls {@link Statement#executeQuery(java.lang.String)}.  Manages getting and cleaning up of all
+	 * DB resources needed to execute the SQL.
+	 * 
+	 * @param query SQL to Execute.
+	 * @return Returns a Proxied {@link ResultSet} object which manages closing of all associated DB resources
+	 * on the call to {@link ResultSet#close()} to the returned {@link ResultSet} object. 
+	 */
+	public static ResultSet executeQuery(String query) {
+		DbResources dbResources = null;
+		ResultSet resultSet = null;
+
+		try {
+			dbResources = new DbResources();
+			resultSet = dbResources.stat.executeQuery(query);
+			
+			// Proxy the calls to the ResultSet object so we can close the DbResources
+			// when the call to close the resultset is made.
+			return (ResultSet) Proxy.newProxyInstance(ResultSet.class.getClassLoader(),
+				                    new Class[] { ResultSet.class },
+				                    new ResultSetInvocationHandler(resultSet, dbResources));
+		} catch (SQLException e) {
+			// Close the ResultSet and DbResources objects...
+			closeResultSet(resultSet);
+			dbResources.close();
+			TestCaseUtils.logAndFail("SQL execution failed: " + query, logger, e);
+		}
+
+		return null;
+	}
+
+	/**
+	 * Execute an SQL statement.
+	 * <p/>
+	 * Calls {@link Statement#executeUpdate(java.lang.String)}.  Manages getting and cleaning up of all
+	 * DB resources needed to execute the SQL.
+	 * 
+	 * @param sql SQL to Execute.
+	 * @return The return value from {@link Statement#executeUpdate(java.lang.String)}.
+	 */
+	public static int executeUpdate(String sql) {
+		DbResources dbResources = null;
+
+		try {
+			dbResources = new DbResources();
+			return dbResources.stat.executeUpdate(sql);
+		} catch (SQLException e) {
+			// Close the DbResources objects...
+			dbResources.close();
+			TestCaseUtils.logAndFail("SQL execution failed: " + sql, logger, e);
+		}
+
+		return 0;
+	}
+	
+	/**
+	 * Convienience method for closing a DB ResultSet.
+	 * <p/>
+	 * Handles Exceptions etc.
+	 * @param resultSet The ResultSet to close.
+	 */
+	public static void closeResultSet(ResultSet resultSet) {
+		if(resultSet != null) {
+			try {
+				resultSet.close();
+			} catch (SQLException e) {
+				TestCaseUtils.logAndFail("Failed to close resultset.", logger, e);
+			}
+		}		
+	}
+
+	/**
+	 * Assert that the specified query does not return an empty resultset. 
+	 * @param query The query to execute.
+	 * @param maxWait The maximum length of time (ms) to wait for the query to return a non-empty resultset.
+	 */
+	public static void assertNonEmptyResultSet(String query, int maxWait) {
+		long endTime = System.currentTimeMillis() + maxWait;
+		
+		while(System.currentTimeMillis() < endTime) {
+			ResultSet resSet = executeQuery(query);
+			
+			try {
+				if(resSet.next()) {
+					// There were rows in the resultset...
+					return;
+				}
+				Thread.sleep(500);
+			} catch (Exception e) {
+				TestCaseUtils.logAndFail("Error while executing SQL query [" + query + "].", logger, e);
+			} finally {
+				closeResultSet(resSet);
+			}
+		}
+		TestCaseUtils.logAndFail("SQL query [" + query + "] failed to return a non-empty resultset.  Waited for " + maxWait + "ms.", logger, null);
+	}	
+	
+	/**
+	 * ResultSet Proxying InvocationHandler.
+	 * <p/>
+	 * This class is used simply to "catch" the close method call on the ResultSet so
+	 * we can also close the underlying DbResources.
+	 * @author <a href="mailto:tom.fennelly at jboss.com">tom.fennelly at jboss.com</a>
+	 */
+	private static class ResultSetInvocationHandler implements InvocationHandler {
+		private ResultSet resultSet;
+		private DbResources dbResources;
+		
+		private ResultSetInvocationHandler(ResultSet resultSet, DbResources dbResources) {
+			this.resultSet = resultSet;
+			this.dbResources = dbResources;
+		}
+		public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+			if(method.getName().equals("close")) {
+				// Caught the call to close the resultset - close the associated DbResources too!
+				Object returnObj = method.invoke(resultSet, args);
+				dbResources.close();
+				return returnObj;
+			} else {
+				return method.invoke(resultSet, args);
+			}
+		}
+	}
+	
+	/**
+	 * Container Object for a "standard" set of DB resources.
+	 * <p/>
+	 * Provides convienience methods closing the resources etc.
+	 * @author <a href="mailto:tom.fennelly at jboss.com">tom.fennelly at jboss.com</a>
+	 */
+	private static class DbResources {
+		private Connection con = null;
+		private Statement stat = null;
+		
+		private DbResources() {
+			try {
+				// Register the driver..
+				Class.forName(dbDriver).newInstance();
+				con = DriverManager.getConnection(dbUrl, dbUser, dbPassword);
+				stat = con.createStatement();
+			} catch (Exception e) {
+				TestCaseUtils.logAndFail("Failed to connect to database.  Connection Properties: " + properties, logger, e);
+			}
+		}
+		
+		private void close() {
+			try {
+				// Commit on the connection!.
+				con.commit();
+			} catch (SQLException e) {
+				TestCaseUtils.logAndFail("Failed to commit to database: " + properties, logger, e);
+			} finally {
+				try {
+					if (stat != null) {
+						stat.close();
+					}
+					if (con != null) {
+						con.close();
+					}
+				} catch (SQLException e) {
+					TestCaseUtils.logAndFail("Failed to close database resources.  Connection Properties: " + properties, logger, e);
+				}
+			}
+		}
+	}
+}

Modified: labs/jbossesb/trunk/qa/junit/src/org/jboss/soa/esb/util/ListenerUtils.java
===================================================================
--- labs/jbossesb/trunk/qa/junit/src/org/jboss/soa/esb/util/ListenerUtils.java	2006-08-11 16:43:04 UTC (rev 5779)
+++ labs/jbossesb/trunk/qa/junit/src/org/jboss/soa/esb/util/ListenerUtils.java	2006-08-11 16:54:24 UTC (rev 5780)
@@ -28,7 +28,6 @@
 import junit.framework.TestCase;
 
 import org.apache.log4j.Logger;
-import org.jboss.soa.esb.common.SystemProperties;
 import org.jboss.soa.esb.listeners.GpListener;
 import org.jboss.soa.esb.parameters.ParamFileRepository;
 import org.jboss.soa.esb.parameters.ParamRepositoryException;
@@ -43,16 +42,6 @@
 	private static final String CONFIG_TMP_EXT = ".conftmp";
 	private static Logger logger = Logger.getLogger(ListenerUtils.class);
 
-	private static String DB_DRIVER =	"org.jboss.esb.db.driver";
-	private static String DB_URL = 		"org.jboss.esb.db.url";
-	private static String DB_USER = 	"org.jboss.esb.db.user";
-	private static String DB_PASSWORD = 	"org.jboss.esb.db.password";
-
-    private static String dbDriver   = System.getProperty(DB_DRIVER);
-    private static String dbUrl      = System.getProperty(DB_URL);
-    private static String dbUser = System.getProperty(DB_USER);
-    private static String dbPassword = System.getProperty(DB_PASSWORD);
-	
 	/**
 	 * Start a list of Listeners based on the supplied configuration.
 	 * <p/>
@@ -98,10 +87,10 @@
 			// Replace all the "@qa.build@" tokens with the qa "build" dirs file URI, and write to file...
 			configXml = configXml.replaceAll("@qa.build@", FileUtils.getEnvBuildDir().toURI().toString());
 			// Replace all the "@db.*@" tokens with the settings from the deployment.properties...
-			configXml = configXml.replaceAll("@db.driver@", dbDriver);
-			configXml = configXml.replaceAll("@db.url@", dbUrl);
-			configXml = configXml.replaceAll("@db.user@", dbUser);
-			configXml = configXml.replaceAll("@db.password@", dbPassword);
+			configXml = configXml.replaceAll("@db.driver@", DbUtils.dbDriver);
+			configXml = configXml.replaceAll("@db.url@", DbUtils.dbUrl);
+			configXml = configXml.replaceAll("@db.user@", DbUtils.dbUser);
+			configXml = configXml.replaceAll("@db.password@", DbUtils.dbPassword);
 
 			// Write the fixed up config ro a new file - this new file will be used as the listener config!
 			fixedUpFileStream.write(configXml.getBytes());




More information about the jboss-svn-commits mailing list