pespin has uploaded this change for review.
smf: Close all HTTP2_Server_Emulation tcp conns before exiting
The IUT may leave the HTTP2 conn towards our emulated SCP (HTTP2 server)
opened for a while in order to reuse it to send further HTTP2 requests.
If we don't explicitly close the TCP conn when finishing the test, the
IUT HTTP2 stack doesn't know the conn doesn't exist anymore, and upon
next test it will try to re-use the same conn which will be answered by
the system with a TCP RST to indicate the conn doesn't exist anymore.
As a result of that TCP RST, the request fails and the test also fails.
Change-Id: I6b4c40fa5a8ae494a0064bb492ffe0185a394659
---
M library/HTTP2_Server_Emulation.ttcn
M smf/SMF_Tests.ttcn
2 files changed, 58 insertions(+), 1 deletion(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/49/43749/1
diff --git a/library/HTTP2_Server_Emulation.ttcn b/library/HTTP2_Server_Emulation.ttcn
index 6c45287..ec167bb 100644
--- a/library/HTTP2_Server_Emulation.ttcn
+++ b/library/HTTP2_Server_Emulation.ttcn
@@ -72,6 +72,19 @@
f_HTTP2_Server_Conn_init(conn);
}
+private function f_HTTP2_Server_Conn_close_release(inout HTTP2_Server_Conn conn)
+runs on HTTP2_Server_Emulation_CT {
+ var IPL4asp_Types.Result res;
+
+ /* Announce to the peer what we handled until now and tell it we are exiting: */
+ f_HTTP2_Server_Conn_tx(conn, ts_HTTP2_Frame_Goaway(conn.last_stream_id, 0 /* NO_ERROR */));
+
+ /* Close the socket, sends TCP FIN */
+ res := HTTP2_CodecPort_CtrlFunct.f_IPL4_close(HTTP2, conn.conn_id, {tcp := {}});
+
+ f_HTTP2_Server_Conn_release(conn);
+}
+
private function f_HTTP2_Server_Conn_str(in HTTP2_Server_Conn conn) return charstring {
return "HTTP2_Server_Conn(" & int2str(conn.conn_id) & "," & log2str(conn.state) & ")";
}
@@ -186,6 +199,16 @@
return f_conn_table_find_by_conn_id(-1);
}
+private function f_conn_table_close_conn_all()
+runs on HTTP2_Server_Emulation_CT {
+ var integer i;
+ for (i := 0; i < sizeof(conn_table); i := i + 1) {
+ if (conn_table[i].conn_id != -1) {
+ f_HTTP2_Server_Conn_close_release(conn_table[i]);
+ }
+ }
+}
+
private function f_vc_ConnHdlr_table_add(HTTP2_ConnHdlr vc_conn, charstring path_pattern)
runs on HTTP2_Server_Emulation_CT {
var integer i;
@@ -512,6 +535,11 @@
f_vc_ConnHdlr_table_del(vc_conn, path_pattern);
CONN_PROC.reply(HTTP2EM_unregister:{path_pattern}) to vc_conn;
}
+ [] CONN_PROC.getcall(HTTP2EM_close_conn_all:{}) -> sender vc_conn {
+ log("HTTP2_Server: Closing all conns, requested by ", vc_conn);
+ f_conn_table_close_conn_all();
+ CONN_PROC.reply(HTTP2EM_close_conn_all:{}) to vc_conn;
+ }
}
}
@@ -528,10 +556,12 @@
signature HTTP2EM_register(in charstring path_pattern);
signature HTTP2EM_unregister(in charstring path_pattern);
+signature HTTP2EM_close_conn_all();
type port HTTP2_CONN_PROC_PT procedure {
inout HTTP2EM_register;
inout HTTP2EM_unregister;
+ inout HTTP2EM_close_conn_all;
} with { extension "internal" };
@@ -559,4 +589,10 @@
}
}
+function f_http2_server_close_conn_all(integer idx := 0) runs on HTTP2_ConnHdlr {
+ HTTP2_CONN_PROC[idx].call(HTTP2EM_close_conn_all:{}) {
+ [] HTTP2_CONN_PROC[idx].getreply(HTTP2EM_close_conn_all:{});
+ }
+}
+
}
diff --git a/smf/SMF_Tests.ttcn b/smf/SMF_Tests.ttcn
index 4501520..861004c 100644
--- a/smf/SMF_Tests.ttcn
+++ b/smf/SMF_Tests.ttcn
@@ -68,7 +68,7 @@
/* main component, we typically have one per testcase */
-type component SMF_Test_CT extends GTP2_ConnHdlr, PFCP_ConnHdlr, HTTP2_CT {
+type component SMF_Test_CT extends GTP2_ConnHdlr, PFCP_ConnHdlr, HTTP2_CT, HTTP2_ConnHdlr {
var GTPv2_Emulation_CT vc_GTP2;
port GTP2EM_PT TEIC0;
var GTPv1U_Emulation_CT vc_GTP1U;
@@ -252,8 +252,11 @@
vc_HTTP2_SRV_SCP := HTTP2_Server_Emulation_CT.create(id) alive;
vc_HTTP2_SRV_SCP.start(HTTP2_Server_Emulation.main(http2_srv_cfg));
+
+ connect(self:HTTP2_CONN_PROC[HTTP2_CONN_SCP], vc_HTTP2_SRV_SCP:CONN_PROC);
}
+
private function f_init(float guard_timeout := 60.0) runs on SMF_Test_CT {
T_guard.start(guard_timeout);
activate(as_Tguard());
@@ -270,6 +273,11 @@
}
}
+private function f_shutdown() runs on SMF_Test_CT {
+ f_http2_server_close_conn_all();
+ setverdict(pass);
+}
+
function f_start_handler(void_fn fn, template (omit) SessionPars pars_tmpl := omit)
runs on SMF_Test_CT return SMF_Session_CT {
var charstring id := testcasename();
@@ -346,6 +354,7 @@
f_init();
vc_conn := f_start_handler(refers(f_TC_createSession_deleteSession), pars);
vc_conn.done;
+ f_shutdown();
}
/* create an IPv6 session, then delete it again */
@@ -356,6 +365,7 @@
f_init();
vc_conn := f_start_handler(refers(f_TC_createSession_deleteSession), pars);
vc_conn.done;
+ f_shutdown();
}
/* create an IPv4v6 session, then delete it again */
@@ -366,6 +376,7 @@
f_init();
vc_conn := f_start_handler(refers(f_TC_createSession_deleteSession), pars);
vc_conn.done;
+ f_shutdown();
}
function f_TC_createSession_deleteSession_250(INT3b pdn_type) runs on SMF_Test_CT {
@@ -382,6 +393,7 @@
for (i := 0; i < sizeof(vc_conn); i := i + 1) {
vc_conn[i].done;
}
+ f_shutdown();
}
testcase TC_createSession_deleteSession_250() runs on SMF_Test_CT {
@@ -408,6 +420,7 @@
f_init();
vc_conn := f_start_handler(refers(f_TC_deleteSession_unknown), pars);
vc_conn.done;
+ f_shutdown();
}
/* Test charging over Gy interface. */
@@ -462,6 +475,7 @@
f_init();
vc_conn := f_start_handler(refers(f_TC_gy_charging_cc_time), pars);
vc_conn.done;
+ f_shutdown();
}
/* Test Gy CCR rejected with CCA Result-Code DIAMETER_AUTHORIZATION_REJECTED (5003) */
@@ -499,6 +513,7 @@
f_init();
vc_conn := f_start_handler(refers(f_TC_gy_ccr_update_rejected), pars);
vc_conn.done;
+ f_shutdown();
}
/* create a session, expect it to succeed */
@@ -515,6 +530,7 @@
f_init();
vc_conn := f_start_handler(refers(f_TC_s2b_createSession_v4_noapco), pars);
vc_conn.done;
+ f_shutdown();
}
private function f_TC_s2b_createSession_v4_apco() runs on SMF_Session_CT {
@@ -535,6 +551,7 @@
f_init();
vc_conn := f_start_handler(refers(f_TC_s2b_createSession_v4_apco), pars);
vc_conn.done;
+ f_shutdown();
}
/* create an IPv4 session from 5G AMF, then delete it again */
@@ -551,6 +568,7 @@
f_init();
vc_conn := f_start_handler(refers(f_TC_n11_createSession_deleteSession), pars);
vc_conn.done;
+ f_shutdown();
}
/* create an IPv6 session from 5G AMF, then delete it again */
@@ -562,6 +580,7 @@
f_init();
vc_conn := f_start_handler(refers(f_TC_n11_createSession_deleteSession), pars);
vc_conn.done;
+ f_shutdown();
}
/* create an IPv4v6 session from 5G AMF, then delete it again */
@@ -573,6 +592,7 @@
f_init();
vc_conn := f_start_handler(refers(f_TC_n11_createSession_deleteSession), pars);
vc_conn.done;
+ f_shutdown();
}
function f_TC_n11_createSession_deleteSession_250(INT3b pdn_type) runs on SMF_Test_CT {
@@ -589,6 +609,7 @@
for (i := 0; i < sizeof(vc_conn); i := i + 1) {
vc_conn[i].done;
}
+ f_shutdown();
}
testcase TC_n11_createSession_deleteSession_250() runs on SMF_Test_CT {
To view, visit change 43749. To unsubscribe, or for help writing mail filters, visit settings.