blob: 65863c7213647c29bad21f3a519c706bf6de1f73 [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() ->
Vadim Yanitskiy657fee92019-12-26 13:18:02 +0100378 Bin = <<16#2c, ?TEST_IMSI_IE,
379 16#40, 16#01, %% SM-RP-MR
380 16#41,
381 16#46, 16#01, %% Alert reason
382 16#02
383 >>,
Andrey Velikiy1e801782019-06-24 14:09:57 +0300384 Map = #{imsi => <<"123456789012345">>,
Vadim Yanitskiy657fee92019-12-26 13:18:02 +0100385 message_type => ready_for_sm_req,
386 sm_rp_mr => 65,
387 sm_alert_reason => 2},
Andrey Velikiy1e801782019-06-24 14:09:57 +0300388 ?assertEqual(Map, gsup_protocol:decode(Bin)),
389 ?assertEqual(Bin, gsup_protocol:encode(Map)).
390
391check_imei_req_test() ->
392 Bin = <<16#30, ?TEST_IMSI_IE,
393 16#50, 16#09, %% IMEI
394 16#42, 16#42, 16#42, 16#42, 16#42, 16#42, 16#42, 16#42, 16#42
395 >>,
396 Map = #{imei => <<16#42, 16#42, 16#42, 16#42, 16#42, 16#42, 16#42, 16#42, 16#42>>,imsi => <<"123456789012345">>,
397 message_type => check_imei_req},
398 ?assertEqual(Map, gsup_protocol:decode(Bin)),
399 ?assertEqual(Bin, gsup_protocol:encode(Map)).
400
401check_imei_err_test() ->
402 Bin = <<16#31, ?TEST_IMSI_IE, 16#02, 16#01, 16#60>>,
403 Map = #{cause => 96,imsi => <<"123456789012345">>,
404 message_type => check_imei_err},
405 ?assertEqual(Map, gsup_protocol:decode(Bin)),
406 ?assertEqual(Bin, gsup_protocol:encode(Map)).
407
408check_imei_res_test() ->
409 Bin = <<16#32, ?TEST_IMSI_IE,
410 16#51, 16#01,
411 16#00 %% OSMO_GSUP_IMEI_RESULT_ACK
412 >>,
413 Map = #{imei_check_result => 0,imsi => <<"123456789012345">>,
414 message_type => check_imei_res},
415 ?assertEqual(Map, gsup_protocol:decode(Bin)),
416 ?assertEqual(Bin, gsup_protocol:encode(Map)).
417
Andrey Velikiybb299662019-06-19 14:19:10 +0300418e_prepare_handover_req_test() ->
419 Bin = <<16#34, ?TEST_IMSI_IE,
420 %% Session ID and state (begin)
421 16#30, 16#04, 16#de, 16#ad, 16#be, 16#ef,
422 16#31, 16#01, 16#01,
423
424 ?TEST_CLASS_INTER_MSC_IE,
425 ?TEST_SOURCE_NAME_IE,
426 ?TEST_DESTINATION_NAME_IE,
427 ?TEST_AN_APDU_IE %% (Handover Request)
428 >>,
429 Map = #{an_apdu => <<1,66,66,66,66>>,
430 destination_name => <<"MSC-B">>,
431 imsi => <<"123456789012345">>,message_class => 4,
432 message_type => e_prepare_handover_req,
433 session_id => 3735928559,session_state => 1,
434 source_name => <<"MSC-A">>},
435 ?assertEqual(Map, gsup_protocol:decode(Bin)),
436 ?assertEqual(Bin, gsup_protocol:encode(Map)).
437
438e_prepare_handover_err_test() ->
439 Bin = <<16#35, ?TEST_IMSI_IE,
440 %% Session ID and state (continue)
441 16#30, 16#04, 16#de, 16#ad, 16#be, 16#ef,
442 16#31, 16#01, 16#02,
443
444 ?TEST_CLASS_INTER_MSC_IE,
445 ?TEST_SOURCE_NAME_IE,
446 ?TEST_DESTINATION_NAME_IE,
447 ?TEST_AN_APDU_IE, %% (Handover Request) ??? unknown IE
448 %% cause bssap
449 16#64, 16#01, 16#51
450 >>,
451 Map = #{an_apdu => <<1,66,66,66,66>>,
452 bssap_cause => 81,destination_name => <<"MSC-B">>,
453 imsi => <<"123456789012345">>,message_class => 4,
454 message_type => e_prepare_handover_err,
455 session_id => 3735928559,session_state => 2,
456 source_name => <<"MSC-A">>},
457 ?assertEqual(Map, gsup_protocol:decode(Bin)),
458 ?assertEqual(Bin, gsup_protocol:encode(Map)).
459
460e_prepare_handover_res_test() ->
461 Bin = <<16#36, ?TEST_IMSI_IE,
462 %% Session ID and state (continue)
463 16#30, 16#04, 16#de, 16#ad, 16#be, 16#ef,
464 16#31, 16#01, 16#02,
465
466 ?TEST_CLASS_INTER_MSC_IE,
467 ?TEST_SOURCE_NAME_IE,
468 ?TEST_DESTINATION_NAME_IE,
469 ?TEST_AN_APDU_IE %% (Handover Request)
470 >>,
471 Map = #{an_apdu => <<1,66,66,66,66>>,
472 destination_name => <<"MSC-B">>,
473 imsi => <<"123456789012345">>,message_class => 4,
474 message_type => e_prepare_handover_res,
475 session_id => 3735928559,session_state => 2,
476 source_name => <<"MSC-A">>},
477 ?assertEqual(Map, gsup_protocol:decode(Bin)),
478 ?assertEqual(Bin, gsup_protocol:encode(Map)).
479
480e_prepare_subseq_handover_req_test() ->
481 Bin = <<16#38, ?TEST_IMSI_IE,
482 %% Session ID and state (begin)
483 16#30, 16#04, 16#de, 16#ad, 16#be, 16#ef,
484 16#31, 16#01, 16#01,
485
486 ?TEST_CLASS_INTER_MSC_IE,
487 ?TEST_SOURCE_NAME_IE,
488 ?TEST_DESTINATION_NAME_IE,
489 ?TEST_AN_APDU_IE %% (Handover Request)
490 >>,
491 Map = #{an_apdu => <<1,66,66,66,66>>,
492 destination_name => <<"MSC-B">>,
493 imsi => <<"123456789012345">>,message_class => 4,
494 message_type => e_prepare_subseq_handover_req,
495 session_id => 3735928559,session_state => 1,
496 source_name => <<"MSC-A">>},
497 ?assertEqual(Map, gsup_protocol:decode(Bin)),
498 ?assertEqual(Bin, gsup_protocol:encode(Map)).
499
500e_prepare_subseq_handover_err_test() ->
501 Bin = <<16#39, ?TEST_IMSI_IE,
502 %% Session ID and state (continue)
503 16#30, 16#04, 16#de, 16#ad, 16#be, 16#ef,
504 16#31, 16#01, 16#02,
505
506 ?TEST_CLASS_INTER_MSC_IE,
507 ?TEST_SOURCE_NAME_IE,
508 ?TEST_DESTINATION_NAME_IE,
509 ?TEST_AN_APDU_IE, %% (Handover Request) ??? unknown IE
510 %% cause bssap
511 16#64, 16#01, 16#51
512 >>,
513 Map = #{an_apdu => <<1,66,66,66,66>>,
514 bssap_cause => 81,destination_name => <<"MSC-B">>,
515 imsi => <<"123456789012345">>,message_class => 4,
516 message_type => e_prepare_subseq_handover_err,
517 session_id => 3735928559,session_state => 2,
518 source_name => <<"MSC-A">>},
519 ?assertEqual(Map, gsup_protocol:decode(Bin)),
520 ?assertEqual(Bin, gsup_protocol:encode(Map)).
521
522e_prepare_subseq_handover_res_test() ->
523 Bin = <<16#3a, ?TEST_IMSI_IE,
524 %% Session ID and state (continue)
525 16#30, 16#04, 16#de, 16#ad, 16#be, 16#ef,
526 16#31, 16#01, 16#02,
527
528 ?TEST_CLASS_INTER_MSC_IE,
529 ?TEST_SOURCE_NAME_IE,
530 ?TEST_DESTINATION_NAME_IE,
531 ?TEST_AN_APDU_IE %% (Handover Request)
532 >>,
533 Map = #{an_apdu => <<1,66,66,66,66>>,
534 destination_name => <<"MSC-B">>,
535 imsi => <<"123456789012345">>,message_class => 4,
536 message_type => e_prepare_subseq_handover_res,
537 session_id => 3735928559,session_state => 2,
538 source_name => <<"MSC-A">>},
539 ?assertEqual(Map, gsup_protocol:decode(Bin)),
540 ?assertEqual(Bin, gsup_protocol:encode(Map)).
541
542e_send_end_signal_req_test() ->
543 Bin = <<16#3c, ?TEST_IMSI_IE,
544 %% Session ID and state (end)
545 16#30, 16#04, 16#de, 16#ad, 16#be, 16#ef,
546 16#31, 16#01, 16#03,
547
548 ?TEST_CLASS_INTER_MSC_IE,
549 ?TEST_SOURCE_NAME_IE,
550 ?TEST_DESTINATION_NAME_IE,
551 ?TEST_AN_APDU_IE %% (Handover Request)
552 >>,
553 Map = #{an_apdu => <<1,66,66,66,66>>,
554 destination_name => <<"MSC-B">>,
555 imsi => <<"123456789012345">>,message_class => 4,
556 message_type => e_send_end_signal_req,
557 session_id => 3735928559,session_state => 3,
558 source_name => <<"MSC-A">>},
559 ?assertEqual(Map, gsup_protocol:decode(Bin)),
560 ?assertEqual(Bin, gsup_protocol:encode(Map)).
561
562e_send_end_signal_err_test() ->
563 Bin = <<16#3d, ?TEST_IMSI_IE,
564 %% Session ID and state (end)
565 16#30, 16#04, 16#de, 16#ad, 16#be, 16#ef,
566 16#31, 16#01, 16#03,
567
568 ?TEST_CLASS_INTER_MSC_IE,
569 ?TEST_SOURCE_NAME_IE,
570 ?TEST_DESTINATION_NAME_IE,
571 ?TEST_AN_APDU_IE, %% (Handover Request) ??? unknown IE
572 %% cause bssap
573 16#64, 16#01, 16#51
574 >>,
575 Map = #{an_apdu => <<1,66,66,66,66>>,
576 bssap_cause => 81,destination_name => <<"MSC-B">>,
577 imsi => <<"123456789012345">>,message_class => 4,
578 message_type => e_send_end_signal_err,
579 session_id => 3735928559,session_state => 3,
580 source_name => <<"MSC-A">>},
581 ?assertEqual(Map, gsup_protocol:decode(Bin)),
582 ?assertEqual(Bin, gsup_protocol:encode(Map)).
583
584e_send_end_signal_res_test() ->
585 Bin = <<16#3e, ?TEST_IMSI_IE,
586 %% Session ID and state (end)
587 16#30, 16#04, 16#de, 16#ad, 16#be, 16#ef,
588 16#31, 16#01, 16#03,
589
590 ?TEST_CLASS_INTER_MSC_IE,
591 ?TEST_SOURCE_NAME_IE,
592 ?TEST_DESTINATION_NAME_IE,
593 ?TEST_AN_APDU_IE %% (Handover Request)
594 >>,
595 Map = #{an_apdu => <<1,66,66,66,66>>,
596 destination_name => <<"MSC-B">>,
597 imsi => <<"123456789012345">>,message_class => 4,
598 message_type => e_send_end_signal_res,
599 session_id => 3735928559,session_state => 3,
600 source_name => <<"MSC-A">>},
601 ?assertEqual(Map, gsup_protocol:decode(Bin)),
602 ?assertEqual(Bin, gsup_protocol:encode(Map)).
603
604e_process_access_signalling_req_test() ->
605 Bin = <<16#40, ?TEST_IMSI_IE,
606 %% Session ID and state (continue)
607 16#30, 16#04, 16#de, 16#ad, 16#be, 16#ef,
608 16#31, 16#01, 16#02,
609
610 ?TEST_CLASS_INTER_MSC_IE,
611 ?TEST_SOURCE_NAME_IE,
612 ?TEST_DESTINATION_NAME_IE,
613 ?TEST_AN_APDU_IE %% (Handover Request)
614 >>,
615 Map = #{an_apdu => <<1,66,66,66,66>>,
616 destination_name => <<"MSC-B">>,
617 imsi => <<"123456789012345">>,message_class => 4,
618 message_type => e_process_access_signalling_req,
619 session_id => 3735928559,session_state => 2,
620 source_name => <<"MSC-A">>},
621 ?assertEqual(Map, gsup_protocol:decode(Bin)),
622 ?assertEqual(Bin, gsup_protocol:encode(Map)).
623
624e_forward_access_signalling_req_test() ->
625 Bin = <<16#44, ?TEST_IMSI_IE,
626 %% Session ID and state (continue)
627 16#30, 16#04, 16#de, 16#ad, 16#be, 16#ef,
628 16#31, 16#01, 16#02,
629
630 ?TEST_CLASS_INTER_MSC_IE,
631 ?TEST_SOURCE_NAME_IE,
632 ?TEST_DESTINATION_NAME_IE,
633 ?TEST_AN_APDU_IE %% (Handover Request)
634 >>,
635 Map = #{an_apdu => <<1,66,66,66,66>>,
636 destination_name => <<"MSC-B">>,
637 imsi => <<"123456789012345">>,message_class => 4,
638 message_type => e_forward_access_signalling_req,
639 session_id => 3735928559,session_state => 2,
640 source_name => <<"MSC-A">>},
641 ?assertEqual(Map, gsup_protocol:decode(Bin)),
642 ?assertEqual(Bin, gsup_protocol:encode(Map)).
643
644e_close_test() ->
645 Bin = <<16#47, ?TEST_IMSI_IE,
646 %% Session ID and state (end)
647 16#30, 16#04, 16#de, 16#ad, 16#be, 16#ef,
648 16#31, 16#01, 16#03,
649
650 ?TEST_CLASS_INTER_MSC_IE,
651 ?TEST_SOURCE_NAME_IE,
652 ?TEST_DESTINATION_NAME_IE
653 >>,
654 Map = #{
655 destination_name => <<"MSC-B">>,
656 imsi => <<"123456789012345">>,message_class => 4,
657 message_type => e_close,
658 session_id => 3735928559,session_state => 3,
659 source_name => <<"MSC-A">>},
660 ?assertEqual(Map, gsup_protocol:decode(Bin)),
661 ?assertEqual(Bin, gsup_protocol:encode(Map)).
662
663e_abort_test() ->
664 Bin = <<16#4b, ?TEST_IMSI_IE,
665 %% Session ID and state (end)
666 16#30, 16#04, 16#de, 16#ad, 16#be, 16#ef,
667 16#31, 16#01, 16#03,
668
669 ?TEST_CLASS_INTER_MSC_IE,
670 %% cause bssap
671 16#64, 16#01, 16#51
672 >>,
673 Map = #{
674 imsi => <<"123456789012345">>,message_class => 4,
675 bssap_cause => 81,message_type => e_abort,
676 session_id => 3735928559,session_state => 3},
677 ?assertEqual(Map, gsup_protocol:decode(Bin)),
678 ?assertEqual(Bin, gsup_protocol:encode(Map)).
679
680e_routing_error_test() ->
681 Bin = <<16#4e, ?TEST_IMSI_IE,
682 %% Session ID and state (end)
683 16#30, 16#04, 16#de, 16#ad, 16#be, 16#ef,
684 16#31, 16#01, 16#03,
685
686 ?TEST_CLASS_INTER_MSC_IE,
687 ?TEST_SOURCE_NAME_IE,
688 ?TEST_DESTINATION_NAME_IE
689 >>,
690 Map = #{
691 destination_name => <<"MSC-B">>,
692 imsi => <<"123456789012345">>,message_class => 4,
693 message_type => e_routing_err,
694 session_id => 3735928559,session_state => 3,
695 source_name => <<"MSC-A">>},
696 ?assertEqual(Map, gsup_protocol:decode(Bin)),
697 ?assertEqual(Bin, gsup_protocol:encode(Map)).
698