//go:build linux
package microvm
import (
"context"
"io"
"log/slog"
"net"
"strings"
"testing"
"time"
"tangled.org/core/spindle/agentproto"
agentv1 "tangled.org/core/spindle/agentproto/gen"
)
func TestAgentSessionInitProtocolVersion(t *testing.T) {
for _, test := range []struct {
name string
version uint32
wantErr bool
}{
{"current", agentproto.ProtocolVersion, false},
{"stale", agentproto.ProtocolVersion + 1, true},
} {
t.Run(test.name, func(t *testing.T) {
host, guest := net.Pipe()
defer host.Close()
defer guest.Close()
session := NewAgentSession(host, 0, slog.New(slog.NewTextHandler(io.Discard, nil)))
guestErr := make(chan error, 1)
go func() {
encoder := agentproto.NewEncoder(guest)
if err := encoder.Encode(&agentproto.Message{Id: "hello", Hello: &agentv1.Hello{ProtocolVersion: test.version}}); err != nil {
guestErr <- err
return
}
if test.wantErr {
guestErr <- nil
return
}
message, err := agentproto.NewDecoder(guest).Decode()
if err == nil && message.Init == nil {
err = io.ErrUnexpectedEOF
}
guestErr <- err
}()
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
err := session.Init(ctx, &agentv1.Init{JobId: "job"})
if test.wantErr {
if err == nil || !strings.Contains(err.Error(), "protocol version mismatch") {
t.Fatalf("Init error = %v", err)
}
} else if err != nil {
t.Fatalf("Init failed: %v", err)
}
if err := <-guestErr; err != nil {
t.Fatalf("guest side failed: %v", err)
}
})
}
}