@@ -302,6 +302,89 @@ func TestStartWithoutConsumersShouldFail(t *testing.T) {
302
302
require .Error (t , r .Start (context .Background (), componenttest .NewNopHost ()))
303
303
}
304
304
305
+ func TestStartListenerClosed (t * testing.T ) {
306
+
307
+ addr := testutil .GetAvailableLocalAddress (t )
308
+
309
+ // Set the buffer count to 1 to make it flush the test span immediately.
310
+ sink := new (consumertest.TracesSink )
311
+ cfg := & Config {
312
+ ServerConfig : configgrpc.ServerConfig {
313
+ NetAddr : confignet.AddrConfig {
314
+ Endpoint : addr ,
315
+ Transport : "tcp" ,
316
+ },
317
+ },
318
+ }
319
+ ocr := newOpenCensusReceiver (cfg , sink , nil , receivertest .NewNopSettings ())
320
+
321
+ ctx := context .Background ()
322
+
323
+ // start receiver
324
+ err := ocr .Start (ctx , componenttest .NewNopHost ())
325
+ require .NoError (t , err , "Failed to start trace receiver: %v" , err )
326
+
327
+ url := fmt .Sprintf ("http://%s/v1/trace" , addr )
328
+
329
+ traceJSON := []byte (`
330
+ {
331
+ "node":{"identifier":{"hostName":"testHost"}},
332
+ "spans":[
333
+ {
334
+ "traceId":"W47/95gDgQPSabYzgT/GDA==",
335
+ "spanId":"7uGbfsPBsXM=",
336
+ "name":{"value":"testSpan"},
337
+ "startTime":"2018-12-13T14:51:00Z",
338
+ "endTime":"2018-12-13T14:51:01Z",
339
+ "attributes": {
340
+ "attributeMap": {
341
+ "attr1": {"intValue": "55"}
342
+ }
343
+ }
344
+ }
345
+ ]
346
+ }` )
347
+
348
+ // send request to verify listener is working
349
+ req , err := http .NewRequest (http .MethodPost , url , bytes .NewBuffer (traceJSON ))
350
+ require .NoError (t , err , "Error creating trace POST request: %v" , err )
351
+ req .Header .Set ("Content-Type" , "application/json" )
352
+
353
+ client := & http.Client {}
354
+ defer client .CloseIdleConnections ()
355
+ resp , err := client .Do (req )
356
+ require .NoError (t , err , "Error posting trace to grpc-gateway server: %v" , err )
357
+
358
+ defer func () {
359
+ require .NoError (t , resp .Body .Close ())
360
+ }()
361
+
362
+ respBytes , err := io .ReadAll (resp .Body )
363
+ require .NoError (t , err )
364
+ respStr := string (respBytes )
365
+
366
+ assert .Equal (t , http .StatusOK , resp .StatusCode )
367
+ assert .Empty (t , respStr )
368
+
369
+ // stop the listener
370
+ ocr .ln .Close ()
371
+
372
+ // verify trace was sent
373
+ got := sink .AllTraces ()
374
+ require .Len (t , got , 1 )
375
+ require .Equal (t , 1 , got [0 ].ResourceSpans ().Len ())
376
+ gotNode , gotResource , gotSpans := opencensus .ResourceSpansToOC (got [0 ].ResourceSpans ().At (0 ))
377
+
378
+ wantNode := & commonpb.Node {Identifier : & commonpb.ProcessIdentifier {HostName : "testHost" }}
379
+ wantResource := & resourcepb.Resource {}
380
+ assert .True (t , proto .Equal (wantNode , gotNode ))
381
+ assert .True (t , proto .Equal (wantResource , gotResource ))
382
+ require .Len (t , gotSpans , 1 )
383
+
384
+ // stop the receiver to verify it's not blocked by the closed listener
385
+ require .NoError (t , ocr .Shutdown (ctx ))
386
+ }
387
+
305
388
func tempSocketName (t * testing.T ) string {
306
389
tmpfile , err := os .CreateTemp ("" , "sock" )
307
390
require .NoError (t , err )
0 commit comments