[pypy-commit] pypy reverse-debugger: Fix and improve tests
arigo
pypy.commits at gmail.com
Fri Jun 10 04:54:40 EDT 2016
Author: Armin Rigo <arigo at tunes.org>
Branch: reverse-debugger
Changeset: r85066:1a7598c93c56
Date: 2016-06-10 10:54 +0200
http://bitbucket.org/pypy/pypy/changeset/1a7598c93c56/
Log: Fix and improve tests
diff --git a/rpython/translator/revdb/test/test_basic.py b/rpython/translator/revdb/test/test_basic.py
--- a/rpython/translator/revdb/test/test_basic.py
+++ b/rpython/translator/revdb/test/test_basic.py
@@ -1,6 +1,6 @@
import py
import os, sys
-import array, struct
+import re, array, struct
from rpython.tool.udir import udir
from rpython.translator.interactive import Translation
from rpython.rlib.rarithmetic import LONG_BIT
@@ -32,10 +32,11 @@
return self.cur == len(self.buffer)
-class TestBasic(object):
+class BaseTests(object):
- def getcompiled(self, entry_point, argtypes, backendopt=True):
+ def compile(self, entry_point, argtypes, backendopt=True):
t = Translation(entry_point, None, gc="boehm")
+ self.t = t
t.config.translation.reverse_debugger = True
t.config.translation.rweakref = False
if not backendopt:
@@ -48,29 +49,27 @@
self.rdbname = os.path.join(os.path.dirname(str(self.exename)),
'log.rdb')
- def run(*argv):
- env = os.environ.copy()
- env['PYPYREVDB'] = self.rdbname
- stdout, stderr = t.driver.cbuilder.cmdexec(' '.join(argv), env=env,
- expect_crash=9)
- print >> sys.stderr, stderr
- return stdout
-
- def replay():
- stdout = t.driver.cbuilder.cmdexec("--replay '%s'" % self.rdbname)
- return stdout
-
- return run, replay
+ def run(self, *argv):
+ env = os.environ.copy()
+ env['PYPYREVDB'] = self.rdbname
+ t = self.t
+ stdout, stderr = t.driver.cbuilder.cmdexec(' '.join(argv), env=env,
+ expect_crash=9)
+ print >> sys.stderr, stderr
+ return stdout
def fetch_rdb(self):
return RDB(self.rdbname)
+
+class TestRecording(BaseTests):
+
def test_simple(self):
def main(argv):
print argv[1:]
return 9
- fn, replay = self.getcompiled(main, [], backendopt=False)
- assert fn('abc d') == '[abc, d]\n'
+ self.compile(main, [], backendopt=False)
+ assert self.run('abc d') == '[abc, d]\n'
rdb = self.fetch_rdb()
assert rdb.argc == 3
#
@@ -98,10 +97,21 @@
assert rdb.done()
#
assert got == [self.exename, 'abc', 'd']
- #
- # Now try the replay mode (just "doesn't crash" for now)
- out = replay()
- assert out == "Replaying finished, 0 stop points\n"
+
+
+class TestInteraction(BaseTests):
+ """
+ These tests require pexpect (UNIX-only).
+ http://pexpect.sourceforge.net/
+ """
+ def replay(self, **kwds):
+ import pexpect
+ self.EOF = pexpect.EOF
+ kwds.setdefault('timeout', 10)
+ child = pexpect.spawn(str(self.exename),
+ ['--replay', str(self.rdbname)], **kwds)
+ child.logfile = sys.stdout
+ return child
def test_simple_interpreter(self):
def main(argv):
@@ -109,9 +119,30 @@
revdb.stop_point(42)
print op
return 9
- fn, replay = self.getcompiled(main, [], backendopt=False)
- assert fn('abc d ef') == 'abc\nd\nef\n'
+ self.compile(main, [], backendopt=False)
+ assert self.run('abc d ef') == 'abc\nd\nef\n'
assert self.fetch_rdb().number_of_stop_points() == 3
- out = replay()
- assert out == ("break #42 after 1 stop points\n"
- "Replaying finished, 3 stop points\n")
+
+ child = self.replay()
+
+ def wait(s):
+ child.expect(re.escape(s))
+
+ wait('stop_points=3\r\n')
+ wait('(3)$ ')
+ child.sendline('go 1')
+ wait('(1)$ ')
+ child.sendline('')
+ wait('(1)$ ')
+ child.sendline('go 52')
+ wait('(3)$ ')
+ child.sendline('help')
+ wait('select command:\r\n')
+ # ...
+ wait('(3)$ ')
+ child.sendline('info')
+ wait("bad category '', try 'help'\r\n")
+ child.sendline('info fork')
+ wait('latest_fork=3\r\n')
+ child.sendline('quit')
+ child.expect(self.EOF)
More information about the pypy-commit
mailing list