Fix race in tests

pull/502/head
Philipp Heckel 2022-11-16 10:44:10 -05:00
parent 497f871447
commit e147a41f92
1 changed files with 13 additions and 7 deletions

View File

@ -1,40 +1,46 @@
package util_test package util_test
import ( import (
"fmt"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"heckel.io/ntfy/util" "heckel.io/ntfy/util"
"math/rand" "math/rand"
"sync"
"testing" "testing"
"time" "time"
) )
func TestBatchingQueue_InfTimeout(t *testing.T) { func TestBatchingQueue_InfTimeout(t *testing.T) {
q := util.NewBatchingQueue[int](25, 1*time.Hour) q := util.NewBatchingQueue[int](25, 1*time.Hour)
batches := make([][]int, 0) batches, total := make([][]int, 0), 0
total := 0 var mu sync.Mutex
go func() { go func() {
for batch := range q.Dequeue() { for batch := range q.Dequeue() {
mu.Lock()
batches = append(batches, batch) batches = append(batches, batch)
total += len(batch) total += len(batch)
mu.Unlock()
} }
}() }()
for i := 0; i < 101; i++ { for i := 0; i < 101; i++ {
go q.Enqueue(i) go q.Enqueue(i)
} }
time.Sleep(500 * time.Millisecond) time.Sleep(500 * time.Millisecond)
mu.Lock()
require.Equal(t, 100, total) // One is missing, stuck in the last batch! require.Equal(t, 100, total) // One is missing, stuck in the last batch!
require.Equal(t, 4, len(batches)) require.Equal(t, 4, len(batches))
mu.Unlock()
} }
func TestBatchingQueue_WithTimeout(t *testing.T) { func TestBatchingQueue_WithTimeout(t *testing.T) {
q := util.NewBatchingQueue[int](25, 100*time.Millisecond) q := util.NewBatchingQueue[int](25, 100*time.Millisecond)
batches := make([][]int, 0) batches, total := make([][]int, 0), 0
total := 0 var mu sync.Mutex
go func() { go func() {
for batch := range q.Dequeue() { for batch := range q.Dequeue() {
mu.Lock()
batches = append(batches, batch) batches = append(batches, batch)
total += len(batch) total += len(batch)
mu.Unlock()
} }
}() }()
for i := 0; i < 101; i++ { for i := 0; i < 101; i++ {
@ -44,9 +50,9 @@ func TestBatchingQueue_WithTimeout(t *testing.T) {
}(i) }(i)
} }
time.Sleep(time.Second) time.Sleep(time.Second)
fmt.Println(len(batches)) mu.Lock()
fmt.Println(batches)
require.Equal(t, 101, total) require.Equal(t, 101, total)
require.True(t, len(batches) > 4) // 101/25 require.True(t, len(batches) > 4) // 101/25
require.True(t, len(batches) < 21) require.True(t, len(batches) < 21)
mu.Unlock()
} }