@@ -294,7 +294,9 @@ TEST_F(TurnConnectionFunctionalityTest, turnConnectionShutdownWithAllocationRemo
294
294
BOOL doneAllocate = FALSE ;
295
295
UINT64 shutdownTimeout;
296
296
UINT64 doneAllocateTimeout = GETTIME () + 10 * HUNDREDS_OF_NANOS_IN_A_SECOND;
297
- PSocketConnection pTurnSocketConnection = NULL ;
297
+ PSocketConnection pTurnSocketConnection = NULL , pCurrSocketConnection = NULL ;
298
+ PDoubleListNode pCurNode = NULL ;
299
+ BOOL connectionRemovedFromListener = TRUE ;
298
300
299
301
initializeTestTurnConnection ();
300
302
pTurnSocketConnection = pTurnConnection->pControlChannel ;
@@ -326,6 +328,20 @@ TEST_F(TurnConnectionFunctionalityTest, turnConnectionShutdownWithAllocationRemo
326
328
EXPECT_TRUE (ATOMIC_LOAD_BOOL (&pTurnSocketConnection->connectionClosed ));
327
329
MUTEX_UNLOCK (pTurnConnection->lock );
328
330
331
+ THREAD_SLEEP (2 * HUNDREDS_OF_NANOS_IN_A_SECOND);
332
+
333
+ MUTEX_LOCK (pConnectionListener->lock );
334
+ EXPECT_EQ (STATUS_SUCCESS, doubleListGetHeadNode (pConnectionListener->connectionList , &pCurNode));
335
+ while (pCurNode != NULL && connectionRemovedFromListener) {
336
+ pCurrSocketConnection = (PSocketConnection) pCurNode->data ;
337
+ pCurNode = pCurNode->pNext ;
338
+ connectionRemovedFromListener = pCurrSocketConnection != pTurnSocketConnection;
339
+ }
340
+ MUTEX_UNLOCK (pConnectionListener->lock );
341
+
342
+ /* make sure that pTurnSocketConnection has been removed from connection listener's list */
343
+ EXPECT_TRUE (connectionRemovedFromListener == TRUE );
344
+
329
345
freeTestTurnConnection ();
330
346
}
331
347
@@ -338,7 +354,9 @@ TEST_F(TurnConnectionFunctionalityTest, turnConnectionShutdownWithoutAllocationR
338
354
BOOL atGetCredential = FALSE ;
339
355
UINT64 shutdownTimeout;
340
356
UINT64 atGetCredentialTimeout = GETTIME () + 10 * HUNDREDS_OF_NANOS_IN_A_SECOND;
341
- PSocketConnection pTurnSocketConnection = NULL ;
357
+ PSocketConnection pTurnSocketConnection = NULL , pCurrSocketConnection = NULL ;
358
+ PDoubleListNode pCurNode = NULL ;
359
+ BOOL connectionRemovedFromListener = TRUE ;
342
360
343
361
initializeTestTurnConnection ();
344
362
pTurnSocketConnection = pTurnConnection->pControlChannel ;
@@ -369,6 +387,82 @@ TEST_F(TurnConnectionFunctionalityTest, turnConnectionShutdownWithoutAllocationR
369
387
EXPECT_TRUE (ATOMIC_LOAD_BOOL (&pTurnSocketConnection->connectionClosed ));
370
388
MUTEX_UNLOCK (pTurnConnection->lock );
371
389
390
+ THREAD_SLEEP (2 * HUNDREDS_OF_NANOS_IN_A_SECOND);
391
+
392
+ MUTEX_LOCK (pConnectionListener->lock );
393
+ EXPECT_EQ (STATUS_SUCCESS, doubleListGetHeadNode (pConnectionListener->connectionList , &pCurNode));
394
+ while (pCurNode != NULL && connectionRemovedFromListener) {
395
+ pCurrSocketConnection = (PSocketConnection) pCurNode->data ;
396
+ pCurNode = pCurNode->pNext ;
397
+ connectionRemovedFromListener = pCurrSocketConnection != pTurnSocketConnection;
398
+ }
399
+ MUTEX_UNLOCK (pConnectionListener->lock );
400
+
401
+ /* make sure that pTurnSocketConnection has been removed from connection listener's list */
402
+ EXPECT_TRUE (connectionRemovedFromListener == TRUE );
403
+
404
+ freeTestTurnConnection ();
405
+ }
406
+
407
+ TEST_F (TurnConnectionFunctionalityTest, turnConnectionShutdownAfterFailure)
408
+ {
409
+ if (!mAccessKeyIdSet ) {
410
+ return ;
411
+ }
412
+
413
+ BOOL atGetCredential = FALSE ;
414
+ UINT64 shutdownTimeout;
415
+ UINT64 atGetCredentialTimeout = GETTIME () + 10 * HUNDREDS_OF_NANOS_IN_A_SECOND;
416
+ PSocketConnection pTurnSocketConnection = NULL , pCurrSocketConnection = NULL ;
417
+ PDoubleListNode pCurNode = NULL ;
418
+ BOOL connectionRemovedFromListener = TRUE ;
419
+
420
+ initializeTestTurnConnection ();
421
+ pTurnSocketConnection = pTurnConnection->pControlChannel ;
422
+
423
+ EXPECT_EQ (STATUS_SUCCESS, turnConnectionStart (pTurnConnection));
424
+
425
+ // wait until get credential state
426
+ while (!atGetCredential && GETTIME () < atGetCredentialTimeout) {
427
+ THREAD_SLEEP (10 * HUNDREDS_OF_NANOS_IN_A_MILLISECOND);
428
+ MUTEX_LOCK (pTurnConnection->lock );
429
+ if (pTurnConnection->state == TURN_STATE_GET_CREDENTIALS) {
430
+ atGetCredential = TRUE ;
431
+ }
432
+ MUTEX_UNLOCK (pTurnConnection->lock );
433
+ }
434
+
435
+ MUTEX_LOCK (pTurnConnection->lock );
436
+ pTurnConnection->state = TURN_STATE_FAILED;
437
+ pTurnConnection->errorStatus = STATUS_INVALID_OPERATION;
438
+ MUTEX_UNLOCK (pTurnConnection->lock );
439
+
440
+ shutdownTimeout = GETTIME () + 5 * HUNDREDS_OF_NANOS_IN_A_SECOND;
441
+ while (!turnConnectionIsShutdownComplete (pTurnConnection) && GETTIME () < shutdownTimeout) {
442
+ THREAD_SLEEP (HUNDREDS_OF_NANOS_IN_A_SECOND);
443
+ }
444
+
445
+ EXPECT_TRUE (turnConnectionIsShutdownComplete (pTurnConnection));
446
+
447
+ MUTEX_LOCK (pTurnConnection->lock );
448
+ EXPECT_TRUE (ATOMIC_LOAD_BOOL (&pTurnSocketConnection->connectionClosed ));
449
+ MUTEX_UNLOCK (pTurnConnection->lock );
450
+
451
+ /* select in connection timeout every 1s */
452
+ THREAD_SLEEP (3 * HUNDREDS_OF_NANOS_IN_A_SECOND);
453
+
454
+ MUTEX_LOCK (pConnectionListener->lock );
455
+ EXPECT_EQ (STATUS_SUCCESS, doubleListGetHeadNode (pConnectionListener->connectionList , &pCurNode));
456
+ while (pCurNode != NULL && connectionRemovedFromListener) {
457
+ pCurrSocketConnection = (PSocketConnection) pCurNode->data ;
458
+ pCurNode = pCurNode->pNext ;
459
+ connectionRemovedFromListener = pCurrSocketConnection != pTurnSocketConnection;
460
+ }
461
+ MUTEX_UNLOCK (pConnectionListener->lock );
462
+
463
+ /* make sure that pTurnSocketConnection has been removed from connection listener's list */
464
+ EXPECT_TRUE (connectionRemovedFromListener == TRUE );
465
+
372
466
freeTestTurnConnection ();
373
467
}
374
468
0 commit comments