@@ -7,12 +7,14 @@ import (
7
7
"context"
8
8
"encoding/binary"
9
9
"fmt"
10
+ "io"
10
11
"net"
11
12
"net/url"
12
13
"path"
13
14
"testing"
14
15
15
16
"github.com/pingcap/errors"
17
+ "github.com/pingcap/failpoint"
16
18
backuppb "github.com/pingcap/kvproto/pkg/brpb"
17
19
"github.com/pingcap/log"
18
20
berrors "github.com/pingcap/tidb/br/pkg/errors"
@@ -143,6 +145,7 @@ func TestIntegration(t *testing.T) {
143
145
t .Run ("TestStreamListening" , func (t * testing.T ) { testStreamListening (t , streamhelper.AdvancerExt {MetaDataClient : metaCli }) })
144
146
t .Run ("TestStreamCheckpoint" , func (t * testing.T ) { testStreamCheckpoint (t , streamhelper.AdvancerExt {MetaDataClient : metaCli }) })
145
147
t .Run ("testStoptask" , func (t * testing.T ) { testStoptask (t , streamhelper.AdvancerExt {MetaDataClient : metaCli }) })
148
+ t .Run ("TestStreamClose" , func (t * testing.T ) { testStreamClose (t , streamhelper.AdvancerExt {MetaDataClient : metaCli }) })
146
149
}
147
150
148
151
func TestChecking (t * testing.T ) {
@@ -295,6 +298,7 @@ func testStreamListening(t *testing.T, metaCli streamhelper.AdvancerExt) {
295
298
taskInfo2 := simpleTask (taskName2 , 4 )
296
299
require .NoError (t , metaCli .PutTask (ctx , taskInfo2 ))
297
300
require .NoError (t , metaCli .DeleteTask (ctx , taskName2 ))
301
+
298
302
first := <- ch
299
303
require .Equal (t , first .Type , streamhelper .EventAdd )
300
304
require .Equal (t , first .Name , taskName )
@@ -310,8 +314,44 @@ func testStreamListening(t *testing.T, metaCli streamhelper.AdvancerExt) {
310
314
require .Equal (t , forth .Type , streamhelper .EventDel )
311
315
require .Equal (t , forth .Name , taskName2 )
312
316
cancel ()
313
- _ , ok := <- ch
314
- require .False (t , ok )
317
+ fifth , ok := <- ch
318
+ require .True (t , ok )
319
+ require .Equal (t , fifth .Type , streamhelper .EventErr )
320
+ require .Error (t , fifth .Err , context .Canceled )
321
+ item , ok := <- ch
322
+ require .False (t , ok , "%v" , item )
323
+ }
324
+
325
+ func testStreamClose (t * testing.T , metaCli streamhelper.AdvancerExt ) {
326
+ ctx := context .Background ()
327
+ taskName := "close_simple"
328
+ taskInfo := simpleTask (taskName , 4 )
329
+
330
+ require .NoError (t , metaCli .PutTask (ctx , taskInfo ))
331
+ ch := make (chan streamhelper.TaskEvent , 1024 )
332
+ require .NoError (t , metaCli .Begin (ctx , ch ))
333
+ require .NoError (t , metaCli .DeleteTask (ctx , taskName ))
334
+ first := <- ch
335
+ require .Equal (t , first .Type , streamhelper .EventAdd )
336
+ require .Equal (t , first .Name , taskName )
337
+ require .ElementsMatch (t , first .Ranges , simpleRanges (4 ))
338
+ second := <- ch
339
+ require .Equal (t , second .Type , streamhelper .EventDel , "%s" , second )
340
+ require .Equal (t , second .Name , taskName , "%s" , second )
341
+
342
+ require .NoError (t , failpoint .Enable ("github.com/pingcap/tidb/br/pkg/streamhelper/advancer_close_channel" , "return" ))
343
+ defer failpoint .Disable ("github.com/pingcap/tidb/br/pkg/streamhelper/advancer_close_channel" )
344
+ // We need to make the channel file some events hence we can simulate the closed channel.
345
+ taskName2 := "close_simple2"
346
+ taskInfo2 := simpleTask (taskName2 , 4 )
347
+ require .NoError (t , metaCli .PutTask (ctx , taskInfo2 ))
348
+ require .NoError (t , metaCli .DeleteTask (ctx , taskName2 ))
349
+
350
+ third := <- ch
351
+ require .Equal (t , third .Type , streamhelper .EventErr )
352
+ require .Error (t , third .Err , io .EOF )
353
+ item , ok := <- ch
354
+ require .False (t , ok , "%#v" , item )
315
355
}
316
356
317
357
func testStreamCheckpoint (t * testing.T , metaCli streamhelper.AdvancerExt ) {
0 commit comments