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)))