github.com/pingcap/tiflow@v0.0.0-20240520035814-5bf52d54e205/dm/pkg/gtid/gtid_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 gtid 15 16 import ( 17 "testing" 18 19 "github.com/go-mysql-org/go-mysql/mysql" 20 "github.com/stretchr/testify/require" 21 ) 22 23 func TestGTDISetSorted(t *testing.T) { 24 t.Parallel() 25 26 // check mysql 27 gSet, err := ParserGTID(mysql.MySQLFlavor, "3ccc475b-2343-11e7-be21-6c0b84d59f30:1-14,406a3f61-690d-11e7-87c5-6c92bf46f384:1-94321383,53bfca22-690d-11e7-8a62-18ded7a37b78:1-495,05474d3c-28c7-11e7-8352-203db246dd3d:1-170,10b039fc-c843-11e7-8f6a-1866daf8d810:1-308290454,686e1ab6-c47e-11e7-a42c-6c92bf46f384:1-34981190,03fc0263-28c7-11e7-a653-6c0b84d59f30:1-7041423") 28 require.NoError(t, err) 29 sortedGTIDSet := "03fc0263-28c7-11e7-a653-6c0b84d59f30:1-7041423,05474d3c-28c7-11e7-8352-203db246dd3d:1-170,10b039fc-c843-11e7-8f6a-1866daf8d810:1-308290454,3ccc475b-2343-11e7-be21-6c0b84d59f30:1-14,406a3f61-690d-11e7-87c5-6c92bf46f384:1-94321383,53bfca22-690d-11e7-8a62-18ded7a37b78:1-495,686e1ab6-c47e-11e7-a42c-6c92bf46f384:1-34981190" 30 require.Equal(t, sortedGTIDSet, gSet.String()) 31 // check mariadb 32 gSet, err = ParserGTID(mysql.MariaDBFlavor, "0-0-1,1-1-1,4-20-1,3-1-1,10-10-10") 33 require.NoError(t, err) 34 sortedGTIDSet = "0-0-1,1-1-1,10-10-10,3-1-1,4-20-1" 35 require.Equal(t, sortedGTIDSet, gSet.String()) 36 } 37 38 func TestMinGTIDSet(t *testing.T) { 39 t.Parallel() 40 41 gset, err := ZeroGTIDSet(mysql.MySQLFlavor) 42 require.NoError(t, err) 43 require.IsType(t, &mysql.MysqlGTIDSet{}, gset) 44 require.Len(t, gset.String(), 0) 45 46 gset, err = ZeroGTIDSet(mysql.MariaDBFlavor) 47 require.NoError(t, err) 48 require.IsType(t, &mysql.MariadbGTIDSet{}, gset) 49 require.Len(t, gset.String(), 0) 50 51 _, err = ZeroGTIDSet("wrong flavor") 52 require.Error(t, err) 53 } 54 55 func TestParseGTIDNoFlavor(t *testing.T) { 56 t.Parallel() 57 58 gset, err := ParserGTID("", "3ccc475b-2343-11e7-be21-6c0b84d59f30:1-14") 59 require.NoError(t, err) 60 require.IsType(t, &mysql.MysqlGTIDSet{}, gset) 61 62 gset, err = ParserGTID("", "0-0-1,1-1-1,4-20-1,3-1-1,10-10-10") 63 require.NoError(t, err) 64 require.IsType(t, &mysql.MariadbGTIDSet{}, gset) 65 66 gset, err = ParserGTID("", "") 67 require.NoError(t, err) 68 require.IsType(t, &mysql.MysqlGTIDSet{}, gset) 69 } 70 71 func TestIsNilMySQLGTIDSet(t *testing.T) { 72 t.Parallel() 73 74 require.False(t, IsZeroMySQLGTIDSet("")) 75 require.False(t, IsZeroMySQLGTIDSet("xxxxx")) 76 require.False(t, IsZeroMySQLGTIDSet("xxxxx:0,yyyy:0")) 77 require.False(t, IsZeroMySQLGTIDSet("xxxxx:1-2")) 78 require.False(t, IsZeroMySQLGTIDSet("xxxxx:0-0")) 79 require.True(t, IsZeroMySQLGTIDSet("xxxxx:0")) 80 require.True(t, IsZeroMySQLGTIDSet(" xxxxx:0 ")) 81 } 82 83 func TestIsNilMariaDBGTIDSet(t *testing.T) { 84 t.Parallel() 85 86 require.False(t, IsZeroMariaDBGTIDSet("")) 87 require.False(t, IsZeroMariaDBGTIDSet("xxxxx")) 88 require.False(t, IsZeroMariaDBGTIDSet("a-b-0,c-d:0")) 89 require.False(t, IsZeroMariaDBGTIDSet("xxxxx:1")) 90 require.True(t, IsZeroMariaDBGTIDSet("x-y-0")) 91 require.True(t, IsZeroMariaDBGTIDSet(" x-y-0 ")) 92 } 93 94 func TestParseZeroAsEmptyGTIDSet(t *testing.T) { 95 t.Parallel() 96 97 gset, err := ParserGTID(mysql.MariaDBFlavor, "0-0-0") 98 require.NoError(t, err) 99 require.Equal(t, "", gset.String()) 100 101 gset, err = ParserGTID(mysql.MySQLFlavor, "") 102 require.NoError(t, err) 103 require.Equal(t, "", gset.String()) 104 105 gset, err = ParserGTID(mysql.MySQLFlavor, "3ccc475b-2343-11e7-be21-6c0b84d59f30:0") 106 require.NoError(t, err) 107 require.Equal(t, "", gset.String()) 108 } 109 110 func TestCheckGTIDSetEmpty(t *testing.T) { 111 t.Parallel() 112 113 testCases := []struct { 114 gsetStr string 115 isEmpty bool 116 flavor string 117 }{ 118 { 119 "", 120 true, 121 mysql.MySQLFlavor, 122 }, 123 { 124 "", 125 true, 126 mysql.MariaDBFlavor, 127 }, 128 { 129 "3ccc475b-2343-11e7-be21-6c0b84d59f30:0", 130 true, 131 mysql.MySQLFlavor, 132 }, 133 { 134 "0-0-0", 135 true, 136 mysql.MariaDBFlavor, 137 }, 138 { 139 "3ccc475b-2343-11e7-be21-6c0b84d59f30:1-14", 140 false, 141 mysql.MySQLFlavor, 142 }, 143 { 144 "1-2-3", 145 false, 146 mysql.MariaDBFlavor, 147 }, 148 } 149 for i, testCase := range testCases { 150 t.Logf("test case %d", i) 151 gset, err := ParserGTID(testCase.flavor, testCase.gsetStr) 152 require.NoError(t, err) 153 require.Equal(t, testCase.isEmpty, CheckGTIDSetEmpty(gset)) 154 } 155 }