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 }