diff --git a/src/python/devtest/os/test/test.py b/src/python/devtest/os/test/test.py index eabb2a4..0166a15 100644 --- a/src/python/devtest/os/test/test.py +++ b/src/python/devtest/os/test/test.py @@ -39,20 +39,45 @@ async def expect(conn, regex=None, subject=None, act_timeout=0.1, total_timeout= return buf raise Exception("never reached") -async def cmd_expect(conn, cmd, subject=None, regex=None, act_timeout=0.1): # export +async def cmd_expect(conn, cmd, subject=None, regex=None, log_act=None, act_timeout=0.1): # export slog(NOTICE, 'sending command "{}"'.format(str(cmd).rstrip("\n"))) res = await cmd_exec(conn, cmd) if not isinstance(res, list): msg = 'failed to send command over connection {}'.format(conn) slog(ERR, 'FAIL: ' + msg) return msg - if expect(conn, regex=regex, subject=subject, act_timeout=act_timeout): + if expect(conn, regex=regex, subject=subject, act_timeout=act_timeout, log_act=log_act): slog(NOTICE, 'PASS: found pattern "{}" in command output'.format(regex)) return None r = "FAIL: failed to find {} in command output".format(regex) slog(ERR, r) return r +# takes a list of [ cmd, regex-expect (or None), expect_timeout (or None)] +async def cmds_exec(console, cmds, log_act=None, echo_cmd=False): # export + + def find_match(response, pattern): + for s in response: + if re.search(pattern, s) is not None: + return True + return False + + for c in cmds: + cmdline = c[0] + e = None if len(c) < 2 else c[1] + timeout = 200 if len(c) < 3 else c[2] + rr = await cmd_exec(console, cmdline, act_timeout=1, log_act=log_act, echo_cmd=echo_cmd) + if rr is None: + return 'Failed to run command "{}"'.format(cmdline) + if e is not None: + if find_match(rr, e): + continue + slog(DEBUG, 'Waiting for: "{}"'.format(e)) + rr = await expect(console, regex=e, act_timeout=timeout) + if rr is None: + return 'Timed out waiting for: "{}"'.format(e) + return None + async def grep_log(conn, regex, log_glob='/var/log/messages', act_timeout=0.1, total_timeout=None): # export cmd = "ls {} | tail -1".format(log_glob) res = await cmd_exec(conn, cmd, act_timeout=act_timeout, total_timeout=total_timeout)