1package remote
2
3import (
4 "context"
5 "errors"
6 "testing"
7
8 "github.com/bnema/vev/internal/adapters/dgram"
9 "github.com/bnema/vev/internal/ports"
10)
11
12func TestDialerFactorySelectsExplicitModes(t *testing.T) {
13 factory := NewDialerFactory()
14
15 tests := []struct {
16 name string
17 mode ports.RemoteTransportMode
18 wantType any
19 }{
20 {name: "udp", mode: ports.RemoteTransportUDP, wantType: dgram.RemoteDialer{}},
21 {name: "stdio", mode: ports.RemoteTransportStdio, wantType: stdioDialer{}},
22 }
23 for _, tt := range tests {
24 t.Run(tt.name, func(t *testing.T) {
25 dialer, err := factory.DialerForRemote("remote.example", "work", tt.mode, nil)
26 if err != nil {
27 t.Fatalf("DialerForRemote() error = %v", err)
28 }
29 switch tt.wantType.(type) {
30 case dgram.RemoteDialer:
31 got, ok := dialer.(dgram.RemoteDialer)
32 if !ok {
33 t.Fatalf("dialer type = %T, want %T", dialer, dgram.RemoteDialer{})
34 }
35 if got.Target != "remote.example" || got.Session != "work" {
36 t.Fatalf("dialer = %+v, want target/session copied", got)
37 }
38 case stdioDialer:
39 got, ok := dialer.(stdioDialer)
40 if !ok {
41 t.Fatalf("dialer type = %T, want %T", dialer, stdioDialer{})
42 }
43 if got.target != "remote.example" || got.session != "work" {
44 t.Fatalf("dialer = %+v, want target/session copied", got)
45 }
46 }
47 })
48 }
49}
50
51func TestDialerFactoryRejectsUnsupportedMode(t *testing.T) {
52 factory := NewDialerFactory()
53
54 dialer, err := factory.DialerForRemote("remote.example", "work", ports.RemoteTransportMode("serial"), nil)
55 if err == nil {
56 t.Fatal("DialerForRemote() error = nil, want unsupported mode error")
57 }
58 if dialer != nil {
59 t.Fatalf("DialerForRemote() dialer = %T, want nil", dialer)
60 }
61 if got, want := err.Error(), "vev: unsupported remote transport \"serial\""; got != want {
62 t.Fatalf("error = %q, want %q", got, want)
63 }
64}
65
66func TestStdioDialerUsesContextBeforeStartingSSH(t *testing.T) {
67 dialer := stdioDialer{target: "remote.example", session: "work"}
68 ctx, cancel := context.WithCancel(context.Background())
69 cancel()
70
71 transport, err := dialer.Dial(ctx)
72 if !errors.Is(err, context.Canceled) {
73 t.Fatalf("Dial() error = %v, want context canceled", err)
74 }
75 if transport != nil {
76 t.Fatalf("Dial() transport = %T, want nil", transport)
77 }
78}