Skip to content

Commit ddf668c

Browse files
committed
proxy: test two rounds of traceroute to make sure semaphore is released
1 parent fc2438b commit ddf668c

File tree

1 file changed

+40
-32
lines changed

1 file changed

+40
-32
lines changed

proxy/traceroute_test.go

Lines changed: 40 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -184,37 +184,45 @@ func TestTracerouteHandlerConcurrencyLimit(t *testing.T) {
184184
setting.tr_flags = []string{"-c", "sleep 1; echo Done"}
185185
setting.tr_raw = true
186186

187-
// Launch more concurrent requests than the limit
188-
numRequests := 5
189-
responses := make(chan int, numRequests)
190-
191-
for i := 0; i < numRequests; i++ {
192-
go func() {
193-
r := httptest.NewRequest(http.MethodGet, "/traceroute?q="+url.QueryEscape("1.1.1.1"), nil)
194-
w := httptest.NewRecorder()
195-
tracerouteHandler(w, r)
196-
responses <- w.Code
197-
}()
198-
}
199-
200-
// Collect all responses
201-
statusCodes := make(map[int]int)
202-
for i := 0; i < numRequests; i++ {
203-
code := <-responses
204-
statusCodes[code]++
205-
}
206-
207-
// Verify that some requests succeeded (200) and some were rejected (503)
208-
if statusCodes[http.StatusOK] == 0 {
209-
t.Error("Expected at least one request to succeed with 200")
210-
}
211-
if statusCodes[http.StatusServiceUnavailable] == 0 {
212-
t.Error("Expected at least one request to be rejected with 503")
213-
}
214-
215-
// Verify we didn't get any unexpected status codes
216-
totalRequests := statusCodes[http.StatusOK] + statusCodes[http.StatusServiceUnavailable]
217-
if totalRequests != numRequests {
218-
t.Errorf("Expected %d total requests, got %d", numRequests, totalRequests)
187+
// Run two rounds to verify semaphores are properly released
188+
for round := 1; round <= 2; round++ {
189+
t.Logf("Round %d: Testing concurrency limit", round)
190+
191+
// Launch more concurrent requests than the limit
192+
numRequests := 5
193+
responses := make(chan int, numRequests)
194+
195+
for i := 0; i < numRequests; i++ {
196+
go func() {
197+
r := httptest.NewRequest(http.MethodGet, "/traceroute?q="+url.QueryEscape("1.1.1.1"), nil)
198+
w := httptest.NewRecorder()
199+
tracerouteHandler(w, r)
200+
responses <- w.Code
201+
}()
202+
}
203+
204+
// Collect all responses
205+
statusCodes := make(map[int]int)
206+
for i := 0; i < numRequests; i++ {
207+
code := <-responses
208+
statusCodes[code]++
209+
}
210+
211+
// Verify that some requests succeeded (200) and some were rejected (503)
212+
if statusCodes[http.StatusOK] == 0 {
213+
t.Errorf("Round %d: Expected at least one request to succeed with 200", round)
214+
}
215+
if statusCodes[http.StatusServiceUnavailable] == 0 {
216+
t.Errorf("Round %d: Expected at least one request to be rejected with 503", round)
217+
}
218+
219+
// Verify we didn't get any unexpected status codes
220+
totalRequests := statusCodes[http.StatusOK] + statusCodes[http.StatusServiceUnavailable]
221+
if totalRequests != numRequests {
222+
t.Errorf("Round %d: Expected %d total requests, got %d", round, numRequests, totalRequests)
223+
}
224+
225+
t.Logf("Round %d: Got %d successful (200) and %d rejected (503) requests",
226+
round, statusCodes[http.StatusOK], statusCodes[http.StatusServiceUnavailable])
219227
}
220228
}

0 commit comments

Comments
 (0)