Clash.Meta/common/observable/observable_test.go

116 lines
2.1 KiB
Go
Raw Normal View History

2018-06-10 22:50:03 +08:00
package observable
import (
"sync"
2020-07-18 20:56:13 +08:00
"sync/atomic"
2018-06-10 22:50:03 +08:00
"testing"
"time"
"github.com/stretchr/testify/assert"
2018-06-10 22:50:03 +08:00
)
func iterator(item []interface{}) chan interface{} {
ch := make(chan interface{})
go func() {
time.Sleep(100 * time.Millisecond)
for _, elm := range item {
ch <- elm
}
close(ch)
}()
return ch
}
func TestObservable(t *testing.T) {
iter := iterator([]interface{}{1, 2, 3, 4, 5})
src := NewObservable(iter)
data, err := src.Subscribe()
assert.Nil(t, err)
2018-06-10 22:50:03 +08:00
count := 0
for range data {
2019-10-14 17:13:23 +08:00
count++
2018-06-10 22:50:03 +08:00
}
assert.Equal(t, count, 5)
2018-06-10 22:50:03 +08:00
}
func TestObservable_MutilSubscribe(t *testing.T) {
iter := iterator([]interface{}{1, 2, 3, 4, 5})
src := NewObservable(iter)
ch1, _ := src.Subscribe()
ch2, _ := src.Subscribe()
2020-07-18 20:56:13 +08:00
var count int32
2018-06-10 22:50:03 +08:00
var wg sync.WaitGroup
wg.Add(2)
waitCh := func(ch <-chan interface{}) {
for range ch {
2020-07-18 20:56:13 +08:00
atomic.AddInt32(&count, 1)
2018-06-10 22:50:03 +08:00
}
wg.Done()
}
go waitCh(ch1)
go waitCh(ch2)
wg.Wait()
2020-07-18 20:56:13 +08:00
assert.Equal(t, int32(10), count)
2018-06-10 22:50:03 +08:00
}
func TestObservable_UnSubscribe(t *testing.T) {
iter := iterator([]interface{}{1, 2, 3, 4, 5})
src := NewObservable(iter)
data, err := src.Subscribe()
assert.Nil(t, err)
2018-06-10 22:50:03 +08:00
src.UnSubscribe(data)
_, open := <-data
assert.False(t, open)
2018-06-10 22:50:03 +08:00
}
func TestObservable_SubscribeClosedSource(t *testing.T) {
iter := iterator([]interface{}{1})
src := NewObservable(iter)
data, _ := src.Subscribe()
<-data
_, closed := src.Subscribe()
assert.NotNil(t, closed)
}
func TestObservable_UnSubscribeWithNotExistSubscription(t *testing.T) {
sub := Subscription(make(chan interface{}))
iter := iterator([]interface{}{1})
src := NewObservable(iter)
src.UnSubscribe(sub)
}
2018-06-10 22:50:03 +08:00
func TestObservable_SubscribeGoroutineLeak(t *testing.T) {
iter := iterator([]interface{}{1, 2, 3, 4, 5})
src := NewObservable(iter)
max := 100
var list []Subscription
for i := 0; i < max; i++ {
ch, _ := src.Subscribe()
list = append(list, ch)
}
var wg sync.WaitGroup
wg.Add(max)
waitCh := func(ch <-chan interface{}) {
for range ch {
2018-06-10 22:50:03 +08:00
}
wg.Done()
}
for _, ch := range list {
go waitCh(ch)
}
wg.Wait()
2020-07-18 20:56:13 +08:00
for _, sub := range list {
_, more := <-sub
assert.False(t, more)
}
_, more := <-list[0]
assert.False(t, more)
2018-06-10 22:50:03 +08:00
}