|
6 | 6 | "encoding/json" |
7 | 7 | "net" |
8 | 8 | "net/http" |
9 | | - "sync/atomic" |
10 | 9 | "testing" |
11 | 10 |
|
12 | 11 | "connectrpc.com/connect" |
@@ -282,88 +281,3 @@ func TestConnectRPC_ClientErrorHandling(t *testing.T) { |
282 | 281 | g.Assert(t, "error_http_500", errorJSON) |
283 | 282 | }) |
284 | 283 | } |
285 | | - |
286 | | -// TestConnectRPC_ClientConcurrency tests concurrent requests with generated client |
287 | | -func TestConnectRPC_ClientConcurrency(t *testing.T) { |
288 | | - t.Parallel() |
289 | | - |
290 | | - g := goldie.New( |
291 | | - t, |
292 | | - goldie.WithFixtureDir("testdata/connectrpc"), |
293 | | - goldie.WithNameSuffix(".json"), |
294 | | - goldie.WithDiffEngine(goldie.ClassicDiff), |
295 | | - ) |
296 | | - |
297 | | - var requestCount int64 |
298 | | - handler := func(w http.ResponseWriter, r *http.Request) { |
299 | | - atomic.AddInt64(&requestCount, 1) |
300 | | - w.Header().Set("Content-Type", "application/json") |
301 | | - w.WriteHeader(http.StatusOK) |
302 | | - _, _ = w.Write([]byte(`{ |
303 | | - "data": { |
304 | | - "employee": { |
305 | | - "id": 1, |
306 | | - "tag": "employee-1", |
307 | | - "details": { |
308 | | - "forename": "John", |
309 | | - "surname": "Doe" |
310 | | - } |
311 | | - } |
312 | | - } |
313 | | - }`)) |
314 | | - } |
315 | | - |
316 | | - ts := NewTestConnectRPCServer(t, ConnectRPCServerOptions{ |
317 | | - GraphQLHandler: handler, |
318 | | - }) |
319 | | - |
320 | | - err := ts.Start() |
321 | | - require.NoError(t, err) |
322 | | - |
323 | | - client := employeev1connect.NewEmployeeServiceClient( |
324 | | - http.DefaultClient, |
325 | | - "http://"+ts.Addr().String(), |
326 | | - ) |
327 | | - |
328 | | - // Make 10 concurrent requests |
329 | | - const numRequests = 10 |
330 | | - results := make(chan error, numRequests) |
331 | | - type responseData struct { |
332 | | - resp *connect.Response[employeev1.GetEmployeeByIdResponse] |
333 | | - err error |
334 | | - } |
335 | | - responses := make(chan responseData, numRequests) |
336 | | - |
337 | | - for i := 0; i < numRequests; i++ { |
338 | | - go func() { |
339 | | - req := connect.NewRequest(&employeev1.GetEmployeeByIdRequest{ |
340 | | - EmployeeId: 1, |
341 | | - }) |
342 | | - resp, err := client.GetEmployeeById(context.Background(), req) |
343 | | - responses <- responseData{resp: resp, err: err} |
344 | | - results <- err |
345 | | - }() |
346 | | - } |
347 | | - |
348 | | - // Collect results |
349 | | - for i := 0; i < numRequests; i++ { |
350 | | - err := <-results |
351 | | - assert.NoError(t, err) |
352 | | - } |
353 | | - |
354 | | - assert.Equal(t, int64(numRequests), atomic.LoadInt64(&requestCount), "should have made all requests") |
355 | | - |
356 | | - // Verify response consistency by checking one of the responses |
357 | | - select { |
358 | | - case respData := <-responses: |
359 | | - if respData.err == nil && respData.resp != nil && respData.resp.Msg != nil && respData.resp.Msg.Employee != nil { |
360 | | - employeeJSON, err := json.MarshalIndent(respData.resp.Msg.Employee, "", " ") |
361 | | - require.NoError(t, err) |
362 | | - g.Assert(t, "concurrent_response", employeeJSON) |
363 | | - } else { |
364 | | - t.Fatal("invalid response received") |
365 | | - } |
366 | | - default: |
367 | | - t.Fatal("no responses received") |
368 | | - } |
369 | | -} |
0 commit comments