1*99451b44SJordan Rupprecht"""Test lldb's response time for 'frame variable' command."""
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 import configuration
9*99451b44SJordan Rupprechtfrom lldbsuite.test import lldbtest_config
10*99451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
11*99451b44SJordan Rupprechtfrom lldbsuite.test.lldbbench import *
12*99451b44SJordan Rupprecht
13*99451b44SJordan Rupprecht
14*99451b44SJordan Rupprechtclass FrameVariableResponseBench(BenchBase):
15*99451b44SJordan Rupprecht
16*99451b44SJordan Rupprecht    def setUp(self):
17*99451b44SJordan Rupprecht        BenchBase.setUp(self)
18*99451b44SJordan Rupprecht        self.exe = lldbtest_config.lldbExec
19*99451b44SJordan Rupprecht        self.break_spec = '-n main'
20*99451b44SJordan Rupprecht        self.count = 20
21*99451b44SJordan Rupprecht
22*99451b44SJordan Rupprecht    @benchmarks_test
23*99451b44SJordan Rupprecht    @no_debug_info_test
24*99451b44SJordan Rupprecht    @expectedFailureAll(
25*99451b44SJordan Rupprecht        oslist=["windows"],
26*99451b44SJordan Rupprecht        bugnumber="llvm.org/pr22274: need a pexpect replacement for windows")
27*99451b44SJordan Rupprecht    def test_startup_delay(self):
28*99451b44SJordan Rupprecht        """Test response time for the 'frame variable' command."""
29*99451b44SJordan Rupprecht        print()
30*99451b44SJordan Rupprecht        self.run_frame_variable_bench(self.exe, self.break_spec, self.count)
31*99451b44SJordan Rupprecht        print("lldb frame variable benchmark:", self.stopwatch)
32*99451b44SJordan Rupprecht
33*99451b44SJordan Rupprecht    def run_frame_variable_bench(self, exe, break_spec, count):
34*99451b44SJordan Rupprecht        import pexpect
35*99451b44SJordan Rupprecht        # Set self.child_prompt, which is "(lldb) ".
36*99451b44SJordan Rupprecht        self.child_prompt = '(lldb) '
37*99451b44SJordan Rupprecht        prompt = self.child_prompt
38*99451b44SJordan Rupprecht
39*99451b44SJordan Rupprecht        # Reset the stopwatchs now.
40*99451b44SJordan Rupprecht        self.stopwatch.reset()
41*99451b44SJordan Rupprecht        for i in range(count):
42*99451b44SJordan Rupprecht            # So that the child gets torn down after the test.
43*99451b44SJordan Rupprecht            self.child = pexpect.spawn(
44*99451b44SJordan Rupprecht                '%s %s %s' %
45*99451b44SJordan Rupprecht                (lldbtest_config.lldbExec, self.lldbOption, exe))
46*99451b44SJordan Rupprecht            child = self.child
47*99451b44SJordan Rupprecht
48*99451b44SJordan Rupprecht            # Turn on logging for what the child sends back.
49*99451b44SJordan Rupprecht            if self.TraceOn():
50*99451b44SJordan Rupprecht                child.logfile_read = sys.stdout
51*99451b44SJordan Rupprecht
52*99451b44SJordan Rupprecht            # Set our breakpoint.
53*99451b44SJordan Rupprecht            child.sendline('breakpoint set %s' % break_spec)
54*99451b44SJordan Rupprecht            child.expect_exact(prompt)
55*99451b44SJordan Rupprecht
56*99451b44SJordan Rupprecht            # Run the target and expect it to be stopped due to breakpoint.
57*99451b44SJordan Rupprecht            child.sendline('run')  # Aka 'process launch'.
58*99451b44SJordan Rupprecht            child.expect_exact(prompt)
59*99451b44SJordan Rupprecht
60*99451b44SJordan Rupprecht            with self.stopwatch:
61*99451b44SJordan Rupprecht                # Measure the 'frame variable' response time.
62*99451b44SJordan Rupprecht                child.sendline('frame variable')
63*99451b44SJordan Rupprecht                child.expect_exact(prompt)
64*99451b44SJordan Rupprecht
65*99451b44SJordan Rupprecht            child.sendline('quit')
66*99451b44SJordan Rupprecht            try:
67*99451b44SJordan Rupprecht                self.child.expect(pexpect.EOF)
68*99451b44SJordan Rupprecht            except:
69*99451b44SJordan Rupprecht                pass
70*99451b44SJordan Rupprecht
71*99451b44SJordan Rupprecht        # The test is about to end and if we come to here, the child process has
72*99451b44SJordan Rupprecht        # been terminated.  Mark it so.
73*99451b44SJordan Rupprecht        self.child = None
74