Better packet dump routine
diff --git a/tests/basic.py b/tests/basic.py
index 9dec947..6686cd1 100644
--- a/tests/basic.py
+++ b/tests/basic.py
@@ -264,11 +264,8 @@
                                'Packet in message not received on port ' + 
                                str(of_port))
                if str(pkt) != response.data[:len(str(pkt))]:
-                   basic_logger.debug("pkt  len " + str(len(str(pkt))) +
-                                      ": " + str(pkt))
-                   basic_logger.debug("resp len " + 
-                                      str(len(str(response.data))) + 
-                                      ": " + str(response.data))
+                   basic_logger.debug("Sent %s" % format_packet(pkt))
+                   basic_logger.debug("Resp %s" % format_packet(response.data))
                    self.assertTrue(False,
                                    'Response packet does not match send packet' +
                                    ' for port ' + str(of_port))
@@ -323,6 +320,10 @@
                    self.assertEqual(of_port, dp_port, "Unexpected receive port")
                self.assertEqual(str(outpkt), str(pkt)[:len(str(outpkt))],
                                 'Response packet does not match send packet')
+               if str(outpkt) != str(pkt)[:len(str(outpkt))]:
+                   basic_logger.debug("Sent %s" % format_packet(outpkt))
+                   basic_logger.debug("Resp %s" % format_packet(
+                           str(pkt)[:len(str(outpkt))]))
 
 class FlowStatsGet(SimpleProtocol):
     """
diff --git a/tests/testutils.py b/tests/testutils.py
index 0a6c4bd..0380ade 100644
--- a/tests/testutils.py
+++ b/tests/testutils.py
@@ -817,3 +817,26 @@
         rv["matched"] += obj.matched_count
 
     return rv
+
+FILTER=''.join([(len(repr(chr(x)))==3) and chr(x) or '.' 
+                for x in range(256)])
+
+def hex_dump_buffer(src, length=16):
+    """
+    Convert src to a hex dump string and return the string
+    @param src The source buffer
+    @param length The number of bytes shown in each line
+    @returns A string showing the hex dump
+    """
+    result = []
+    for i in xrange(0, len(src), length):
+       chars = src[i:i+length]
+       hex = ' '.join(["%02x" % ord(x) for x in chars])
+       printable = ''.join(["%s" % ((ord(x) <= 127 and
+                                     FILTER[ord(x)]) or '.') for x in chars])
+       result.append("%04x  %-*s  %s\n" % (i, length*3, hex, printable))
+    return ''.join(result)
+
+def format_packet(pkt):
+    return "Packet length %d \n%s" % (len(str(pkt)), 
+                                      hex_dump_buffer(str(pkt)))