github.com/pion/webrtc/v4@v4.0.1/ortc_datachannel_test.go (about)

     1  // SPDX-FileCopyrightText: 2023 The Pion community <https://pion.ly>
     2  // SPDX-License-Identifier: MIT
     3  
     4  //go:build !js
     5  // +build !js
     6  
     7  package webrtc
     8  
     9  import (
    10  	"io"
    11  	"testing"
    12  	"time"
    13  
    14  	"github.com/pion/transport/v3/test"
    15  	"github.com/stretchr/testify/assert"
    16  )
    17  
    18  func TestDataChannel_ORTC_SCTPTransport(t *testing.T) {
    19  	lim := test.TimeOut(time.Second * 20)
    20  	defer lim.Stop()
    21  
    22  	report := test.CheckRoutines(t)
    23  	defer report()
    24  
    25  	stackA, stackB, err := newORTCPair()
    26  	assert.NoError(t, err)
    27  
    28  	getSelectedCandidatePairErrChan := make(chan error)
    29  	stackB.sctp.OnDataChannel(func(d *DataChannel) {
    30  		_, getSelectedCandidatePairErr := d.Transport().Transport().ICETransport().GetSelectedCandidatePair()
    31  		getSelectedCandidatePairErrChan <- getSelectedCandidatePairErr
    32  	})
    33  
    34  	assert.NoError(t, signalORTCPair(stackA, stackB))
    35  
    36  	var id uint16 = 1
    37  	_, err = stackA.api.NewDataChannel(stackA.sctp, &DataChannelParameters{
    38  		Label: "Foo",
    39  		ID:    &id,
    40  	})
    41  	assert.NoError(t, err)
    42  
    43  	assert.NoError(t, <-getSelectedCandidatePairErrChan)
    44  	assert.NoError(t, stackA.close())
    45  	assert.NoError(t, stackB.close())
    46  }
    47  
    48  func TestDataChannel_ORTCE2E(t *testing.T) {
    49  	lim := test.TimeOut(time.Second * 20)
    50  	defer lim.Stop()
    51  
    52  	report := test.CheckRoutines(t)
    53  	defer report()
    54  
    55  	stackA, stackB, err := newORTCPair()
    56  	assert.NoError(t, err)
    57  
    58  	awaitSetup := make(chan struct{})
    59  	awaitString := make(chan struct{})
    60  	awaitBinary := make(chan struct{})
    61  	stackB.sctp.OnDataChannel(func(d *DataChannel) {
    62  		close(awaitSetup)
    63  
    64  		d.OnMessage(func(msg DataChannelMessage) {
    65  			if msg.IsString {
    66  				close(awaitString)
    67  			} else {
    68  				close(awaitBinary)
    69  			}
    70  		})
    71  	})
    72  
    73  	assert.NoError(t, signalORTCPair(stackA, stackB))
    74  
    75  	var id uint16 = 1
    76  	dcParams := &DataChannelParameters{
    77  		Label: "Foo",
    78  		ID:    &id,
    79  	}
    80  	channelA, err := stackA.api.NewDataChannel(stackA.sctp, dcParams)
    81  	assert.NoError(t, err)
    82  
    83  	<-awaitSetup
    84  
    85  	assert.NoError(t, channelA.SendText("ABC"))
    86  	assert.NoError(t, channelA.Send([]byte("ABC")))
    87  
    88  	<-awaitString
    89  	<-awaitBinary
    90  
    91  	assert.NoError(t, stackA.close())
    92  	assert.NoError(t, stackB.close())
    93  
    94  	// attempt to send when channel is closed
    95  	assert.ErrorIs(t, channelA.Send([]byte("ABC")), io.ErrClosedPipe)
    96  	assert.ErrorIs(t, channelA.SendText("test"), io.ErrClosedPipe)
    97  	assert.ErrorIs(t, channelA.ensureOpen(), io.ErrClosedPipe)
    98  }