@@ -45,11 +45,11 @@ func TestPubsub(t *testing.T) {
45
45
event := "test"
46
46
data := "testing"
47
47
messageChannel := make (chan []byte )
48
- cancelFunc , err = pubsub .Subscribe (event , func (ctx context.Context , message []byte ) {
48
+ unsub , err : = pubsub .Subscribe (event , func (ctx context.Context , message []byte ) {
49
49
messageChannel <- message
50
50
})
51
51
require .NoError (t , err )
52
- defer cancelFunc ()
52
+ defer unsub ()
53
53
go func () {
54
54
err = pubsub .Publish (event , []byte (data ))
55
55
assert .NoError (t , err )
@@ -72,6 +72,91 @@ func TestPubsub(t *testing.T) {
72
72
defer pubsub .Close ()
73
73
cancelFunc ()
74
74
})
75
+
76
+ t .Run ("NotClosedOnCancelContext" , func (t * testing.T ) {
77
+ ctx , cancel := context .WithCancel (context .Background ())
78
+ defer cancel ()
79
+ connectionURL , closePg , err := postgres .Open ()
80
+ require .NoError (t , err )
81
+ defer closePg ()
82
+ db , err := sql .Open ("postgres" , connectionURL )
83
+ require .NoError (t , err )
84
+ defer db .Close ()
85
+ pubsub , err := database .NewPubsub (ctx , db , connectionURL )
86
+ require .NoError (t , err )
87
+ defer pubsub .Close ()
88
+
89
+ // Provided context must only be active during NewPubsub, not after.
90
+ cancel ()
91
+
92
+ event := "test"
93
+ data := "testing"
94
+ messageChannel := make (chan []byte )
95
+ unsub , err := pubsub .Subscribe (event , func (_ context.Context , message []byte ) {
96
+ messageChannel <- message
97
+ })
98
+ require .NoError (t , err )
99
+ defer unsub ()
100
+ go func () {
101
+ err = pubsub .Publish (event , []byte (data ))
102
+ assert .NoError (t , err )
103
+ }()
104
+ message := <- messageChannel
105
+ assert .Equal (t , string (message ), data )
106
+ })
107
+
108
+ t .Run ("ClosePropagatesContextCancellationToSubscription" , func (t * testing.T ) {
109
+ ctx , cancel := context .WithTimeout (context .Background (), testutil .WaitLong )
110
+ defer cancel ()
111
+ connectionURL , closePg , err := postgres .Open ()
112
+ require .NoError (t , err )
113
+ defer closePg ()
114
+ db , err := sql .Open ("postgres" , connectionURL )
115
+ require .NoError (t , err )
116
+ defer db .Close ()
117
+ pubsub , err := database .NewPubsub (ctx , db , connectionURL )
118
+ require .NoError (t , err )
119
+ defer pubsub .Close ()
120
+
121
+ event := "test"
122
+ done := make (chan struct {})
123
+ called := make (chan struct {})
124
+ unsub , err := pubsub .Subscribe (event , func (subCtx context.Context , _ []byte ) {
125
+ defer close (done )
126
+ select {
127
+ case <- subCtx .Done ():
128
+ assert .Fail (t , "context should not be canceled" )
129
+ default :
130
+ }
131
+ close (called )
132
+ select {
133
+ case <- subCtx .Done ():
134
+ case <- ctx .Done ():
135
+ assert .Fail (t , "timeout waiting for sub context to be canceled" )
136
+ }
137
+ })
138
+ require .NoError (t , err )
139
+ defer unsub ()
140
+
141
+ go func () {
142
+ err := pubsub .Publish (event , nil )
143
+ assert .NoError (t , err )
144
+ }()
145
+
146
+ select {
147
+ case <- called :
148
+ case <- ctx .Done ():
149
+ require .Fail (t , "timeout waiting for handler to be called" )
150
+ }
151
+ err = pubsub .Close ()
152
+ require .NoError (t , err )
153
+
154
+ select {
155
+ case <- done :
156
+ case <- ctx .Done ():
157
+ require .Fail (t , "timeout waiting for handler to finish" )
158
+ }
159
+ })
75
160
}
76
161
77
162
func TestPubsub_ordering (t * testing.T ) {
0 commit comments