1*99451b44SJordan Rupprecht"""Test lldb's expression evaluations and collect statistics."""
2*99451b44SJordan Rupprecht
3*99451b44SJordan Rupprechtfrom __future__ import print_function
4*99451b44SJordan Rupprecht
5*99451b44SJordan Rupprecht
6*99451b44SJordan Rupprechtimport sys
7*99451b44SJordan Rupprechtimport lldb
8*99451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
9*99451b44SJordan Rupprechtfrom lldbsuite.test.lldbbench import *
10*99451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
11*99451b44SJordan Rupprechtfrom lldbsuite.test import configuration
12*99451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
13*99451b44SJordan Rupprecht
14*99451b44SJordan Rupprecht
15*99451b44SJordan Rupprechtclass ExpressionEvaluationCase(BenchBase):
16*99451b44SJordan Rupprecht
17*99451b44SJordan Rupprecht    def setUp(self):
18*99451b44SJordan Rupprecht        BenchBase.setUp(self)
19*99451b44SJordan Rupprecht        self.source = 'main.cpp'
20*99451b44SJordan Rupprecht        self.line_to_break = line_number(
21*99451b44SJordan Rupprecht            self.source, '// Set breakpoint here.')
22*99451b44SJordan Rupprecht        self.count = 25
23*99451b44SJordan Rupprecht
24*99451b44SJordan Rupprecht    @benchmarks_test
25*99451b44SJordan Rupprecht    @expectedFailureAll(
26*99451b44SJordan Rupprecht        oslist=["windows"],
27*99451b44SJordan Rupprecht        bugnumber="llvm.org/pr22274: need a pexpect replacement for windows")
28*99451b44SJordan Rupprecht    def test_expr_cmd(self):
29*99451b44SJordan Rupprecht        """Test lldb's expression commands and collect statistics."""
30*99451b44SJordan Rupprecht        self.build()
31*99451b44SJordan Rupprecht        self.exe_name = 'a.out'
32*99451b44SJordan Rupprecht
33*99451b44SJordan Rupprecht        print()
34*99451b44SJordan Rupprecht        self.run_lldb_repeated_exprs(self.exe_name, self.count)
35*99451b44SJordan Rupprecht        print("lldb expr cmd benchmark:", self.stopwatch)
36*99451b44SJordan Rupprecht
37*99451b44SJordan Rupprecht    def run_lldb_repeated_exprs(self, exe_name, count):
38*99451b44SJordan Rupprecht        import pexpect
39*99451b44SJordan Rupprecht        exe = self.getBuildArtifact(exe_name)
40*99451b44SJordan Rupprecht
41*99451b44SJordan Rupprecht        # Set self.child_prompt, which is "(lldb) ".
42*99451b44SJordan Rupprecht        self.child_prompt = '(lldb) '
43*99451b44SJordan Rupprecht        prompt = self.child_prompt
44*99451b44SJordan Rupprecht
45*99451b44SJordan Rupprecht        # Reset the stopwatch now.
46*99451b44SJordan Rupprecht        self.stopwatch.reset()
47*99451b44SJordan Rupprecht        for i in range(count):
48*99451b44SJordan Rupprecht            # So that the child gets torn down after the test.
49*99451b44SJordan Rupprecht            self.child = pexpect.spawn(
50*99451b44SJordan Rupprecht                '%s %s %s' %
51*99451b44SJordan Rupprecht                (lldbtest_config.lldbExec, self.lldbOption, exe))
52*99451b44SJordan Rupprecht            child = self.child
53*99451b44SJordan Rupprecht
54*99451b44SJordan Rupprecht            # Turn on logging for what the child sends back.
55*99451b44SJordan Rupprecht            if self.TraceOn():
56*99451b44SJordan Rupprecht                child.logfile_read = sys.stdout
57*99451b44SJordan Rupprecht
58*99451b44SJordan Rupprecht            child.expect_exact(prompt)
59*99451b44SJordan Rupprecht            child.sendline(
60*99451b44SJordan Rupprecht                'breakpoint set -f %s -l %d' %
61*99451b44SJordan Rupprecht                (self.source, self.line_to_break))
62*99451b44SJordan Rupprecht            child.expect_exact(prompt)
63*99451b44SJordan Rupprecht            child.sendline('run')
64*99451b44SJordan Rupprecht            child.expect_exact(prompt)
65*99451b44SJordan Rupprecht            expr_cmd1 = 'expr ptr[j]->point.x'
66*99451b44SJordan Rupprecht            expr_cmd2 = 'expr ptr[j]->point.y'
67*99451b44SJordan Rupprecht
68*99451b44SJordan Rupprecht            with self.stopwatch:
69*99451b44SJordan Rupprecht                child.sendline(expr_cmd1)
70*99451b44SJordan Rupprecht                child.expect_exact(prompt)
71*99451b44SJordan Rupprecht                child.sendline(expr_cmd2)
72*99451b44SJordan Rupprecht                child.expect_exact(prompt)
73*99451b44SJordan Rupprecht
74*99451b44SJordan Rupprecht            child.sendline('quit')
75*99451b44SJordan Rupprecht            try:
76*99451b44SJordan Rupprecht                self.child.expect(pexpect.EOF)
77*99451b44SJordan Rupprecht            except:
78*99451b44SJordan Rupprecht                pass
79*99451b44SJordan Rupprecht
80*99451b44SJordan Rupprecht        self.child = None
81