Files
mediadevices/pkg/driver/manager_test.go

115 lines
3.2 KiB
Go

package driver
import (
"github.com/pion/mediadevices/pkg/io/audio"
"github.com/pion/mediadevices/pkg/io/video"
"github.com/pion/mediadevices/pkg/prop"
"github.com/stretchr/testify/assert"
"testing"
)
func filterTrue(_ Driver) bool {
return true
}
func filterFalse(_ Driver) bool {
return false
}
func TestFilterNot(t *testing.T) {
if FilterNot(filterTrue)(nil) != false {
t.Error("FilterNot(filterTrue)() must be false")
}
if FilterNot(filterFalse)(nil) != true {
t.Error("FilterNot(filterFalse)() must be true")
}
}
func TestFilterAnd(t *testing.T) {
if FilterAnd(filterTrue, filterTrue)(nil) != true {
t.Error("FilterAnd(filterTrue, filterTrue)() must be true")
}
if FilterAnd(filterTrue, filterFalse)(nil) != false {
t.Error("FilterAnd(filterTrue, filterFalse)() must be false")
}
if FilterAnd(filterFalse, filterTrue)(nil) != false {
t.Error("FilterAnd(filterFalse, filterTrue)() must be false")
}
if FilterAnd(filterFalse, filterFalse)(nil) != false {
t.Error("FilterAnd(filterFalse, filterFalse)() must be false")
}
if FilterAnd(filterFalse, filterTrue, filterTrue)(nil) != false {
t.Error("FilterAnd(filterFalse, filterTrue, filterTrue)() must be false")
}
if FilterAnd(filterTrue, filterTrue, filterTrue)(nil) != true {
t.Error("FilterAnd(filterTrue, filterTrue, filterTrue)() must be true")
}
}
type fakeVideoAdapter struct{}
func (a *fakeVideoAdapter) Open() error { return nil }
func (a *fakeVideoAdapter) Close() error { return nil }
func (a *fakeVideoAdapter) Properties() []prop.Media { return nil }
func (a *fakeVideoAdapter) VideoRecord(_ prop.Media) (r video.Reader, err error) { return nil, nil }
type fakeAudioAdapter struct{}
func (a *fakeAudioAdapter) Open() error { return nil }
func (a *fakeAudioAdapter) Close() error { return nil }
func (a *fakeAudioAdapter) Properties() []prop.Media { return nil }
func (a *fakeAudioAdapter) AudioRecord(_ prop.Media) (r audio.Reader, err error) { return nil, nil }
type fakeAdapter struct{}
func (a *fakeAdapter) Open() error { return nil }
func (a *fakeAdapter) Close() error { return nil }
func (a *fakeAdapter) Properties() []prop.Media { return nil }
func TestRegister(t *testing.T) {
m := GetManager()
va := &fakeVideoAdapter{}
err := m.Register(va, Info{})
assert.NoError(t, err, "cannot register video adapter")
assert.Equal(t, len(m.Query(filterTrue)), 1)
aa := &fakeAudioAdapter{}
err = m.Register(aa, Info{})
assert.NoError(t, err, "cannot register audio adapter")
assert.Equal(t, len(m.Query(filterTrue)), 2)
a := &fakeAdapter{}
assert.Panics(t, func() { m.Register(a, Info{}) }, "should not register adapter that is neither audio nor video")
assert.Equal(t, len(m.Query(filterTrue)), 2)
}
func TestRegisterSync(t *testing.T) {
m := GetManager()
start := make(chan struct{})
race := func() {
<-start
assert.NoError(t, m.Register(&fakeVideoAdapter{}, Info{}))
}
go race()
go race()
close(start)
}
func TestQuerySync(t *testing.T) {
m := GetManager()
start := make(chan struct{})
race := func() {
<-start
m.Query(filterTrue)
}
go race()
go race()
close(start)
// write while reading
assert.NoError(t, m.Register(&fakeVideoAdapter{}, Info{}))
}