aboutsummaryrefslogtreecommitdiffstats
path: root/cbc/ECBE_Components.ttcn
diff options
context:
space:
mode:
Diffstat (limited to 'cbc/ECBE_Components.ttcn')
-rw-r--r--cbc/ECBE_Components.ttcn139
1 files changed, 139 insertions, 0 deletions
diff --git a/cbc/ECBE_Components.ttcn b/cbc/ECBE_Components.ttcn
new file mode 100644
index 00000000..996b17d8
--- /dev/null
+++ b/cbc/ECBE_Components.ttcn
@@ -0,0 +1,139 @@
+/* ECBE (REST) interface client of osmo-cbc test suite in TTCN-3
+ * (C) 2022 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
+ * All rights reserved.
+ *
+ * Released under the terms of GNU General Public License, Version 2 or
+ * (at your option) any later version.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+module ECBE_Components {
+
+import from Osmocom_Types all;
+
+import from HTTP_Adapter all;
+import from HTTPmsg_Types all;
+import from ECBE_Types all;
+
+import from CBSP_Types all;
+
+import from CBS_Message all;
+
+private function f_cbs2ecbe_category(CBSP_Category cat_in) return EcbeCategory
+{
+ select (cat_in) {
+ case (CBSP_CATEG_HIGH_PRIO) { return high_priority; }
+ case (CBSP_CATEG_BACKGROUND) { return background; }
+ case (CBSP_CATEG_NORMAL) { return normal; }
+ case else { mtc.stop }
+ }
+}
+
+private function f_cbs2ecbe_page(CBS_MessageContent inp) return EcbePage
+{
+ return hex2str(oct2hex(inp.payload));
+}
+
+private function f_cbs2ecbe_etws(CBS_Message inp, charstring cbe_name) return EcbeCbcMessage
+{
+ var EcbeWarningTypeDecoded warn_type;
+ int2enum(inp.msg_id - 4352, warn_type);
+
+ var EcbeCbcMessage ret := {
+ cbe_name := cbe_name,
+ category := f_cbs2ecbe_category(inp.category),
+ repetition_period := inp.rep_period,
+ num_of_bcast := inp.num_bcast_req,
+ scope := { scope_plmn := {} },
+ smscb_message := {
+ serial_nr := {
+ serial_nr_encoded := inp.ser_nr
+ },
+ message_id := inp.msg_id,
+ payload := {
+ payload_etws := {
+ warning_type := {
+ warning_type_decoded := warn_type
+ },
+ emergency_user_alert := true,
+ popup_on_display := true,
+ warning_sec_info := omit
+ }
+ }
+ }
+ };
+ return ret;
+}
+
+/* convert from CBS_Message to EcbeCbcMessage */
+function f_cbs2ecbe(CBS_Message inp, charstring cbe_name) return EcbeCbcMessage
+{
+ if (msg_id_is_etws(inp.msg_id)) {
+ return f_cbs2ecbe_etws(inp, cbe_name);
+ }
+
+ var EcbeCbcMessage ret := {
+ cbe_name := cbe_name,
+ category := f_cbs2ecbe_category(inp.category),
+ repetition_period := inp.rep_period,
+ num_of_bcast := inp.num_bcast_req,
+ scope := { scope_plmn := {} },
+ smscb_message := {
+ serial_nr := {
+ serial_nr_encoded := inp.ser_nr
+ },
+ message_id := inp.msg_id,
+ payload := {
+ payload_encoded := {
+ dcs := inp.dcs,
+ pages := { } /* appended below */
+ }
+ }
+ }
+ };
+ for (var integer i := 0; i < lengthof(inp.content); i := i+1) {
+ ret.smscb_message.payload.payload_encoded.pages :=
+ ret.smscb_message.payload.payload_encoded.pages & { f_cbs2ecbe_page(inp.content[i]) };
+ }
+ return ret;
+}
+
+/*********************************************************************************
+ * ECBE (REST) interface
+ *********************************************************************************/
+
+function f_ecbe_tx_post_cbs(EcbeCbcMessage cbc)
+runs on http_CT {
+ var charstring body := oct2char(enc_EcbeCbcMessage(cbc));
+ log("TX POST CBS: ", body);
+ var HTTPMessage http_resp;
+ f_http_tx_request(url := "/api/ecbe/v1/message", method := "POST", body := body);
+}
+
+function f_ecbe_rx_resp(template integer exp_sts := (200..299))
+runs on http_CT return HTTPResponse {
+ var HTTPMessage http_resp := f_http_rx_response(tr_HTTP_Resp(exp_sts), tout := 20.0);
+ return http_resp.response;
+}
+
+/* run a HTTP POST to add a new CBC message */
+function f_ecbe_post_cbs(EcbeCbcMessage cbc, template integer exp_sts := 201)
+runs on http_CT return HTTPResponse {
+ f_ecbe_tx_post_cbs(cbc);
+ return f_ecbe_rx_resp(exp_sts)
+}
+
+function f_ecbe_tx_delete_cbs(integer msg_id)
+runs on http_CT {
+ f_http_tx_request("/api/ecbe/v1/message/" & int2str(msg_id), method := "DELETE");
+}
+
+/* run a HTTP GET on specified URL expecting json in RSRES format as response */
+function f_ecbe_delete_cbs(integer msg_id, template integer exp_sts := 200)
+runs on http_CT return HTTPResponse {
+ f_ecbe_tx_delete_cbs(msg_id);
+ return f_ecbe_rx_resp(exp_sts);
+}
+
+}