github.com/pingcap/tiflow@v0.0.0-20240520035814-5bf52d54e205/dm/pkg/utils/common_test.go (about) 1 // Copyright 2020 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 utils 15 16 import ( 17 "bytes" 18 "sync" 19 "testing" 20 21 "github.com/pingcap/tidb/pkg/parser" 22 "github.com/pingcap/tiflow/dm/pkg/log" 23 "github.com/stretchr/testify/require" 24 "go.uber.org/zap" 25 ) 26 27 func TestTrimCtrlChars(t *testing.T) { 28 t.Parallel() 29 30 ddl := "create table if not exists foo.bar(id int)" 31 controlChars := make([]byte, 0, 33) 32 nul := byte(0x00) 33 for i := 0; i < 32; i++ { 34 controlChars = append(controlChars, nul) 35 nul++ 36 } 37 controlChars = append(controlChars, 0x7f) 38 39 parser2 := parser.New() 40 var buf bytes.Buffer 41 for _, char := range controlChars { 42 buf.WriteByte(char) 43 buf.WriteByte(char) 44 buf.WriteString(ddl) 45 buf.WriteByte(char) 46 buf.WriteByte(char) 47 48 newDDL := TrimCtrlChars(buf.String()) 49 require.Equal(t, ddl, newDDL) 50 51 _, err := parser2.ParseOneStmt(newDDL, "", "") 52 require.NoError(t, err) 53 buf.Reset() 54 } 55 } 56 57 func TestTrimQuoteMark(t *testing.T) { 58 t.Parallel() 59 60 cases := [][]string{ 61 {`"123"`, `123`}, 62 {`123`, `123`}, 63 {`"123`, `"123`}, 64 {`'123'`, `'123'`}, 65 } 66 for _, ca := range cases { 67 require.Equal(t, TrimQuoteMark(ca[0]), ca[1]) 68 } 69 } 70 71 func TestCompareShardingDDLs(t *testing.T) { 72 t.Parallel() 73 74 var ( 75 DDL1 = "alter table add column c1 int" 76 DDL2 = "alter table add column c2 text" 77 ) 78 79 // different DDLs 80 require.False(t, CompareShardingDDLs([]string{DDL1}, []string{DDL2})) 81 82 // different length 83 require.False(t, CompareShardingDDLs([]string{DDL1, DDL2}, []string{DDL2})) 84 85 // same DDLs 86 require.True(t, CompareShardingDDLs([]string{DDL1}, []string{DDL1})) 87 require.True(t, CompareShardingDDLs([]string{DDL1, DDL2}, []string{DDL1, DDL2})) 88 89 // same contents but different order 90 require.True(t, CompareShardingDDLs([]string{DDL1, DDL2}, []string{DDL2, DDL1})) 91 } 92 93 func TestDDLLockID(t *testing.T) { 94 t.Parallel() 95 96 task := "test" 97 id := GenDDLLockID(task, "db", "tbl") 98 require.Equal(t, "test-`db`.`tbl`", id) 99 require.Equal(t, task, ExtractTaskFromLockID(id)) 100 101 id = GenDDLLockID(task, "d`b", "tb`l") 102 require.Equal(t, "test-`d``b`.`tb``l`", id) 103 require.Equal(t, task, ExtractTaskFromLockID(id)) 104 105 // invalid ID 106 require.Equal(t, "", ExtractTaskFromLockID("invalid-lock-id")) 107 } 108 109 func TestNonRepeatStringsEqual(t *testing.T) { 110 t.Parallel() 111 112 require.True(t, NonRepeatStringsEqual([]string{}, []string{})) 113 require.True(t, NonRepeatStringsEqual([]string{"1", "2"}, []string{"2", "1"})) 114 require.False(t, NonRepeatStringsEqual([]string{}, []string{"1"})) 115 require.False(t, NonRepeatStringsEqual([]string{"1", "2"}, []string{"2", "3"})) 116 } 117 118 func TestGoLogWrapper(t *testing.T) { 119 var wg sync.WaitGroup 120 wg.Add(1) 121 // to avoid data race since there's concurrent test case writing log.L() 122 l := log.Logger{Logger: zap.NewNop()} 123 go GoLogWrapper(l, func() { 124 defer wg.Done() 125 panic("should be captured") 126 }) 127 wg.Wait() 128 // if GoLogWrapper didn't catch it, this case will fail. 129 }