OVMS3-idf/components/test/TestCaseScript/IOT/WifiConnUtility.py
Yinling 90e57cdf8f add auto generated test folder to components:
1. add test cases and related scripts
2. add CI config files
read README.md for detail
2016-10-11 17:19:40 +11:00

244 lines
8.6 KiB
Python
Executable file

from NativeLog import NativeLog
import time
import random
import string
ERROR_AP_PROP = {"ssid": "123456789012345678901234567890",
"ssid_len": 30,
"pwd": "12345678901234567890",
"pwd_len": 20,
"channel": 10,
"enc": 3,
"apc": 9, # invalid apc count
}
class WifiConnUtilError(StandardError):
pass
class WifiConnUtility(object):
def __init__(self, tc_action):
self.tc_action = tc_action
self.target_type = tc_action.target_type
pass
def set_mode(self, mode):
ret = True
fail_string = "set mode fail"
cmd = []
checker_stings = []
for i in range(2):
if self.target_type[0] == "SSC":
cmd.append("SSCC SSC%d op -S -o %d" % (i+1, mode[i]))
checker_stings.append("SSCP SSC%d C cur_mode C %d" % (i+1, mode[i]))
pass
else:
cmd.append("ATC AT%d CWMODE %d" % (i+1, mode[i]))
checker_stings.append("ATP AT%d L OK" % (i+1))
pass
if self.tc_action.load_and_exe_one_step(checker_stings, cmd,
fail_string, check_time=50) is False:
NativeLog.add_trace_critical("Failed to set mode")
ret = False
return ret
pass
def _apc_switch(self, outlet_list, action_list):
checker_stings = ["R PC_COM C OK"]
switch_cmd = "APC APC1"
fail_string = "Error when switching APC"
ret = True
for [_outlet, _action] in zip(action_list, outlet_list):
switch_cmd += " %s %d" % (_action, _outlet)
if self.tc_action.load_and_exe_one_step(checker_stings, [switch_cmd],
fail_string, check_time=50) is False:
NativeLog.add_trace_critical("Error when switching APC")
ret = False
return ret
pass
def _set_target_ap(self, ap_prop):
ret = True
fail_string = "set target ap fail, %s, %s" % (ap_prop["ssid"], ap_prop["pwd"])
if self.target_type[1] == "SSC":
if ap_prop["pwd"] == "":
cmd = ["SSCC SSC2 ap -S -s %s -t %d" % (ap_prop["ssid"],
ap_prop["enc"])
]
else:
cmd = ["SSCC SSC2 ap -S -s %s -p %s -t %d" % (ap_prop["ssid"],
ap_prop["pwd"],
ap_prop["enc"])
]
checker_stings = ["SSCP SSC2 C +SAP:OK"]
pass
else:
cmd = ["ATC AT2 CWSAP \"%s\" \"%s\" %d %d" % (ap_prop["ssid"],
ap_prop["pwd"],
ap_prop["channel"],
ap_prop["enc"])
]
checker_stings = ["ATR AT2 L OK"]
pass
if self.tc_action.load_and_exe_one_step(checker_stings, cmd,
fail_string, check_time=50) is False:
NativeLog.add_trace_critical("set target ap fail")
ret = False
return ret
pass
def setup_ap(self, ap_type, ap_prop):
if ap_type == "target":
ret = self._set_target_ap(ap_prop)
pass
else:
ret = self._apc_switch(["ON"], [ap_prop["apc"]])
# delay for 5 seconds, wait AP ready
time.sleep(5)
pass
return ret
def do_scan(self, ap_prop):
fail_string = "Scan fail"
ret = True
# do not check if the set AP can be scanned
if self.target_type[1] == "SSC":
cmd = ["SSCC SSC1 sta -S"]
checker_stings = ["SSCR SSC1 C ssc%20scan%20done"]
pass
else:
cmd = ["ATS AT1 AT+CWLAP"]
checker_stings = ["ATR AT1 L OK"]
pass
if self.tc_action.load_and_exe_one_step(checker_stings, cmd,
fail_string, check_time=100) is False:
NativeLog.add_trace_critical("Scan fail")
ret = False
return ret
pass
def _switch_off_target_ap(self, delay):
time.sleep(delay)
self._set_target_ap(ERROR_AP_PROP)
pass
def _switch_on_target_ap(self, ap_prop, delay):
time.sleep(delay)
self._set_target_ap(ap_prop)
pass
def _switch_off_ap(self, ap_type, ap_prop, delay_range):
delay = random.randint(delay_range[0]*10, delay_range[1]*10)/10
if ap_type == "target":
self._switch_off_target_ap(delay)
else:
delay -= 1.5
time.sleep(delay if delay > 0 else 0)
self._apc_switch(["OFF"], [ap_prop["apc"]])
pass
def _switch_on_ap(self, ap_type, ap_prop, delay_range):
delay = random.randint(delay_range[0]*10, delay_range[1]*10)/10
if ap_type == "target":
self._switch_on_target_ap(ap_prop, delay)
else:
delay -= 1.5
time.sleep(delay if delay > 0 else 0)
self._apc_switch(["ON"], [ap_prop["apc"]])
pass
def _join_ap(self, ap_prop, test_method):
fail_string = "join target ap fail, %s, %s" % (ap_prop["ssid"], ap_prop["pwd"])
if self.target_type[1] == "SSC":
cmd = ["SSCC SSC1 ap -C -s %s -p %s" % (ap_prop["ssid"],
ap_prop["pwd"],)
]
checker_stings = ["SSCR SSC1 C %s" % ap_prop["ssid"],
"SSCR SSC1 C dhcp%20client%20start",
"SSCR SSC1 C ip C mask C gw"]
pass
else:
cmd = ["ATC AT1 CWJAP \"%s\" \"%s\"" % (ap_prop["ssid"],
ap_prop["pwd"])
]
checker_stings = ["ATR AT1 NC ERROR NC FAIL L OK"]
pass
if test_method == "Normal":
ret = self.tc_action.load_and_exe_one_step(checker_stings, cmd,
fail_string, check_freq=0.1, check_time=350)
if ret is not False:
ret *= 0.1
else:
ret = self.tc_action.load_and_exe_one_step([], cmd, fail_string)
return ret
pass
def _check_join_ap_result(self, ap_prop):
ret = False
fail_string = "join ap fail, %s, %s" % (ap_prop["ssid"], ap_prop["pwd"])
if self.target_type[1] == "SSC":
checker_stings = ["SSCR SSC1 C dhcp%20client%20start",
"SSCR SSC1 C ip C mask C gw"]
ret = self.tc_action.load_and_exe_one_step(checker_stings, ["DELAY 0"],
fail_string, check_freq=1, check_time=120)
pass
else:
cmd = ["ATS AT1 AT+CWJAP?"]
checker_stings = ["ATR AT1 NC busy NC No%20AP C +CWJAP"]
for i in range(3):
ret = self.tc_action.load_and_exe_one_step(checker_stings, cmd,
fail_string, check_freq=1, check_time=2)
if ret is not False:
break
time.sleep(15)
return ret
pass
def join_ap(self, join_test_method, ap_type, ap_prop, delay):
if join_test_method == "WRONG_PROP":
_prop = ERROR_AP_PROP
else:
_prop = ap_prop
ret = self._join_ap(_prop, join_test_method)
if join_test_method == "OFF_ON":
self._switch_off_ap(ap_type, ap_prop, delay[0])
self._switch_on_ap(ap_type, ap_prop, delay[1])
ret = self._check_join_ap_result(_prop)
pass
elif join_test_method == "OFF":
self._switch_off_ap(ap_type, ap_prop, delay[0])
time.sleep(25)
pass
return ret
pass
def do_reconnect(self, reconnect_test_method, ap_type, ap_prop, delay):
ret = True
if reconnect_test_method == "OFF_ON":
self._switch_off_ap(ap_type, ap_prop, delay[0])
self._switch_on_ap(ap_type, ap_prop, delay[1])
ret = self._check_join_ap_result(ap_prop)
pass
elif reconnect_test_method == "OFF":
self._switch_off_ap(ap_type, ap_prop, delay[0])
pass
return ret
pass
def main():
pass
if __name__ == '__main__':
main()