Added sanity tests for generated files
diff --git a/tools/munger/Makefile b/tools/munger/Makefile
index 5a04a1f..9984cc0 100644
--- a/tools/munger/Makefile
+++ b/tools/munger/Makefile
@@ -35,7 +35,6 @@
LINT_FILES := $(subst ${TARGET_DIR}/,lint/,${LINT_FILES})
all: ${GEN_FILES}
- @echo "Generated files"
# The core OpenFlow libraries generated from openflow.h
${TARGET_DIR}/ofp.py: ${OFP_DEP}
@@ -58,6 +57,9 @@
clean:
rm -rf ${GEN_FILES} ${LINT_FILES} ${DOC_DIR}/html/*
+test: all
+ (cd tests && python msg_test.py) > tests/msg_test.log
+
help:
@echo
@echo "Makefile for oftest source munger"
@@ -81,4 +83,4 @@
@echo "LINT_FILES: ${LINT_FILES}"
-.PHONY: all local install help doc lint clean
+.PHONY: all local install help doc lint clean test
diff --git a/tools/munger/tests/msg_test.py b/tools/munger/tests/msg_test.py
new file mode 100644
index 0000000..b92acae
--- /dev/null
+++ b/tools/munger/tests/msg_test.py
@@ -0,0 +1,216 @@
+import sys
+sys.path.append('../../../src/python/oftest/ofmsg')
+from message import *
+from action import *
+from error import *
+from ofp_aux import *
+
+header_fields = ['version', 'xid']
+fixed_header_fields = ['type', 'length']
+
+ofmsg_class_map_to_parents = {
+ action_enqueue : [ofp_action_enqueue],
+ action_output : [ofp_action_output],
+ action_set_dl_dst : [ofp_action_dl_addr],
+ action_set_dl_src : [ofp_action_dl_addr],
+ action_set_nw_dst : [ofp_action_nw_addr],
+ action_set_nw_src : [ofp_action_nw_addr],
+ action_set_nw_tos : [ofp_action_nw_tos],
+ action_set_tp_dst : [ofp_action_tp_port],
+ action_set_tp_src : [ofp_action_tp_port],
+ action_set_vlan_pcp : [ofp_action_vlan_pcp],
+ action_set_vlan_vid : [ofp_action_vlan_vid],
+ action_strip_vlan : [ofp_action_header],
+ action_vendor : [ofp_action_vendor_header],
+ aggregate_stats_reply : [ofp_stats_reply],
+ aggregate_stats_request : [ofp_stats_request,
+ ofp_aggregate_stats_request],
+ bad_action_error_msg : [ofp_error_msg],
+ bad_request_error_msg : [ofp_error_msg],
+ barrier_reply : [],
+ barrier_request : [],
+ desc_stats_reply : [ofp_stats_reply],
+ desc_stats_request : [ofp_stats_request,
+ ofp_desc_stats_request],
+ echo_reply : [],
+ echo_request : [],
+ error : [ofp_error_msg],
+ features_reply : [ofp_switch_features],
+ features_request : [],
+ flow_mod : [ofp_flow_mod],
+ flow_mod_failed_error_msg : [ofp_error_msg],
+ flow_removed : [ofp_flow_removed],
+ flow_stats_entry : [ofp_flow_stats],
+ flow_stats_reply : [ofp_stats_reply],
+ flow_stats_request : [ofp_stats_request,
+ ofp_flow_stats_request],
+ get_config_reply : [ofp_switch_config],
+ get_config_request : [],
+ hello : [],
+ hello_failed_error_msg : [ofp_error_msg],
+ ofp_desc_stats_request : [],
+ ofp_table_stats_request : [],
+ packet_in : [ofp_packet_in],
+ packet_out : [ofp_packet_out],
+ port_mod : [ofp_port_mod],
+ port_mod_failed_error_msg : [ofp_error_msg],
+ port_stats_reply : [ofp_stats_reply],
+ port_stats_request : [ofp_stats_request,
+ ofp_port_stats_request],
+ port_status : [ofp_port_status],
+ queue_get_config_reply : [ofp_queue_get_config_reply],
+ queue_get_config_request : [ofp_queue_get_config_request],
+ queue_op_failed_error_msg : [ofp_error_msg],
+ queue_stats_reply : [ofp_stats_reply],
+ queue_stats_request : [ofp_stats_request,
+ ofp_queue_stats_request],
+ set_config : [ofp_switch_config],
+ stats_reply : [ofp_stats_reply],
+ stats_request : [ofp_stats_request],
+ table_stats_reply : [ofp_stats_reply],
+ table_stats_request : [ofp_stats_request,
+ ofp_table_stats_request],
+ vendor : [ofp_vendor_header]
+}
+
+ofmsg_names = {
+ action_enqueue : 'action_enqueue',
+ action_output : 'action_output',
+ action_set_dl_dst : 'action_set_dl_dst',
+ action_set_dl_src : 'action_set_dl_src',
+ action_set_nw_dst : 'action_set_nw_dst',
+ action_set_nw_src : 'action_set_nw_src',
+ action_set_nw_tos : 'action_set_nw_tos',
+ action_set_tp_dst : 'action_set_tp_dst',
+ action_set_tp_src : 'action_set_tp_src',
+ action_set_vlan_pcp : 'action_set_vlan_pcp',
+ action_set_vlan_vid : 'action_set_vlan_vid',
+ action_strip_vlan : 'action_strip_vlan',
+ action_vendor : 'action_vendor',
+ aggregate_stats_reply : 'aggregate_stats_reply',
+ aggregate_stats_request : 'aggregate_stats_request',
+ bad_action_error_msg : 'bad_action_error_msg',
+ bad_request_error_msg : 'bad_request_error_msg',
+ barrier_reply : 'barrier_reply',
+ barrier_request : 'barrier_request',
+ desc_stats_reply : 'desc_stats_reply',
+ desc_stats_request : 'desc_stats_request',
+ echo_reply : 'echo_reply',
+ echo_request : 'echo_request',
+ error : 'error',
+ features_reply : 'features_reply',
+ features_request : 'features_request',
+ flow_mod : 'flow_mod',
+ flow_mod_failed_error_msg : 'flow_mod_failed_error_msg',
+ flow_removed : 'flow_removed',
+ flow_stats_entry : 'flow_stats_entry',
+ flow_stats_reply : 'flow_stats_reply',
+ flow_stats_request : 'flow_stats_request',
+ get_config_reply : 'get_config_reply',
+ get_config_request : 'get_config_request',
+ hello : 'hello',
+ hello_failed_error_msg : 'hello_failed_error_msg',
+ ofp_desc_stats_request : 'ofp_desc_stats_request',
+ ofp_table_stats_request : 'ofp_table_stats_request',
+ packet_in : 'packet_in',
+ packet_out : 'packet_out',
+ port_mod : 'port_mod',
+ port_mod_failed_error_msg : 'port_mod_failed_error_msg',
+ port_stats_reply : 'port_stats_reply',
+ port_stats_request : 'port_stats_request',
+ port_status : 'port_status',
+ queue_get_config_reply : 'queue_get_config_reply',
+ queue_get_config_request : 'queue_get_config_request',
+ queue_op_failed_error_msg : 'queue_op_failed_error_msg',
+ queue_stats_reply : 'queue_stats_reply',
+ queue_stats_request : 'queue_stats_request',
+ set_config : 'set_config',
+ stats_reply : 'stats_reply',
+ stats_request : 'stats_request',
+ table_stats_reply : 'table_stats_reply',
+ table_stats_request : 'table_stats_request',
+ vendor : 'vendor'
+}
+
+keys = ofmsg_class_map_to_parents.keys()
+keys.sort()
+
+print "Generating all classes with no data init"
+print
+for cls in keys:
+ print "Creating class " + ofmsg_names[cls]
+ obj = cls()
+ print ofmsg_names[cls] + " length: " + str(len(obj))
+ obj.show(" ")
+ print
+
+print "End of class generation"
+print
+print
+
+print "Generating messages, packing, showing (to verify len)"
+print "and calling self unpack"
+print
+for cls in keys:
+ print "Pack/unpack test for class " + ofmsg_names[cls]
+ obj = cls()
+ packed = obj.pack()
+ print "Packed object, length ", len(packed)
+ obj.show(" ")
+ obj_check = cls()
+ string = obj_check.unpack(packed)
+ print "Unpacked obj, length ", len(obj_check)
+ obj_check.show(" ")
+ if string != "":
+ print >> sys.stderr, "WARNING: " + ofmsg_names[cls] + \
+ ", unpack returned string " + string
+ if obj != obj_check:
+ print >> sys.stderr, "ERROR: " + ofmsg_names[cls] + \
+ ", obj != obj_check"
+ print
+
+print "End of class pack check"
+print
+
+
+#
+# TO DO
+# Generate varying actions lists and attach to flow_mod,
+# packet out and flow_stats_entry objects.
+# Generate varying lists of stats entries for replies in
+# flow_stats_reply, table_stats_reply, port_stats_reply and
+# queue_stats_reply
+# Create and test packet-to-flow function
+
+
+f = flow_stats_reply()
+ent = flow_stats_entry()
+
+
+act = action_strip_vlan()
+alist = action_list()
+alist.add(act)
+
+act = action_set_tp_dst()
+act.tp_port = 17
+
+m = ofp_match()
+m.wildcards = OFPFW_IN_PORT + OFPFW_DL_VLAN + OFPFW_DL_SRC
+
+#
+# Need: Easy reference from action to data members
+m.in_port = 12
+m.dl_src= [1,2,3,4,5,6]
+m.dl_dst= [11,22,23,24,25,26]
+m.dl_vlan = 83
+m.dl_vlan_pcp = 1
+m.dl_type = 0x12
+m.nw_tos = 3
+m.nw_proto = 0x300
+m.nw_src = 0x232323
+m.nw_dst = 0x3232123
+m.tp_src = 32
+m.tp_dst = 2
+
+m.show()
+