package gubgub import ( "context" "testing" "github.com/stretchr/testify/require" ) func BenchmarkAsyncTopic_Publish(b *testing.B) { for _, tc := range publishCases { b.Run(tc.Name, func(b *testing.B) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() subscribersReady := make(chan struct{}, 1) defer close(subscribersReady) topicClosed := make(chan struct{}, 1) defer close(topicClosed) topic := NewAsyncTopic[int](ctx, WithOnSubscribe(func(count int) { if count == tc.Count { subscribersReady <- struct{}{} } }), WithOnClose(func() { topicClosed <- struct{}{} }), ) for range tc.Count { require.NoError(b, topic.Subscribe(tc.Subscriber)) } <-subscribersReady b.ResetTimer() for i := range b.N { _ = topic.Publish(i) } b.StopTimer() cancel() // This just helps leaving as few running Go routines as possible when the next round starts <-topicClosed }) } }