Skip to content

Commit 822e734

Browse files
authored
Merge pull request #9 from RaduBerinde/require
testutils: add require library
2 parents f2ca848 + 499edc6 commit 822e734

File tree

12 files changed

+509
-110
lines changed

12 files changed

+509
-110
lines changed

crencoding/var_int_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,19 @@ import (
1919
"math"
2020
"math/rand/v2"
2121
"testing"
22+
23+
"github.com/cockroachdb/crlib/testutils/require"
2224
)
2325

2426
// TestUvarintLen tests UvarintLen32 and UvarintLen64.
2527
func TestUvarintLen(t *testing.T) {
2628
check := func(n uint64) {
29+
t := require.WithMsgf(t, "n=%d", n)
2730
res64 := UvarintLen64(n)
28-
if expected := len(binary.AppendUvarint(nil, n)); res64 != expected {
29-
t.Fatalf("invalid result for %d: %d instead of %d", n, res64, expected)
30-
}
31+
require.Equal(t, res64, len(binary.AppendUvarint(nil, n)))
32+
3133
res32 := UvarintLen32(uint32(n))
32-
if expected := len(binary.AppendUvarint(nil, uint64(uint32(n)))); res32 != expected {
33-
t.Fatalf("invalid result for %d: %d instead of %d", n, res32, expected)
34-
}
34+
require.Equal(t, res32, len(binary.AppendUvarint(nil, uint64(uint32(n)))))
3535
}
3636
check(0)
3737
check(math.MaxUint64)

crstrings/utils_test.go

Lines changed: 24 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ import (
1818
"fmt"
1919
"strings"
2020
"testing"
21+
22+
"github.com/cockroachdb/crlib/testutils/require"
2123
)
2224

2325
type num int
@@ -28,56 +30,49 @@ func (n num) String() string {
2830

2931
func TestJoinStringers(t *testing.T) {
3032
nums := []num{0, 1, 2, 3}
31-
expect(t, "", JoinStringers(", ", nums[:0]...))
32-
expect(t, "000", JoinStringers(", ", nums[0]))
33-
expect(t, "000, 001", JoinStringers(", ", nums[0], nums[1]))
34-
expect(t, "000, 001, 002, 003", JoinStringers(", ", nums...))
33+
require.Equal(t, "", JoinStringers(", ", nums[:0]...))
34+
require.Equal(t, "000", JoinStringers(", ", nums[0]))
35+
require.Equal(t, "000, 001", JoinStringers(", ", nums[0], nums[1]))
36+
require.Equal(t, "000, 001, 002, 003", JoinStringers(", ", nums...))
3537
}
3638

3739
func TestMapAndJoin(t *testing.T) {
3840
nums := []int{0, 1, 2, 3}
3941
fn := func(n int) string {
4042
return fmt.Sprintf("%d", n)
4143
}
42-
expect(t, "", MapAndJoin(fn, ", ", nums[:0]...))
43-
expect(t, "0", MapAndJoin(fn, ", ", nums[0]))
44-
expect(t, "0, 1", MapAndJoin(fn, ", ", nums[0], nums[1]))
45-
expect(t, "0, 1, 2, 3", MapAndJoin(fn, ", ", nums...))
46-
}
47-
48-
func expect(t *testing.T, expected, actual string) {
49-
t.Helper()
50-
if actual != expected {
51-
t.Errorf("expected %q got %q", expected, actual)
52-
}
44+
require.Equal(t, "", MapAndJoin(fn, ", ", nums[:0]...))
45+
require.Equal(t, "0", MapAndJoin(fn, ", ", nums[0]))
46+
require.Equal(t, "0, 1", MapAndJoin(fn, ", ", nums[0], nums[1]))
47+
require.Equal(t, "0, 1, 2, 3", MapAndJoin(fn, ", ", nums...))
5348
}
5449

5550
func TestIf(t *testing.T) {
56-
expect(t, "", If(false, "true"))
57-
expect(t, "true", If(true, "true"))
51+
require.Equal(t, "", If(false, "true"))
52+
require.Equal(t, "true", If(true, "true"))
5853
}
5954

6055
func TestIfElse(t *testing.T) {
61-
expect(t, "false", IfElse(false, "true", "false"))
62-
expect(t, "true", IfElse(true, "true", "false"))
56+
require.Equal(t, "false", IfElse(false, "true", "false"))
57+
require.Equal(t, "true", IfElse(true, "true", "false"))
6358
}
6459

6560
func TestWithSep(t *testing.T) {
66-
expect(t, "a,b", WithSep("a", ",", "b"))
67-
expect(t, "a", WithSep("a", ",", ""))
68-
expect(t, "b", WithSep("", ",", "b"))
61+
require.Equal(t, "a,b", WithSep("a", ",", "b"))
62+
require.Equal(t, "a", WithSep("a", ",", ""))
63+
require.Equal(t, "b", WithSep("", ",", "b"))
6964
}
7065

7166
func TestFilterEmpty(t *testing.T) {
7267
s := []string{"a", "", "b", "", "c", ""}
73-
expect(t, "a,b,c", strings.Join(FilterEmpty(s), ","))
68+
require.Equal(t, "a,b,c", strings.Join(FilterEmpty(s), ","))
7469
}
7570

7671
func TestLines(t *testing.T) {
77-
expect(t, `["a" "b" "c"]`, fmt.Sprintf("%q", Lines("a\nb\nc")))
78-
expect(t, `["a" "b" "c"]`, fmt.Sprintf("%q", Lines("a\nb\nc\n")))
79-
expect(t, `["a" "b" "c" ""]`, fmt.Sprintf("%q", Lines("a\nb\nc\n\n")))
80-
expect(t, `["" "a" "b" "c"]`, fmt.Sprintf("%q", Lines("\na\nb\nc\n")))
81-
expect(t, `[]`, fmt.Sprintf("%q", Lines("")))
82-
expect(t, `[]`, fmt.Sprintf("%q", Lines("\n")))
72+
require.Equal(t, `["a" "b" "c"]`, fmt.Sprintf("%q", Lines("a\nb\nc")))
73+
require.Equal(t, `["a" "b" "c"]`, fmt.Sprintf("%q", Lines("a\nb\nc\n")))
74+
require.Equal(t, `["a" "b" "c" ""]`, fmt.Sprintf("%q", Lines("a\nb\nc\n\n")))
75+
require.Equal(t, `["" "a" "b" "c"]`, fmt.Sprintf("%q", Lines("\na\nb\nc\n")))
76+
require.Equal(t, `[]`, fmt.Sprintf("%q", Lines("")))
77+
require.Equal(t, `[]`, fmt.Sprintf("%q", Lines("\n")))
8378
}

crtime/monotonic_test.go

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,17 @@ package crtime
1717
import (
1818
"testing"
1919
"time"
20+
21+
"github.com/cockroachdb/crlib/testutils/require"
2022
)
2123

2224
func TestMono(t *testing.T) {
2325
a := NowMono()
2426
time.Sleep(10 * time.Millisecond)
2527
b := NowMono()
26-
if delta := b.Sub(a); delta < 9*time.Millisecond {
27-
t.Errorf("expected 10+ms, got %s", delta)
28-
}
28+
require.GE(t, b.Sub(a), 9*time.Millisecond)
2929
c := MonoFromTime(time.Now())
3030
d := NowMono()
31-
if c < b || c > d {
32-
t.Errorf("expected %d <= %d <= %d", b, c, d)
33-
}
31+
require.LE(t, b, c)
32+
require.LE(t, c, d)
3433
}

fifo/queue_test.go

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,34 +17,36 @@ package fifo
1717
import (
1818
"math/rand"
1919
"testing"
20+
21+
"github.com/cockroachdb/crlib/testutils/require"
2022
)
2123

2224
var pool = MakeQueueBackingPool[int]()
2325

2426
func TestQueue(t *testing.T) {
2527
q := MakeQueue[int](&pool)
26-
requireEqual(t, q.PeekFront(), nil)
27-
requireEqual(t, q.Len(), 0)
28+
require.Equal(t, q.PeekFront(), nil)
29+
require.Equal(t, q.Len(), 0)
2830
q.PushBack(1)
2931
q.PushBack(2)
3032
q.PushBack(3)
31-
requireEqual(t, q.Len(), 3)
32-
requireEqual(t, *q.PeekFront(), 1)
33+
require.Equal(t, q.Len(), 3)
34+
require.Equal(t, *q.PeekFront(), 1)
3335
q.PopFront()
34-
requireEqual(t, *q.PeekFront(), 2)
36+
require.Equal(t, *q.PeekFront(), 2)
3537
q.PopFront()
36-
requireEqual(t, *q.PeekFront(), 3)
38+
require.Equal(t, *q.PeekFront(), 3)
3739
q.PopFront()
38-
requireEqual(t, q.PeekFront(), nil)
40+
require.Equal(t, q.PeekFront(), nil)
3941

4042
for i := 1; i <= 1000; i++ {
4143
q.PushBack(i)
42-
requireEqual(t, q.Len(), i)
44+
require.Equal(t, q.Len(), i)
4345
}
4446
for i := 1; i <= 1000; i++ {
45-
requireEqual(t, *q.PeekFront(), i)
47+
require.Equal(t, *q.PeekFront(), i)
4648
q.PopFront()
47-
requireEqual(t, q.Len(), 1000-i)
49+
require.Equal(t, q.Len(), 1000-i)
4850
}
4951
}
5052

@@ -55,20 +57,13 @@ func TestQueueRand(t *testing.T) {
5557
for n := rand.Intn(100); n > 0; n-- {
5658
r++
5759
q.PushBack(r)
58-
requireEqual(t, q.Len(), r-l)
60+
require.Equal(t, q.Len(), r-l)
5961
}
6062
for n := rand.Intn(q.Len() + 1); n > 0; n-- {
6163
l++
62-
requireEqual(t, *q.PeekFront(), l)
64+
require.Equal(t, *q.PeekFront(), l)
6365
q.PopFront()
64-
requireEqual(t, q.Len(), r-l)
66+
require.Equal(t, q.Len(), r-l)
6567
}
6668
}
6769
}
68-
69-
func requireEqual[T comparable](t *testing.T, actual, expected T) {
70-
t.Helper()
71-
if actual != expected {
72-
t.Fatalf("expected %v, but found %v", expected, actual)
73-
}
74-
}

fifo/semaphore_test.go

Lines changed: 31 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,16 @@ import (
2222
"sync"
2323
"testing"
2424
"time"
25+
26+
"github.com/cockroachdb/crlib/testutils/require"
2527
)
2628

2729
func TestSemaphoreAPI(t *testing.T) {
2830
s := NewSemaphore(10)
29-
requireEqual(t, s.TryAcquire(5), true)
30-
requireEqual(t, s.TryAcquire(10), false)
31-
requireEqual(t, s.Acquire(context.Background(), 20), ErrRequestExceedsCapacity)
32-
requireEqual(t, "capacity: 10, outstanding: 5, num-had-to-wait: 0", s.Stats().String())
31+
require.Equal(t, s.TryAcquire(5), true)
32+
require.Equal(t, s.TryAcquire(10), false)
33+
require.Equal(t, s.Acquire(context.Background(), 20), ErrRequestExceedsCapacity)
34+
require.Equal(t, "capacity: 10, outstanding: 5, num-had-to-wait: 0", s.Stats().String())
3335

3436
ch := make(chan struct{}, 10)
3537
go func() {
@@ -46,15 +48,15 @@ func TestSemaphoreAPI(t *testing.T) {
4648
}
4749
ch <- struct{}{}
4850
}()
49-
assertNoRecv(t, ch)
51+
require.NoRecv(t, ch)
5052
s.Release(5)
51-
assertRecv(t, ch)
52-
assertRecv(t, ch)
53-
assertNoRecv(t, ch)
53+
require.Recv(t, ch)
54+
require.Recv(t, ch)
55+
require.NoRecv(t, ch)
5456
s.Release(1)
55-
assertNoRecv(t, ch)
57+
require.NoRecv(t, ch)
5658
s.Release(8)
57-
assertRecv(t, ch)
59+
require.Recv(t, ch)
5860

5961
// Test UpdateCapacity.
6062
go func() {
@@ -66,16 +68,16 @@ func TestSemaphoreAPI(t *testing.T) {
6668
t.Error(err)
6769
}
6870
ch <- struct{}{}
69-
requireEqual(t, s.Acquire(context.Background(), 5), ErrRequestExceedsCapacity)
71+
require.Equal(t, s.Acquire(context.Background(), 5), ErrRequestExceedsCapacity)
7072
ch <- struct{}{}
7173
}()
72-
assertNoRecv(t, ch)
74+
require.NoRecv(t, ch)
7375
s.UpdateCapacity(15)
74-
assertRecv(t, ch)
75-
assertRecv(t, ch)
76-
assertNoRecv(t, ch)
76+
require.Recv(t, ch)
77+
require.Recv(t, ch)
78+
require.NoRecv(t, ch)
7779
s.UpdateCapacity(2)
78-
assertRecv(t, ch)
80+
require.Recv(t, ch)
7981
}
8082

8183
// TestSemaphoreBasic is a test with multiple goroutines acquiring a unit and
@@ -103,7 +105,7 @@ func TestSemaphoreBasic(t *testing.T) {
103105
}
104106

105107
for i := 0; i < numGoroutines; i++ {
106-
if err := assertRecv(t, resCh); err != nil {
108+
if err := require.Recv(t, resCh); err != nil {
107109
t.Fatal(err)
108110
}
109111
}
@@ -132,14 +134,14 @@ func TestSemaphoreContextCancellation(t *testing.T) {
132134

133135
cancel()
134136

135-
err := assertRecv(t, errCh)
137+
err := require.Recv(t, errCh)
136138
if !errors.Is(err, context.Canceled) {
137139
t.Fatalf("expected context cancellation error, got %v", err)
138140
}
139141

140142
stats := s.Stats()
141-
requireEqual(t, stats.Capacity, 1)
142-
requireEqual(t, stats.Outstanding, 1)
143+
require.Equal(t, stats.Capacity, 1)
144+
require.Equal(t, stats.Outstanding, 1)
143145
}
144146

145147
// TestSemaphoreCanceledAcquisitions tests the behavior where we enqueue
@@ -163,7 +165,7 @@ func TestSemaphoreCanceledAcquisitions(t *testing.T) {
163165
}
164166

165167
for i := 0; i < numGoroutines; i++ {
166-
if err := assertRecv(t, errCh); !errors.Is(err, context.Canceled) {
168+
if err := require.Recv(t, errCh); !errors.Is(err, context.Canceled) {
167169
t.Fatalf("expected context cancellation error, got %v", err)
168170
}
169171
}
@@ -173,7 +175,7 @@ func TestSemaphoreCanceledAcquisitions(t *testing.T) {
173175
errCh <- s.Acquire(context.Background(), 1)
174176
}()
175177

176-
if err := assertRecv(t, errCh); err != nil {
178+
if err := require.Recv(t, errCh); err != nil {
177179
t.Fatal(err)
178180
}
179181
}
@@ -206,25 +208,25 @@ func TestSemaphoreNumHadToWait(t *testing.T) {
206208
}
207209
}
208210
// Initially s should have no waiters.
209-
requireEqual(t, s.Stats().NumHadToWait, 0)
211+
require.Equal(t, s.Stats().NumHadToWait, 0)
210212
if err := s.Acquire(ctx, 1); err != nil {
211213
t.Fatal(err)
212214
}
213215
// Still no waiters.
214-
requireEqual(t, s.Stats().NumHadToWait, 0)
216+
require.Equal(t, s.Stats().NumHadToWait, 0)
215217
for i := 0; i < 10; i++ {
216218
go doAcquire(ctx)
217219
}
218220
assertNumWaitersSoon(10)
219221
s.Release(1)
220-
assertRecv(t, doneCh)
222+
require.Recv(t, doneCh)
221223
go doAcquire(ctx)
222224
assertNumWaitersSoon(11)
223225
for i := 0; i < 10; i++ {
224226
s.Release(1)
225-
assertRecv(t, doneCh)
227+
require.Recv(t, doneCh)
226228
}
227-
requireEqual(t, s.Stats().NumHadToWait, 11)
229+
require.Equal(t, s.Stats().NumHadToWait, 11)
228230
}
229231

230232
func TestConcurrentUpdatesAndAcquisitions(t *testing.T) {
@@ -258,26 +260,6 @@ func TestConcurrentUpdatesAndAcquisitions(t *testing.T) {
258260
wg.Wait()
259261
s.UpdateCapacity(maxCap)
260262
stats := s.Stats()
261-
requireEqual(t, stats.Capacity, 100)
262-
requireEqual(t, stats.Outstanding, 0)
263-
}
264-
265-
func assertRecv[T any](t *testing.T, ch chan T) T {
266-
t.Helper()
267-
select {
268-
case v := <-ch:
269-
return v
270-
case <-time.After(time.Second):
271-
t.Fatal("did not receive notification")
272-
panic("unreachable")
273-
}
274-
}
275-
276-
func assertNoRecv[T any](t *testing.T, ch chan T) {
277-
t.Helper()
278-
select {
279-
case <-ch:
280-
t.Fatal("received unexpected notification")
281-
case <-time.After(10 * time.Millisecond):
282-
}
263+
require.Equal(t, stats.Capacity, 100)
264+
require.Equal(t, stats.Outstanding, 0)
283265
}

0 commit comments

Comments
 (0)