6
6
"context"
7
7
"io"
8
8
"os"
9
+ "regexp"
9
10
"strings"
10
11
"sync/atomic"
11
12
"testing"
@@ -15,12 +16,14 @@ import (
15
16
"github.com/stretchr/testify/assert"
16
17
"github.com/stretchr/testify/require"
17
18
"golang.org/x/xerrors"
19
+ "tailscale.com/tailcfg"
18
20
19
21
"github.com/coder/coder/v2/cli/clibase"
20
22
"github.com/coder/coder/v2/cli/clitest"
21
23
"github.com/coder/coder/v2/cli/cliui"
22
24
"github.com/coder/coder/v2/coderd/util/ptr"
23
25
"github.com/coder/coder/v2/codersdk"
26
+ "github.com/coder/coder/v2/tailnet"
24
27
"github.com/coder/coder/v2/testutil"
25
28
)
26
29
@@ -476,3 +479,191 @@ func TestAgent(t *testing.T) {
476
479
require .NoError (t , cmd .Invoke ().Run ())
477
480
})
478
481
}
482
+
483
+ func TestPeerDiagnostics (t * testing.T ) {
484
+ t .Parallel ()
485
+ testCases := []struct {
486
+ name string
487
+ diags tailnet.PeerDiagnostics
488
+ want []* regexp.Regexp // must be ordered, can omit lines
489
+ }{
490
+ {
491
+ name : "noPreferredDERP" ,
492
+ diags : tailnet.PeerDiagnostics {
493
+ PreferredDERP : 0 ,
494
+ DERPRegionNames : make (map [int ]string ),
495
+ SentNode : true ,
496
+ ReceivedNode : & tailcfg.Node {DERP : "127.3.3.40:999" },
497
+ LastWireguardHandshake : time .Now (),
498
+ },
499
+ want : []* regexp.Regexp {
500
+ regexp .MustCompile ("^✘ not connected to DERP$" ),
501
+ },
502
+ },
503
+ {
504
+ name : "preferredDERP" ,
505
+ diags : tailnet.PeerDiagnostics {
506
+ PreferredDERP : 23 ,
507
+ DERPRegionNames : map [int ]string {
508
+ 23 : "testo" ,
509
+ },
510
+ SentNode : true ,
511
+ ReceivedNode : & tailcfg.Node {DERP : "127.3.3.40:999" },
512
+ LastWireguardHandshake : time .Now (),
513
+ },
514
+ want : []* regexp.Regexp {
515
+ regexp .MustCompile (`^✔ preferred DERP region: 23 \(testo\)$` ),
516
+ },
517
+ },
518
+ {
519
+ name : "sentNode" ,
520
+ diags : tailnet.PeerDiagnostics {
521
+ PreferredDERP : 0 ,
522
+ DERPRegionNames : map [int ]string {},
523
+ SentNode : true ,
524
+ ReceivedNode : & tailcfg.Node {DERP : "127.3.3.40:999" },
525
+ LastWireguardHandshake : time.Time {},
526
+ },
527
+ want : []* regexp.Regexp {
528
+ regexp .MustCompile (`^✔ sent local data to Coder networking coodinator$` ),
529
+ },
530
+ },
531
+ {
532
+ name : "didntSendNode" ,
533
+ diags : tailnet.PeerDiagnostics {
534
+ PreferredDERP : 0 ,
535
+ DERPRegionNames : map [int ]string {},
536
+ SentNode : false ,
537
+ ReceivedNode : & tailcfg.Node {DERP : "127.3.3.40:999" },
538
+ LastWireguardHandshake : time.Time {},
539
+ },
540
+ want : []* regexp.Regexp {
541
+ regexp .MustCompile (`^✘ have not sent local data to Coder networking coordinator$` ),
542
+ },
543
+ },
544
+ {
545
+ name : "receivedNodeDERPOKNoEndpoints" ,
546
+ diags : tailnet.PeerDiagnostics {
547
+ PreferredDERP : 0 ,
548
+ DERPRegionNames : map [int ]string {999 : "Embedded" },
549
+ SentNode : true ,
550
+ ReceivedNode : & tailcfg.Node {DERP : "127.3.3.40:999" },
551
+ LastWireguardHandshake : time.Time {},
552
+ },
553
+ want : []* regexp.Regexp {
554
+ regexp .MustCompile (`^✔ received remote agent data from Coder networking coordinator$` ),
555
+ regexp .MustCompile (`preferred DERP region: 999 \(Embedded\)$` ),
556
+ regexp .MustCompile (`endpoints: $` ),
557
+ },
558
+ },
559
+ {
560
+ name : "receivedNodeDERPUnknownNoEndpoints" ,
561
+ diags : tailnet.PeerDiagnostics {
562
+ PreferredDERP : 0 ,
563
+ DERPRegionNames : map [int ]string {},
564
+ SentNode : true ,
565
+ ReceivedNode : & tailcfg.Node {DERP : "127.3.3.40:999" },
566
+ LastWireguardHandshake : time.Time {},
567
+ },
568
+ want : []* regexp.Regexp {
569
+ regexp .MustCompile (`^✔ received remote agent data from Coder networking coordinator$` ),
570
+ regexp .MustCompile (`preferred DERP region: 999 \(unknown\)$` ),
571
+ regexp .MustCompile (`endpoints: $` ),
572
+ },
573
+ },
574
+ {
575
+ name : "receivedNodeEndpointsNoDERP" ,
576
+ diags : tailnet.PeerDiagnostics {
577
+ PreferredDERP : 0 ,
578
+ DERPRegionNames : map [int ]string {999 : "Embedded" },
579
+ SentNode : true ,
580
+ ReceivedNode : & tailcfg.Node {Endpoints : []string {"99.88.77.66:4555" , "33.22.11.0:3444" }},
581
+ LastWireguardHandshake : time.Time {},
582
+ },
583
+ want : []* regexp.Regexp {
584
+ regexp .MustCompile (`^✔ received remote agent data from Coder networking coordinator$` ),
585
+ regexp .MustCompile (`preferred DERP region:\s*$` ),
586
+ regexp .MustCompile (`endpoints: 99\.88\.77\.66:4555, 33\.22\.11\.0:3444$` ),
587
+ },
588
+ },
589
+ {
590
+ name : "didntReceiveNode" ,
591
+ diags : tailnet.PeerDiagnostics {
592
+ PreferredDERP : 0 ,
593
+ DERPRegionNames : map [int ]string {},
594
+ SentNode : false ,
595
+ ReceivedNode : nil ,
596
+ LastWireguardHandshake : time.Time {},
597
+ },
598
+ want : []* regexp.Regexp {
599
+ regexp .MustCompile (`^✘ have not received remote agent data from Coder networking coordinator$` ),
600
+ },
601
+ },
602
+ {
603
+ name : "noWireguardHandshake" ,
604
+ diags : tailnet.PeerDiagnostics {
605
+ PreferredDERP : 0 ,
606
+ DERPRegionNames : map [int ]string {},
607
+ SentNode : false ,
608
+ ReceivedNode : nil ,
609
+ LastWireguardHandshake : time.Time {},
610
+ },
611
+ want : []* regexp.Regexp {
612
+ regexp .MustCompile (`^✘ Wireguard is not connected$` ),
613
+ },
614
+ },
615
+ {
616
+ name : "wireguardHandshakeRecent" ,
617
+ diags : tailnet.PeerDiagnostics {
618
+ PreferredDERP : 0 ,
619
+ DERPRegionNames : map [int ]string {},
620
+ SentNode : false ,
621
+ ReceivedNode : nil ,
622
+ LastWireguardHandshake : time .Now ().Add (- 5 * time .Second ),
623
+ },
624
+ want : []* regexp.Regexp {
625
+ regexp .MustCompile (`^✔ Wireguard handshake \d+s ago$` ),
626
+ },
627
+ },
628
+ {
629
+ name : "wireguardHandshakeOld" ,
630
+ diags : tailnet.PeerDiagnostics {
631
+ PreferredDERP : 0 ,
632
+ DERPRegionNames : map [int ]string {},
633
+ SentNode : false ,
634
+ ReceivedNode : nil ,
635
+ LastWireguardHandshake : time .Now ().Add (- 450 * time .Second ), // 7m30s
636
+ },
637
+ want : []* regexp.Regexp {
638
+ regexp .MustCompile (`^⚠ Wireguard handshake 7m\d+s ago$` ),
639
+ },
640
+ },
641
+ }
642
+ for _ , tc := range testCases {
643
+ tc := tc
644
+ t .Run (tc .name , func (t * testing.T ) {
645
+ t .Parallel ()
646
+ r , w := io .Pipe ()
647
+ go func () {
648
+ defer w .Close ()
649
+ cliui .PeerDiagnostics (w , tc .diags )
650
+ }()
651
+ s := bufio .NewScanner (r )
652
+ i := 0
653
+ got := make ([]string , 0 )
654
+ for s .Scan () {
655
+ got = append (got , s .Text ())
656
+ if i < len (tc .want ) {
657
+ reg := tc .want [i ]
658
+ if reg .Match (s .Bytes ()) {
659
+ i ++
660
+ }
661
+ }
662
+ }
663
+ if i < len (tc .want ) {
664
+ t .Logf ("failed to match regexp: %s\n got:\n %s" , tc .want [i ].String (), strings .Join (got , "\n " ))
665
+ t .FailNow ()
666
+ }
667
+ })
668
+ }
669
+ }
0 commit comments