Files
buildx/util/daptest/conn.go
T
Jonathan A. Sternberg fdfba3014d tests: add integration tests for dap build
This adds integration tests for the `dap build` command to test various
behavior associated with the command. We start the build and the
integration test acts as a dap client to send requests and check that
the output is what we expect.

Signed-off-by: Jonathan A. Sternberg <jonathan.sternberg@docker.com>
2025-12-17 10:56:30 -06:00

92 lines
1.6 KiB
Go

package daptest
import (
"bytes"
"context"
"encoding/json"
"errors"
"io"
"testing"
"github.com/docker/buildx/dap/common"
"github.com/google/go-dap"
)
func LogConn(t *testing.T, prefix string, conn common.Conn) common.Conn {
return &loggingConn{
Conn: conn,
t: t,
prefix: prefix,
}
}
type loggingConn struct {
common.Conn
t *testing.T
prefix string
outBuf []byte
}
func (c *loggingConn) SendMsg(m dap.Message) error {
c.t.Helper()
b, _ := json.Marshal(m)
c.t.Logf("[%s] send: %v", c.prefix, string(b))
err := c.Conn.SendMsg(m)
if err != nil {
c.t.Logf("[%s] send error: %v", c.prefix, err)
}
return err
}
func (c *loggingConn) RecvMsg(ctx context.Context) (dap.Message, error) {
c.t.Helper()
m, err := c.Conn.RecvMsg(ctx)
if err != nil {
if !errors.Is(err, context.Canceled) && !errors.Is(err, io.EOF) {
c.t.Logf("[%s] recv error: %v", c.prefix, err)
}
return nil, err
}
if e, ok := m.(dap.EventMessage); ok {
if drop := c.handleEvent(e); drop {
return m, nil
}
}
b, _ := json.Marshal(m)
c.t.Logf("[%s] recv: %v", c.prefix, string(b))
return m, nil
}
func (c *loggingConn) handleEvent(e dap.EventMessage) bool {
switch e.GetEvent().Event {
case "output":
m := e.(*dap.OutputEvent)
c.outBuf = append(c.outBuf, []byte(m.Body.Output)...)
for len(c.outBuf) > 0 {
i := bytes.IndexRune(c.outBuf, '\n')
if i < 0 {
break
}
c.t.Log(string(c.outBuf[:i]))
c.outBuf = c.outBuf[i+1:]
}
return true
case "terminated":
if len(c.outBuf) > 0 {
c.t.Log(string(c.outBuf))
c.outBuf = nil
}
return false
default:
return false
}
}