@ -8,7 +8,7 @@ import (
"fmt"
"strings"
"testing"
"t ime "
"t esting/synctest "
"tailscale.com/util/eventbus"
"tailscale.com/util/eventbus/eventbustest"
@ -110,37 +110,35 @@ func TestExpectFilter(t *testing.T) {
for _ , tt := range tests {
t . Run ( tt . name , func ( t * testing . T ) {
bus := eventbustest . NewBus ( t )
t . Cleanup ( bus . Close )
synctest. Test ( t , func ( t * testing . T ) {
bus := eventbustest . NewBus ( t )
if * doDebug {
eventbustest . LogAllEvents ( t , bus )
}
tw := eventbustest . NewWatcher ( t , bus )
if * doDebug {
eventbustest . LogAllEvents ( 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" )
updater := eventbus . Publish [ EventFoo ] ( client )
client := bus . Client ( "testClient" )
defer client . Close ( )
updater := eventbus . Publish [ EventFoo ] ( client )
for _ , i := range tt . events {
updater . Publish ( EventFoo { i } )
}
for _ , i := range tt . events {
updater . Publish ( EventFoo { i } )
}
synctest . Wait ( )
if err := eventbustest . Expect ( tw , tt . expectFunc ) ; err != nil {
if tt . wantErr == "" {
t . Errorf ( "Expect[EventFoo]: unexpected error: %v" , err )
} else if ! strings . Contains ( err . Error ( ) , tt . wantErr ) {
t . Errorf ( "Expect[EventFoo]: err = %v, want %q" , err , tt . wantErr )
} else {
t . Logf ( "Got expected error: %v (OK)" , err )
if err := eventbustest . Expect ( tw , tt . expectFunc ) ; err != nil {
if tt . wantErr == "" {
t . Errorf ( "Expect[EventFoo]: unexpected error: %v" , err )
} else if ! strings . Contains ( err . Error ( ) , tt . wantErr ) {
t . Errorf ( "Expect[EventFoo]: err = %v, want %q" , err , tt . wantErr )
} else {
t . Logf ( "Got expected error: %v (OK)" , err )
}
} else if tt . wantErr != "" {
t . Errorf ( "Expect[EventFoo]: unexpectedly succeeded, want error %q" , tt . wantErr )
}
} else if tt . wantErr != "" {
t . Errorf ( "Expect[EventFoo]: unexpectedly succeeded, want error %q" , tt . wantErr )
}
} )
} )
}
}
@ -244,37 +242,35 @@ func TestExpectEvents(t *testing.T) {
for _ , tt := range tests {
t . Run ( tt . name , func ( t * testing . T ) {
bus := eventbustest . NewBus ( t )
t . Cleanup ( bus . Close )
synctest. Test ( t , func ( t * testing . T ) {
bus := eventbustest . NewBus ( t )
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
tw := eventbustest . NewWatcher ( t , bus )
client := bus . Client ( "testClient" )
defer client . Close ( )
updaterFoo := eventbus . Publish [ EventFoo ] ( client )
updaterBar := eventbus . Publish [ EventBar ] ( client )
updaterBaz := eventbus . Publish [ EventBaz ] ( client )
client := bus . Client ( "testClient" )
updaterFoo := eventbus . Publish [ EventFoo ] ( client )
updaterBar := eventbus . Publish [ EventBar ] ( client )
updaterBaz := eventbus . Publish [ EventBaz ] ( client )
for _ , ev := range tt . events {
switch ev . ( type ) {
case EventFoo :
evCast := ev . ( EventFoo )
updaterFoo . Publish ( evCast )
case EventBar :
evCast := ev . ( EventBar )
updaterBar . Publish ( evCast )
case EventBaz :
evCast := ev . ( EventBaz )
updaterBaz . Publish ( evCast )
for _ , ev := range tt . events {
switch ev := ev . ( type ) {
case EventFoo :
evCast := ev
updaterFoo . Publish ( evCast )
case EventBar :
evCast := ev
updaterBar . Publish ( evCast )
case EventBaz :
evCast := ev
updaterBaz . Publish ( evCast )
}
}
}
if err := eventbustest . Expect ( tw , tt . expectEvents ... ) ; ( err != nil ) != tt . wantErr {
t . Errorf ( "ExpectEvents: error = %v, wantErr %v" , err , tt . wantErr )
}
synctest . Wait ( )
if err := eventbustest . Expect ( tw , tt . expectEvents ... ) ; ( err != nil ) != 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 {
t . Run ( tt . name , func ( t * testing . T ) {
bus := eventbustest . NewBus ( t )
t . Cleanup ( bus . Close )
synctest. Test ( t , func ( t * testing . T ) {
bus := eventbustest . NewBus ( t )
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
tw := eventbustest . NewWatcher ( t , bus )
client := bus . Client ( "testClient" )
defer client . Close ( )
updaterFoo := eventbus . Publish [ EventFoo ] ( client )
updaterBar := eventbus . Publish [ EventBar ] ( client )
updaterBaz := eventbus . Publish [ EventBaz ] ( client )
client := bus . Client ( "testClient" )
updaterFoo := eventbus . Publish [ EventFoo ] ( client )
updaterBar := eventbus . Publish [ EventBar ] ( client )
updaterBaz := eventbus . Publish [ EventBaz ] ( client )
for _ , ev := range tt . events {
switch ev . ( type ) {
case EventFoo :
evCast := ev . ( EventFoo )
updaterFoo . Publish ( evCast )
case EventBar :
evCast := ev . ( EventBar )
updaterBar . Publish ( evCast )
case EventBaz :
evCast := ev . ( EventBaz )
updaterBaz . Publish ( evCast )
for _ , ev := range tt . events {
switch ev := ev . ( type ) {
case EventFoo :
evCast := ev
updaterFoo . Publish ( evCast )
case EventBar :
evCast := ev
updaterBar . Publish ( evCast )
case EventBaz :
evCast := ev
updaterBaz . Publish ( evCast )
}
}
}
if err := eventbustest . ExpectExactly ( tw , tt . expectEvents ... ) ; ( err != nil ) != tt . wantErr {
t . Errorf ( "ExpectEvents: error = %v, wantErr %v" , err , tt . wantErr )
}
synctest . Wait ( )
if err := eventbustest . ExpectExactly ( tw , tt . expectEvents ... ) ; ( err != nil ) != tt . wantErr {
t . Errorf ( "ExpectEvents: error = %v, wantErr %v" , err , tt . wantErr )
}
} )
} )
}
}