...
1
17
18 package buffer
19
20 import (
21 "reflect"
22 "sort"
23 "sync"
24 "testing"
25
26 "google.golang.org/grpc/internal/grpctest"
27 )
28
29 const (
30 numWriters = 10
31 numWrites = 10
32 )
33
34 type s struct {
35 grpctest.Tester
36 }
37
38 func Test(t *testing.T) {
39 grpctest.RunSubTests(t, s{})
40 }
41
42
43
44 var wantReads []int
45
46 func init() {
47 for i := 0; i < numWriters; i++ {
48 for j := 0; j < numWrites; j++ {
49 wantReads = append(wantReads, i)
50 }
51 }
52 }
53
54
55
56 func (s) TestSingleWriter(t *testing.T) {
57 ub := NewUnbounded()
58 reads := []int{}
59
60 var wg sync.WaitGroup
61 wg.Add(1)
62 go func() {
63 defer wg.Done()
64 ch := ub.Get()
65 for i := 0; i < numWriters*numWrites; i++ {
66 r := <-ch
67 reads = append(reads, r.(int))
68 ub.Load()
69 }
70 }()
71
72 wg.Add(1)
73 go func() {
74 defer wg.Done()
75 for i := 0; i < numWriters; i++ {
76 for j := 0; j < numWrites; j++ {
77 ub.Put(i)
78 }
79 }
80 }()
81
82 wg.Wait()
83 if !reflect.DeepEqual(reads, wantReads) {
84 t.Errorf("reads: %#v, wantReads: %#v", reads, wantReads)
85 }
86 }
87
88
89
90 func (s) TestMultipleWriters(t *testing.T) {
91 ub := NewUnbounded()
92 reads := []int{}
93
94 var wg sync.WaitGroup
95 wg.Add(1)
96 go func() {
97 defer wg.Done()
98 ch := ub.Get()
99 for i := 0; i < numWriters*numWrites; i++ {
100 r := <-ch
101 reads = append(reads, r.(int))
102 ub.Load()
103 }
104 }()
105
106 wg.Add(numWriters)
107 for i := 0; i < numWriters; i++ {
108 go func(index int) {
109 defer wg.Done()
110 for j := 0; j < numWrites; j++ {
111 ub.Put(index)
112 }
113 }(i)
114 }
115
116 wg.Wait()
117 sort.Ints(reads)
118 if !reflect.DeepEqual(reads, wantReads) {
119 t.Errorf("reads: %#v, wantReads: %#v", reads, wantReads)
120 }
121 }
122
123
124
125 func (s) TestClose(t *testing.T) {
126 ub := NewUnbounded()
127 if err := ub.Put(1); err != nil {
128 t.Fatalf("Unbounded.Put() = %v; want nil", err)
129 }
130 ub.Close()
131 if err := ub.Put(1); err == nil {
132 t.Fatalf("Unbounded.Put() = <nil>; want non-nil error")
133 }
134 if v, ok := <-ub.Get(); !ok {
135 t.Errorf("Unbounded.Get() = %v, %v, want %v, %v", v, ok, 1, true)
136 }
137 if err := ub.Put(1); err == nil {
138 t.Fatalf("Unbounded.Put() = <nil>; want non-nil error")
139 }
140 ub.Load()
141 if v, ok := <-ub.Get(); ok {
142 t.Errorf("Unbounded.Get() = %v, want closed channel", v)
143 }
144 if err := ub.Put(1); err == nil {
145 t.Fatalf("Unbounded.Put() = <nil>; want non-nil error")
146 }
147 ub.Close()
148 }
149
View as plain text