blob: c0d3a21cab2ea99a00a3a6bf213a36ef76f4cf86 [file] [log] [blame]
Andrey Velikiyb39df232019-06-14 21:08:00 +03001% This Source Code Form is subject to the terms of the Mozilla Public
2% License, v. 2.0. If a copy of the MPL was not distributed with this
3% file, You can obtain one at https://mozilla.org/MPL/2.0/.
4% (C) 2019 Andrey Velikiy <agreat22@gmail.com>
5% (C) 2019 Fairwaves (edited)
6
7-module (gsup_encode_decode_test).
8
9-include_lib("eunit/include/eunit.hrl").
10
Andrey Velikiy1e801782019-06-24 14:09:57 +030011-define(TEST_IMSI_IE, 16#01, 16#08, 16#21, 16#43, 16#65, 16#87, 16#09, 16#21, 16#43, 16#f5).
12-define(TEST_MSISDN_IE, 16#08, 16#07, 16#91, 16#94, 16#61, 16#46, 16#32, 16#24, 16#43).
13-define(TEST_CLASS_SUBSCR_IE, 16#0a, 16#01, 16#01).
Andrey Velikiybb299662019-06-19 14:19:10 +030014-define(TEST_CLASS_INTER_MSC_IE, 16#0a, 16#01, 16#04).
15-define(TEST_AN_APDU_IE, 16#62, 16#05, 16#01, 16#42, 16#42, 16#42, 16#42).
16-define(TEST_SOURCE_NAME_IE, 16#60, 16#05, "MSC-A").
17-define(TEST_DESTINATION_NAME_IE, 16#61, 16#05, "MSC-B").
Harald Welteb470dfa2019-12-01 16:28:48 +010018-define(TEST_SUPP_RAT_TYPES_IE, 16#29, 16#02, 16#01, 16#03).
19-define(TEST_CURR_RAT_TYPE_LTE_IE, 16#2a, 16#01, 16#03).
Andrey Velikiybb299662019-06-19 14:19:10 +030020
Andrey Velikiyb39df232019-06-14 21:08:00 +030021
22missing_params_test() ->
Andrey Velikiy1e801782019-06-24 14:09:57 +030023 ?assertError({mandatory_ie_missing,location_cancellation_err,[cause]}, gsup_protocol:decode(<<16#1d, ?TEST_IMSI_IE>>)),
Andrey Velikiyfde0fd92019-08-02 09:42:22 +030024 ?assertError({mandatory_ie_missing,mo_forward_sm_req,[sm_rp_mr,sm_rp_da,sm_rp_oa,sm_rp_ui]}, gsup_protocol:encode(#{message_type => mo_forward_sm_req, imsi => <<"123456">>})).
Andrey Velikiyb39df232019-06-14 21:08:00 +030025
26excess_params_test() ->
27 ?assertError({ie_not_expected,location_upd_err,[pdp_info_complete]}, gsup_protocol:encode(#{message_type => location_upd_err,imsi => <<"1234">>,cause => 1,pdp_info_complete => <<>>})).
28
29ie_size_test() ->
30 ?assertEqual(#{cause => 255}, gsup_protocol:decode_ie(<<2,1,255>>, #{})),
31 ?assertError({ie_length_mismatch,cause,2}, gsup_protocol:decode_ie(<<2,2,0,0>>, #{})),
32
33 ?assertError({ie_value_length_mismatch,cause,-1}, gsup_protocol:encode_ie(#{cause => -1}, <<>>)),
34 ?assertEqual(<<2,1,255>>, gsup_protocol:encode_ie(#{cause => 255}, <<>>)),
35 ?assertError({ie_value_length_mismatch,cause,256}, gsup_protocol:encode_ie(#{cause => 256}, <<>>)),
36 ?assertEqual(<<20,2,255,255>>, gsup_protocol:encode_ie(#{pdp_charging => 16#ffff}, <<>>)),
37 ?assertError({ie_value_length_mismatch,pdp_charging,16#10000}, gsup_protocol:encode_ie(#{pdp_charging => 16#10000}, <<>>)),
38 ?assertEqual(<<48,4,255,255,255,255>>, gsup_protocol:encode_ie(#{session_id => 16#ffffffff}, <<>>)),
39 ?assertError({ie_value_length_mismatch,session_id,16#100000000}, gsup_protocol:encode_ie(#{session_id => 16#100000000}, <<>>)).
Andrey Velikiy1e801782019-06-24 14:09:57 +030040
41sai_req_test() ->
42 Bin = <<16#08, ?TEST_IMSI_IE, ?TEST_CLASS_SUBSCR_IE>>,
43 Map = #{imsi => <<"123456789012345">>, message_class => 1, message_type => send_auth_info_req},
44 ?assertEqual(Map, gsup_protocol:decode(Bin)),
45 ?assertEqual(Bin, gsup_protocol:encode(Map)).
46
Harald Welteb76c7fa2019-08-22 13:48:00 +020047sai_req_eps_test() ->
Harald Welteb470dfa2019-12-01 16:28:48 +010048 Bin = <<16#08, ?TEST_IMSI_IE, ?TEST_CLASS_SUBSCR_IE, ?TEST_SUPP_RAT_TYPES_IE, ?TEST_CURR_RAT_TYPE_LTE_IE>>,
Harald Welteb76c7fa2019-08-22 13:48:00 +020049 Map = #{imsi => <<"123456789012345">>, message_class => 1, message_type => send_auth_info_req,
Harald Welteb470dfa2019-12-01 16:28:48 +010050 supported_rat_types => [rat_geran_a, rat_eutran_sgs], current_rat_type => rat_eutran_sgs},
Harald Welteb76c7fa2019-08-22 13:48:00 +020051 ?assertEqual(Map, gsup_protocol:decode(Bin)),
52 ?assertEqual(Bin, gsup_protocol:encode(Map)).
53
Andrey Velikiy1e801782019-06-24 14:09:57 +030054sai_err_test() ->
55 Bin = <<16#09, ?TEST_IMSI_IE, 16#02, 16#01, 16#07>>,
56 Map = #{imsi => <<"123456789012345">>, message_type => send_auth_info_err, cause=>7},
57 ?assertEqual(Map, gsup_protocol:decode(Bin)),
58 ?assertEqual(Bin, gsup_protocol:encode(Map)).
59
60sai_res_test() ->
61 Bin = <<16#0a, ?TEST_IMSI_IE,
62 16#03, 16#22, %% Auth tuple
63 16#20, 16#10,
64 16#01, 16#02, 16#03, 16#04, 16#05, 16#06, 16#07, 16#08,
65 16#09, 16#0a, 16#0b, 16#0c, 16#0d, 16#0e, 16#0f, 16#10,
66 16#21, 16#04,
67 16#21, 16#22, 16#23, 16#24,
68 16#22, 16#08,
69 16#31, 16#32, 16#33, 16#34, 16#35, 16#36, 16#37, 16#38,
70 16#03, 16#22, %% Auth tuple
71 16#20, 16#10,
72 16#81, 16#82, 16#83, 16#84, 16#85, 16#86, 16#87, 16#88,
73 16#89, 16#8a, 16#8b, 16#8c, 16#8d, 16#8e, 16#8f, 16#90,
74 16#21, 16#04,
75 16#a1, 16#a2, 16#a3, 16#a4,
76 16#22, 16#08,
77 16#b1, 16#b2, 16#b3, 16#b4, 16#b5, 16#b6, 16#b7, 16#b8
78 >>,
79 Map = #{auth_tuples =>
80 [#{kc => <<16#31, 16#32, 16#33, 16#34, 16#35, 16#36, 16#37, 16#38>>,
81 rand => <<1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16>>,
82 sres => <<16#21, 16#22, 16#23, 16#24>>},
83 #{kc => <<16#b1, 16#b2, 16#b3, 16#b4, 16#b5, 16#b6, 16#b7, 16#b8>>,
84 rand =>
85 <<129,130,131,132,133,134,135,136,137,138,139,
86 140,141,142,143,144>>,
87 sres => <<16#a1, 16#a2, 16#a3, 16#a4>>}],
88 imsi => <<"123456789012345">>,
89 message_type => send_auth_info_res},
90 ?assertEqual(Map, gsup_protocol:decode(Bin)),
91 ?assertEqual(Bin, gsup_protocol:encode(Map)).
92
93sai_res_umts_test() ->
94 Bin = <<16#0a, ?TEST_IMSI_IE,
95 16#03, 16#62, %% Auth tuple
96 16#20, 16#10, %% rand
97 16#01, 16#02, 16#03, 16#04, 16#05, 16#06, 16#07, 16#08,
98 16#09, 16#0a, 16#0b, 16#0c, 16#0d, 16#0e, 16#0f, 16#10,
99 16#21, 16#04, %% sres
100 16#21, 16#22, 16#23, 16#24,
101 16#22, 16#08, %% kc
102 16#31, 16#32, 16#33, 16#34, 16#35, 16#36, 16#37, 16#38,
103 16#23, 16#10, %% IK (UMTS)
104 16#01, 16#02, 16#03, 16#04, 16#05, 16#06, 16#07, 16#08,
105 16#09, 16#0a, 16#0b, 16#0c, 16#0d, 16#0e, 16#0f, 16#10,
106 16#24, 16#10, %% CK (UMTS)
107 16#01, 16#02, 16#03, 16#04, 16#05, 16#06, 16#07, 16#08,
108 16#09, 16#0a, 16#0b, 16#0c, 16#0d, 16#0e, 16#0f, 16#10,
109 16#25, 16#10, %% AUTN (UMTS)
110 16#01, 16#02, 16#03, 16#04, 16#05, 16#06, 16#07, 16#08,
111 16#09, 16#0a, 16#0b, 16#0c, 16#0d, 16#0e, 16#0f, 16#10,
112 16#27, 16#08, %% RES (UMTS)
113 16#01, 16#02, 16#03, 16#04, 16#05, 16#06, 16#07, 16#08,
114 16#03, 16#62, %% Auth tuple
115 16#20, 16#10, %% rand
116 16#a1, 16#a2, 16#a3, 16#a4, 16#a5, 16#a6, 16#a7, 16#a8,
117 16#a9, 16#aa, 16#ab, 16#ac, 16#ad, 16#ae, 16#af, 16#10,
118 16#21, 16#04, %% sres
119 16#b1, 16#b2, 16#b3, 16#b4,
120 16#22, 16#08, %% kc
121 16#c1, 16#c2, 16#c3, 16#c4, 16#c5, 16#c6, 16#c7, 16#c8,
122 16#23, 16#10, %% IK (UMTS)
123 16#d1, 16#d2, 16#d3, 16#d4, 16#d5, 16#d6, 16#d7, 16#d8,
124 16#d9, 16#da, 16#db, 16#dc, 16#dd, 16#de, 16#df, 16#d0,
125 16#24, 16#10, %% CK (UMTS)
126 16#e1, 16#e2, 16#e3, 16#e4, 16#e5, 16#e6, 16#e7, 16#e8,
127 16#e9, 16#ea, 16#eb, 16#ec, 16#ed, 16#ee, 16#ef, 16#e0,
128 16#25, 16#10, %%AUTN (UMTS)
129 16#f1, 16#f2, 16#f3, 16#f4, 16#f5, 16#f6, 16#f7, 16#f8,
130 16#f9, 16#fa, 16#fb, 16#fc, 16#fd, 16#fe, 16#ff, 16#f0,
131 16#27, 16#08, %%RES (UMTS)
132 16#91, 16#92, 16#93, 16#94, 16#95, 16#96, 16#97, 16#98
133 >>,
134 Map = #{auth_tuples =>
135 [#{autn => <<1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16>>,
136 ck => <<1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16>>,
137 ik => <<1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16>>,
138 kc => <<"12345678">>,
139 rand => <<1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16>>,
140 res => <<1,2,3,4,5,6,7,8>>,
141 sres => <<16#21, 16#22, 16#23, 16#24>>},
142 #{autn => <<16#f1, 16#f2, 16#f3, 16#f4, 16#f5, 16#f6, 16#f7, 16#f8,
143 16#f9, 16#fa, 16#fb, 16#fc, 16#fd, 16#fe, 16#ff, 16#f0>>,
144 ck => <<16#e1, 16#e2, 16#e3, 16#e4, 16#e5, 16#e6, 16#e7, 16#e8,
145 16#e9, 16#ea, 16#eb, 16#ec, 16#ed, 16#ee, 16#ef, 16#e0>>,
146 ik => <<16#d1, 16#d2, 16#d3, 16#d4, 16#d5, 16#d6, 16#d7, 16#d8,
147 16#d9, 16#da, 16#db, 16#dc, 16#dd, 16#de, 16#df, 16#d0>>,
148 kc => <<16#c1, 16#c2, 16#c3, 16#c4, 16#c5, 16#c6, 16#c7, 16#c8>>,
149 rand =>
150 <<161,162,163,164,165,166,167,168,169,170,171,
151 172,173,174,175,16>>,
152 res => <<145,146,147,148,149,150,151,152>>,
153 sres => <<16#b1, 16#b2, 16#b3, 16#b4>>}],
154 imsi => <<"123456789012345">>,
155 message_type => send_auth_info_res},
156 ?assertEqual(Map, gsup_protocol:decode(Bin)),
157 ?assertEqual(Bin, gsup_protocol:encode(Map)).
158
159sai_res_auts_test() ->
160 Bin = <<16#0a, ?TEST_IMSI_IE,
161 16#26, 16#0e, %% AUTS (UMTS)
162 16#01, 16#02, 16#03, 16#04, 16#05, 16#06, 16#07, 16#08,
163 16#09, 16#0a, 16#0b, 16#0c, 16#0d, 16#0e,
164 16#20, 16#10, %% rand
165 16#01, 16#02, 16#03, 16#04, 16#05, 16#06, 16#07, 16#08,
166 16#09, 16#0a, 16#0b, 16#0c, 16#0d, 16#0e, 16#0f, 16#10
167 >>,
168 Map = #{auts => <<1,2,3,4,5,6,7,8,9,10,11,12,13,14>>,
169 imsi => <<"123456789012345">>,
170 message_type => send_auth_info_res,
171 rand => <<1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16>>},
172 ?assertEqual(Map, gsup_protocol:decode(Bin)),
173 ?assertEqual(Bin, gsup_protocol:encode(Map)).
174
175lu_req_test() ->
176 Bin = <<16#04, ?TEST_IMSI_IE>>,
177 Map = #{imsi => <<"123456789012345">>, message_type => location_upd_req},
178 ?assertEqual(Map, gsup_protocol:decode(Bin)),
179 ?assertEqual(Bin, gsup_protocol:encode(Map)).
180
181lu_err_test() ->
182 Bin = <<16#05, ?TEST_IMSI_IE, 16#02, 16#01, 16#07>>,
183 Map = #{imsi => <<"123456789012345">>, message_type => location_upd_err, cause=>7},
184 ?assertEqual(Map, gsup_protocol:decode(Bin)),
185 ?assertEqual(Bin, gsup_protocol:encode(Map)).
186
187lu_res_test() ->
188 Bin = <<16#06, ?TEST_IMSI_IE, ?TEST_MSISDN_IE,
189 16#09, 16#07, %% HLR-Number of the subscriber
190 16#91, 16#83, 16#52, 16#38, 16#48, 16#83, 16#93,
191 16#04, 16#00, %% PDP info complete
192 16#05, 16#19,
193 16#10, 16#01, 16#01,
194 16#11, 16#02, 16#f1, 16#21, %% IPv4
195 16#12, 16#09, 16#04, "test", 16#03, "apn",
196 16#13, 16#01, 16#02,
197 16#14, 16#02, 16#FF, 16#23,
198 16#05, 16#11,
199 16#10, 16#01, 16#02,
200 16#11, 16#02, 16#f1, 16#21, %% IPv4
201 16#12, 16#08, 16#03, "foo", 16#03, "apn",
202 16#14, 16#02,
203 16#AE, 16#FF
204 >>,
205 Map = #{hlr_number => <<145,131,82,56,72,131,147>>,
206 imsi => <<"123456789012345">>,
207 message_type => location_upd_res,
208 msisdn => <<145,148,97,70,50,36,67>>,
209 pdp_charging => 44799,pdp_info_complete => true,
210 pdp_info_list =>
211 [#{access_point_name =>
212 <<4,116,101,115,116,3,97,112,110>>,
213 pdp_charging => 65315,pdp_context_id => 1,
214 pdp_type => 61729,
215 quality_of_service => <<2>>},
216 #{access_point_name => <<3,102,111,111,3,97,112,110>>,
217 pdp_context_id => 2,pdp_type => 61729}]},
218 ?assertEqual(Map, gsup_protocol:decode(Bin)),
219 ?assertEqual(Bin, gsup_protocol:encode(Map)).
220
221lc_req_test() ->
222 Bin = <<16#1c, ?TEST_IMSI_IE, 16#06, 16#01, 16#00>>,
223 Map = #{imsi => <<"123456789012345">>, message_type => location_cancellation_req, cancellation_type => 0},
224 ?assertEqual(Map, gsup_protocol:decode(Bin)),
225 ?assertEqual(Bin, gsup_protocol:encode(Map)).
226
227lc_err_test() ->
228 Bin = <<16#1d, ?TEST_IMSI_IE, 16#02, 16#01, 16#03>>,
229 Map = #{imsi => <<"123456789012345">>, message_type => location_cancellation_err, cause=>3},
230 ?assertEqual(Map, gsup_protocol:decode(Bin)),
231 ?assertEqual(Bin, gsup_protocol:encode(Map)).
232
233lc_res_test() ->
234 Bin = <<16#1e, ?TEST_IMSI_IE>>,
235 Map = #{imsi => <<"123456789012345">>, message_type => location_cancellation_res},
236 ?assertEqual(Map, gsup_protocol:decode(Bin)),
237 ?assertEqual(Bin, gsup_protocol:encode(Map)).
238
239purge_ms_req_test() ->
240 Bin = <<16#0c, ?TEST_IMSI_IE>>,
241 Map = #{imsi => <<"123456789012345">>, message_type => purge_ms_req},
242 ?assertEqual(Map, gsup_protocol:decode(Bin)),
243 ?assertEqual(Bin, gsup_protocol:encode(Map)).
244
245purge_ms_err_test() ->
246 Bin = <<16#0d, ?TEST_IMSI_IE, 16#02, 16#01, 16#03>>,
247 Map = #{imsi => <<"123456789012345">>, message_type => purge_ms_err, cause=>3},
248 ?assertEqual(Map, gsup_protocol:decode(Bin)),
249 ?assertEqual(Bin, gsup_protocol:encode(Map)).
250
251purge_ms_res_test() ->
252 Bin = <<16#0e, ?TEST_IMSI_IE, 16#07, 16#00>>,
253 Map = #{imsi => <<"123456789012345">>, message_type => purge_ms_res, freeze_p_tmsi => true},
254 ?assertEqual(Map, gsup_protocol:decode(Bin)),
255 ?assertEqual(Bin, gsup_protocol:encode(Map)).
256
257% dummy_session_test() ->
258% Bin = <<16#2b, ?TEST_IMSI_IE, %% Session ID and state
259% 16#30, 16#04, 16#de, 16#ad, 16#be, 16#ef,
260% 16#31, 16#01, 16#01
261% >>,
262% Map = #{imsi => <<"123456789012345">>},
263% ?assertEqual(Map, gsup_protocol:decode(Bin)),
264% ?assertEqual(Bin, gsup_protocol:encode(Map)).
265
266ussd_req_test() ->
267 Bin = <<16#20, ?TEST_IMSI_IE, %% Session ID and state
268 16#30, 16#04, 16#de, 16#ad, 16#be, 16#ef,
269 16#31, 16#01, 16#01,
270
271 %% SS/USSD information IE
272 16#35, 16#14,
273 %% ASN.1 encoded MAP payload
274 16#a1, 16#12,
275 16#02, 16#01, %% Component: invoke
276 16#01, %% invokeID = 1
277 %% opCode: processUnstructuredSS-Request
278 16#02, 16#01, 16#3b, 16#30, 16#0a, 16#04, 16#01, 16#0f,
279 16#04, 16#05, 16#aa, 16#18, 16#0c, 16#36, 16#02
280 >>,
281 Map = #{imsi => <<"123456789012345">>,message_type => ss_req,
282 session_id => 3735928559,session_state => 1,
283 ss_info =>
284 <<161,18,2,1,1,2,1,59,48,10,4,1,15,4,5,170,24,12,54,2>>},
285 ?assertEqual(Map, gsup_protocol:decode(Bin)),
286 ?assertEqual(Bin, gsup_protocol:encode(Map)).
287
288ussd_res_test() ->
289 Bin = <<16#22, ?TEST_IMSI_IE, %% Session ID and state
290 16#30, 16#04, 16#de, 16#ad, 16#be, 16#ef,
291 16#31, 16#01, 16#03,
292
293 %% SS/USSD information IE
294 16#35, 16#08,
295 %% ASN.1 encoded MAP payload
296 16#a3, 16#06,
297 16#02, 16#01, %% Component: returnError
298 16#01, %% invokeID = 1
299 %% localValue: unknownAlphabet
300 16#02, 16#01, 16#47
301 >>,
302 Map = #{imsi => <<"123456789012345">>,message_type => ss_res,
303 session_id => 3735928559,session_state => 3,
304 ss_info => <<163,6,2,1,1,2,1,71>>},
305 ?assertEqual(Map, gsup_protocol:decode(Bin)),
306 ?assertEqual(Bin, gsup_protocol:encode(Map)).
307
308mo_forward_sm_req_test() ->
309 Bin = <<16#24, ?TEST_IMSI_IE, %% SM related IEs
310 16#40, 16#01, %% SM-RP-MR (Message Reference)
311 16#fa,
312 16#41, 16#08, %% SM-RP-DA (Destination Address)
313 16#03, %% SMSC address
314 16#91, 16#52, 16#75, 16#47, 16#99, 16#09, 16#82,
315 16#42, 16#01, %% SM-RP-OA (Originating Address)
316 16#ff, %% Special case: noSM-RP-OA
317 16#43, 16#04, %% SM-RP-UI (TPDU)
318 16#de, 16#ad, 16#be, 16#ef
319 >>,
320 Map = #{imsi => <<"123456789012345">>,
Andrey Velikiyfde0fd92019-08-02 09:42:22 +0300321 message_type => mo_forward_sm_req,
Andrey Velikiy1e801782019-06-24 14:09:57 +0300322 sm_rp_da => <<3,145,82,117,71,153,9,130>>,
323 sm_rp_mr => 250,sm_rp_oa => <<16#ff>>,sm_rp_ui => <<16#de, 16#ad, 16#be, 16#ef>>},
324 ?assertEqual(Map, gsup_protocol:decode(Bin)),
325 ?assertEqual(Bin, gsup_protocol:encode(Map)).
326
327mt_forward_sm_req_test() ->
328 Bin = <<16#28, ?TEST_IMSI_IE, %% SM related IEs
329 16#40, 16#01, %% SM-RP-MR (Message Reference)
330 16#fa,
331 16#41, 16#09, %% SM-RP-DA (Destination Address)
332 16#01, %% IMSI
333 16#21, 16#43, 16#65, 16#87, 16#09, 16#21, 16#43, 16#f5,
334 16#42, 16#08, %% SM-RP-OA (Originating Address)
335 16#03, %% SMSC address
336 16#91, 16#52, 16#75, 16#47, 16#99, 16#09, 16#82,
337 16#43, 16#04, %% SM-RP-UI (TPDU)
338 16#de, 16#ad, 16#be, 16#ef,
339 16#45, 16#01, %% SM-RP-MMS (More Messages to Send)
340 16#01
341 >>,
342 Map = #{imsi => <<"123456789012345">>,
Andrey Velikiyfde0fd92019-08-02 09:42:22 +0300343 message_type => mt_forward_sm_req,
Andrey Velikiy1e801782019-06-24 14:09:57 +0300344 sm_rp_da => <<1,33,67,101,135,9,33,67,245>>,
345 sm_rp_mms => 1,sm_rp_mr => 250,
346 sm_rp_oa => <<3,145,82,117,71,153,9,130>>,
347 sm_rp_ui => <<16#de, 16#ad, 16#be, 16#ef>>},
348 ?assertEqual(Map, gsup_protocol:decode(Bin)),
349 ?assertEqual(Bin, gsup_protocol:encode(Map)).
350
351mo_forward_sm_err_test() ->
352 Bin = <<16#25, ?TEST_IMSI_IE, %% SM related IEs
353 16#40, 16#01, %% SM-RP-MR (Message Reference)
354 16#fa,
355 16#44, 16#01, %% SM-RP-Cause value
356 16#af
357 >>,
358 Map = #{imsi => <<"123456789012345">>,
Andrey Velikiyfde0fd92019-08-02 09:42:22 +0300359 message_type => mo_forward_sm_err,sm_rp_cause => 175,
Andrey Velikiy1e801782019-06-24 14:09:57 +0300360 sm_rp_mr => 250},
361 ?assertEqual(Map, gsup_protocol:decode(Bin)),
362 ?assertEqual(Bin, gsup_protocol:encode(Map)).
363
364mt_forward_sm_res_test() ->
365 Bin = <<16#2a, ?TEST_IMSI_IE, %% SM related IEs
366 16#40, 16#01, %% SM-RP-MR (Message Reference)
367 16#fa,
368 16#43, 16#04, %% SM-RP-UI (TPDU)
369 16#de, 16#ad, 16#be, 16#ef
370 >>,
371 Map = #{imsi => <<"123456789012345">>,
Andrey Velikiyfde0fd92019-08-02 09:42:22 +0300372 message_type => mt_forward_sm_res,sm_rp_mr => 250,
Andrey Velikiy1e801782019-06-24 14:09:57 +0300373 sm_rp_ui => <<16#de, 16#ad, 16#be, 16#ef>>},
374 ?assertEqual(Map, gsup_protocol:decode(Bin)),
375 ?assertEqual(Bin, gsup_protocol:encode(Map)).
376
377ready_for_sm_req_test() ->
378 Bin = <<16#2c, ?TEST_IMSI_IE, 16#46, 16#01, 16#02>>,
379 Map = #{imsi => <<"123456789012345">>,
380 message_type => ready_for_sm_req,sm_alert_reason => 2},
381 ?assertEqual(Map, gsup_protocol:decode(Bin)),
382 ?assertEqual(Bin, gsup_protocol:encode(Map)).
383
384check_imei_req_test() ->
385 Bin = <<16#30, ?TEST_IMSI_IE,
386 16#50, 16#09, %% IMEI
387 16#42, 16#42, 16#42, 16#42, 16#42, 16#42, 16#42, 16#42, 16#42
388 >>,
389 Map = #{imei => <<16#42, 16#42, 16#42, 16#42, 16#42, 16#42, 16#42, 16#42, 16#42>>,imsi => <<"123456789012345">>,
390 message_type => check_imei_req},
391 ?assertEqual(Map, gsup_protocol:decode(Bin)),
392 ?assertEqual(Bin, gsup_protocol:encode(Map)).
393
394check_imei_err_test() ->
395 Bin = <<16#31, ?TEST_IMSI_IE, 16#02, 16#01, 16#60>>,
396 Map = #{cause => 96,imsi => <<"123456789012345">>,
397 message_type => check_imei_err},
398 ?assertEqual(Map, gsup_protocol:decode(Bin)),
399 ?assertEqual(Bin, gsup_protocol:encode(Map)).
400
401check_imei_res_test() ->
402 Bin = <<16#32, ?TEST_IMSI_IE,
403 16#51, 16#01,
404 16#00 %% OSMO_GSUP_IMEI_RESULT_ACK
405 >>,
406 Map = #{imei_check_result => 0,imsi => <<"123456789012345">>,
407 message_type => check_imei_res},
408 ?assertEqual(Map, gsup_protocol:decode(Bin)),
409 ?assertEqual(Bin, gsup_protocol:encode(Map)).
410
Andrey Velikiybb299662019-06-19 14:19:10 +0300411e_prepare_handover_req_test() ->
412 Bin = <<16#34, ?TEST_IMSI_IE,
413 %% Session ID and state (begin)
414 16#30, 16#04, 16#de, 16#ad, 16#be, 16#ef,
415 16#31, 16#01, 16#01,
416
417 ?TEST_CLASS_INTER_MSC_IE,
418 ?TEST_SOURCE_NAME_IE,
419 ?TEST_DESTINATION_NAME_IE,
420 ?TEST_AN_APDU_IE %% (Handover Request)
421 >>,
422 Map = #{an_apdu => <<1,66,66,66,66>>,
423 destination_name => <<"MSC-B">>,
424 imsi => <<"123456789012345">>,message_class => 4,
425 message_type => e_prepare_handover_req,
426 session_id => 3735928559,session_state => 1,
427 source_name => <<"MSC-A">>},
428 ?assertEqual(Map, gsup_protocol:decode(Bin)),
429 ?assertEqual(Bin, gsup_protocol:encode(Map)).
430
431e_prepare_handover_err_test() ->
432 Bin = <<16#35, ?TEST_IMSI_IE,
433 %% Session ID and state (continue)
434 16#30, 16#04, 16#de, 16#ad, 16#be, 16#ef,
435 16#31, 16#01, 16#02,
436
437 ?TEST_CLASS_INTER_MSC_IE,
438 ?TEST_SOURCE_NAME_IE,
439 ?TEST_DESTINATION_NAME_IE,
440 ?TEST_AN_APDU_IE, %% (Handover Request) ??? unknown IE
441 %% cause bssap
442 16#64, 16#01, 16#51
443 >>,
444 Map = #{an_apdu => <<1,66,66,66,66>>,
445 bssap_cause => 81,destination_name => <<"MSC-B">>,
446 imsi => <<"123456789012345">>,message_class => 4,
447 message_type => e_prepare_handover_err,
448 session_id => 3735928559,session_state => 2,
449 source_name => <<"MSC-A">>},
450 ?assertEqual(Map, gsup_protocol:decode(Bin)),
451 ?assertEqual(Bin, gsup_protocol:encode(Map)).
452
453e_prepare_handover_res_test() ->
454 Bin = <<16#36, ?TEST_IMSI_IE,
455 %% Session ID and state (continue)
456 16#30, 16#04, 16#de, 16#ad, 16#be, 16#ef,
457 16#31, 16#01, 16#02,
458
459 ?TEST_CLASS_INTER_MSC_IE,
460 ?TEST_SOURCE_NAME_IE,
461 ?TEST_DESTINATION_NAME_IE,
462 ?TEST_AN_APDU_IE %% (Handover Request)
463 >>,
464 Map = #{an_apdu => <<1,66,66,66,66>>,
465 destination_name => <<"MSC-B">>,
466 imsi => <<"123456789012345">>,message_class => 4,
467 message_type => e_prepare_handover_res,
468 session_id => 3735928559,session_state => 2,
469 source_name => <<"MSC-A">>},
470 ?assertEqual(Map, gsup_protocol:decode(Bin)),
471 ?assertEqual(Bin, gsup_protocol:encode(Map)).
472
473e_prepare_subseq_handover_req_test() ->
474 Bin = <<16#38, ?TEST_IMSI_IE,
475 %% Session ID and state (begin)
476 16#30, 16#04, 16#de, 16#ad, 16#be, 16#ef,
477 16#31, 16#01, 16#01,
478
479 ?TEST_CLASS_INTER_MSC_IE,
480 ?TEST_SOURCE_NAME_IE,
481 ?TEST_DESTINATION_NAME_IE,
482 ?TEST_AN_APDU_IE %% (Handover Request)
483 >>,
484 Map = #{an_apdu => <<1,66,66,66,66>>,
485 destination_name => <<"MSC-B">>,
486 imsi => <<"123456789012345">>,message_class => 4,
487 message_type => e_prepare_subseq_handover_req,
488 session_id => 3735928559,session_state => 1,
489 source_name => <<"MSC-A">>},
490 ?assertEqual(Map, gsup_protocol:decode(Bin)),
491 ?assertEqual(Bin, gsup_protocol:encode(Map)).
492
493e_prepare_subseq_handover_err_test() ->
494 Bin = <<16#39, ?TEST_IMSI_IE,
495 %% Session ID and state (continue)
496 16#30, 16#04, 16#de, 16#ad, 16#be, 16#ef,
497 16#31, 16#01, 16#02,
498
499 ?TEST_CLASS_INTER_MSC_IE,
500 ?TEST_SOURCE_NAME_IE,
501 ?TEST_DESTINATION_NAME_IE,
502 ?TEST_AN_APDU_IE, %% (Handover Request) ??? unknown IE
503 %% cause bssap
504 16#64, 16#01, 16#51
505 >>,
506 Map = #{an_apdu => <<1,66,66,66,66>>,
507 bssap_cause => 81,destination_name => <<"MSC-B">>,
508 imsi => <<"123456789012345">>,message_class => 4,
509 message_type => e_prepare_subseq_handover_err,
510 session_id => 3735928559,session_state => 2,
511 source_name => <<"MSC-A">>},
512 ?assertEqual(Map, gsup_protocol:decode(Bin)),
513 ?assertEqual(Bin, gsup_protocol:encode(Map)).
514
515e_prepare_subseq_handover_res_test() ->
516 Bin = <<16#3a, ?TEST_IMSI_IE,
517 %% Session ID and state (continue)
518 16#30, 16#04, 16#de, 16#ad, 16#be, 16#ef,
519 16#31, 16#01, 16#02,
520
521 ?TEST_CLASS_INTER_MSC_IE,
522 ?TEST_SOURCE_NAME_IE,
523 ?TEST_DESTINATION_NAME_IE,
524 ?TEST_AN_APDU_IE %% (Handover Request)
525 >>,
526 Map = #{an_apdu => <<1,66,66,66,66>>,
527 destination_name => <<"MSC-B">>,
528 imsi => <<"123456789012345">>,message_class => 4,
529 message_type => e_prepare_subseq_handover_res,
530 session_id => 3735928559,session_state => 2,
531 source_name => <<"MSC-A">>},
532 ?assertEqual(Map, gsup_protocol:decode(Bin)),
533 ?assertEqual(Bin, gsup_protocol:encode(Map)).
534
535e_send_end_signal_req_test() ->
536 Bin = <<16#3c, ?TEST_IMSI_IE,
537 %% Session ID and state (end)
538 16#30, 16#04, 16#de, 16#ad, 16#be, 16#ef,
539 16#31, 16#01, 16#03,
540
541 ?TEST_CLASS_INTER_MSC_IE,
542 ?TEST_SOURCE_NAME_IE,
543 ?TEST_DESTINATION_NAME_IE,
544 ?TEST_AN_APDU_IE %% (Handover Request)
545 >>,
546 Map = #{an_apdu => <<1,66,66,66,66>>,
547 destination_name => <<"MSC-B">>,
548 imsi => <<"123456789012345">>,message_class => 4,
549 message_type => e_send_end_signal_req,
550 session_id => 3735928559,session_state => 3,
551 source_name => <<"MSC-A">>},
552 ?assertEqual(Map, gsup_protocol:decode(Bin)),
553 ?assertEqual(Bin, gsup_protocol:encode(Map)).
554
555e_send_end_signal_err_test() ->
556 Bin = <<16#3d, ?TEST_IMSI_IE,
557 %% Session ID and state (end)
558 16#30, 16#04, 16#de, 16#ad, 16#be, 16#ef,
559 16#31, 16#01, 16#03,
560
561 ?TEST_CLASS_INTER_MSC_IE,
562 ?TEST_SOURCE_NAME_IE,
563 ?TEST_DESTINATION_NAME_IE,
564 ?TEST_AN_APDU_IE, %% (Handover Request) ??? unknown IE
565 %% cause bssap
566 16#64, 16#01, 16#51
567 >>,
568 Map = #{an_apdu => <<1,66,66,66,66>>,
569 bssap_cause => 81,destination_name => <<"MSC-B">>,
570 imsi => <<"123456789012345">>,message_class => 4,
571 message_type => e_send_end_signal_err,
572 session_id => 3735928559,session_state => 3,
573 source_name => <<"MSC-A">>},
574 ?assertEqual(Map, gsup_protocol:decode(Bin)),
575 ?assertEqual(Bin, gsup_protocol:encode(Map)).
576
577e_send_end_signal_res_test() ->
578 Bin = <<16#3e, ?TEST_IMSI_IE,
579 %% Session ID and state (end)
580 16#30, 16#04, 16#de, 16#ad, 16#be, 16#ef,
581 16#31, 16#01, 16#03,
582
583 ?TEST_CLASS_INTER_MSC_IE,
584 ?TEST_SOURCE_NAME_IE,
585 ?TEST_DESTINATION_NAME_IE,
586 ?TEST_AN_APDU_IE %% (Handover Request)
587 >>,
588 Map = #{an_apdu => <<1,66,66,66,66>>,
589 destination_name => <<"MSC-B">>,
590 imsi => <<"123456789012345">>,message_class => 4,
591 message_type => e_send_end_signal_res,
592 session_id => 3735928559,session_state => 3,
593 source_name => <<"MSC-A">>},
594 ?assertEqual(Map, gsup_protocol:decode(Bin)),
595 ?assertEqual(Bin, gsup_protocol:encode(Map)).
596
597e_process_access_signalling_req_test() ->
598 Bin = <<16#40, ?TEST_IMSI_IE,
599 %% Session ID and state (continue)
600 16#30, 16#04, 16#de, 16#ad, 16#be, 16#ef,
601 16#31, 16#01, 16#02,
602
603 ?TEST_CLASS_INTER_MSC_IE,
604 ?TEST_SOURCE_NAME_IE,
605 ?TEST_DESTINATION_NAME_IE,
606 ?TEST_AN_APDU_IE %% (Handover Request)
607 >>,
608 Map = #{an_apdu => <<1,66,66,66,66>>,
609 destination_name => <<"MSC-B">>,
610 imsi => <<"123456789012345">>,message_class => 4,
611 message_type => e_process_access_signalling_req,
612 session_id => 3735928559,session_state => 2,
613 source_name => <<"MSC-A">>},
614 ?assertEqual(Map, gsup_protocol:decode(Bin)),
615 ?assertEqual(Bin, gsup_protocol:encode(Map)).
616
617e_forward_access_signalling_req_test() ->
618 Bin = <<16#44, ?TEST_IMSI_IE,
619 %% Session ID and state (continue)
620 16#30, 16#04, 16#de, 16#ad, 16#be, 16#ef,
621 16#31, 16#01, 16#02,
622
623 ?TEST_CLASS_INTER_MSC_IE,
624 ?TEST_SOURCE_NAME_IE,
625 ?TEST_DESTINATION_NAME_IE,
626 ?TEST_AN_APDU_IE %% (Handover Request)
627 >>,
628 Map = #{an_apdu => <<1,66,66,66,66>>,
629 destination_name => <<"MSC-B">>,
630 imsi => <<"123456789012345">>,message_class => 4,
631 message_type => e_forward_access_signalling_req,
632 session_id => 3735928559,session_state => 2,
633 source_name => <<"MSC-A">>},
634 ?assertEqual(Map, gsup_protocol:decode(Bin)),
635 ?assertEqual(Bin, gsup_protocol:encode(Map)).
636
637e_close_test() ->
638 Bin = <<16#47, ?TEST_IMSI_IE,
639 %% Session ID and state (end)
640 16#30, 16#04, 16#de, 16#ad, 16#be, 16#ef,
641 16#31, 16#01, 16#03,
642
643 ?TEST_CLASS_INTER_MSC_IE,
644 ?TEST_SOURCE_NAME_IE,
645 ?TEST_DESTINATION_NAME_IE
646 >>,
647 Map = #{
648 destination_name => <<"MSC-B">>,
649 imsi => <<"123456789012345">>,message_class => 4,
650 message_type => e_close,
651 session_id => 3735928559,session_state => 3,
652 source_name => <<"MSC-A">>},
653 ?assertEqual(Map, gsup_protocol:decode(Bin)),
654 ?assertEqual(Bin, gsup_protocol:encode(Map)).
655
656e_abort_test() ->
657 Bin = <<16#4b, ?TEST_IMSI_IE,
658 %% Session ID and state (end)
659 16#30, 16#04, 16#de, 16#ad, 16#be, 16#ef,
660 16#31, 16#01, 16#03,
661
662 ?TEST_CLASS_INTER_MSC_IE,
663 %% cause bssap
664 16#64, 16#01, 16#51
665 >>,
666 Map = #{
667 imsi => <<"123456789012345">>,message_class => 4,
668 bssap_cause => 81,message_type => e_abort,
669 session_id => 3735928559,session_state => 3},
670 ?assertEqual(Map, gsup_protocol:decode(Bin)),
671 ?assertEqual(Bin, gsup_protocol:encode(Map)).
672
673e_routing_error_test() ->
674 Bin = <<16#4e, ?TEST_IMSI_IE,
675 %% Session ID and state (end)
676 16#30, 16#04, 16#de, 16#ad, 16#be, 16#ef,
677 16#31, 16#01, 16#03,
678
679 ?TEST_CLASS_INTER_MSC_IE,
680 ?TEST_SOURCE_NAME_IE,
681 ?TEST_DESTINATION_NAME_IE
682 >>,
683 Map = #{
684 destination_name => <<"MSC-B">>,
685 imsi => <<"123456789012345">>,message_class => 4,
686 message_type => e_routing_err,
687 session_id => 3735928559,session_state => 3,
688 source_name => <<"MSC-A">>},
689 ?assertEqual(Map, gsup_protocol:decode(Bin)),
690 ?assertEqual(Bin, gsup_protocol:encode(Map)).
691