[jboss-cvs] JBoss Messaging SVN: r1432 - trunk/tests/src/org/jboss/test/messaging/jms

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Wed Oct 4 19:34:02 EDT 2006


Author: clebert.suconic at jboss.com
Date: 2006-10-04 19:34:00 -0400 (Wed, 04 Oct 2006)
New Revision: 1432

Modified:
   trunk/tests/src/org/jboss/test/messaging/jms/MessageConsumerTest.java
Log:
JBMESSAGING-591 - improving testcase

Modified: trunk/tests/src/org/jboss/test/messaging/jms/MessageConsumerTest.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/jms/MessageConsumerTest.java	2006-10-04 18:04:44 UTC (rev 1431)
+++ trunk/tests/src/org/jboss/test/messaging/jms/MessageConsumerTest.java	2006-10-04 23:34:00 UTC (rev 1432)
@@ -56,6 +56,7 @@
 /**
  * @author <a href="mailto:ovidiu at jboss.org">Ovidiu Feodorov</a>
  * @author <a href="mailto:tim.fox at jboss.com">Tim Fox</a>
+ * @author <a href="mailto:clebert.suconic at jboss.com">Clebert Suconic</a>
  * @version <tt>$Revision$</tt>
  *
  * $Id$
@@ -1766,44 +1767,111 @@
       latch.acquire();
    }
 
-   public void testTimeoutReceiveOnClose() throws Exception
-   {
-      if (log.isTraceEnabled()) log.trace("testTimeoutReceiveOnClose");
-      consumerConnection.start();
-      final Latch latch = new Latch();
-      final long timeToSleep = 1000;
-      Thread closerThread = new Thread(new Runnable()
-      {
-         public void run()
-         {
+
+    /** to be used by testTimeoutReceiveOnClose */
+    private class ThreadCloser extends Thread
+    {
+
+        Object waitMonitor;
+        long timeToSleep;
+
+        public ThreadCloser( Object waitMonitor, long timeToSleep)
+        {
+            this.waitMonitor=waitMonitor;
+            this.timeToSleep=timeToSleep;
+        }
+
+
+        public void run()
+        {
             try
             {
-               // this is needed to make sure the main thread has enough time to block
-               Thread.sleep(timeToSleep);
-               topicConsumer.close();
+                log.info("(ThreadCloser)Waiting on monitor to close thread");
+                synchronized (waitMonitor)
+                {
+                    waitMonitor.wait();
+                }
+                log.info("(ThreadCloser)Notification received");
+                Thread.sleep(timeToSleep);
+                topicConsumer.close();
+
             }
-            catch(Exception e)
+            catch (Exception e)
             {
-               log.error(e);
+                log.error(e);
+                e.printStackTrace();
             }
-            finally
+        }
+    }
+
+    /** to be used by testTimeoutReceiveOnClose */
+    private class ThreadReceiver extends Thread
+    {
+
+        long timeToWait;
+        Object waitMonitor;
+        long t1;
+        long t2;
+        Object receivedObject;
+
+        public ThreadReceiver(Object waitMonitor, long timeToWait)
+        {
+            this.waitMonitor=waitMonitor;
+            this.timeToWait=timeToWait;
+        }
+
+        public void run()
+        {
+            try
             {
-               latch.release();
+                log.info("(ThreadReceiver)Waiting on monitor to close thread");
+                synchronized(waitMonitor)
+                {
+                    waitMonitor.wait();
+                }
+                log.info("(ThreadReceiver)Notification received");
+                t1=System.currentTimeMillis();
+                receivedObject=topicConsumer.receive(timeToWait);
+                t2=System.currentTimeMillis();
+
             }
-         }
-      }, "closing thread");
-      closerThread.start();
+            catch (Exception e)
+            {
+                log.error(e);
+                e.printStackTrace();
+            }
+        }
+    }
 
-      long t1 = System.currentTimeMillis();
-      assertNull(topicConsumer.receive(1500));
-      long elapsed = System.currentTimeMillis() - t1;
-      log.trace("timeToSleep = " + timeToSleep + " ms, elapsed = " + elapsed + " ms");
+   public void testTimeoutReceiveOnClose() throws Exception
+   {
+      System.gc();       /// If A GC need to be execute, it' s better to be executed now
+      Thread.sleep(1000);
+      if (log.isTraceEnabled()) log.trace("testTimeoutReceiveOnClose");
 
-      // make sure it didn't wait 5 seconds to return null; allow 10 ms for overhead
-      assertTrue(elapsed <= timeToSleep + 100);
+      Object monitor = new Object();
+      ThreadCloser closer = null;
+      ThreadReceiver receiver = new ThreadReceiver(monitor,2000);
 
-      // wait for the closing thread to finish
-      latch.acquire();
+      closer = new ThreadCloser(monitor,1000);
+      receiver= new ThreadReceiver(monitor,2000);
+      closer.start();
+      receiver.start();
+      Thread.sleep(2000);
+      synchronized (monitor)
+      {
+         monitor.notifyAll();
+      }
+      closer.join();
+      receiver.join();
+
+
+      assertNull(receiver.receivedObject);
+
+      log.info("Elapsed time was " + (receiver.t2-receiver.t1));
+
+      // We need to make sure the
+      assertTrue("Receive was supposed to receive a notification before 2 seconds",receiver.t2-receiver.t1<=1500);
    }
 
 




More information about the jboss-cvs-commits mailing list