7a04f298d2
- update to latest telegram layer - remove some references to fields in tg.Entities that don't exist in the schema - originally added here: https://github.com/beeper/td/commit/820929062a2ba0104397bc01235ab58a9cff780e - referenced here - https://github.com/mautrix/telegramgo/commit/124f0967ed195b5a380c9bd02e170ada9710dde3 - https://github.com/mautrix/telegramgo/commit/4205047aab2e0639217148b5d125bfaab668bd8e
110 lines
1.7 KiB
Go
110 lines
1.7 KiB
Go
package tdsync
|
|
|
|
import (
|
|
"sync"
|
|
"testing"
|
|
)
|
|
|
|
func TestResetReady(t *testing.T) {
|
|
t.Run("Ready", func(t *testing.T) {
|
|
r := NewResetReady()
|
|
|
|
wait := make(chan struct{})
|
|
wg := &sync.WaitGroup{}
|
|
wg.Add(1)
|
|
go func() {
|
|
defer wg.Done()
|
|
<-r.Ready()
|
|
<-r.Ready()
|
|
close(wait)
|
|
}()
|
|
|
|
// Check that Ready can be called multiple times
|
|
// from different threads.
|
|
wg.Add(1)
|
|
go func() {
|
|
defer wg.Done()
|
|
<-r.Ready()
|
|
<-r.Ready()
|
|
}()
|
|
|
|
// Check that Signal can be called multiple times
|
|
// from different threads.
|
|
wg.Add(1)
|
|
go func() {
|
|
defer wg.Done()
|
|
<-wait
|
|
r.Signal()
|
|
}()
|
|
|
|
// Check Signal call logic.
|
|
wg.Add(1)
|
|
go func() {
|
|
defer wg.Done()
|
|
r.Signal()
|
|
r.Signal()
|
|
<-wait
|
|
}()
|
|
|
|
wg.Wait()
|
|
})
|
|
|
|
checkNoSignal := func(t *testing.T, r *ResetReady) {
|
|
select {
|
|
case <-r.Ready():
|
|
t.Error("unexpected signal")
|
|
default:
|
|
}
|
|
}
|
|
|
|
t.Run("Reset", func(t *testing.T) {
|
|
t.Run("Zero", func(t *testing.T) {
|
|
r := NewResetReady()
|
|
checkNoSignal(t, r)
|
|
|
|
acquire := make(chan struct{})
|
|
release := make(chan struct{})
|
|
go func() {
|
|
close(acquire)
|
|
<-r.Ready()
|
|
close(release)
|
|
}()
|
|
|
|
<-acquire
|
|
r.Reset()
|
|
<-release
|
|
checkNoSignal(t, r)
|
|
})
|
|
|
|
t.Run("NoSignal", func(t *testing.T) {
|
|
r := NewResetReady()
|
|
checkNoSignal(t, r)
|
|
r.Reset()
|
|
checkNoSignal(t, r)
|
|
})
|
|
|
|
t.Run("Signal", func(t *testing.T) {
|
|
r := NewResetReady()
|
|
|
|
wait := make(chan struct{})
|
|
wg := &sync.WaitGroup{}
|
|
wg.Add(1)
|
|
go func() {
|
|
defer wg.Done()
|
|
<-r.Ready()
|
|
close(wait)
|
|
}()
|
|
wg.Add(1)
|
|
go func() {
|
|
defer wg.Done()
|
|
r.Signal()
|
|
<-wait
|
|
}()
|
|
|
|
wg.Wait()
|
|
r.Reset()
|
|
checkNoSignal(t, r)
|
|
})
|
|
})
|
|
}
|