MCPcopy Index your code
hub / github.com/coder/coder / TestConcurrencyLimit

Function TestConcurrencyLimit

coderd/httpmw/ratelimit_test.go:251–357  ·  view source on GitHub ↗
(t *testing.T)

Source from the content-addressed store, hash-verified

249}
250
251func TestConcurrencyLimit(t *testing.T) {
252 t.Parallel()
253
254 t.Run("LimitsConcurrentRequests", func(t *testing.T) {
255 t.Parallel()
256
257 const maxConcurrency = 2
258 rtr := chi.NewRouter()
259 rtr.Use(httpmw.ConcurrencyLimit(maxConcurrency, "Test"))
260
261 // Use a WaitGroup as a barrier to ensure all requests are in the handler
262 // before any of them proceed.
263 var handlersReady sync.WaitGroup
264 handlersReady.Add(maxConcurrency)
265 releaseHandler := make(chan struct{})
266
267 rtr.Get("/", func(rw http.ResponseWriter, r *http.Request) {
268 handlersReady.Done()
269 // Wait until released.
270 <-releaseHandler
271 rw.WriteHeader(http.StatusOK)
272 })
273
274 server := httptest.NewServer(rtr)
275 defer server.Close()
276
277 ctx := testutil.Context(t, testutil.WaitShort)
278
279 // Start maxConcurrency requests that will block.
280 // We use channels to collect errors instead of require in goroutines.
281 type result struct {
282 statusCode int
283 err error
284 }
285 results := make(chan result, maxConcurrency)
286
287 var wg sync.WaitGroup
288 for i := 0; i < maxConcurrency; i++ {
289 wg.Add(1)
290 go func() {
291 defer wg.Done()
292 req, err := http.NewRequestWithContext(ctx, http.MethodGet, server.URL+"/", nil)
293 if err != nil {
294 results <- result{err: err}
295 return
296 }
297 resp, err := http.DefaultClient.Do(req)
298 if err != nil {
299 results <- result{err: err}
300 return
301 }
302 defer resp.Body.Close()
303 results <- result{statusCode: resp.StatusCode}
304 }()
305 }
306
307 // Wait for all requests to enter the handler with a timeout.
308 handlersReadyCh := make(chan struct{})

Callers

nothing calls this directly

Calls 15

CloseMethod · 0.95
ConcurrencyLimitFunction · 0.92
ContextFunction · 0.92
FatalMethod · 0.80
RunMethod · 0.65
AddMethod · 0.65
GetMethod · 0.65
DoMethod · 0.65
CloseMethod · 0.65
WaitMethod · 0.65
DoneMethod · 0.45
WriteHeaderMethod · 0.45

Tested by

no test coverage detected