| -module(mgw_nat_act_vfuk_onw_tests). |
| -author('Harald Welte <laforge@gnumonks.org>'). |
| |
| -include_lib("eunit/include/eunit.hrl"). |
| |
| -include_lib("osmo_map/include/map.hrl"). |
| -include_lib("osmo_ss7/include/sccp.hrl"). |
| -include_lib("osmo_ss7/include/osmo_util.hrl"). |
| |
| |
| |
| -define(MAP_DEC_IN, {'begin', |
| #'MapSpecificPDUs_begin'{ |
| otid = [81,1,2,200], |
| dialoguePortion = {'EXTERNAL', {syntax,{0,0,17,773,1,1,1}}, asn1_NOVALUE, |
| [96,15,128,2,7,128,161,9,6,7,4,0,0,1,0,1,3]}, |
| components = [{basicROS, |
| {invoke, #'MapSpecificPDUs_begin_components_SEQOF_basicROS_invoke'{ |
| invokeId = {present,64}, |
| linkedId = asn1_NOVALUE, |
| opcode = {local,2}, |
| argument = #'UpdateLocationArg'{ |
| imsi = [50,20,149,112,8,100,119,248], |
| 'msc-Number' = [145,83,132,9,0,7], |
| 'vlr-Number' = [145,83,132,9,0,23], |
| 'vlr-Capability' = #'VLR-Capability'{ |
| supportedCamelPhases = [phase1, phase2, phase3], |
| _ = asn1_NOVALUE}, |
| _ = asn1_NOVALUE}, |
| _ = asn1_NOVALUE}}}] |
| }}). |
| -define(MAP_DEC_OUT, {'begin', |
| #'MapSpecificPDUs_begin'{ |
| otid = [81,1,2,200], |
| dialoguePortion = {'EXTERNAL', {syntax,{0,0,17,773,1,1,1}}, asn1_NOVALUE, |
| [96,15,128,2,7,128,161,9,6,7,4,0,0,1,0,1,3]}, |
| components = [{basicROS, |
| {invoke, #'MapSpecificPDUs_begin_components_SEQOF_basicROS_invoke'{ |
| invokeId = {present,64}, |
| linkedId = asn1_NOVALUE, |
| opcode = {local,2}, |
| argument = #'UpdateLocationArg'{ |
| imsi = [50,20,149,112,8,100,119,248], |
| 'msc-Number' = [145,83,132,9,0,7], |
| 'vlr-Number' = [145,83,132,9,0,23], |
| 'vlr-Capability' = #'VLR-Capability'{ |
| supportedCamelPhases = [phase1], |
| _ = asn1_NOVALUE}, |
| _ = asn1_NOVALUE}, |
| _ = asn1_NOVALUE}}}] |
| }}). |
| |
| setup() -> |
| application:set_env(mgw_nat, camel_phase_patch_table, [ |
| % each element in this list is a tuple of two lists: |
| % first half of the tuple: property-list of #gtt_match field members |
| % second half: list of atoms for camel phase [ phase1, phase2, phase3 ] |
| { [ {gt_range_from, 443850000000000 }, |
| {gt_range_to, 443859999999999 } ], [ phase1 ] } |
| ]), |
| application:set_env(mgw_nat, mangle_tt_sri_sm_pfx, [ 91 ]), |
| mgw_nat_act_vfuk_onw:reload_config(). |
| |
| teardown(_) -> |
| application:unset_env(mgw_nat, mangle_tt_sri_sm_pfx), |
| application:unset_env(mgw_nat, camel_phase_patch_table). |
| |
| % Test the tuple walker and camelph_twalk_cb() directly, as we don't have a |
| % SCCP header in front of the MAP message and thus we cannot call |
| % mangle_map_camel_phase() directly |
| camelphase_twalk() -> |
| ?assertEqual(?MAP_DEC_OUT, osmo_util:tuple_walk(?MAP_DEC_IN, |
| fun mgw_nat_act_vfuk_onw:camelph_twalk_cb/3, |
| [[phase1]])). |
| |
| build_fake_sccp_msg(CalledDigList) -> |
| Gt = #global_title{phone_number = CalledDigList}, |
| SccpAddr = #sccp_addr{global_title = Gt}, |
| #sccp_msg{parameters = [{called_party_addr, SccpAddr}]}. |
| |
| % a full test testing the entire chain... |
| camelphase_full() -> |
| % Set up a fake SCCP message with Called Addr and GT |
| SccpDec = build_fake_sccp_msg([4,4,3,8,5,0,0,0,0,0,0,0,0,0,1]), |
| % call the rewrite actor |
| MapOut = mgw_nat_act_vfuk_onw:rewrite_actor(map, from_msc, [SccpDec], 0, ?MAP_DEC_IN), |
| ?assertEqual(?MAP_DEC_OUT, MapOut). |
| |
| camelphase_full_nomatch() -> |
| % Set up a fake SCCP message with Called Addr and GT |
| SccpDec = build_fake_sccp_msg([4,4,3,8,6,5,4,3,2,1,2,3,4,5,1]), |
| % call the rewrite actor |
| MapOut = mgw_nat_act_vfuk_onw:rewrite_actor(map, from_msc, [SccpDec], 0, ?MAP_DEC_IN), |
| ?assertEqual(?MAP_DEC_IN, MapOut). |
| |
| test_pcap(File) -> |
| Args = [{rewrite_fn, fun mgw_nat_act_vfuk_onw:rewrite_actor/5}], |
| case file:read_file_info(File) of |
| {ok, _Info} -> |
| {ok, NrPkts} = ?debugTime("PCAP", osmo_ss7_pcap:pcap_apply(File, "", Args)), |
| ?debugFmt("Parsed ~p PCAP packets~n", [NrPkts]); |
| {error, _Reason} -> |
| ?debugFmt("Skipping PCAP based tests as no ~p could be found~n", |
| [File]) |
| end. |
| |
| camel_phase_test_() -> |
| {setup, |
| fun setup/0, |
| fun teardown/1, |
| [ ?_test(camelphase_twalk()), |
| ?_test(camelphase_full()), |
| ?_test(camelphase_full_nomatch()), |
| { timeout, 5*60, ?_test(test_pcap("../priv/map.pcap")) } ] |
| }. |