vitess.io/vitess@v0.16.2/go/mysql/replication_test.go (about)

     1  /*
     2  Copyright 2019 The Vitess Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package mysql
    18  
    19  import (
    20  	"reflect"
    21  	"testing"
    22  
    23  	"github.com/stretchr/testify/assert"
    24  	"github.com/stretchr/testify/require"
    25  
    26  	binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata"
    27  )
    28  
    29  func TestComBinlogDump(t *testing.T) {
    30  	listener, sConn, cConn := createSocketPair(t)
    31  	defer func() {
    32  		listener.Close()
    33  		sConn.Close()
    34  		cConn.Close()
    35  	}()
    36  
    37  	// Write ComBinlogDump packet, read it, compare.
    38  	if err := cConn.WriteComBinlogDump(0x01020304, "moofarm", 0x05060708, 0x090a); err != nil {
    39  		t.Fatalf("WriteComBinlogDump failed: %v", err)
    40  	}
    41  
    42  	data, err := sConn.ReadPacket()
    43  	require.NoError(t, err, "sConn.ReadPacket - ComBinlogDump failed: %v", err)
    44  
    45  	expectedData := []byte{
    46  		ComBinlogDump,
    47  		0x08, 0x07, 0x06, 0x05, // binlog-pos
    48  		0x0a, 0x09, //flags
    49  		0x04, 0x03, 0x02, 0x01, // server-id
    50  		'm', 'o', 'o', 'f', 'a', 'r', 'm', // binlog-filename
    51  	}
    52  	assert.True(t, reflect.DeepEqual(data, expectedData), "ComBinlogDump returned unexpected data:\n%v\nwas expecting:\n%v", data, expectedData)
    53  
    54  	sConn.sequence = 0
    55  
    56  	// Write ComBinlogDump packet with no filename, read it, compare.
    57  	if err := cConn.WriteComBinlogDump(0x01020304, "", 0x05060708, 0x090a); err != nil {
    58  		t.Fatalf("WriteComBinlogDump failed: %v", err)
    59  	}
    60  
    61  	data, err = sConn.ReadPacket()
    62  	require.NoError(t, err, "sConn.ReadPacket - ComBinlogDump failed: %v", err)
    63  
    64  	expectedData = []byte{
    65  		ComBinlogDump,
    66  		0x08, 0x07, 0x06, 0x05, // binlog-pos
    67  		0x0a, 0x09, // flags
    68  		0x04, 0x03, 0x02, 0x01, // server-id
    69  	}
    70  	assert.True(t, reflect.DeepEqual(data, expectedData), "ComBinlogDump returned unexpected data:\n%v\nwas expecting:\n%v", data, expectedData)
    71  
    72  }
    73  
    74  func TestComBinlogDumpGTID(t *testing.T) {
    75  	listener, sConn, cConn := createSocketPair(t)
    76  	defer func() {
    77  		listener.Close()
    78  		sConn.Close()
    79  		cConn.Close()
    80  	}()
    81  
    82  	t.Run("WriteComBinlogDumpGTID", func(t *testing.T) {
    83  		// Write ComBinlogDumpGTID packet, read it, compare.
    84  		err := cConn.WriteComBinlogDumpGTID(0x01020304, "moofarm", 0x05060708090a0b0c, 0x0d0e, []byte{0xfa, 0xfb})
    85  		assert.NoError(t, err)
    86  		data, err := sConn.ReadPacket()
    87  		require.NoError(t, err, "sConn.ReadPacket - ComBinlogDumpGTID failed: %v", err)
    88  
    89  		expectedData := []byte{
    90  			ComBinlogDumpGTID,
    91  			0x0e, 0x0d, // flags
    92  			0x04, 0x03, 0x02, 0x01, // server-id
    93  			0x07, 0x00, 0x00, 0x00, // binlog-filename-len
    94  			'm', 'o', 'o', 'f', 'a', 'r', 'm', // bilog-filename
    95  			0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, // binlog-pos
    96  			0x02, 0x00, 0x00, 0x00, // data-size
    97  			0xfa, 0xfb, // data
    98  		}
    99  		assert.Equal(t, expectedData, data)
   100  	})
   101  
   102  	sConn.sequence = 0
   103  
   104  	t.Run("WriteComBinlogDumpGTID no filename", func(t *testing.T) {
   105  		// Write ComBinlogDumpGTID packet with no filename, read it, compare.
   106  		err := cConn.WriteComBinlogDumpGTID(0x01020304, "", 0x05060708090a0b0c, 0x0d0e, []byte{0xfa, 0xfb})
   107  		assert.NoError(t, err)
   108  		data, err := sConn.ReadPacket()
   109  		require.NoError(t, err, "sConn.ReadPacket - ComBinlogDumpGTID failed: %v", err)
   110  
   111  		expectedData := []byte{
   112  			ComBinlogDumpGTID,
   113  			0x0e, 0x0d, // flags
   114  			0x04, 0x03, 0x02, 0x01, // server-id
   115  			0x00, 0x00, 0x00, 0x00, // binlog-filename-len
   116  			0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, // binlog-pos
   117  			0x02, 0x00, 0x00, 0x00, // data-size
   118  			0xfa, 0xfb, // data
   119  		}
   120  		assert.Equal(t, expectedData, data)
   121  	})
   122  	f := NewMySQL56BinlogFormat()
   123  	s := NewFakeBinlogStream()
   124  
   125  	t.Run("Write rotate event", func(t *testing.T) {
   126  		event := NewRotateEvent(f, s, 456, "mysql-bin.000123")
   127  		err := cConn.WriteBinlogEvent(event, false)
   128  		assert.NoError(t, err)
   129  		data, err := sConn.ReadPacket()
   130  		require.NoError(t, err)
   131  
   132  		expectedData := []byte{0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x1, 0x0, 0x0, 0x0, 0x2f,
   133  			0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc8, 0x1, 0x0, 0x0, 0x0, 0x0,
   134  			0x0, 0x0, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x2d, 0x62, 0x69, 0x6e, 0x2e, 0x30,
   135  			0x30, 0x30, 0x31, 0x32, 0x33, 0xfd, 0x1c, 0x1d, 0x80}
   136  		assert.Equal(t, expectedData, data)
   137  	})
   138  	t.Run("Write query event", func(t *testing.T) {
   139  		q := Query{
   140  			Database: "my database",
   141  			SQL:      "my query",
   142  			Charset: &binlogdatapb.Charset{
   143  				Client: 0x1234,
   144  				Conn:   0x5678,
   145  				Server: 0x9abc,
   146  			},
   147  		}
   148  		event := NewQueryEvent(f, s, q)
   149  		err := cConn.WriteBinlogEvent(event, false)
   150  		assert.NoError(t, err)
   151  		data, err := sConn.ReadPacket()
   152  		require.NoError(t, err)
   153  
   154  		expectedData := []byte{0x0, 0x98, 0x68, 0xe9, 0x53, 0x2, 0x1, 0x0, 0x0, 0x0,
   155  			0x3f, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
   156  			0x0, 0x0, 0x0, 0xb, 0x0, 0x0, 0x7, 0x0, 0x4, 0x34, 0x12, 0x78, 0x56, 0xbc,
   157  			0x9a, 0x6d, 0x79, 0x20, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65,
   158  			0x0, 0x6d, 0x79, 0x20, 0x71, 0x75, 0x65, 0x72, 0x79, 0x65, 0xaa, 0x33, 0xe}
   159  		assert.Equal(t, expectedData, data)
   160  	})
   161  }
   162  
   163  func TestSendSemiSyncAck(t *testing.T) {
   164  	listener, sConn, cConn := createSocketPair(t)
   165  	defer func() {
   166  		listener.Close()
   167  		sConn.Close()
   168  		cConn.Close()
   169  	}()
   170  
   171  	// Write ComBinlogDumpGTID packet, read it, compare.
   172  	logName := "moofarm"
   173  	logPos := uint64(1852)
   174  	if err := cConn.SendSemiSyncAck(logName, logPos); err != nil {
   175  		t.Fatalf("SendSemiSyncAck failed: %v", err)
   176  	}
   177  
   178  	data, err := sConn.ReadPacket()
   179  	require.NoError(t, err, "sConn.ReadPacket - SendSemiSyncAck failed: %v", err)
   180  
   181  	expectedData := []byte{
   182  		ComSemiSyncAck,
   183  		0x3c, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // log pos
   184  		'm', 'o', 'o', 'f', 'a', 'r', 'm', // binlog-filename
   185  	}
   186  	assert.True(t, reflect.DeepEqual(data, expectedData), "SendSemiSyncAck returned unexpected data:\n%v\nwas expecting:\n%v", data, expectedData)
   187  
   188  }