~james/core

core/spindle/engines/microvm/agent_test.go -rw-r--r-- 1.6 KiB
452f17b7 — james chore(import): snapshot james.dad.town/core at f70c71c7696a 17 hours ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//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)
			}
		})
	}
}