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  }