diff --git a/commands/daemon/daemon.go b/commands/daemon/daemon.go index a82656bbe70..82809c6c3d9 100644 --- a/commands/daemon/daemon.go +++ b/commands/daemon/daemon.go @@ -278,7 +278,10 @@ func (s *ArduinoCoreServerImpl) Compile(req *rpc.CompileRequest, stream rpc.Ardu errStream.Close() <-outCtx.Done() <-errCtx.Done() - compileRespSendErr := stream.Send(compileResp) + var compileRespSendErr error + if compileResp != nil { + compileRespSendErr = stream.Send(compileResp) + } if compileErr != nil { return convertErrorToRPCStatus(compileErr) } diff --git a/internal/integrationtest/daemon/daemon_compile_test.go b/internal/integrationtest/daemon/daemon_compile_test.go index 2995c15afc8..a26f4d14e1d 100644 --- a/internal/integrationtest/daemon/daemon_compile_test.go +++ b/internal/integrationtest/daemon/daemon_compile_test.go @@ -93,3 +93,35 @@ func TestDaemonCompileOptions(t *testing.T) { } } } + +func TestDaemonCompileAfterFailedLibInstall(t *testing.T) { + // See: https://github.com/arduino/arduino-cli/issues/1812 + + env, cli := createEnvForDaemon(t) + defer env.CleanUp() + + grpcInst := cli.Create() + require.NoError(t, grpcInst.Init("", "", func(ir *commands.InitResponse) { + fmt.Printf("INIT> %v\n", ir.GetMessage()) + })) + + // Build sketch (with errors) + sk := paths.New("testdata", "bare_minimum") + compile, err := grpcInst.Compile(context.Background(), "", sk.String()) + require.NoError(t, err) + for { + msg, err := compile.Recv() + if err == io.EOF { + require.FailNow(t, "Expected compilation failure", "compilation succeeded") + break + } + if err != nil { + fmt.Println("COMPILE ERROR>", err) + require.Contains(t, err.Error(), "Missing FQBN") + break + } + if msg.ErrStream != nil { + fmt.Printf("COMPILE> %v\n", string(msg.GetErrStream())) + } + } +}