@ -8,7 +8,7 @@ import (
"fmt"
"fmt"
"strings"
"strings"
"testing"
"testing"
"t ime "
"t esting/synctest "
"tailscale.com/util/eventbus"
"tailscale.com/util/eventbus"
"tailscale.com/util/eventbus/eventbustest"
"tailscale.com/util/eventbus/eventbustest"
@ -110,26 +110,23 @@ func TestExpectFilter(t *testing.T) {
for _ , tt := range tests {
for _ , tt := range tests {
t . Run ( tt . name , func ( t * testing . T ) {
t . Run ( tt . name , func ( t * testing . T ) {
synctest . Test ( t , func ( t * testing . T ) {
bus := eventbustest . NewBus ( t )
bus := eventbustest . NewBus ( t )
t . Cleanup ( bus . Close )
if * doDebug {
if * doDebug {
eventbustest . LogAllEvents ( t , bus )
eventbustest . LogAllEvents ( t , bus )
}
}
tw := eventbustest . NewWatcher ( t , bus )
tw := eventbustest . NewWatcher ( t , bus )
// TODO(cmol): When synctest is out of experimental, use that instead:
// https://go.dev/blog/synctest
tw . TimeOut = 10 * time . Millisecond
client := bus . Client ( "testClient" )
client := bus . Client ( "testClient" )
defer client . Close ( )
updater := eventbus . Publish [ EventFoo ] ( client )
updater := eventbus . Publish [ EventFoo ] ( client )
for _ , i := range tt . events {
for _ , i := range tt . events {
updater . Publish ( EventFoo { i } )
updater . Publish ( EventFoo { i } )
}
}
synctest . Wait ( )
if err := eventbustest . Expect ( tw , tt . expectFunc ) ; err != nil {
if err := eventbustest . Expect ( tw , tt . expectFunc ) ; err != nil {
if tt . wantErr == "" {
if tt . wantErr == "" {
t . Errorf ( "Expect[EventFoo]: unexpected error: %v" , err )
t . Errorf ( "Expect[EventFoo]: unexpected error: %v" , err )
@ -142,6 +139,7 @@ func TestExpectFilter(t *testing.T) {
t . Errorf ( "Expect[EventFoo]: unexpectedly succeeded, want error %q" , tt . wantErr )
t . Errorf ( "Expect[EventFoo]: unexpectedly succeeded, want error %q" , tt . wantErr )
}
}
} )
} )
} )
}
}
}
}
@ -244,38 +242,36 @@ func TestExpectEvents(t *testing.T) {
for _ , tt := range tests {
for _ , tt := range tests {
t . Run ( tt . name , func ( t * testing . T ) {
t . Run ( tt . name , func ( t * testing . T ) {
synctest . Test ( t , func ( t * testing . T ) {
bus := eventbustest . NewBus ( t )
bus := eventbustest . NewBus ( t )
t . Cleanup ( bus . Close )
tw := eventbustest . NewWatcher ( t , bus )
tw := eventbustest . NewWatcher ( t , bus )
// TODO(cmol): When synctest is out of experimental, use that instead:
// https://go.dev/blog/synctest
tw . TimeOut = 100 * time . Millisecond
client := bus . Client ( "testClient" )
client := bus . Client ( "testClient" )
defer client . Close ( )
updaterFoo := eventbus . Publish [ EventFoo ] ( client )
updaterFoo := eventbus . Publish [ EventFoo ] ( client )
updaterBar := eventbus . Publish [ EventBar ] ( client )
updaterBar := eventbus . Publish [ EventBar ] ( client )
updaterBaz := eventbus . Publish [ EventBaz ] ( client )
updaterBaz := eventbus . Publish [ EventBaz ] ( client )
for _ , ev := range tt . events {
for _ , ev := range tt . events {
switch ev . ( type ) {
switch ev := ev . ( type ) {
case EventFoo :
case EventFoo :
evCast := ev . ( EventFoo )
evCast := ev
updaterFoo . Publish ( evCast )
updaterFoo . Publish ( evCast )
case EventBar :
case EventBar :
evCast := ev . ( EventBar )
evCast := ev
updaterBar . Publish ( evCast )
updaterBar . Publish ( evCast )
case EventBaz :
case EventBaz :
evCast := ev . ( EventBaz )
evCast := ev
updaterBaz . Publish ( evCast )
updaterBaz . Publish ( evCast )
}
}
}
}
synctest . Wait ( )
if err := eventbustest . Expect ( tw , tt . expectEvents ... ) ; ( err != nil ) != tt . wantErr {
if err := eventbustest . Expect ( tw , tt . expectEvents ... ) ; ( err != nil ) != tt . wantErr {
t . Errorf ( "ExpectEvents: error = %v, wantErr %v" , err , tt . wantErr )
t . Errorf ( "ExpectEvents: error = %v, wantErr %v" , err , tt . wantErr )
}
}
} )
} )
} )
}
}
}
}
@ -378,37 +374,35 @@ func TestExpectExactlyEventsFilter(t *testing.T) {
for _ , tt := range tests {
for _ , tt := range tests {
t . Run ( tt . name , func ( t * testing . T ) {
t . Run ( tt . name , func ( t * testing . T ) {
synctest . Test ( t , func ( t * testing . T ) {
bus := eventbustest . NewBus ( t )
bus := eventbustest . NewBus ( t )
t . Cleanup ( bus . Close )
tw := eventbustest . NewWatcher ( t , bus )
tw := eventbustest . NewWatcher ( t , bus )
// TODO(cmol): When synctest is out of experimental, use that instead:
// https://go.dev/blog/synctest
tw . TimeOut = 10 * time . Millisecond
client := bus . Client ( "testClient" )
client := bus . Client ( "testClient" )
defer client . Close ( )
updaterFoo := eventbus . Publish [ EventFoo ] ( client )
updaterFoo := eventbus . Publish [ EventFoo ] ( client )
updaterBar := eventbus . Publish [ EventBar ] ( client )
updaterBar := eventbus . Publish [ EventBar ] ( client )
updaterBaz := eventbus . Publish [ EventBaz ] ( client )
updaterBaz := eventbus . Publish [ EventBaz ] ( client )
for _ , ev := range tt . events {
for _ , ev := range tt . events {
switch ev . ( type ) {
switch ev := ev . ( type ) {
case EventFoo :
case EventFoo :
evCast := ev . ( EventFoo )
evCast := ev
updaterFoo . Publish ( evCast )
updaterFoo . Publish ( evCast )
case EventBar :
case EventBar :
evCast := ev . ( EventBar )
evCast := ev
updaterBar . Publish ( evCast )
updaterBar . Publish ( evCast )
case EventBaz :
case EventBaz :
evCast := ev . ( EventBaz )
evCast := ev
updaterBaz . Publish ( evCast )
updaterBaz . Publish ( evCast )
}
}
}
}
synctest . Wait ( )
if err := eventbustest . ExpectExactly ( tw , tt . expectEvents ... ) ; ( err != nil ) != tt . wantErr {
if err := eventbustest . ExpectExactly ( tw , tt . expectEvents ... ) ; ( err != nil ) != tt . wantErr {
t . Errorf ( "ExpectEvents: error = %v, wantErr %v" , err , tt . wantErr )
t . Errorf ( "ExpectEvents: error = %v, wantErr %v" , err , tt . wantErr )
}
}
} )
} )
} )
}
}
}
}