mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
90e57cdf8f
1. add test cases and related scripts 2. add CI config files read README.md for detail
274 lines
12 KiB
Python
Executable File
274 lines
12 KiB
Python
Executable File
import random
|
|
import os
|
|
import time
|
|
import copy
|
|
|
|
from TCAction import TCActionBase
|
|
from NativeLog import NativeLog
|
|
from Utility import Encoding
|
|
from Utility import MakeFolder
|
|
|
|
AP_PROP = ("ssid", "ssid_len", "pwd",
|
|
"pwd_len", "channel", "enc", "apc")
|
|
|
|
SMART_TYPE = ("esp-touch", "airkiss")
|
|
|
|
TEST_METHOD = ("ssid_broadcast", "ssid_hidden")
|
|
|
|
HT = ("ht20", "ht40")
|
|
|
|
TEST_STAT = ("total count", "fail count", "total time", "longest time")
|
|
|
|
_TEST_STAT_INIT_DICT = {"total count": 0,
|
|
"fail count": 0,
|
|
"total time": 0,
|
|
"longest time": 0,
|
|
}
|
|
|
|
LOG_FOLDER = os.path.join("AT_LOG", "Performance", "SmartConfig")
|
|
|
|
|
|
SSID_LEN_RANGE = (1, 32) # in bytes
|
|
ENC_TYPE = (0, 2, 3, 4) # do not support WEP for 8266 soft AP
|
|
PWD_RANGE = {0: [0, 0],
|
|
1: [5, 5],
|
|
2: [8, 32],
|
|
3: [8, 32],
|
|
4: [8, 32],
|
|
}
|
|
|
|
|
|
class WifiSmartConfig(TCActionBase.CommonTCActionBase):
|
|
|
|
def __init__(self, name, test_env, cmd_set, timeout=30, log_path=TCActionBase.LOG_PATH):
|
|
TCActionBase.CommonTCActionBase.__init__(self, name, test_env, cmd_set=cmd_set,
|
|
timeout=timeout, log_path=log_path)
|
|
# default value for optional configurable params
|
|
self.test_method = ["ssid_hidden", "ssid_broadcast"]
|
|
self.bssid = "ff:ff:ff:ff:ff:ff"
|
|
self.ht_ap = dict(zip(HT, [("<ht20_ap_ssid>", "<ht20_ap_password>"),
|
|
("<ht40_ap_ssid>", "<ht40_ap_password>")]))
|
|
self.ap_channel = {"ht20": 1, "ht40": 1}
|
|
self.delay_time = 3 # default 3s, wait for scan done
|
|
# load param from excel
|
|
for i in range(1, len(cmd_set)):
|
|
if cmd_set[i][0] != "dummy" and cmd_set[i][0] != "":
|
|
cmd_string = "self." + cmd_set[i][0]
|
|
exec cmd_string
|
|
|
|
folder_path = MakeFolder.make_folder(LOG_FOLDER)
|
|
file_name = "SmartConfig_log_%s.log" % (time.strftime("%m%d%H%M%S", time.localtime()))
|
|
self._performance_log_file = os.path.join(folder_path, file_name)
|
|
|
|
# type
|
|
self.target_type = ["SSC" if test_env.get_port_by_name("AT1") is None else "AT"]
|
|
self.target_type.append("SSC" if test_env.get_port_by_name("AT2") is None else "AT")
|
|
|
|
# test statistics
|
|
# better ways to create?
|
|
_test_stat = dict.fromkeys(TEST_STAT, 0)
|
|
_test_method = dict.fromkeys(TEST_METHOD)
|
|
_test_ht = dict.fromkeys(HT)
|
|
self.test_stat = dict.fromkeys(SMART_TYPE)
|
|
for i in SMART_TYPE:
|
|
self.test_stat[i] = copy.deepcopy(_test_ht)
|
|
for j in HT:
|
|
self.test_stat[i][j] = copy.deepcopy(_test_method)
|
|
for k in TEST_METHOD:
|
|
self.test_stat[i][j][k] = copy.deepcopy(_test_stat)
|
|
|
|
self.result_cntx = TCActionBase.ResultCheckContext(self, test_env, self.tc_name)
|
|
pass
|
|
|
|
def _generate_random_ap_prop(self, ht_type):
|
|
ap_prop = dict.fromkeys(AP_PROP)
|
|
# generate target ap_value
|
|
ap_prop["ssid_len"] = random.randint(SSID_LEN_RANGE[0], SSID_LEN_RANGE[1])
|
|
ap_prop["channel"] = self.ap_channel[ht_type]
|
|
ap_prop["enc"] = random.choice(ENC_TYPE)
|
|
ap_prop["pwd_len"] = random.randint(PWD_RANGE[ap_prop["enc"]][0], PWD_RANGE[ap_prop["enc"]][1])
|
|
ap_prop["ssid"] = Encoding.generate_random_printable_str(ap_prop["ssid_len"])
|
|
ap_prop["pwd"] = Encoding.generate_random_printable_str(ap_prop["pwd_len"])
|
|
|
|
return ap_prop
|
|
|
|
def _logging_performance(self, time_cost, ssid, password, smart_type, test_method, ht_type):
|
|
# update test statistics
|
|
stat = self.test_stat[smart_type][ht_type][test_method]
|
|
stat["total count"] += 1
|
|
# log performance to performance log file
|
|
with open(self._performance_log_file, "ab+") as f:
|
|
# log time and ssid
|
|
if time_cost is not False:
|
|
time_tmp = float(time_cost)/10
|
|
f.write("\r\n[%s]:\r\n[Succeed] [%.2f]\r\n" %
|
|
(time.strftime("%m-%d %H:%M:%S", time.localtime()), time_tmp))
|
|
stat["total time"] += time_tmp
|
|
stat["longest time"] = time_tmp if time_tmp > stat["longest time"] else stat["longest time"]
|
|
else:
|
|
f.write("\r\n[%s]:\r\n[Fail]\r\n" %
|
|
time.strftime("%m-%d %H:%M:%S", time.localtime()))
|
|
stat["fail count"] += 1
|
|
|
|
f.write("[%s] [%s] [%s]\r\n" %
|
|
(smart_type, test_method, ht_type))
|
|
f.write("[ssid] %s \r\n[password] %s\r\n" %
|
|
(ssid, password))
|
|
pass
|
|
|
|
def _generate_performance_report(self):
|
|
with open(self._performance_log_file, "ab+") as f:
|
|
for i in SMART_TYPE:
|
|
for j in HT:
|
|
for k in TEST_METHOD:
|
|
stat = self.test_stat[i][j][k]
|
|
f.write("\r\n[Test report] [%s] [%s] [%s]\r\n" % (i, j, k))
|
|
if stat["total count"] > 0:
|
|
f.write("[Total]: %d\r\n" % stat["total count"])
|
|
f.write("[Failed]: %d\r\n" % stat["fail count"])
|
|
f.write("[Fail ratio]: %.2f%%\r\n" %
|
|
(float(stat["fail count"])/stat["total count"] * 100))
|
|
f.write("[Longest time cost]: %.2f\r\n" % stat["longest time"])
|
|
if (stat["total count"] - stat["fail count"]) > 0:
|
|
f.write("[Average time cost]: %.2f\r\n" %
|
|
(stat["total time"]/(stat["total count"]-stat["fail count"])))
|
|
|
|
@staticmethod
|
|
def cmd_exception_catcher(e):
|
|
raise e
|
|
pass
|
|
|
|
def execute(self):
|
|
TCActionBase.TCActionBase.execute(self)
|
|
self.result_cntx.start()
|
|
|
|
# mandatory configurable params
|
|
try:
|
|
test_count = self.test_count
|
|
delay_time = self.delay_time
|
|
except StandardError, e:
|
|
NativeLog.add_trace_critical("Error configuration for WifiJAP script, error is %s" % e)
|
|
raise StandardError("Error configuration")
|
|
|
|
# step 0 : set AT1 mode
|
|
fail_string = "Fail to restore init condition"
|
|
if self.target_type[0] == "AT":
|
|
cmd = ["ATS AT1 AT+CWMODE=1"]
|
|
checker_stings = ["R AT1 L OK"]
|
|
else:
|
|
cmd = ["SSC SSC1 op -S -o 1"]
|
|
checker_stings = ["R SSC1 C +MODE:OK"]
|
|
if self.target_type[1] == "AT":
|
|
cmd.append("ATS AT2 AT+CWMODE=2")
|
|
checker_stings.append("R AT2 L OK")
|
|
else:
|
|
cmd.append("SSC SSC2 op -S -o 2")
|
|
checker_stings.append("R SSC2 C +MODE:OK")
|
|
|
|
if self.load_and_exe_one_step(checker_stings, cmd,
|
|
fail_string, check_time=150) is False:
|
|
NativeLog.add_trace_critical(fail_string)
|
|
return
|
|
|
|
for i in xrange(test_count):
|
|
_method = random.choice(self.test_method)
|
|
_ht = random.choice(self.ht)
|
|
_ap_prop = self._generate_random_ap_prop(_ht)
|
|
_smart_type = random.choice(self.smart_type)
|
|
_ht_ap = self.ht_ap[_ht]
|
|
is_hidden = 0 if _method == "ssid_broadcast" else 1
|
|
# get ip and
|
|
|
|
# step 1 : restore init condition
|
|
fail_string = "Fail to restore init condition"
|
|
if self.target_type[0] == "AT":
|
|
cmd = ["ATS AT1 AT+CWSTOPSMART", "WIFI <pc_wifi_nic> CONN %s %s <pc_ip_sc>" % (_ht_ap[0], _ht_ap[1])]
|
|
checker_stings = ["P AT1 L OK", "P PC_COM L OK"]
|
|
else:
|
|
cmd = ["SSC SSC1 smart -E", "WIFI <pc_wifi_nic> CONN %s %s <pc_ip_sc>" % (_ht_ap[0], _ht_ap[1])]
|
|
checker_stings = ["P SSC1 C +SC:OK", "P PC_COM L OK"]
|
|
|
|
if self.load_and_exe_one_step(checker_stings, cmd,
|
|
fail_string, check_time=200) is False:
|
|
NativeLog.add_trace_critical(fail_string)
|
|
continue
|
|
NativeLog.add_prompt_trace("Step1 Done")
|
|
|
|
# step 2 : test method is ssid_broadcast, then set AP on target 2
|
|
if _method == "ssid_broadcast":
|
|
fail_string = "Fail to set AP"
|
|
if self.target_type[1] == "AT":
|
|
cmd = ["ATS AT2 AT+CWSAP=\"%s\",\"%s\",%d,%d" % (_ap_prop["ssid"], _ap_prop["pwd"],
|
|
_ap_prop["channel"], _ap_prop["enc"])]
|
|
checker_stings = ["R AT2 L OK"]
|
|
else:
|
|
cmd = ["SSC SSC2 ap -S -s %s -p %s -n %d -t %d" % (_ap_prop["ssid"], _ap_prop["pwd"],
|
|
_ap_prop["channel"], _ap_prop["enc"])]
|
|
checker_stings = ["R SSC2 C +SAP:OK"]
|
|
|
|
if self.load_and_exe_one_step(checker_stings, cmd,
|
|
fail_string, check_time=50) is False:
|
|
NativeLog.add_trace_critical(fail_string)
|
|
continue
|
|
NativeLog.add_prompt_trace("Step2 Done")
|
|
|
|
# step 3 : start SMART
|
|
fail_string = "Fail to start smart config"
|
|
if self.target_type[0] == "AT":
|
|
cmd = ["ATS AT1 AT+CWSTARTSMART"]
|
|
checker_stings = ["R AT1 L OK"]
|
|
else:
|
|
cmd = ["SSC SSC1 smart -S -a 0"]
|
|
checker_stings = ["R SSC1 C +SC:OK"]
|
|
|
|
if self.load_and_exe_one_step(checker_stings, cmd,
|
|
fail_string, check_time=50) is False:
|
|
NativeLog.add_trace_critical(fail_string)
|
|
continue
|
|
# sleep for delay_time seconds to wait scan done or simulate delay config situation
|
|
time.sleep(delay_time)
|
|
NativeLog.add_prompt_trace("Step3 Done")
|
|
|
|
# step 4 : do smart config
|
|
fail_string = "Fail in smart config"
|
|
cmd = ["SMART %s <pc_ip_sc> %s %s %s %d"
|
|
% (_smart_type, _ap_prop["ssid"], _ap_prop["pwd"], self.bssid, is_hidden)]
|
|
if self.target_type[0] == "AT":
|
|
checker_stings = ["P AT1 C Smart%20get%20wifi%20info",
|
|
"P LOG1 C %s C %s" % (_ap_prop["ssid"], _ap_prop["pwd"])]
|
|
else:
|
|
checker_stings = ["P SSC1 C %s C %s" % (_ap_prop["ssid"], _ap_prop["pwd"])]
|
|
|
|
try:
|
|
time_cost = self.load_and_exe_one_step(checker_stings, cmd,
|
|
fail_string, check_time=400,
|
|
cmd_exception_catcher=self.cmd_exception_catcher)
|
|
except StandardError:
|
|
NativeLog.add_prompt_trace("Exception occurred during executing cmd")
|
|
continue
|
|
pass
|
|
self._logging_performance(time_cost, _ap_prop["ssid"], _ap_prop["pwd"],
|
|
_smart_type, _method, _ht)
|
|
if time_cost is False:
|
|
NativeLog.add_prompt_trace(fail_string)
|
|
continue
|
|
|
|
# continue to next loop
|
|
NativeLog.add_prompt_trace("[WifiSmartConfig] Test count %d done" % i)
|
|
|
|
# generate report and cleanup
|
|
self._generate_performance_report()
|
|
|
|
self.result_cntx.set_result("Succeed")
|
|
|
|
def result_check(self, port_name, data):
|
|
TCActionBase.CommonTCActionBase.result_check(self, port_name, data)
|
|
self.result_cntx.append_data(port_name, data)
|
|
|
|
|
|
def main():
|
|
pass
|
|
|
|
if __name__ == '__main__':
|
|
main()
|