""" Test lldb-vscode RestartRequest. """ import os from lldbsuite.test.decorators import * from lldbsuite.test.lldbtest import line_number import lldbvscode_testcase class TestVSCode_restart_runInTerminal(lldbvscode_testcase.VSCodeTestCaseBase): def isTestSupported(self): try: # We skip this test for debug builds because it takes too long # parsing lldb's own debug info. Release builds are fine. # Checking the size of the lldb-vscode binary seems to be a decent # proxy for a quick detection. It should be far less than 1 MB in # Release builds. return os.path.getsize(os.environ["LLDBVSCODE_EXEC"]) < 1000000 except: return False @skipIfWindows @skipIfRemote @skipIf(archs=["arm"]) # Always times out on buildbot def test_basic_functionality(self): """ Test basic restarting functionality when the process is running in a terminal. """ if not self.isTestSupported(): return line_A = line_number("main.c", "// breakpoint A") line_B = line_number("main.c", "// breakpoint B") program = self.getBuildArtifact("a.out") self.build_and_launch(program, runInTerminal=True) [bp_A, bp_B] = self.set_source_breakpoints("main.c", [line_A, line_B]) # Verify we hit A, then B. self.vscode.request_configurationDone() self.verify_breakpoint_hit([bp_A]) self.vscode.request_continue() self.verify_breakpoint_hit([bp_B]) # Make sure i has been modified from its initial value of 0. self.assertEquals( int(self.vscode.get_local_variable_value("i")), 1234, "i != 1234 after hitting breakpoint B", ) # Restart. self.vscode.request_restart() # Finally, check we stop back at A and program state has been reset. self.verify_breakpoint_hit([bp_A]) self.assertEquals( int(self.vscode.get_local_variable_value("i")), 0, "i != 0 after hitting breakpoint A on restart", ) @skipIfWindows @skipIfRemote @skipIf(archs=["arm"]) # Always times out on buildbot def test_stopOnEntry(self): """ Check that stopOnEntry works correctly when using runInTerminal. """ if not self.isTestSupported(): return line_A = line_number("main.c", "// breakpoint A") line_B = line_number("main.c", "// breakpoint B") program = self.getBuildArtifact("a.out") self.build_and_launch(program, runInTerminal=True, stopOnEntry=True) [bp_main] = self.set_function_breakpoints(["main"]) self.vscode.request_configurationDone() # When using stopOnEntry, configurationDone doesn't result in a running # process, we should immediately get a stopped event instead. stopped_events = self.vscode.wait_for_stopped() # We should be stopped at the entry point. for stopped_event in stopped_events: if "body" in stopped_event: body = stopped_event["body"] if "reason" in body: reason = body["reason"] self.assertNotEqual( reason, "breakpoint", "verify stop isn't a breakpoint" ) # Then, if we continue, we should hit the breakpoint at main. self.vscode.request_continue() self.verify_breakpoint_hit([bp_main]) # Restart and check that we still get a stopped event before reaching # main. self.vscode.request_restart() stopped_events = self.vscode.wait_for_stopped() for stopped_event in stopped_events: if "body" in stopped_event: body = stopped_event["body"] if "reason" in body: reason = body["reason"] self.assertNotEqual( reason, "breakpoint", 'verify stop after restart isn\'t "main" breakpoint', )