minor cleanups; test.py add --demo option
Testing/demo:
$ test/test.py --demo regtest
This commit is contained in:
parent
c263d5b187
commit
056de3bc5c
4 changed files with 51 additions and 40 deletions
|
|
@ -74,7 +74,7 @@ def line_input(prompt,echo=True,insert_txt='',hold_protect=True):
|
|||
else:
|
||||
from getpass import getpass
|
||||
if g.platform == 'win':
|
||||
# MSWin hack - getpass('foo') doesn't flush stderr
|
||||
# MSYS2/MSWin hack - getpass('foo') doesn't flush stderr - TODO: has this been fixed?
|
||||
msg_r(prompt.strip()) # getpass('') adds a space
|
||||
sys.stderr.flush()
|
||||
reply = getpass('')
|
||||
|
|
|
|||
|
|
@ -33,9 +33,8 @@ except ImportError as e:
|
|||
die(2,red(f'Pexpect module is missing. Cannnot run test suite ({e!r})'))
|
||||
|
||||
def debug_pexpect_msg(p):
|
||||
if opt.debug_pexpect:
|
||||
msg('\n{}{}{}'.format( red('BEFORE ['), p.before, red(']') ))
|
||||
msg('{}{}{}'.format( red('MATCH ['), p.after, red(']') ))
|
||||
msg('\n{}{}{}'.format( red('BEFORE ['), p.before, red(']') ))
|
||||
msg('{}{}{}'.format( red('MATCH ['), p.after, red(']') ))
|
||||
|
||||
NL = '\n'
|
||||
|
||||
|
|
@ -154,10 +153,12 @@ class MMGenPexpect:
|
|||
|
||||
def expect_getend(self,s,regex=False):
|
||||
ret = self.expect(s,regex=regex,nonl=True)
|
||||
debug_pexpect_msg(self.p)
|
||||
if opt.debug_pexpect:
|
||||
debug_pexpect_msg(self.p)
|
||||
# readline() of partial lines doesn't work with PopenSpawn, so do this instead:
|
||||
self.expect(NL,nonl=True,silent=True)
|
||||
debug_pexpect_msg(self.p)
|
||||
if opt.debug_pexpect:
|
||||
debug_pexpect_msg(self.p)
|
||||
end = self.p.before.rstrip()
|
||||
if not g.debug:
|
||||
vmsg(f' ==> {cyan(end)}')
|
||||
|
|
@ -186,14 +187,11 @@ class MMGenPexpect:
|
|||
if not silent:
|
||||
if opt.verbose:
|
||||
msg_r('EXPECT ' + yellow(str(s)))
|
||||
elif not opt.exact_output: msg_r('+')
|
||||
elif not opt.exact_output:
|
||||
msg_r('+')
|
||||
|
||||
try:
|
||||
if s == '':
|
||||
ret = 0
|
||||
else:
|
||||
f = (self.p.expect_exact,self.p.expect)[bool(regex)]
|
||||
ret = f(s)
|
||||
ret = (self.p.expect_exact,self.p.expect)[bool(regex)](s) if s else 0
|
||||
except pexpect.TIMEOUT:
|
||||
if opt.debug_pexpect:
|
||||
raise
|
||||
|
|
@ -202,7 +200,8 @@ class MMGenPexpect:
|
|||
m3 = f'sent value: [{self.sent_value}]' if self.sent_value != None else ''
|
||||
die(2,m1+m2+m3)
|
||||
|
||||
debug_pexpect_msg(self.p)
|
||||
if opt.debug_pexpect:
|
||||
debug_pexpect_msg(self.p)
|
||||
|
||||
if opt.verbose and type(s) != str:
|
||||
msg_r(f' ==> {ret} ')
|
||||
|
|
@ -210,20 +209,21 @@ class MMGenPexpect:
|
|||
if ret == -1:
|
||||
die(4,f'Error. Expect returned {ret}')
|
||||
else:
|
||||
if t == '':
|
||||
if not nonl and not silent: vmsg('')
|
||||
else:
|
||||
if t:
|
||||
self.send(t,delay,s)
|
||||
else:
|
||||
if not nonl and not silent:
|
||||
vmsg('')
|
||||
return ret
|
||||
|
||||
def send(self,t,delay=None,s=False):
|
||||
self.sent_value = None
|
||||
delay = delay or (0,0.3)[bool(opt.buf_keypress)]
|
||||
if delay: time.sleep(delay)
|
||||
if delay:
|
||||
time.sleep(delay)
|
||||
ret = self.p.send(t) # returns num bytes written
|
||||
if ret:
|
||||
self.sent_value = t
|
||||
if delay: time.sleep(delay)
|
||||
self.sent_value = t if ret else None
|
||||
if opt.demo and delay:
|
||||
time.sleep(delay)
|
||||
if opt.verbose:
|
||||
ls = '' if opt.debug or not s else ' '
|
||||
es = '' if s else ' '
|
||||
|
|
|
|||
15
test/test.py
15
test/test.py
|
|
@ -96,7 +96,12 @@ g.quiet = False # if 'quiet' was set in config file, disable here
|
|||
os.environ['MMGEN_QUIET'] = '0' # for this script and spawned scripts
|
||||
|
||||
opts_data = {
|
||||
'sets': [('list_current_cmd_groups',True,'list_cmd_groups',True)],
|
||||
'sets': [
|
||||
('list_current_cmd_groups',True,'list_cmd_groups',True),
|
||||
('demo',True,'exact_output',True),
|
||||
('demo',True,'buf_keypress',True),
|
||||
('demo',True,'pexpect_spawn',True),
|
||||
],
|
||||
'text': {
|
||||
'desc': 'Test suite for the MMGen suite',
|
||||
'usage':'[options] [command [..command]] | [command_group[.command_subgroup][:command]]',
|
||||
|
|
@ -111,6 +116,8 @@ opts_data = {
|
|||
-c, --print-cmdline Print the command line of each spawned command
|
||||
-C, --coverage Produce code coverage info using trace module
|
||||
-x, --debug-pexpect Produce debugging output for pexpect calls
|
||||
--, --demo Add extra delay after each send to make input visible.
|
||||
Implies --exact-output --pexpect-spawn --buf-keypress
|
||||
-D, --no-daemon-stop Don't stop auto-started daemons after running tests
|
||||
-E, --direct-exec Bypass pexpect and execute a command directly (for
|
||||
debugging only)
|
||||
|
|
@ -615,7 +622,11 @@ class TestSuiteRunner(object):
|
|||
env.update({ 'EXEC_WRAPPER_TRACEBACK':'' }) # Python 3.9: OR the dicts
|
||||
|
||||
from test.include.pexpect import MMGenPexpect
|
||||
return MMGenPexpect( args, no_output=no_output, env=env, pexpect_spawn=pexpect_spawn )
|
||||
return MMGenPexpect(
|
||||
args = args,
|
||||
no_output = no_output,
|
||||
env = env,
|
||||
pexpect_spawn = pexpect_spawn )
|
||||
|
||||
def end_msg(self):
|
||||
t = int(time.time() - self.start_time)
|
||||
|
|
|
|||
|
|
@ -190,29 +190,29 @@ class TestSuiteInput(TestSuiteBase):
|
|||
|
||||
return t
|
||||
|
||||
def password_entry(self,prompt,cmd_args):
|
||||
t = self.spawn('test/misc/password_entry.py',cmd_args,cmd_dir='.')
|
||||
def _password_entry(self,prompt,opts=[],term=False):
|
||||
t = self.spawn( 'test/misc/password_entry.py', opts, cmd_dir='.', pexpect_spawn=term )
|
||||
imsg('Terminal: {}'.format(term))
|
||||
pw = 'abc-α'
|
||||
t.expect(prompt,pw+'\n')
|
||||
ret = t.expect_getend('Entered: ')
|
||||
assert ret == pw, f'Password mismatch! {ret} != {pw}'
|
||||
return t
|
||||
|
||||
def password_entry_noecho(self):
|
||||
if self.skip_for_win():
|
||||
m = "getpass() doesn't work with pexpect.popen_spawn!\n"
|
||||
m += 'Perform the following test by hand with non-ASCII password abc-α:\n'
|
||||
m += ' test/misc/password_entry.py'
|
||||
return ('skip_warn',m)
|
||||
return self.password_entry('Enter passphrase: ',[])
|
||||
# TODO: has this been fixed?
|
||||
winskip_msg = """
|
||||
getpass() doesn't work with pexpect.popen_spawn on MSYS2!
|
||||
Perform the following test by hand with non-ASCII password abc-α
|
||||
or another password in your native alphabet:
|
||||
|
||||
def password_entry_echo(self):
|
||||
if self.skip_for_win():
|
||||
m = "getpass() doesn't work with pexpect.popen_spawn!\n"
|
||||
m += 'Perform the following test by hand with non-ASCII password abc-α:\n'
|
||||
m += ' test/misc/password_entry.py --echo-passphrase'
|
||||
return ('skip_warn',m)
|
||||
return self.password_entry('Enter passphrase (echoed): ',['--echo-passphrase'])
|
||||
test/misc/input_func.py{} passphrase
|
||||
"""
|
||||
|
||||
def password_entry_noecho(self,term=False):
|
||||
return self._password_entry('Enter passphrase: ',term=term)
|
||||
|
||||
def password_entry_echo(self,term=False):
|
||||
return self._password_entry('Enter passphrase (echoed): ',['--echo-passphrase'],term=term)
|
||||
|
||||
def _mn2hex(self,fmt,entry_mode='full',mn=None,pad_entry=False,enter_for_dfl=False):
|
||||
mn = mn or sample_mn[fmt]['mn'].split()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue