[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