@@ -4,19 +4,26 @@ import (
4
4
"archive/zip"
5
5
"encoding/json"
6
6
"io"
7
+ "os"
7
8
"path/filepath"
8
9
"runtime"
9
10
"testing"
10
11
"time"
11
12
13
+ "tailscale.com/ipn/ipnstate"
14
+
12
15
"github.com/stretchr/testify/require"
13
16
17
+ "github.com/coder/coder/v2/agent"
18
+ "github.com/coder/coder/v2/agent/agenttest"
14
19
"github.com/coder/coder/v2/cli/clitest"
15
20
"github.com/coder/coder/v2/coderd/coderdtest"
16
21
"github.com/coder/coder/v2/coderd/database"
17
22
"github.com/coder/coder/v2/coderd/database/dbfake"
18
23
"github.com/coder/coder/v2/coderd/database/dbtime"
19
24
"github.com/coder/coder/v2/codersdk"
25
+ "github.com/coder/coder/v2/codersdk/agentsdk"
26
+ "github.com/coder/coder/v2/tailnet"
20
27
"github.com/coder/coder/v2/testutil"
21
28
)
22
29
@@ -37,7 +44,14 @@ func TestSupportBundle(t *testing.T) {
37
44
}).WithAgent ().Do ()
38
45
ws , err := client .Workspace (ctx , r .Workspace .ID )
39
46
require .NoError (t , err )
40
- agt := ws .LatestBuild .Resources [0 ].Agents [0 ]
47
+ tempDir := t .TempDir ()
48
+ logPath := filepath .Join (tempDir , "coder-agent.log" )
49
+ require .NoError (t , os .WriteFile (logPath , []byte ("hello from the agent" ), 0o600 ))
50
+ agt := agenttest .New (t , client .URL , r .AgentToken , func (o * agent.Options ) {
51
+ o .LogDir = tempDir
52
+ })
53
+ defer agt .Close ()
54
+ coderdtest .NewWorkspaceAgentWaiter (t , client , r .Workspace .ID ).Wait ()
41
55
42
56
// Insert a provisioner job log
43
57
_ , err = db .InsertProvisionerJobLogs (ctx , database.InsertProvisionerJobLogsParams {
@@ -51,7 +65,7 @@ func TestSupportBundle(t *testing.T) {
51
65
require .NoError (t , err )
52
66
// Insert an agent log
53
67
_ , err = db .InsertWorkspaceAgentLogs (ctx , database.InsertWorkspaceAgentLogsParams {
54
- AgentID : agt .ID ,
68
+ AgentID : ws . LatestBuild . Resources [ 0 ]. Agents [ 0 ] .ID ,
55
69
CreatedAt : dbtime .Now (),
56
70
Output : []string {"started up" },
57
71
Level : []database.LogLevel {database .LogLevelInfo },
@@ -141,22 +155,44 @@ func assertBundleContents(t *testing.T, path string) {
141
155
case "network/tailnet_debug.html" :
142
156
bs := readBytesFromZip (t , f )
143
157
require .NotEmpty (t , bs , "tailnet debug should not be empty" )
144
- case "network/netcheck_local.json" , "network/netcheck_remote .json" :
145
- // TODO: setup fake agent?
146
- bs := readBytesFromZip (t , f )
147
- require .NotEmpty (t , bs , "netcheck should not be empty" )
158
+ case "network/netcheck .json" :
159
+ var v codersdk. WorkspaceAgentConnectionInfo
160
+ decodeJSONFromZip (t , f , & v )
161
+ require .NotEmpty (t , v , "connection info should not be empty" )
148
162
case "workspace/workspace.json" :
149
163
var v codersdk.Workspace
150
164
decodeJSONFromZip (t , f , & v )
151
165
require .NotEmpty (t , v , "workspace should not be empty" )
152
166
case "workspace/build_logs.txt" :
153
167
bs := readBytesFromZip (t , f )
154
168
require .Contains (t , string (bs ), "provision done" )
155
- case "workspace /agent.json" :
169
+ case "agent /agent.json" :
156
170
var v codersdk.WorkspaceAgent
157
171
decodeJSONFromZip (t , f , & v )
158
172
require .NotEmpty (t , v , "agent should not be empty" )
159
- case "workspace/agent_startup_logs.txt" :
173
+ case "agent/listening_ports.json" :
174
+ var v codersdk.WorkspaceAgentListeningPortsResponse
175
+ decodeJSONFromZip (t , f , & v )
176
+ require .NotEmpty (t , v , "agent listening ports should not be empty" )
177
+ case "agent/logs.txt" :
178
+ bs := readBytesFromZip (t , f )
179
+ require .NotEmpty (t , bs , "logs should not be empty" )
180
+ case "agent/magicsock.html" :
181
+ bs := readBytesFromZip (t , f )
182
+ require .NotEmpty (t , bs , "agent magicsock should not be empty" )
183
+ case "agent/manifest.json" :
184
+ var v agentsdk.Manifest
185
+ decodeJSONFromZip (t , f , & v )
186
+ require .NotEmpty (t , v , "agent manifest should not be empty" )
187
+ case "agent/peer_diagnostics.json" :
188
+ var v * tailnet.PeerDiagnostics
189
+ decodeJSONFromZip (t , f , & v )
190
+ require .NotEmpty (t , v , "peer diagnostics should not be empty" )
191
+ case "agent/ping_result.json" :
192
+ var v * ipnstate.PingResult
193
+ decodeJSONFromZip (t , f , & v )
194
+ require .NotEmpty (t , v , "ping result should not be empty" )
195
+ case "agent/startup_logs.txt" :
160
196
bs := readBytesFromZip (t , f )
161
197
require .Contains (t , string (bs ), "started up" )
162
198
case "workspace/template.json" :
@@ -178,7 +214,7 @@ func assertBundleContents(t *testing.T, path string) {
178
214
bs := readBytesFromZip (t , f )
179
215
require .NotEmpty (t , bs , "logs should not be empty" )
180
216
default :
181
- require .Failf (t , "unexpected file in bundle: %q " , f .Name )
217
+ require .Failf (t , "unexpected file in bundle" , f .Name )
182
218
}
183
219
}
184
220
}
0 commit comments