diff --git a/datachannel.go b/datachannel.go index 52de821b7e5..ea50a031feb 100644 --- a/datachannel.go +++ b/datachannel.go @@ -464,10 +464,12 @@ func (d *DataChannel) DetachWithDeadline() (datachannel.ReadWriteCloserDeadliner d.mu.Lock() if !d.api.settingEngine.detach.DataChannels { + d.mu.Unlock() return nil, errDetachNotEnabled } if d.dataChannel == nil { + d.mu.Unlock() return nil, errDetachBeforeOpened } diff --git a/datachannel_go_test.go b/datachannel_go_test.go index 88d9fb36986..bee388f09f4 100644 --- a/datachannel_go_test.go +++ b/datachannel_go_test.go @@ -822,3 +822,30 @@ func TestDataChannelClose(t *testing.T) { assert.NoError(t, answerPC.Close()) }) } + +func TestDataChannel_DetachErrors(t *testing.T) { + t.Run("error errDetachNotEnabled", func(t *testing.T) { + s := SettingEngine{} + offer, answer, err := NewAPI(WithSettingEngine(s)).newPair(Configuration{}) + assert.NoError(t, err) + dc, err := offer.CreateDataChannel("data", nil) + assert.NoError(t, err) + _, err = dc.Detach() + assert.ErrorIs(t, err, errDetachNotEnabled) + assert.NoError(t, offer.Close()) + assert.NoError(t, answer.Close()) + }) + + t.Run("error errDetachBeforeOpened", func(t *testing.T) { + s := SettingEngine{} + s.DetachDataChannels() + offer, answer, err := NewAPI(WithSettingEngine(s)).newPair(Configuration{}) + assert.NoError(t, err) + dc, err := offer.CreateDataChannel("data", nil) + assert.NoError(t, err) + _, err = dc.Detach() + assert.ErrorIs(t, err, errDetachBeforeOpened) + assert.NoError(t, offer.Close()) + assert.NoError(t, answer.Close()) + }) +}