Skip to content

Commit 5b906c1

Browse files
committed
Add more agent tests
1 parent 31ba0c6 commit 5b906c1

File tree

2 files changed

+54
-17
lines changed

2 files changed

+54
-17
lines changed

agent/agent.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,8 +231,10 @@ func (a *agent) runTailnet(ctx context.Context, derpMap *tailcfg.DERPMap) {
231231
for {
232232
conn, err := reconnectingPTYListener.Accept()
233233
if err != nil {
234+
a.logger.Debug(ctx, "accept pty failed", slog.Error(err))
234235
return
235236
}
237+
conn = a.stats.wrapConn(conn)
236238
// This cannot use a JSON decoder, since that can
237239
// buffer additional data that is required for the PTY.
238240
rawLen := make([]byte, 2)
@@ -251,7 +253,7 @@ func (a *agent) runTailnet(ctx context.Context, derpMap *tailcfg.DERPMap) {
251253
if err != nil {
252254
continue
253255
}
254-
go a.handleReconnectingPTY(ctx, msg, a.stats.wrapConn(conn))
256+
go a.handleReconnectingPTY(ctx, msg, conn)
255257
}
256258
}()
257259
}

agent/agent_test.go

Lines changed: 51 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -57,24 +57,59 @@ func TestAgent(t *testing.T) {
5757
t.Run(fmt.Sprintf("tailscale=%v", tailscale), func(t *testing.T) {
5858
t.Parallel()
5959

60-
var derpMap *tailcfg.DERPMap
61-
if tailscale {
62-
derpMap = tailnettest.RunDERPAndSTUN(t)
60+
setupAgent := func(t *testing.T) (agent.Conn, <-chan *agent.Stats) {
61+
var derpMap *tailcfg.DERPMap
62+
if tailscale {
63+
derpMap = tailnettest.RunDERPAndSTUN(t)
64+
}
65+
conn, stats := setupAgent(t, agent.Metadata{
66+
DERPMap: derpMap,
67+
}, 0)
68+
assert.Empty(t, <-stats)
69+
return conn, stats
6370
}
64-
conn, stats := setupAgent(t, agent.Metadata{
65-
DERPMap: derpMap,
66-
}, 0)
67-
assert.Empty(t, <-stats)
68-
69-
sshClient, err := conn.SSHClient()
70-
require.NoError(t, err)
71-
session, err := sshClient.NewSession()
72-
require.NoError(t, err)
73-
defer session.Close()
7471

75-
assert.EqualValues(t, 1, (<-stats).NumConns)
76-
assert.Greater(t, (<-stats).RxBytes, int64(0))
77-
assert.Greater(t, (<-stats).TxBytes, int64(0))
72+
t.Run("SSH", func(t *testing.T) {
73+
t.Parallel()
74+
conn, stats := setupAgent(t)
75+
76+
sshClient, err := conn.SSHClient()
77+
require.NoError(t, err)
78+
session, err := sshClient.NewSession()
79+
require.NoError(t, err)
80+
defer session.Close()
81+
82+
assert.EqualValues(t, 1, (<-stats).NumConns)
83+
assert.Greater(t, (<-stats).RxBytes, int64(0))
84+
assert.Greater(t, (<-stats).TxBytes, int64(0))
85+
})
86+
87+
t.Run("ReconnectingPTY", func(t *testing.T) {
88+
t.Parallel()
89+
90+
conn, stats := setupAgent(t)
91+
92+
ptyConn, err := conn.ReconnectingPTY(uuid.NewString(), 128, 128, "/bin/bash")
93+
require.NoError(t, err)
94+
defer ptyConn.Close()
95+
96+
data, err := json.Marshal(agent.ReconnectingPTYRequest{
97+
Data: "echo test\r\n",
98+
})
99+
require.NoError(t, err)
100+
_, err = ptyConn.Write(data)
101+
require.NoError(t, err)
102+
103+
require.Eventually(t, func() bool {
104+
s, ok := (<-stats)
105+
return ok && s.NumConns > 0
106+
}, testutil.WaitShort, testutil.IntervalFast,
107+
"never saw conn",
108+
)
109+
assert.EqualValues(t, 1, (<-stats).NumConns)
110+
assert.Greater(t, (<-stats).RxBytes, int64(0))
111+
assert.Greater(t, (<-stats).TxBytes, int64(0))
112+
})
78113
})
79114
}
80115
})

0 commit comments

Comments
 (0)