@@ -589,12 +589,23 @@ func beginPartialStateJoin(t *testing.T, deployment *docker.Deployment, joiningU
589589 },
590590 }))
591591
592- // register a handler for /state_ids requests, which finishes fedStateIdsRequestReceivedWaiter, then
592+ // register a handler for /state_ids requests for the most recent event,
593+ // which finishes fedStateIdsRequestReceivedWaiter, then
593594 // waits for fedStateIdsSendResponseWaiter and sends a reply
594- handleStateIdsRequests (t , result .Server , result .ServerRoom , result .fedStateIdsRequestReceivedWaiter , result .fedStateIdsSendResponseWaiter )
595+ lastEvent := result .ServerRoom .Timeline [len (result .ServerRoom .Timeline )- 1 ]
596+ currentState := result .ServerRoom .AllCurrentState ()
597+ handleStateIdsRequests (
598+ t , result .Server , result .ServerRoom ,
599+ lastEvent .EventID (), currentState ,
600+ result .fedStateIdsRequestReceivedWaiter , result .fedStateIdsSendResponseWaiter ,
601+ )
595602
596603 // a handler for /state requests, which sends a sensible response
597- handleStateRequests (t , result .Server , result .ServerRoom , nil , nil )
604+ handleStateRequests (
605+ t , result .Server , result .ServerRoom ,
606+ lastEvent .EventID (), currentState ,
607+ nil , nil ,
608+ )
598609
599610 // have joiningUser join the room by room ID.
600611 joiningUser .JoinRoom (t , result .ServerRoom .RoomID , []string {result .Server .ServerName ()})
@@ -630,16 +641,20 @@ func (psj *partialStateJoinResult) FinishStateRequest() {
630641 psj .fedStateIdsSendResponseWaiter .Finish ()
631642}
632643
633- // handleStateIdsRequests registers a handler for /state_ids requests for serverRoom.
644+ // handleStateIdsRequests registers a handler for /state_ids requests for 'eventID'
645+ //
646+ // the returned state is as passed in 'roomState'
634647//
635648// if requestReceivedWaiter is not nil, it will be Finish()ed when the request arrives.
636649// if sendResponseWaiter is not nil, we will Wait() for it to finish before sending the response.
637650func handleStateIdsRequests (
638651 t * testing.T , srv * federation.Server , serverRoom * federation.ServerRoom ,
652+ eventID string , roomState []* gomatrixserverlib.Event ,
639653 requestReceivedWaiter * Waiter , sendResponseWaiter * Waiter ,
640654) {
641- srv .Mux ().Handle (
655+ srv .Mux ().NewRoute (). Methods ( "GET" ). Path (
642656 fmt .Sprintf ("/_matrix/federation/v1/state_ids/%s" , serverRoom .RoomID ),
657+ ).Queries ("event_id" , eventID ).Handler (
643658 http .HandlerFunc (func (w http.ResponseWriter , req * http.Request ) {
644659 queryParams := req .URL .Query ()
645660 t .Logf ("Incoming state_ids request for event %s in room %s" , queryParams ["event_id" ], serverRoom .RoomID )
@@ -652,8 +667,8 @@ func handleStateIdsRequests(
652667 t .Logf ("Replying to /state_ids request" )
653668
654669 res := gomatrixserverlib.RespStateIDs {
655- AuthEventIDs : eventIDsFromEvents (serverRoom .AuthChain ( )),
656- StateEventIDs : eventIDsFromEvents (serverRoom . AllCurrentState () ),
670+ AuthEventIDs : eventIDsFromEvents (serverRoom .AuthChainForEvents ( roomState )),
671+ StateEventIDs : eventIDsFromEvents (roomState ),
657672 }
658673 w .WriteHeader (200 )
659674 jsonb , _ := json .Marshal (res )
@@ -662,19 +677,24 @@ func handleStateIdsRequests(
662677 t .Errorf ("Error writing to request: %v" , err )
663678 }
664679 }),
665- ).Methods ("GET" )
680+ )
681+ t .Logf ("Registered state_ids handler for event %s" , eventID )
666682}
667683
668- // makeStateHandler returns a handler for /state requests for serverRoom.
684+ // makeStateHandler returns a handler for /state requests for 'eventID'
685+ //
686+ // the returned state is as passed in 'roomState'
669687//
670688// if requestReceivedWaiter is not nil, it will be Finish()ed when the request arrives.
671689// if sendResponseWaiter is not nil, we will Wait() for it to finish before sending the response.
672690func handleStateRequests (
673691 t * testing.T , srv * federation.Server , serverRoom * federation.ServerRoom ,
692+ eventID string , roomState []* gomatrixserverlib.Event ,
674693 requestReceivedWaiter * Waiter , sendResponseWaiter * Waiter ,
675694) {
676- srv .Mux ().Handle (
695+ srv .Mux ().NewRoute (). Methods ( "GET" ). Path (
677696 fmt .Sprintf ("/_matrix/federation/v1/state/%s" , serverRoom .RoomID ),
697+ ).Queries ("event_id" , eventID ).Handler (
678698 http .HandlerFunc (func (w http.ResponseWriter , req * http.Request ) {
679699 queryParams := req .URL .Query ()
680700 t .Logf ("Incoming state request for event %s in room %s" , queryParams ["event_id" ], serverRoom .RoomID )
@@ -685,8 +705,8 @@ func handleStateRequests(
685705 sendResponseWaiter .Waitf (t , 60 * time .Second , "Waiting for /state request" )
686706 }
687707 res := gomatrixserverlib.RespState {
688- AuthEvents : gomatrixserverlib .NewEventJSONsFromEvents (serverRoom .AuthChain ( )),
689- StateEvents : gomatrixserverlib .NewEventJSONsFromEvents (serverRoom . AllCurrentState () ),
708+ AuthEvents : gomatrixserverlib .NewEventJSONsFromEvents (serverRoom .AuthChainForEvents ( roomState )),
709+ StateEvents : gomatrixserverlib .NewEventJSONsFromEvents (roomState ),
690710 }
691711 w .WriteHeader (200 )
692712 jsonb , _ := json .Marshal (res )
@@ -695,7 +715,7 @@ func handleStateRequests(
695715 t .Errorf ("Error writing to request: %v" , err )
696716 }
697717 }),
698- ). Methods ( "GET" )
718+ )
699719}
700720
701721func eventIDsFromEvents (he []* gomatrixserverlib.Event ) []string {
0 commit comments