@@ -513,30 +513,42 @@ func TestWorkspaceAgentClientCoordinate_BadVersion(t *testing.T) {
513
513
require .Equal (t ,"version" ,sdkErr .Validations [0 ].Field )
514
514
}
515
515
516
- type resumeTokenTestFakeCoordinator struct {
517
- tailnet.Coordinator
518
- t testing.TB
519
- peerIDCh chan uuid.UUID
516
+ type resumeTokenRecordingProvider struct {
517
+ tailnet.ResumeTokenProvider
518
+ t testing.TB
519
+ generateCalls chan uuid.UUID
520
+ verifyCalls chan string
520
521
}
521
522
522
- var _ tailnet.Coordinator = & resumeTokenTestFakeCoordinator {}
523
+ var _ tailnet.ResumeTokenProvider = & resumeTokenRecordingProvider {}
523
524
524
- func (c * resumeTokenTestFakeCoordinator )storeID (id uuid.UUID ) {
525
- select {
526
- case c .peerIDCh <- id :
527
- default :
528
- c .t .Fatal ("peer ID channel full" )
525
+ func newResumeTokenRecordingProvider (t testing.TB ,underlying tailnet.ResumeTokenProvider )* resumeTokenRecordingProvider {
526
+ return & resumeTokenRecordingProvider {
527
+ ResumeTokenProvider :underlying ,
528
+ t :t ,
529
+ generateCalls :make (chan uuid.UUID ,1 ),
530
+ verifyCalls :make (chan string ,1 ),
529
531
}
530
532
}
531
533
532
- func (c * resumeTokenTestFakeCoordinator )ServeClient (conn net.Conn ,id uuid.UUID ,agentID uuid.UUID )error {
533
- c .storeID (id )
534
- return c .Coordinator .ServeClient (conn ,id ,agentID )
534
+ func (r * resumeTokenRecordingProvider )GenerateResumeToken (peerID uuid.UUID ) (* tailnetproto.RefreshResumeTokenResponse ,error ) {
535
+ select {
536
+ case r .generateCalls <- peerID :
537
+ return r .ResumeTokenProvider .GenerateResumeToken (peerID )
538
+ default :
539
+ r .t .Error ("generateCalls full" )
540
+ return nil ,xerrors .New ("generateCalls full" )
541
+ }
535
542
}
536
543
537
- func (c * resumeTokenTestFakeCoordinator )Coordinate (ctx context.Context ,id uuid.UUID ,name string ,a tailnet.CoordinateeAuth ) (chan <- * tailnetproto.CoordinateRequest ,<- chan * tailnetproto.CoordinateResponse ) {
538
- c .storeID (id )
539
- return c .Coordinator .Coordinate (ctx ,id ,name ,a )
544
+ func (r * resumeTokenRecordingProvider )VerifyResumeToken (token string ) (uuid.UUID ,error ) {
545
+ select {
546
+ case r .verifyCalls <- token :
547
+ return r .ResumeTokenProvider .VerifyResumeToken (token )
548
+ default :
549
+ r .t .Error ("verifyCalls full" )
550
+ return uuid .Nil ,xerrors .New ("verifyCalls full" )
551
+ }
540
552
}
541
553
542
554
func TestWorkspaceAgentClientCoordinate_ResumeToken (t * testing.T ) {
@@ -546,15 +558,12 @@ func TestWorkspaceAgentClientCoordinate_ResumeToken(t *testing.T) {
546
558
clock := quartz .NewMock (t )
547
559
resumeTokenSigningKey ,err := tailnet .GenerateResumeTokenSigningKey ()
548
560
require .NoError (t ,err )
549
- resumeTokenProvider := tailnet .NewResumeTokenKeyProvider (resumeTokenSigningKey ,clock ,time .Hour )
550
- coordinator := & resumeTokenTestFakeCoordinator {
551
- Coordinator :tailnet .NewCoordinator (logger ),
552
- t :t ,
553
- peerIDCh :make (chan uuid.UUID ,1 ),
554
- }
555
- defer close (coordinator .peerIDCh )
561
+ resumeTokenProvider := newResumeTokenRecordingProvider (
562
+ t ,
563
+ tailnet .NewResumeTokenKeyProvider (resumeTokenSigningKey ,clock ,time .Hour ),
564
+ )
556
565
client ,closer ,api := coderdtest .NewWithAPI (t ,& coderdtest.Options {
557
- Coordinator :coordinator ,
566
+ Coordinator :tailnet . NewCoordinator ( logger ) ,
558
567
CoordinatorResumeTokenProvider :resumeTokenProvider ,
559
568
})
560
569
defer closer .Close ()
@@ -576,15 +585,17 @@ func TestWorkspaceAgentClientCoordinate_ResumeToken(t *testing.T) {
576
585
// random value.
577
586
originalResumeToken ,err := connectToCoordinatorAndFetchResumeToken (ctx ,logger ,client ,agentAndBuild .WorkspaceAgent .ID ,"" )
578
587
require .NoError (t ,err )
579
- originalPeerID := testutil .RequireRecvCtx (ctx ,t ,coordinator . peerIDCh )
588
+ originalPeerID := testutil .RequireRecvCtx (ctx ,t ,resumeTokenProvider . generateCalls )
580
589
require .NotEqual (t ,originalPeerID ,uuid .Nil )
581
590
582
591
// Connect with a valid resume token, and ensure that the peer ID is set to
583
592
// the stored value.
584
593
clock .Advance (time .Second )
585
594
newResumeToken ,err := connectToCoordinatorAndFetchResumeToken (ctx ,logger ,client ,agentAndBuild .WorkspaceAgent .ID ,originalResumeToken )
586
595
require .NoError (t ,err )
587
- newPeerID := testutil .RequireRecvCtx (ctx ,t ,coordinator .peerIDCh )
596
+ verifiedToken := testutil .RequireRecvCtx (ctx ,t ,resumeTokenProvider .verifyCalls )
597
+ require .Equal (t ,originalResumeToken ,verifiedToken )
598
+ newPeerID := testutil .RequireRecvCtx (ctx ,t ,resumeTokenProvider .generateCalls )
588
599
require .Equal (t ,originalPeerID ,newPeerID )
589
600
require .NotEqual (t ,originalResumeToken ,newResumeToken )
590
601
@@ -598,9 +609,11 @@ func TestWorkspaceAgentClientCoordinate_ResumeToken(t *testing.T) {
598
609
require .Equal (t ,http .StatusUnauthorized ,sdkErr .StatusCode ())
599
610
require .Len (t ,sdkErr .Validations ,1 )
600
611
require .Equal (t ,"resume_token" ,sdkErr .Validations [0 ].Field )
612
+ verifiedToken = testutil .RequireRecvCtx (ctx ,t ,resumeTokenProvider .verifyCalls )
613
+ require .Equal (t ,"invalid" ,verifiedToken )
601
614
602
615
select {
603
- case <- coordinator . peerIDCh :
616
+ case <- resumeTokenProvider . generateCalls :
604
617
t .Fatal ("unexpected peer ID in channel" )
605
618
default :
606
619
}
@@ -646,21 +659,6 @@ func connectToCoordinatorAndFetchResumeToken(ctx context.Context, logger slog.Lo
646
659
return "" ,xerrors .Errorf ("new dRPC client: %w" ,err )
647
660
}
648
661
649
- // Send an empty coordination request. This will do nothing on the server,
650
- // but ensures our wrapped coordinator can record the peer ID.
651
- coordinateClient ,err := rpcClient .Coordinate (ctx )
652
- if err != nil {
653
- return "" ,xerrors .Errorf ("coordinate: %w" ,err )
654
- }
655
- err = coordinateClient .Send (& tailnetproto.CoordinateRequest {})
656
- if err != nil {
657
- return "" ,xerrors .Errorf ("send empty coordination request: %w" ,err )
658
- }
659
- err = coordinateClient .Close ()
660
- if err != nil {
661
- return "" ,xerrors .Errorf ("close coordination request: %w" ,err )
662
- }
663
-
664
662
// Fetch a resume token.
665
663
newResumeToken ,err := rpcClient .RefreshResumeToken (ctx ,& tailnetproto.RefreshResumeTokenRequest {})
666
664
if err != nil {