aboutsummaryrefslogtreecommitdiffstats
path: root/cbc/ECBE_Components.ttcn
blob: 996b17d8d7aca5ab283d410239c5462be6d58598 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
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);
}

}