@@ -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 {
0 commit comments