You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ra...@apache.org on 2010/05/06 02:10:08 UTC
svn commit: r941553 - in /qpid/trunk/qpid/java:
client/src/main/java/org/apache/qpid/client/
systests/src/main/java/org/apache/qpid/test/unit/client/
systests/src/main/java/org/apache/qpid/test/utils/ test-profiles/
Author: rajith
Date: Thu May 6 00:10:07 2010
New Revision: 941553
URL: http://svn.apache.org/viewvc?rev=941553&view=rev
Log:
The heartbeat wasn't being set properly and these mistakes went uncaught due to lack of proper test.
I have added a test case to AMQConnectionTest called testHeartBeat.
This test fails once in a while even when I have an external script to clean the broker instance.
It seems once it's wedged with kill -STOP, it somestimes doesn't get cleaned up properly with kill -9.
Despite the occasional failure, I think it's worth to have this test as a lot of our users rely on heartbeat functionality.
Added:
qpid/trunk/qpid/java/test-profiles/kill-broker (with props)
Modified:
qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnectionDelegate_0_10.java
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/unit/client/AMQConnectionTest.java
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/QpidTestCase.java
Modified: qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnectionDelegate_0_10.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnectionDelegate_0_10.java?rev=941553&r1=941552&r2=941553&view=diff
==============================================================================
--- qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnectionDelegate_0_10.java (original)
+++ qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnectionDelegate_0_10.java Thu May 6 00:10:07 2010
@@ -396,7 +396,7 @@ public class AMQConnectionDelegate_0_10
{
heartbeat = Integer.getInteger(ClientProperties.HEARTBEAT,ClientProperties.HEARTBEAT_DEFAULT);
}
- return 0;
+ return heartbeat;
}
protected org.apache.qpid.transport.Connection getQpidConnection()
Modified: qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/unit/client/AMQConnectionTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/unit/client/AMQConnectionTest.java?rev=941553&r1=941552&r2=941553&view=diff
==============================================================================
--- qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/unit/client/AMQConnectionTest.java (original)
+++ qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/unit/client/AMQConnectionTest.java Thu May 6 00:10:07 2010
@@ -20,6 +20,16 @@
*/
package org.apache.qpid.test.unit.client;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.InputStreamReader;
+import java.io.LineNumberReader;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import javax.jms.Connection;
+import javax.jms.ExceptionListener;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
@@ -37,6 +47,8 @@ import org.apache.qpid.client.AMQTopic;
import org.apache.qpid.configuration.ClientProperties;
import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.test.utils.QpidTestCase;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public class AMQConnectionTest extends QpidTestCase
{
@@ -45,6 +57,7 @@ public class AMQConnectionTest extends Q
private static AMQQueue _queue;
private static QueueSession _queueSession;
private static TopicSession _topicSession;
+ protected static final Logger _logger = LoggerFactory.getLogger(AMQConnectionTest.class);
protected void setUp() throws Exception
{
@@ -262,6 +275,98 @@ public class AMQConnectionTest extends Q
}
}
+ /**
+ * Test Strategy : Kill -STOP the broker and see
+ * if the client terminates the connection with a
+ * read timeout.
+ * The broker process is cleaned up in the test itself
+ * and avoids using process.waitFor() as it hangs.
+ */
+ public void testHeartBeat() throws Exception
+ {
+ boolean windows =
+ ((String) System.getProperties().get("os.name")).matches("(?i).*windows.*");
+
+ if (!isCppBroker() || windows)
+ {
+ return;
+ }
+
+ Process process = null;
+ int port = getPort(0);
+ try
+ {
+ _connection.close();
+ System.setProperty("qpid.heartbeat", "1");
+ Connection con = getConnection();
+ final AtomicBoolean lock = new AtomicBoolean(false);
+
+ String cmd = "/usr/bin/pgrep -f " + port;
+ process = Runtime.getRuntime().exec("/bin/bash");
+ LineNumberReader reader = new LineNumberReader(new InputStreamReader(process.getInputStream()));
+ PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(process.getOutputStream())), true);
+ out.println(cmd);
+ String pid = reader.readLine();
+ try
+ {
+ Integer.parseInt(pid);
+ }
+ catch (NumberFormatException e)
+ {
+ // Error! try to read further to gather the error msg.
+ String line;
+ _logger.debug(pid);
+ while ((line = reader.readLine()) != null )
+ {
+ _logger.debug(line);
+ }
+ throw new Exception( "Unable to get the brokers pid " + pid);
+ }
+ _logger.debug("pid : " + pid);
+
+ con.setExceptionListener(new ExceptionListener(){
+
+ public void onException(JMSException e)
+ {
+ synchronized(lock) {
+ lock.set(true);
+ lock.notifyAll();
+ }
+ }
+ });
+
+ out.println("kill -STOP " + pid);
+
+ synchronized(lock){
+ lock.wait(2500);
+ }
+ out.close();
+ reader.close();
+ assertTrue("Client did not terminate the connection, check log for details",lock.get());
+ }
+ catch(Exception e)
+ {
+ throw e;
+ }
+ finally
+ {
+ System.setProperty("qpid.heartbeat", "");
+ if (process != null)
+ {
+ process.destroy();
+ }
+
+ Runtime.getRuntime().exec(System.getProperty("broker.kill"));
+
+ Process brokerProcess = _brokers.remove(port);
+ if (process != null)
+ {
+ brokerProcess.destroy();
+ }
+ cleanBroker();
+ }
+ }
+
public static junit.framework.Test suite()
{
return new junit.framework.TestSuite(AMQConnectionTest.class);
Modified: qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/QpidTestCase.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/QpidTestCase.java?rev=941553&r1=941552&r2=941553&view=diff
==============================================================================
--- qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/QpidTestCase.java (original)
+++ qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/QpidTestCase.java Thu May 6 00:10:07 2010
@@ -201,7 +201,7 @@ public class QpidTestCase extends TestCa
protected PrintStream _brokerOutputStream;
- private Map<Integer, Process> _brokers = new HashMap<Integer, Process>();
+ protected Map<Integer, Process> _brokers = new HashMap<Integer, Process>();
private InitialContext _initialContext;
protected AMQConnectionFactory _connectionFactory;
@@ -453,7 +453,7 @@ public class QpidTestCase extends TestCa
return getPort(0);
}
- private int getPort(int port)
+ protected int getPort(int port)
{
if (_broker.equals(VM))
{
Added: qpid/trunk/qpid/java/test-profiles/kill-broker
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/test-profiles/kill-broker?rev=941553&view=auto
==============================================================================
--- qpid/trunk/qpid/java/test-profiles/kill-broker (added)
+++ qpid/trunk/qpid/java/test-profiles/kill-broker Thu May 6 00:10:07 2010
@@ -0,0 +1,25 @@
+
+#!/bin/bash
+#
+#
+# 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.
+#
+#
+
+
+kill -9 $1
Propchange: qpid/trunk/qpid/java/test-profiles/kill-broker
------------------------------------------------------------------------------
svn:executable = *
---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project: http://qpid.apache.org
Use/Interact: mailto:commits-subscribe@qpid.apache.org