199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtTest lldb data formatter subsystem. 399451b44SJordan Rupprecht""" 499451b44SJordan Rupprecht 599451b44SJordan Rupprechtfrom __future__ import print_function 699451b44SJordan Rupprecht 799451b44SJordan Rupprecht 899451b44SJordan Rupprechtimport lldb 9*f9ad1127SRaphael Isemannfrom lldbsuite.test.decorators import * 1099451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 1199451b44SJordan Rupprechtimport lldbsuite.test.lldbutil as lldbutil 1299451b44SJordan Rupprecht 1399451b44SJordan Rupprecht 1499451b44SJordan Rupprechtclass ValueObjectRecursionTestCase(TestBase): 1599451b44SJordan Rupprecht 1699451b44SJordan Rupprecht def setUp(self): 1799451b44SJordan Rupprecht # Call super's setUp(). 1899451b44SJordan Rupprecht TestBase.setUp(self) 1999451b44SJordan Rupprecht # Find the line number to break at. 2099451b44SJordan Rupprecht self.line = line_number('main.cpp', '// Set break point at this line.') 2199451b44SJordan Rupprecht 22*f9ad1127SRaphael Isemann @no_debug_info_test 2399451b44SJordan Rupprecht def test_with_run_command(self): 2499451b44SJordan Rupprecht """Test that deeply nested ValueObjects still work.""" 2599451b44SJordan Rupprecht self.build() 2699451b44SJordan Rupprecht self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET) 2799451b44SJordan Rupprecht 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', 3699451b44SJordan Rupprecht 'stop reason = breakpoint']) 3799451b44SJordan Rupprecht 3899451b44SJordan Rupprecht # This is the function to remove the custom formats in order to have a 3999451b44SJordan Rupprecht # clean slate for the next test case. 4099451b44SJordan Rupprecht def cleanup(): 4199451b44SJordan Rupprecht self.runCmd('type format clear', check=False) 4299451b44SJordan Rupprecht self.runCmd('type summary clear', check=False) 4399451b44SJordan Rupprecht 4499451b44SJordan Rupprecht # Execute the cleanup function during test case tear down. 4599451b44SJordan Rupprecht self.addTearDownHook(cleanup) 4699451b44SJordan Rupprecht 4799451b44SJordan Rupprecht root = self.frame().FindVariable("root") 4899451b44SJordan Rupprecht child = root.GetChildAtIndex(1) 4999451b44SJordan Rupprecht if self.TraceOn(): 5099451b44SJordan Rupprecht print(root) 5199451b44SJordan Rupprecht print(child) 5299451b44SJordan Rupprecht for i in range(0, 15000): 5399451b44SJordan Rupprecht child = child.GetChildAtIndex(1) 5499451b44SJordan Rupprecht if self.TraceOn(): 5599451b44SJordan Rupprecht print(child) 5699451b44SJordan Rupprecht self.assertTrue( 5799451b44SJordan Rupprecht child.IsValid(), 5899451b44SJordan Rupprecht "could not retrieve the deep ValueObject") 5999451b44SJordan Rupprecht self.assertTrue( 6099451b44SJordan Rupprecht child.GetChildAtIndex(0).IsValid(), 6199451b44SJordan Rupprecht "the deep ValueObject has no value") 6299451b44SJordan Rupprecht self.assertTrue( 6399451b44SJordan Rupprecht child.GetChildAtIndex(0).GetValueAsUnsigned() != 0, 6499451b44SJordan Rupprecht "the deep ValueObject has a zero value") 6599451b44SJordan Rupprecht self.assertTrue( 6699451b44SJordan Rupprecht child.GetChildAtIndex(1).GetValueAsUnsigned() != 0, 6799451b44SJordan Rupprecht "the deep ValueObject has no next") 68