esp-idf/components/test/TestCaseScript/TCPStress/TCPConnUtility.py

274 lines
12 KiB
Python
Raw Normal View History

from NativeLog import NativeLog
# make sure target do not listen on this port
ERROR_PORT = 23333
def unused_param(param):
return param
class TCPUtilError(StandardError):
pass
class TCPConnUtility(object):
METHOD_RESULT = {"C_01": ("ESTABLISHED", "ESTABLISHED"), # target TCP peer state, PC TCP peer state
"C_02": ("SYNC_SENT", "CLOSED"),
"C_03": ("CLOSED", "CLOSED"),
"C_04": ("SYN_RCVD", "ESTABLISHED"),
"C_05": ("ESTABLISHED", "ESTABLISHED"),
"C_06": ("CLOSED", "CLOSED"),
"C_07": ("CLOSED", "CLOSED"),
"C_08": ("CLOSED", "CLOSED"),
"D_01": ("TIME_WAIT", "CLOSED"),
"D_02": ("TIME_WAIT", "TIME_WAIT"),
"D_03": ("FIN_WAIT_2", "CLOSE_WAIT"),
"D_04": ("FIN_WAIT_1", "CLOSE_WAIT"),
"D_05": ("CLOSED", "TIME_WAIT"),
"D_06": ("CLOSED", "CLOSED"),
"D_07": ("CLOSE_WAIT", "FIN_WAIT2"),
"D_08": ("TIME_WAIT", "CLOSED"), }
SOC_CLOSED_STATE = ("FIN_WAIT_1", "FIN_WAIT_2", "CLOSING", "TIME_WAIT", "LAST_ACK", "CLOSED")
SOC_CREATED_STATE = ("SYNC_RCVD", "SYNC_SENT", "ESTABLISHED")
SOC_SEND_DATA_STATE = ("ESTABLISHED", "CLOSE_WAIT")
SOC_ESTABLISHED_STATE = ("ESTABLISHED", )
def __init__(self, tc_action):
self.tc_action = tc_action
self.pc_server_port = "<test_tcp_port1>"
self.target_server_port = "<test_tcp_port1>"
self.pc_ip = "<pc_ip>"
self.target_ip = "<target_ip>"
pass
def config_parameters(self, pc_server_port=None, target_server_port=None, pc_ip=None, target_ip=None):
if pc_ip is not None:
self.pc_ip = pc_ip
if target_ip is not None:
self.target_ip = target_ip
if pc_server_port is not None:
self.pc_server_port = pc_server_port
if target_server_port is not None:
self.target_server_port = target_server_port
pass
def __connect_c_01(self, conn_id):
checker_stings = ["SOCR SOC1 C +ACCEPT", "ATR AT1 NC CLOSE L OK"]
test_action_strings = ["ATC AT1 CIPSTART %d \"TCP\" %s %s" %
(conn_id[1], self.pc_ip, self.pc_server_port)]
fail_string = "Fail, Target failed on connect to PC server"
ret = self.tc_action.load_and_exe_one_step(checker_stings, test_action_strings, fail_string)
if ret is False:
return ret
checker_stings = ["SOCR SOC_COM L OK"]
test_action_strings = ["SOC SOC1 ACCEPT SOC%d" % conn_id[0]]
return self.tc_action.load_and_exe_one_step(checker_stings, test_action_strings, fail_string)
pass
def __connect_c_02(self, conn_id):
checker_stings = ["ATR AT1 C ERROR"]
test_action_strings = ["ATC AT1 CIPSTART %d \"TCP\" %s %s" %
(conn_id[1], self.pc_ip, ERROR_PORT)]
fail_string = "Fail, Target fail on connect to port not listened"
return self.tc_action.load_and_exe_one_step(checker_stings, test_action_strings, fail_string)
pass
def __connect_c_03(self, conn_id):
pass
def __connect_c_04(self, conn_id):
pass
def __connect_c_05(self, conn_id):
checker_stings = ["SOCP SOC_COM OK", "ATP AT1 C CONNECT"]
test_action_strings = ["SOC SOC%d CONNECT %s %s" %
(conn_id[0], self.target_server_port, self.target_ip)]
fail_string = "Fail, PC fail on connect to target server"
return self.tc_action.load_and_exe_one_step(checker_stings, test_action_strings,
fail_string, check_time=200, check_freq=0.01)
pass
def __connect_c_06(self, conn_id):
pass
def __connect_c_07(self, conn_id):
# no checker strings, only try to create
# while connect is a blocking function, will return till target reply RST
checker_stings = ["SOCR SOC_COM C CLOSE"]
test_action_strings = ["SOC SOC%d CONNECT %s %s" %
(conn_id[0], ERROR_PORT, self.target_ip)]
fail_string = "Fail, PC fail on connect to target server"
return self.tc_action.load_and_exe_one_step(checker_stings, test_action_strings,
fail_string, check_time=2000, check_freq=0.01)
pass
def __connect_c_08(self, conn_id):
pass
def __close_d_01(self, conn_id):
checker_stings = ["ATP AT1 C %d,CLOSED" % conn_id[1], "SOCP SOC_COM C CLOSE"]
test_action_strings = ["SOC SOC%d SETOPT CLOSE_OPT IMM_SEND_FIN" % conn_id[0],
"ATS AT1 AT+CIPCLOSE=%d" % conn_id[1]]
fail_string = "Fail, Fail to close socket using D_01"
return self.tc_action.load_and_exe_one_step(checker_stings, test_action_strings,
fail_string, check_time=200, check_freq=0.01)
pass
def __close_d_02(self, conn_id):
pass
def __close_d_03(self, conn_id):
checker_stings = []
test_action_strings = ["SOC SOC%d SETOPT CLOSE_OPT WAIT_TO" % conn_id[0],
"ATS AT1 AT+CIPCLOSE=%d" % conn_id[1]]
fail_string = "Fail, Fail to close socket using D_01"
return self.tc_action.load_and_exe_one_step(checker_stings, test_action_strings,
fail_string, check_time=500, check_freq=0.01)
pass
def __close_d_04(self, conn_id):
pass
def __close_d_05(self, conn_id):
checker_stings = ["ATP AT1 C %d,CLOSED" % conn_id[1]]
test_action_strings = ["SOC SOC%d SETOPT CLOSE_OPT IMM_SEND_FIN" % conn_id[0],
"SOC SOC%d CLOSE" % conn_id[0]]
fail_string = "Fail, Fail to close socket using D_05"
return self.tc_action.load_and_exe_one_step(checker_stings, test_action_strings,
fail_string, check_time=200, check_freq=0.01)
pass
def __close_d_06(self, conn_id):
# 1. set PC socket close option, stop calling recv; send in target
checker_stings = ["ATP AT1 C >"]
test_action_strings = ["SOC SOC%d STOPRECV" % conn_id[0],
"SOC SOC%d SETOPT CLOSE_OPT IMM_SEND_RST" % conn_id[0],
"ATS AT1 AT+CIPSEND=%d,5" % conn_id[1]]
fail_string = "Fail, Fail to close socket using D_06"
ret = self.tc_action.load_and_exe_one_step(checker_stings, test_action_strings,
fail_string, check_time=200, check_freq=0.01)
if ret is False:
return ret
# 2. send 5 bytes to socket
checker_stings = ["ATP AT1 C OK"]
test_action_strings = ["ATSN AT1 5"]
fail_string = "Fail, Fail to close socket using D_06"
ret = self.tc_action.load_and_exe_one_step(checker_stings, test_action_strings,
fail_string, check_time=200, check_freq=0.01)
if ret is False:
return ret
# 3. close socket
checker_stings = ["ATP AT1 OR 2 C %d,CONNECT C %d,CLOSED" % (conn_id[1], conn_id[1])]
test_action_strings = ["SOC SOC%d CLOSE" % conn_id[0]]
fail_string = "Fail, Fail to close socket using D_06"
return self.tc_action.load_and_exe_one_step(checker_stings, test_action_strings,
fail_string, check_time=200, check_freq=0.01)
pass
def __close_d_07(self, conn_id):
pass
def __close_d_08(self, conn_id):
pass
def send_test_data(self, socket_id, target_link_id, check_data_len):
# check_data_len[0] for socket data len, check_data_len[1] for target link data len
fail_string = "Fail, Fail on send and recv data"
ret = True
for i in range(1):
if check_data_len[1] != 0:
checker_stings = ["ATP AT1 C >"]
test_action_strings = ["ATS AT1 AT+CIPSEND=%d,%d" % (target_link_id, check_data_len[1])]
if self.tc_action.load_and_exe_one_step(checker_stings, test_action_strings,
fail_string, check_time=20) is False:
NativeLog.add_trace_critical("Fail on target send command for link %d" % target_link_id)
ret = False
break
checker_stings = ["SOCP SOC%d RL %d" % (socket_id, check_data_len[1]), "ATP AT1 C OK"]
test_action_strings = ["ATSN AT1 %d" % check_data_len[1]]
if self.tc_action.load_and_exe_one_step(checker_stings, test_action_strings,
fail_string, check_time=20) is False:
NativeLog.add_trace_critical("Fail on target send for link %d, send or recv error" % target_link_id)
ret = False
break
if check_data_len[0] != 0:
checker_stings = ["ATP AT1 DL %d+%d" % (target_link_id, check_data_len[0])]
test_action_strings = ["SOC SOC%d SEND %d" % (socket_id, check_data_len[0])]
if self.tc_action.load_and_exe_one_step(checker_stings, test_action_strings,
fail_string, check_time=20) is False:
NativeLog.add_trace_critical("Fail to receive PC SOC%d sent data" % socket_id)
ret = False
break
# return ret
# for now do not validate data
return True
TCP_ACTION_DICT = {"C_01": __connect_c_01,
"C_02": __connect_c_02,
"C_03": __connect_c_03,
"C_04": __connect_c_04,
"C_05": __connect_c_05,
"C_06": __connect_c_06,
"C_07": __connect_c_07,
"C_08": __connect_c_08,
"D_01": __close_d_01,
"D_02": __close_d_02,
"D_03": __close_d_03,
"D_04": __close_d_04,
"D_05": __close_d_05,
"D_06": __close_d_06,
"D_07": __close_d_07,
"D_08": __close_d_08,
}
def get_method_destination_state(self, method):
return self.METHOD_RESULT[method]
def execute_tcp_method(self, method, conn_id):
if method in self.METHOD_RESULT:
return self.TCP_ACTION_DICT[method](self, conn_id), self.get_method_destination_state(method)
else:
raise TCPUtilError("Not TCP connection method")
pass
def is_created_state(self, state):
if state in self.SOC_CREATED_STATE:
return True
else:
return False
def is_closed_state(self, state):
if state in self.SOC_CLOSED_STATE:
return True
else:
return False
def is_able_to_send_data(self, state):
if state in self.SOC_SEND_DATA_STATE:
return True
else:
return False
def is_established_connection(self, state):
if state[0] in self.SOC_ESTABLISHED_STATE and state[1] in self.SOC_ESTABLISHED_STATE:
return True
else:
return False
def main():
pass
if __name__ == '__main__':
main()