blob: 996b17d8d7aca5ab283d410239c5462be6d58598 [file] [log] [blame]
Pau Espin Pedrol4ff118a2022-07-28 17:37:47 +02001/* ECBE (REST) interface client of osmo-cbc test suite in TTCN-3
2 * (C) 2022 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
3 * All rights reserved.
4 *
5 * Released under the terms of GNU General Public License, Version 2 or
6 * (at your option) any later version.
7 *
8 * SPDX-License-Identifier: GPL-2.0-or-later
9 */
10
11module ECBE_Components {
12
13import from Osmocom_Types all;
14
15import from HTTP_Adapter all;
16import from HTTPmsg_Types all;
17import from ECBE_Types all;
18
19import from CBSP_Types all;
20
21import from CBS_Message all;
22
23private function f_cbs2ecbe_category(CBSP_Category cat_in) return EcbeCategory
24{
25 select (cat_in) {
26 case (CBSP_CATEG_HIGH_PRIO) { return high_priority; }
27 case (CBSP_CATEG_BACKGROUND) { return background; }
28 case (CBSP_CATEG_NORMAL) { return normal; }
29 case else { mtc.stop }
30 }
31}
32
33private function f_cbs2ecbe_page(CBS_MessageContent inp) return EcbePage
34{
35 return hex2str(oct2hex(inp.payload));
36}
37
Pau Espin Pedrolad5d2db2022-08-03 14:02:02 +020038private function f_cbs2ecbe_etws(CBS_Message inp, charstring cbe_name) return EcbeCbcMessage
39{
40 var EcbeWarningTypeDecoded warn_type;
41 int2enum(inp.msg_id - 4352, warn_type);
42
43 var EcbeCbcMessage ret := {
44 cbe_name := cbe_name,
45 category := f_cbs2ecbe_category(inp.category),
46 repetition_period := inp.rep_period,
47 num_of_bcast := inp.num_bcast_req,
48 scope := { scope_plmn := {} },
49 smscb_message := {
50 serial_nr := {
51 serial_nr_encoded := inp.ser_nr
52 },
53 message_id := inp.msg_id,
54 payload := {
55 payload_etws := {
56 warning_type := {
57 warning_type_decoded := warn_type
58 },
59 emergency_user_alert := true,
60 popup_on_display := true,
61 warning_sec_info := omit
62 }
63 }
64 }
65 };
66 return ret;
67}
68
Pau Espin Pedrol4ff118a2022-07-28 17:37:47 +020069/* convert from CBS_Message to EcbeCbcMessage */
70function f_cbs2ecbe(CBS_Message inp, charstring cbe_name) return EcbeCbcMessage
71{
Pau Espin Pedrolad5d2db2022-08-03 14:02:02 +020072 if (msg_id_is_etws(inp.msg_id)) {
73 return f_cbs2ecbe_etws(inp, cbe_name);
74 }
75
Pau Espin Pedrol4ff118a2022-07-28 17:37:47 +020076 var EcbeCbcMessage ret := {
77 cbe_name := cbe_name,
78 category := f_cbs2ecbe_category(inp.category),
79 repetition_period := inp.rep_period,
80 num_of_bcast := inp.num_bcast_req,
81 scope := { scope_plmn := {} },
82 smscb_message := {
83 serial_nr := {
84 serial_nr_encoded := inp.ser_nr
85 },
86 message_id := inp.msg_id,
87 payload := {
88 payload_encoded := {
89 dcs := inp.dcs,
90 pages := { } /* appended below */
91 }
92 }
93 }
94 };
95 for (var integer i := 0; i < lengthof(inp.content); i := i+1) {
96 ret.smscb_message.payload.payload_encoded.pages :=
97 ret.smscb_message.payload.payload_encoded.pages & { f_cbs2ecbe_page(inp.content[i]) };
98 }
99 return ret;
100}
101
102/*********************************************************************************
103 * ECBE (REST) interface
104 *********************************************************************************/
105
106function f_ecbe_tx_post_cbs(EcbeCbcMessage cbc)
107runs on http_CT {
108 var charstring body := oct2char(enc_EcbeCbcMessage(cbc));
109 log("TX POST CBS: ", body);
110 var HTTPMessage http_resp;
111 f_http_tx_request(url := "/api/ecbe/v1/message", method := "POST", body := body);
112}
113
114function f_ecbe_rx_resp(template integer exp_sts := (200..299))
115runs on http_CT return HTTPResponse {
116 var HTTPMessage http_resp := f_http_rx_response(tr_HTTP_Resp(exp_sts), tout := 20.0);
117 return http_resp.response;
118}
119
120/* run a HTTP POST to add a new CBC message */
121function f_ecbe_post_cbs(EcbeCbcMessage cbc, template integer exp_sts := 201)
122runs on http_CT return HTTPResponse {
123 f_ecbe_tx_post_cbs(cbc);
124 return f_ecbe_rx_resp(exp_sts)
125}
126
127function f_ecbe_tx_delete_cbs(integer msg_id)
128runs on http_CT {
129 f_http_tx_request("/api/ecbe/v1/message/" & int2str(msg_id), method := "DELETE");
130}
131
132/* run a HTTP GET on specified URL expecting json in RSRES format as response */
133function f_ecbe_delete_cbs(integer msg_id, template integer exp_sts := 200)
134runs on http_CT return HTTPResponse {
135 f_ecbe_tx_delete_cbs(msg_id);
136 return f_ecbe_rx_resp(exp_sts);
137}
138
139}