github.com/pingcap/tiflow@v0.0.0-20240520035814-5bf52d54e205/dm/relay/streamer_test.go (about) 1 // Copyright 2019 PingCAP, Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // See the License for the specific language governing permissions and 12 // limitations under the License. 13 14 package relay 15 16 import ( 17 "context" 18 "time" 19 20 "github.com/go-mysql-org/go-mysql/replication" 21 . "github.com/pingcap/check" 22 "github.com/pingcap/errors" 23 "github.com/pingcap/failpoint" 24 "github.com/pingcap/tiflow/dm/pkg/binlog/event" 25 "github.com/pingcap/tiflow/dm/pkg/terror" 26 ) 27 28 var _ = Suite(&testStreamerSuite{}) 29 30 type testStreamerSuite struct{} 31 32 func (t *testStreamerSuite) TestStreamer(c *C) { 33 c.Assert(failpoint.Enable("github.com/pingcap/tiflow/dm/relay/SetHeartbeatInterval", "return(10000)"), IsNil) 34 defer func() { 35 c.Assert(failpoint.Disable("github.com/pingcap/tiflow/dm/relay/SetHeartbeatInterval"), IsNil) 36 }() 37 38 ctx, cancel := context.WithTimeout(context.Background(), time.Second) 39 defer cancel() 40 41 // generate an event 42 header := &replication.EventHeader{ 43 Timestamp: uint32(time.Now().Unix()), 44 ServerID: 11, 45 } 46 ev, err := event.GenFormatDescriptionEvent(header, 4) 47 c.Assert(err, IsNil) 48 49 // 1. get event and error 50 s := newLocalStreamer() // with buffer 51 s.ch <- ev 52 ev2, err := s.GetEvent(ctx) 53 c.Assert(err, IsNil) 54 c.Assert(ev2, DeepEquals, ev) 55 56 // read error 57 errIn := errors.New("error use for streamer test 1") 58 s.ech <- errIn 59 ev2, err = s.GetEvent(ctx) 60 c.Assert(err, Equals, errIn) 61 c.Assert(ev2, IsNil) 62 63 // can not get event anymore because got error 64 ev2, err = s.GetEvent(ctx) 65 c.Assert(terror.ErrNeedSyncAgain.Equal(err), IsTrue) 66 c.Assert(ev2, IsNil) 67 68 // 2. close with error 69 s = newLocalStreamer() 70 errClose := errors.New("error use for streamer test 2") 71 s.closeWithError(errClose) 72 ev2, err = s.GetEvent(ctx) 73 c.Assert(err, Equals, errClose) 74 c.Assert(ev2, IsNil) 75 76 // can not get event anymore 77 ev2, err = s.GetEvent(ctx) 78 c.Assert(terror.ErrNeedSyncAgain.Equal(err), IsTrue) 79 c.Assert(ev2, IsNil) 80 81 // 3. close without error 82 s = newLocalStreamer() 83 s.close() 84 ev2, err = s.GetEvent(ctx) 85 c.Assert(terror.ErrSyncClosed.Equal(err), IsTrue) 86 c.Assert(ev2, IsNil) 87 88 // can not get event anymore 89 ev2, err = s.GetEvent(ctx) 90 c.Assert(terror.ErrNeedSyncAgain.Equal(err), IsTrue) 91 c.Assert(ev2, IsNil) 92 93 // 4. close with nil error 94 s = newLocalStreamer() 95 s.closeWithError(nil) 96 ev2, err = s.GetEvent(ctx) 97 c.Assert(terror.ErrSyncClosed.Equal(err), IsTrue) 98 c.Assert(ev2, IsNil) 99 100 // can not get event anymore 101 ev2, err = s.GetEvent(ctx) 102 c.Assert(terror.ErrNeedSyncAgain.Equal(err), IsTrue) 103 c.Assert(ev2, IsNil) 104 } 105 106 func (t *testStreamerSuite) TestHeartbeat(c *C) { 107 c.Assert(failpoint.Enable("github.com/pingcap/tiflow/dm/relay/SetHeartbeatInterval", "return(1)"), IsNil) 108 defer func() { 109 c.Assert(failpoint.Disable("github.com/pingcap/tiflow/dm/relay/SetHeartbeatInterval"), IsNil) 110 }() 111 112 ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) 113 defer cancel() 114 s := newLocalStreamer() 115 ev, err := s.GetEvent(ctx) 116 c.Assert(err, IsNil) 117 c.Assert(ev.Header.EventType, Equals, replication.HEARTBEAT_EVENT) 118 }