@@ -745,3 +745,80 @@ func TestDetachRemovesDatachannelReference(t *testing.T) {
745745 }
746746 }
747747}
748+
749+ func TestDataChannelClose (t * testing.T ) {
750+ // Test if onClose is fired for self and remote after Close is called
751+ t .Run ("close open channels" , func (t * testing.T ) {
752+ options := & DataChannelInit {}
753+
754+ offerPC , answerPC , dc , done := setUpDataChannelParametersTest (t , options )
755+
756+ answerPC .OnDataChannel (func (dataChannel * DataChannel ) {
757+ // Make sure this is the data channel we were looking for. (Not the one
758+ // created in signalPair).
759+ if dataChannel .Label () != expectedLabel {
760+ return
761+ }
762+
763+ dataChannel .OnOpen (func () {
764+ assert .NoError (t , dataChannel .Close ())
765+ })
766+
767+ dataChannel .OnClose (func () {
768+ done <- true
769+ })
770+ })
771+
772+ dc .OnClose (func () {
773+ done <- true
774+ })
775+
776+ assert .NoError (t , signalPair (offerPC , answerPC ))
777+
778+ // Offer and Answer OnClose
779+ <- done
780+ <- done
781+
782+ assert .NoError (t , offerPC .Close ())
783+ assert .NoError (t , answerPC .Close ())
784+ })
785+
786+ // Test if OnClose is fired for self and remote after Close is called on non-established channel
787+ // https://github.com/pion/webrtc/issues/2659
788+ t .Run ("Close connecting channels" , func (t * testing.T ) {
789+ options := & DataChannelInit {}
790+
791+ offerPC , answerPC , dc , done := setUpDataChannelParametersTest (t , options )
792+
793+ answerPC .OnDataChannel (func (dataChannel * DataChannel ) {
794+ // Make sure this is the data channel we were looking for. (Not the one
795+ // created in signalPair).
796+ if dataChannel .Label () != expectedLabel {
797+ return
798+ }
799+
800+ dataChannel .OnOpen (func () {
801+ t .Fatal ("OnOpen must not be fired after we call Close" )
802+ })
803+
804+ dataChannel .OnClose (func () {
805+ done <- true
806+ })
807+
808+ assert .NoError (t , dataChannel .Close ())
809+ })
810+
811+ dc .OnClose (func () {
812+ done <- true
813+ })
814+
815+ assert .NoError (t , signalPair (offerPC , answerPC ))
816+
817+ // Offer and Answer OnClose
818+ <- done
819+ <- done
820+
821+ assert .NoError (t , offerPC .Close ())
822+ assert .NoError (t , answerPC .Close ())
823+ })
824+ }
0 commit comments