@@ -88,7 +88,7 @@ func TestTailnet(t *testing.T) {
88
88
}
89
89
})
90
90
node := testutil .RequireRecvCtx (ctx , t , nodes )
91
- // Ensure this connected over DERP!
91
+ // Ensure this connected over raw (not websocket) DERP!
92
92
require .Len (t , node .DERPForcedWebsocket , 0 )
93
93
94
94
w1 .Close ()
@@ -157,6 +157,94 @@ func TestTailnet(t *testing.T) {
157
157
w1 .Close ()
158
158
w2 .Close ()
159
159
})
160
+
161
+ t .Run ("PingDirect" , func (t * testing.T ) {
162
+ t .Parallel ()
163
+ logger := slogtest .Make (t , nil ).Leveled (slog .LevelDebug )
164
+ ctx := testutil .Context (t , testutil .WaitLong )
165
+ w1IP := tailnet .IP ()
166
+ w1 , err := tailnet .NewConn (& tailnet.Options {
167
+ Addresses : []netip.Prefix {netip .PrefixFrom (w1IP , 128 )},
168
+ Logger : logger .Named ("w1" ),
169
+ DERPMap : derpMap ,
170
+ })
171
+ require .NoError (t , err )
172
+
173
+ w2 , err := tailnet .NewConn (& tailnet.Options {
174
+ Addresses : []netip.Prefix {netip .PrefixFrom (tailnet .IP (), 128 )},
175
+ Logger : logger .Named ("w2" ),
176
+ DERPMap : derpMap ,
177
+ })
178
+ require .NoError (t , err )
179
+ t .Cleanup (func () {
180
+ _ = w1 .Close ()
181
+ _ = w2 .Close ()
182
+ })
183
+ stitch (t , w2 , w1 )
184
+ stitch (t , w1 , w2 )
185
+ require .True (t , w2 .AwaitReachable (context .Background (), w1IP ))
186
+
187
+ require .Eventually (t , func () bool {
188
+ _ , direct , pong , err := w2 .Ping (ctx , w1IP )
189
+ if err != nil {
190
+ t .Logf ("ping error: %s" , err .Error ())
191
+ return false
192
+ }
193
+ if ! direct {
194
+ t .Logf ("got pong: %+v" , pong )
195
+ return false
196
+ }
197
+ return true
198
+ }, testutil .WaitShort , testutil .IntervalFast )
199
+
200
+ w1 .Close ()
201
+ w2 .Close ()
202
+ })
203
+
204
+ t .Run ("PingDERPOnly" , func (t * testing.T ) {
205
+ t .Parallel ()
206
+ logger := slogtest .Make (t , nil ).Leveled (slog .LevelDebug )
207
+ ctx := testutil .Context (t , testutil .WaitLong )
208
+ w1IP := tailnet .IP ()
209
+ w1 , err := tailnet .NewConn (& tailnet.Options {
210
+ Addresses : []netip.Prefix {netip .PrefixFrom (w1IP , 128 )},
211
+ Logger : logger .Named ("w1" ),
212
+ DERPMap : derpMap ,
213
+ BlockEndpoints : true ,
214
+ })
215
+ require .NoError (t , err )
216
+
217
+ w2 , err := tailnet .NewConn (& tailnet.Options {
218
+ Addresses : []netip.Prefix {netip .PrefixFrom (tailnet .IP (), 128 )},
219
+ Logger : logger .Named ("w2" ),
220
+ DERPMap : derpMap ,
221
+ BlockEndpoints : true ,
222
+ })
223
+ require .NoError (t , err )
224
+ t .Cleanup (func () {
225
+ _ = w1 .Close ()
226
+ _ = w2 .Close ()
227
+ })
228
+ stitch (t , w2 , w1 )
229
+ stitch (t , w1 , w2 )
230
+ require .True (t , w2 .AwaitReachable (context .Background (), w1IP ))
231
+
232
+ require .Eventually (t , func () bool {
233
+ _ , direct , pong , err := w2 .Ping (ctx , w1IP )
234
+ if err != nil {
235
+ t .Logf ("ping error: %s" , err .Error ())
236
+ return false
237
+ }
238
+ if direct || pong .DERPRegionID != derpMap .RegionIDs ()[0 ] {
239
+ t .Logf ("got pong: %+v" , pong )
240
+ return false
241
+ }
242
+ return true
243
+ }, testutil .WaitShort , testutil .IntervalFast )
244
+
245
+ w1 .Close ()
246
+ w2 .Close ()
247
+ })
160
248
}
161
249
162
250
// TestConn_PreferredDERP tests that we only trigger the NodeCallback when we have a preferred DERP server.
0 commit comments