You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ac...@apache.org on 2009/11/26 16:56:55 UTC

svn commit: r884613 - /qpid/trunk/qpid/python/qpid/brokertest.py

Author: aconway
Date: Thu Nov 26 15:56:54 2009
New Revision: 884613

URL: http://svn.apache.org/viewvc?rev=884613&view=rev
Log:
Improved error messages in brokertest framework.

Modified:
    qpid/trunk/qpid/python/qpid/brokertest.py

Modified: qpid/trunk/qpid/python/qpid/brokertest.py
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/python/qpid/brokertest.py?rev=884613&r1=884612&r2=884613&view=diff
==============================================================================
--- qpid/trunk/qpid/python/qpid/brokertest.py (original)
+++ qpid/trunk/qpid/python/qpid/brokertest.py Thu Nov 26 15:56:54 2009
@@ -47,6 +47,30 @@
 class BadProcessStatus(Exception):
     pass
 
+class ExceptionWrapper:
+    """Proxy object that adds a message to exceptions raised"""
+    def __init__(self, obj, msg):
+        self.obj = obj
+        self.msg = msg
+        
+    def __getattr__(self, name):
+        func = getattr(self.obj, name)
+        return lambda *args, **kwargs: self._wrap(func, args, kwargs)
+
+    def _wrap(self, func, args, kwargs):
+        try:
+            return func(*args, **kwargs)
+        except Exception, e:
+            raise Exception("%s: %s" %(self.msg, str(e)))
+        
+def error_line(f):
+    try:
+        lines = file(f).readlines()
+        if len(lines) > 0: return ": %s" % (lines[-1])
+    except: pass
+    return ""
+    
+
 class Popen(popen2.Popen3):
     """
     Similar to subprocess.Popen but using popen2 classes for portability.
@@ -55,24 +79,28 @@
     """
 
     def __init__(self, cmd, expect=EXPECT_EXIT_OK):
+        if type(cmd) is type(""): cmd = [cmd] # Make it a list.
         self.cmd  = [ str(x) for x in cmd ]
         popen2.Popen3.__init__(self, self.cmd, True)
         self.expect = expect
-        self.stdin = self.tochild
-        self.stdout = self.fromchild
-        self.stderr = self.childerr
         self.pname = "%s-%d" % (os.path.split(self.cmd[0])[-1], self.pid)
+        msg = "Process %s" % self.pname
+        self.stdin = ExceptionWrapper(self.tochild, msg)
+        self.stdout = ExceptionWrapper(self.fromchild, msg)
+        self.stderr = ExceptionWrapper(self.childerr, msg)
         self.dump(self.cmd_str(), "cmd")
 
     def dump(self, str, ext):
-        f = file("%s.%s" % (self.pname, ext), "w")
+        name = "%s.%s" % (self.pname, ext)
+        f = file(name, "w")
         f.write(str)
         f.close()
+        return name
 
     def unexpected(self,msg):
         self.dump(self.stdout.read(), "out")
-        self.dump(self.stderr.read(), "err")
-        raise BadProcessStatus("%s: %s" % (msg, self.pname))
+        err = self.dump(self.stderr.read(), "err")
+        raise BadProcessStatus("%s %s%s" % (self.pname, msg, error_line(err)))
     
     def stop(self):                  # Clean up at end of test.
         if self.expect == EXPECT_RUNNING:
@@ -88,11 +116,11 @@
                 delay *= 2
             if self.returncode is None: # Still haven't stopped
                 self.kill()
-                self.unexpected("Still running")
+                self.unexpected("still running")
             elif self.expect == EXPECT_EXIT_OK and self.returncode != 0:
-                self.unexpected("Exit code %d" % self.returncode)
+                self.unexpected("exit code %d" % self.returncode)
             elif self.expect == EXPECT_EXIT_FAIL and self.returncode == 0:
-                self.unexpected("Expected error")
+                self.unexpected("expected error")
                
     def communicate(self, input=None):
         if input:
@@ -102,7 +130,10 @@
         self.wait()
         return outerr
 
-    def is_running(self): return is_running(self.pid)
+    def is_running(self): return self.poll() is None
+
+    def assert_running(self):
+        if not self.is_running(): unexpected("Exit code %d" % self.returncode)
 
     def poll(self):
         self.returncode = popen2.Popen3.poll(self)
@@ -157,8 +188,8 @@
         if (self._port is None):
             try: self._port = int(self.stdout.readline())
             except ValueError, e:
-                raise Exception("Can't get port for broker %s (%s)\n    %s" %
-                                (self.name, self.pname, file(self.log).readlines()[-1]))
+                raise Exception("Can't get port for broker %s (%s)%s" %
+                                (self.name, self.pname, error_line(self.log)))
         return self._port
 
     def unexpected(self,msg):



---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:commits-subscribe@qpid.apache.org