github.com/pingcap/tiflow@v0.0.0-20240520035814-5bf52d54e205/pkg/sink/codec/canal/canal_json_txn_event_encoder_test.go (about) 1 // Copyright 2023 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 canal 15 16 import ( 17 "testing" 18 19 "github.com/pingcap/tiflow/cdc/entry" 20 "github.com/pingcap/tiflow/cdc/model" 21 "github.com/pingcap/tiflow/pkg/config" 22 "github.com/pingcap/tiflow/pkg/sink/codec/common" 23 "github.com/stretchr/testify/require" 24 ) 25 26 func TestBuildCanalJSONTxnEventEncoder(t *testing.T) { 27 t.Parallel() 28 cfg := common.NewConfig(config.ProtocolCanalJSON) 29 30 builder := NewJSONTxnEventEncoderBuilder(cfg) 31 encoder, ok := builder.Build().(*JSONTxnEventEncoder) 32 require.True(t, ok) 33 require.NotNil(t, encoder.config) 34 } 35 36 func TestCanalJSONTxnEventEncoderMaxMessageBytes(t *testing.T) { 37 helper := entry.NewSchemaTestHelper(t) 38 defer helper.Close() 39 40 sql := `create table test.t(a varchar(255) primary key)` 41 _ = helper.DDL2Event(sql) 42 testEvent := helper.DML2Event(`insert into test.t values("aa")`, "test", "t") 43 // the size of `testEvent` after being encoded by canal-json is 200 44 txn := &model.SingleTableTxn{ 45 TableInfo: testEvent.TableInfo, 46 Rows: []*model.RowChangedEvent{ 47 testEvent, 48 }, 49 } 50 51 // the test message length is smaller than max-message-bytes 52 maxMessageBytes := 300 53 cfg := common.NewConfig(config.ProtocolCanalJSON).WithMaxMessageBytes(maxMessageBytes) 54 encoder := NewJSONTxnEventEncoderBuilder(cfg).Build() 55 err := encoder.AppendTxnEvent(txn, nil) 56 require.Nil(t, err) 57 58 // the test message length is larger than max-message-bytes 59 cfg = cfg.WithMaxMessageBytes(100) 60 encoder = NewJSONTxnEventEncoderBuilder(cfg).Build() 61 err = encoder.AppendTxnEvent(txn, nil) 62 require.NotNil(t, err) 63 } 64 65 func TestCanalJSONAppendTxnEventEncoderWithCallback(t *testing.T) { 66 helper := entry.NewSchemaTestHelper(t) 67 defer helper.Close() 68 69 sql := `create table test.t(a varchar(255) primary key)` 70 _ = helper.DDL2Event(sql) 71 72 cfg := common.NewConfig(config.ProtocolCanalJSON) 73 encoder := NewJSONTxnEventEncoderBuilder(cfg).Build() 74 require.NotNil(t, encoder) 75 76 event1 := helper.DML2Event(`insert into test.t values("aa")`, "test", "t") 77 event2 := helper.DML2Event(`insert into test.t values("bb")`, "test", "t") 78 79 count := 0 80 81 txn := &model.SingleTableTxn{ 82 TableInfo: event1.TableInfo, 83 Rows: []*model.RowChangedEvent{event1, event2}, 84 } 85 86 // Empty build makes sure that the callback build logic not broken. 87 msgs := encoder.Build() 88 require.Len(t, msgs, 0, "no message should be built and no panic") 89 90 // Append the events. 91 callback := func() { 92 count++ 93 } 94 err := encoder.AppendTxnEvent(txn, callback) 95 require.Nil(t, err) 96 require.Equal(t, 0, count, "nothing should be called") 97 98 msgs = encoder.Build() 99 require.Len(t, msgs, 1, "expected one message") 100 msgs[0].Callback() 101 require.Equal(t, 1, count, "expected one callback be called") 102 // Assert the build reset all the internal states. 103 require.Nil(t, encoder.(*JSONTxnEventEncoder).txnSchema) 104 require.Nil(t, encoder.(*JSONTxnEventEncoder).txnTable) 105 require.Nil(t, encoder.(*JSONTxnEventEncoder).callback) 106 require.Equal(t, 0, encoder.(*JSONTxnEventEncoder).batchSize) 107 require.Equal(t, 0, encoder.(*JSONTxnEventEncoder).valueBuf.Len()) 108 }