@@ -884,6 +884,60 @@ func TestDiscover_ExplicitSpecURL(t *testing.T) {
884884 }
885885}
886886
887+ func TestDiscoverWaitsForCanceledNetworkProbes (t * testing.T ) {
888+ specBody := `{"openapi":"3.1.0","info":{"title":"Direct","version":"1.0.0"},"paths":{}}`
889+ slowEntered := make (chan struct {})
890+ cancelSeen := make (chan struct {})
891+ releaseSlow := make (chan struct {})
892+ done := make (chan error , 1 )
893+
894+ cfg := DiscoverConfig {
895+ APIName : "testapi" ,
896+ BaseURL : "https://api.example.com" ,
897+ Fetch : func (ctx context.Context , rawURL string , tr http.RoundTripper ) (* http.Response , error ) {
898+ switch rawURL {
899+ case "https://api.example.com" :
900+ close (slowEntered )
901+ <- ctx .Done ()
902+ close (cancelSeen )
903+ <- releaseSlow
904+ return nil , ctx .Err ()
905+ case "https://api.example.com/openapi.json" :
906+ <- slowEntered
907+ return httpResponse (200 , "application/json" , specBody , nil ), nil
908+ default :
909+ return httpResponse (404 , "text/plain" , "not found" , nil ), nil
910+ }
911+ },
912+ }
913+
914+ go func () {
915+ _ , err := Discover (context .Background (), cfg , DefaultLoaders ())
916+ done <- err
917+ }()
918+
919+ select {
920+ case <- cancelSeen :
921+ case <- time .After (2 * time .Second ):
922+ t .Fatal ("Discover did not cancel the slower probe" )
923+ }
924+ select {
925+ case err := <- done :
926+ t .Fatalf ("Discover returned before canceled probes exited: %v" , err )
927+ default :
928+ }
929+
930+ close (releaseSlow )
931+ select {
932+ case err := <- done :
933+ if err != nil {
934+ t .Fatalf ("Discover: %v" , err )
935+ }
936+ case <- time .After (2 * time .Second ):
937+ t .Fatal ("Discover did not return after canceled probe exited" )
938+ }
939+ }
940+
887941func TestDiscoverCleansCredentialURLMetadataInCache (t * testing.T ) {
888942 raw := `{"openapi":"3.1.0","info":{"title":"Direct","version":"1.0.0"},"paths":{"/items":{"get":{"operationId":"listItems","responses":{"200":{"description":"OK"}}}}}}`
889943 tr := roundTripperFunc (func (r * http.Request ) (* http.Response , error ) {
0 commit comments