<s> import functools <EOL> import json <EOL> import logging <EOL> from nose . tools import eq_ <EOL> import os <EOL> import sys <EOL> import unittest <EOL> from ryu . lib import ofctl_v1_0 <EOL> from ryu . lib import ofctl_v1_2 <EOL> from ryu . lib import ofctl_v1_3 <EOL> from ryu . lib import ofctl_v1_4 <EOL> from ryu . ofproto import ofproto_parser <EOL> from ryu . ofproto . ofproto_protocol import ProtocolDesc <EOL> from ryu . tests import test_lib <EOL> LOG = logging . getLogger ( __name__ ) <EOL> class DummyDatapath ( ProtocolDesc ) : <EOL> def __init__ ( self , version ) : <EOL> super ( DummyDatapath , self ) . __init__ ( version ) <EOL> self . id = <NUM_LIT:1> <EOL> self . request_msg = None <EOL> self . reply_msg = None <EOL> self . waiters = None <EOL> @ staticmethod <EOL> def set_xid ( msg ) : <EOL> msg . set_xid ( <NUM_LIT:0> ) <EOL> return <NUM_LIT:0> <EOL> def send_msg ( self , msg ) : <EOL> msg . serialize ( ) <EOL> self . request_msg = msg <EOL> if self . reply_msg : <EOL> lock , msgs = self . waiters [ self . id ] [ msg . xid ] <EOL> msgs . append ( self . reply_msg ) <EOL> del self . waiters [ self . id ] [ msg . xid ] <EOL> lock . set ( ) <EOL> def set_reply ( self , msg , waiters ) : <EOL> self . reply_msg = msg <EOL> self . waiters = waiters <EOL> class Test_ofctl ( unittest . TestCase ) : <EOL> def _test ( self , name , dp , method , args , request , reply , expected ) : <EOL> print ( '<STR_LIT>' % name ) <EOL> waiters = { } <EOL> dp . set_reply ( reply , waiters ) <EOL> if reply : <EOL> output = method ( dp = dp , waiters = waiters , ** args ) <EOL> else : <EOL> output = method ( dp = dp , ** args ) <EOL> request . serialize ( ) <EOL> try : <EOL> eq_ ( json . dumps ( request . to_jsondict ( ) , sort_keys = True ) , <EOL> json . dumps ( dp . request_msg . to_jsondict ( ) , sort_keys = True ) ) <EOL> except AssertionError as e : <EOL> json . dump ( dp . request_msg . to_jsondict ( ) , <EOL> open ( '<STR_LIT>' + name + '<STR_LIT>' , '<STR_LIT:w>' ) , <EOL> indent = <NUM_LIT:3> , sort_keys = True ) <EOL> raise e <EOL> def _remove ( d , names ) : <EOL> def f ( x ) : <EOL> return _remove ( x , names ) <EOL> if isinstance ( d , list ) : <EOL> return list ( map ( f , d ) ) <EOL> if isinstance ( d , dict ) : <EOL> d2 = { } <EOL> for k , v in d . items ( ) : <EOL> if k in names : <EOL> continue <EOL> d2 [ k ] = f ( v ) <EOL> return d2 <EOL> return d <EOL> expected = _remove ( expected , [ '<STR_LIT>' , '<STR_LIT>' ] ) <EOL> output = _remove ( output , [ '<STR_LIT>' , '<STR_LIT>' ] ) <EOL> try : <EOL> eq_ ( json . dumps ( expected , sort_keys = True ) , <EOL> json . dumps ( output , sort_keys = True ) ) <EOL> except AssertionError as e : <EOL> json . dump ( output , open ( '<STR_LIT>' + name + '<STR_LIT>' , '<STR_LIT:w>' ) , <EOL> indent = <NUM_LIT:4> ) <EOL> raise e <EOL> def _add_tests ( ) : <EOL> _ofp_vers = { <EOL> '<STR_LIT>' : <NUM_LIT> , <EOL> '<STR_LIT>' : <NUM_LIT> , <EOL> '<STR_LIT>' : <NUM_LIT> , <EOL> '<STR_LIT>' : <NUM_LIT> , <EOL> } <EOL> _test_cases = { <EOL> '<STR_LIT>' : [ <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_0 . mod_flow_entry , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : None <EOL> } , <EOL> ] , <EOL> '<STR_LIT>' : [ <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_2 . get_desc_stats , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_2 . get_queue_stats , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_2 . get_queue_stats , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_2 . get_queue_stats , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_2 . get_queue_stats , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_2 . get_queue_config , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_2 . get_flow_stats , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_2 . get_aggregate_flow_stats , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_2 . get_table_stats , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_2 . get_port_stats , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_2 . get_port_stats , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_2 . get_group_stats , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_2 . get_group_stats , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_2 . get_group_features , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_2 . get_group_desc , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_2 . get_port_desc , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_2 . mod_flow_entry , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : None <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_2 . mod_group_entry , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : None <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_2 . mod_port_behavior , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : None <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_2 . send_experimenter , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : None <EOL> } , <EOL> ] , <EOL> '<STR_LIT>' : [ <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_3 . get_desc_stats , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_3 . get_queue_stats , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_3 . get_queue_stats , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_3 . get_queue_stats , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_3 . get_queue_stats , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_3 . get_queue_config , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_3 . get_flow_stats , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_3 . get_aggregate_flow_stats , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_3 . get_table_stats , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_3 . get_table_features , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_3 . get_port_stats , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_3 . get_port_stats , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_3 . get_meter_stats , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_3 . get_meter_stats , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_3 . get_meter_features , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_3 . get_meter_config , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_3 . get_meter_config , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_3 . get_group_stats , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_3 . get_group_stats , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_3 . get_group_features , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_3 . get_group_desc , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_3 . get_port_desc , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_3 . mod_flow_entry , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : None <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_3 . mod_meter_entry , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : None <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_3 . mod_group_entry , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : None <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_3 . mod_port_behavior , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : None <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_3 . send_experimenter , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : None <EOL> } , <EOL> ] , <EOL> '<STR_LIT>' : [ <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_4 . get_desc_stats , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_4 . get_queue_stats , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_4 . get_queue_desc_stats , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_4 . get_flow_stats , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_4 . get_aggregate_flow_stats , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_4 . get_table_stats , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_4 . get_table_features , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_4 . get_port_stats , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_4 . get_meter_stats , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_4 . get_meter_features , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_4 . get_meter_config , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_4 . get_group_stats , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_4 . get_group_features , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_4 . get_group_desc , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_4 . get_port_desc , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_4 . mod_flow_entry , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : None <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_4 . mod_meter_entry , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : None <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_4 . mod_group_entry , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : None <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_4 . mod_port_behavior , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : None <EOL> } , <EOL> { <EOL> '<STR_LIT>' : ofctl_v1_4 . send_experimenter , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : None <EOL> } , <EOL> ] , <EOL> } <EOL> def _jsonfile_to_msg ( datapath , jsonfile ) : <EOL> return ofproto_parser . ofp_msg_from_jsondict ( <EOL> datapath , json . load ( open ( jsonfile ) ) ) <EOL> this_dir = os . path . dirname ( sys . modules [ __name__ ] . __file__ ) <EOL> parser_json_root = os . path . join ( this_dir , '<STR_LIT>' ) <EOL> ofctl_json_root = os . path . join ( this_dir , '<STR_LIT>' ) <EOL> for ofp_ver , tests in _test_cases . items ( ) : <EOL> dp = DummyDatapath ( _ofp_vers [ ofp_ver ] ) <EOL> parser_json_dir = os . path . join ( parser_json_root , ofp_ver ) <EOL> ofctl_json_dir = os . path . join ( ofctl_json_root , ofp_ver ) <EOL> for test in tests : <EOL> name = '<STR_LIT>' + ofp_ver + '<STR_LIT:_>' + test [ '<STR_LIT>' ] <EOL> print ( '<STR_LIT>' % name ) <EOL> args = { } <EOL> args_json_path = os . path . join ( ofctl_json_dir , test [ '<STR_LIT>' ] ) <EOL> if os . path . exists ( args_json_path ) : <EOL> args = json . load ( open ( args_json_path ) ) <EOL> request = _jsonfile_to_msg ( <EOL> dp , os . path . join ( parser_json_dir , test [ '<STR_LIT>' ] ) ) <EOL> reply = None <EOL> expected = None <EOL> if test [ '<STR_LIT>' ] : <EOL> reply = _jsonfile_to_msg ( <EOL> dp , os . path . join ( parser_json_dir , test [ '<STR_LIT>' ] ) ) <EOL> expected = json . load ( <EOL> open ( os . path . join ( ofctl_json_dir , test [ '<STR_LIT>' ] ) ) ) <EOL> f = functools . partial ( <EOL> Test_ofctl . _test , name = name , dp = dp , method = test [ '<STR_LIT>' ] , <EOL> args = args , request = request , reply = reply , expected = expected ) <EOL> test_lib . add_method ( Test_ofctl , name , f ) <EOL> _add_tests ( ) <EOL> if __name__ == "<STR_LIT:__main__>" : <EOL> unittest . main ( ) </s>
