199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtTest that an alias can reference other aliases without crashing. 399451b44SJordan Rupprecht""" 499451b44SJordan Rupprecht 599451b44SJordan Rupprecht 699451b44SJordan Rupprecht 799451b44SJordan Rupprechtimport lldb 899451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 999451b44SJordan Rupprechtimport lldbsuite.test.lldbutil as lldbutil 1099451b44SJordan Rupprecht 1199451b44SJordan Rupprecht 1299451b44SJordan Rupprechtclass NestedAliasTestCase(TestBase): 1399451b44SJordan Rupprecht NO_DEBUG_INFO_TESTCASE = True 1499451b44SJordan Rupprecht 1599451b44SJordan Rupprecht def setUp(self): 1699451b44SJordan Rupprecht # Call super's setUp(). 1799451b44SJordan Rupprecht TestBase.setUp(self) 1899451b44SJordan Rupprecht # Find the line number to break inside main(). 1999451b44SJordan Rupprecht self.line = line_number('main.cpp', '// break here') 2099451b44SJordan Rupprecht 2199451b44SJordan Rupprecht def test_nested_alias(self): 2299451b44SJordan Rupprecht """Test that an alias can reference other aliases without crashing.""" 2399451b44SJordan Rupprecht self.build() 2499451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 2599451b44SJordan Rupprecht self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) 2699451b44SJordan Rupprecht 2799451b44SJordan Rupprecht # Break in main() after the variables are assigned values. 2899451b44SJordan Rupprecht lldbutil.run_break_set_by_file_and_line( 2999451b44SJordan Rupprecht self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True) 3099451b44SJordan Rupprecht 3199451b44SJordan Rupprecht self.runCmd("run", RUN_SUCCEEDED) 3299451b44SJordan Rupprecht 3399451b44SJordan Rupprecht # The stop reason of the thread should be breakpoint. 3499451b44SJordan Rupprecht self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, 3599451b44SJordan Rupprecht substrs=['stopped', 'stop reason = breakpoint']) 3699451b44SJordan Rupprecht 3799451b44SJordan Rupprecht # The breakpoint should have a hit count of 1. 389f0b5f9aSSYNOPSYS\georgiev lldbutil.check_breakpoint(self, bpno = 1, expected_hit_count = 1) 3999451b44SJordan Rupprecht 4099451b44SJordan Rupprecht # This is the function to remove the custom aliases in order to have a 4199451b44SJordan Rupprecht # clean slate for the next test case. 4299451b44SJordan Rupprecht def cleanup(): 4399451b44SJordan Rupprecht self.runCmd('command unalias read', check=False) 4499451b44SJordan Rupprecht self.runCmd('command unalias rd', check=False) 4599451b44SJordan Rupprecht self.runCmd('command unalias fo', check=False) 4699451b44SJordan Rupprecht self.runCmd('command unalias foself', check=False) 47*b9515041SDave Lee self.runCmd('command unalias add_two', check=False) 48*b9515041SDave Lee self.runCmd('command unalias two', check=False) 4999451b44SJordan Rupprecht 5099451b44SJordan Rupprecht # Execute the cleanup function during test case tear down. 5199451b44SJordan Rupprecht self.addTearDownHook(cleanup) 5299451b44SJordan Rupprecht 5399451b44SJordan Rupprecht self.runCmd('command alias read memory read -f A') 5499451b44SJordan Rupprecht self.runCmd('command alias rd read -c 3') 5599451b44SJordan Rupprecht 5699451b44SJordan Rupprecht self.expect( 5799451b44SJordan Rupprecht 'memory read -f A -c 3 `&my_ptr[0]`', 5899451b44SJordan Rupprecht substrs=[ 5999451b44SJordan Rupprecht 'deadbeef', 6099451b44SJordan Rupprecht 'main.cpp:', 6199451b44SJordan Rupprecht 'feedbeef']) 6299451b44SJordan Rupprecht self.expect( 6399451b44SJordan Rupprecht 'rd `&my_ptr[0]`', 6499451b44SJordan Rupprecht substrs=[ 6599451b44SJordan Rupprecht 'deadbeef', 6699451b44SJordan Rupprecht 'main.cpp:', 6799451b44SJordan Rupprecht 'feedbeef']) 6899451b44SJordan Rupprecht 6999451b44SJordan Rupprecht self.expect( 7099451b44SJordan Rupprecht 'memory read -f A -c 3 `&my_ptr[0]`', 7199451b44SJordan Rupprecht substrs=['deadfeed'], 7299451b44SJordan Rupprecht matching=False) 7399451b44SJordan Rupprecht self.expect('rd `&my_ptr[0]`', substrs=['deadfeed'], matching=False) 7499451b44SJordan Rupprecht 7599451b44SJordan Rupprecht self.runCmd('command alias fo frame variable -O --') 7699451b44SJordan Rupprecht self.runCmd('command alias foself fo self') 7799451b44SJordan Rupprecht 7899451b44SJordan Rupprecht self.expect( 7999451b44SJordan Rupprecht 'help foself', 8099451b44SJordan Rupprecht substrs=[ 8199451b44SJordan Rupprecht '--show-all-children', 8299451b44SJordan Rupprecht '--raw-output'], 8399451b44SJordan Rupprecht matching=False) 8499451b44SJordan Rupprecht self.expect( 8599451b44SJordan Rupprecht 'help foself', 8699451b44SJordan Rupprecht substrs=[ 8799451b44SJordan Rupprecht 'Show variables for the current', 8899451b44SJordan Rupprecht 'stack frame.'], 8999451b44SJordan Rupprecht matching=True) 9099451b44SJordan Rupprecht 9199451b44SJordan Rupprecht # Check that foself was resolved and is now independent of 'fo'. 9299451b44SJordan Rupprecht self.runCmd('command unalias fo') 9399451b44SJordan Rupprecht self.expect( 9499451b44SJordan Rupprecht 'help foself', 9599451b44SJordan Rupprecht substrs=[ 9699451b44SJordan Rupprecht 'Show variables for the current', 9799451b44SJordan Rupprecht 'stack frame.'], 9899451b44SJordan Rupprecht matching=True) 99*b9515041SDave Lee 100*b9515041SDave Lee # Check that aliases can be created for raw input commands. 101*b9515041SDave Lee self.expect('command alias two expr -- 2') 102*b9515041SDave Lee self.expect('command alias add_two two +') 103*b9515041SDave Lee self.expect('add_two 3', patterns=[' = 5$']) 104