""" Test lldb-vscode RestartRequest. """ from lldbsuite.test.decorators import * from lldbsuite.test.lldbtest import line_number import lldbvscode_testcase class TestVSCode_restart(lldbvscode_testcase.VSCodeTestCaseBase): @skipIfWindows @skipIfRemote def test_basic_functionality(self): ''' Tests the basic restarting functionality: set two breakpoints in sequence, restart at the second, check that we hit the first one. ''' 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) [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 then check we stop back at A and program state has been reset. self.vscode.request_restart() 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 def test_stopOnEntry(self): ''' Check that the stopOnEntry setting is still honored after a restart. ''' program = self.getBuildArtifact("a.out") self.build_and_launch(program, stopOnEntry=True) [bp_main] = self.set_function_breakpoints(['main']) self.vscode.request_configurationDone() # Once the "configuration done" event is sent, we should get a stopped # event immediately because of stopOnEntry. 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 isn\'t "main" 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') @skipIfWindows @skipIfRemote def test_arguments(self): ''' Tests that lldb-vscode will use updated launch arguments included with a restart request. ''' line_A = line_number('main.c', '// breakpoint A') program = self.getBuildArtifact("a.out") self.build_and_launch(program) [bp_A] = self.set_source_breakpoints('main.c', [line_A]) # Verify we hit A, then B. self.vscode.request_configurationDone() self.verify_breakpoint_hit([bp_A]) # We don't set any arguments in the initial launch request, so argc # should be 1. self.assertEquals(int(self.vscode.get_local_variable_value('argc')), 1, 'argc != 1 before restart') # Restart with some extra 'args' and check that the new argc reflects # the updated launch config. self.vscode.request_restart(restartArguments={ 'arguments': { 'program': program, 'args': ['a', 'b', 'c', 'd'], } }) self.verify_breakpoint_hit([bp_A]) self.assertEquals(int(self.vscode.get_local_variable_value('argc')), 5, 'argc != 5 after restart')