Home | History | Annotate | Download | only in expression
      1 """Test lldb's expression evaluations and collect statistics."""
      2 
      3 import os, sys
      4 import unittest2
      5 import lldb
      6 import pexpect
      7 from lldbbench import *
      8 
      9 class ExpressionEvaluationCase(BenchBase):
     10 
     11     mydir = os.path.join("benchmarks", "expression")
     12 
     13     def setUp(self):
     14         BenchBase.setUp(self)
     15         self.source = 'main.cpp'
     16         self.line_to_break = line_number(self.source, '// Set breakpoint here.')
     17         self.count = lldb.bmIterationCount
     18         if self.count <= 0:
     19             self.count = 25
     20 
     21     @benchmarks_test
     22     def test_expr_cmd(self):
     23         """Test lldb's expression commands and collect statistics."""
     24         self.buildDefault()
     25         self.exe_name = 'a.out'
     26 
     27         print
     28         self.run_lldb_repeated_exprs(self.exe_name, self.count)
     29         print "lldb expr cmd benchmark:", self.stopwatch
     30 
     31     def run_lldb_repeated_exprs(self, exe_name, count):
     32         exe = os.path.join(os.getcwd(), exe_name)
     33 
     34         # Set self.child_prompt, which is "(lldb) ".
     35         self.child_prompt = '(lldb) '
     36         prompt = self.child_prompt
     37 
     38         # Reset the stopwatch now.
     39         self.stopwatch.reset()
     40         for i in range(count):
     41             # So that the child gets torn down after the test.
     42             self.child = pexpect.spawn('%s %s %s' % (self.lldbHere, self.lldbOption, exe))
     43             child = self.child
     44 
     45             # Turn on logging for what the child sends back.
     46             if self.TraceOn():
     47                 child.logfile_read = sys.stdout
     48 
     49             child.expect_exact(prompt)
     50             child.sendline('breakpoint set -f %s -l %d' % (self.source, self.line_to_break))
     51             child.expect_exact(prompt)
     52             child.sendline('run')
     53             child.expect_exact(prompt)
     54             expr_cmd1 = 'expr ptr[j]->point.x'
     55             expr_cmd2 = 'expr ptr[j]->point.y'
     56 
     57             with self.stopwatch:
     58                 child.sendline(expr_cmd1)
     59                 child.expect_exact(prompt)
     60                 child.sendline(expr_cmd2)
     61                 child.expect_exact(prompt)
     62 
     63             child.sendline('quit')
     64             try:
     65                 self.child.expect(pexpect.EOF)
     66             except:
     67                 pass
     68 
     69         self.child = None
     70 
     71 
     72 if __name__ == '__main__':
     73     import atexit
     74     lldb.SBDebugger.Initialize()
     75     atexit.register(lambda: lldb.SBDebugger.Terminate())
     76     unittest2.main()
     77