diff --git a/service/dap/server.go b/service/dap/server.go index cfb67abc33bc6a755c6d0de99aad720ce9c94ee6..1f0eade0c2c718608b296314b64f29f207232838 100644 --- a/service/dap/server.go +++ b/service/dap/server.go @@ -432,8 +432,19 @@ func (s *Server) onInitializeRequest(request *dap.InitializeRequest) { const debugBinary string = "./__debug_bin" func (s *Server) onLaunchRequest(request *dap.LaunchRequest) { - // TODO(polina): Respond with an error if debug session is in progress? + // Validate launch request mode + mode, ok := request.Arguments["mode"] + if !ok || mode == "" { + mode = "debug" + } + if !isValidLaunchMode(mode) { + s.sendErrorResponse(request.Request, + FailedToLaunch, "Failed to launch", + fmt.Sprintf("Unsupported 'mode' value %q in debug configuration.", mode)) + return + } + // TODO(polina): Respond with an error if debug session is in progress? program, ok := request.Arguments["program"].(string) if !ok || program == "" { s.sendErrorResponse(request.Request, @@ -442,11 +453,6 @@ func (s *Server) onLaunchRequest(request *dap.LaunchRequest) { return } - mode, ok := request.Arguments["mode"] - if !ok || mode == "" { - mode = "debug" - } - if mode == "debug" || mode == "test" { output, ok := request.Arguments["output"].(string) if !ok || output == "" { @@ -486,14 +492,6 @@ func (s *Server) onLaunchRequest(request *dap.LaunchRequest) { s.binaryToRemove = debugname } - // TODO(polina): support "remote" mode - if mode != "exec" && mode != "debug" && mode != "test" { - s.sendErrorResponse(request.Request, - FailedToLaunch, "Failed to launch", - fmt.Sprintf("Unsupported 'mode' value %q in debug configuration.", mode)) - return - } - s.setLaunchAttachArgs(request) var targetArgs []string @@ -535,6 +533,16 @@ func (s *Server) onLaunchRequest(request *dap.LaunchRequest) { s.send(&dap.LaunchResponse{Response: *newResponse(request.Request)}) } +// TODO(polina): support "remote" mode +func isValidLaunchMode(launchMode interface{}) bool { + switch launchMode { + case "exec", "debug", "test": + return true + } + + return false +} + // onDisconnectRequest handles the DisconnectRequest. Per the DAP spec, // it disconnects the debuggee and signals that the debug adaptor // (in our case this TCP server) can be terminated. diff --git a/service/dap/server_test.go b/service/dap/server_test.go index 96d6e769352b0fa22b95825ef8950391dd9cac80..02310022dadbc3bafc87d7361b03ba5fd30bff01 100644 --- a/service/dap/server_test.go +++ b/service/dap/server_test.go @@ -2559,6 +2559,10 @@ func TestBadLaunchRequests(t *testing.T) { client.LaunchRequestWithArgs(map[string]interface{}{"mode": "debug", "program": fixture.Source, "buildFlags": "123"}) expectFailedToLaunch(client.ExpectErrorResponse(t)) // Build error + client.LaunchRequest("", fixture.Path, stopOnEntry) + expectFailedToLaunchWithMessage(client.ExpectErrorResponse(t), + "Failed to launch: Build error: exit status 1") + // We failed to launch the program. Make sure shutdown still works. client.DisconnectRequest() dresp := client.ExpectDisconnectResponse(t)