vitess.io/vitess@v0.16.2/go/mysql/gtid_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 "strings" 21 "testing" 22 23 "github.com/stretchr/testify/assert" 24 ) 25 26 func TestParseGTID(t *testing.T) { 27 flavor := "fake flavor" 28 gtidParsers[flavor] = func(s string) (GTID, error) { 29 return fakeGTID{value: s}, nil 30 } 31 input := "12345" 32 want := fakeGTID{value: "12345"} 33 34 got, err := ParseGTID(flavor, input) 35 assert.NoError(t, err, "unexpected error: %v", err) 36 assert.Equal(t, want, got, "ParseGTID(%#v, %#v) = %#v, want %#v", flavor, input, got, want) 37 38 } 39 40 func TestMustParseGTID(t *testing.T) { 41 flavor := "fake flavor" 42 gtidParsers[flavor] = func(s string) (GTID, error) { 43 return fakeGTID{value: s}, nil 44 } 45 input := "12345" 46 want := fakeGTID{value: "12345"} 47 48 got := MustParseGTID(flavor, input) 49 assert.Equal(t, want, got, "MustParseGTID(%#v, %#v) = %#v, want %#v", flavor, input, got, want) 50 51 } 52 53 func TestMustParseGTIDError(t *testing.T) { 54 defer func() { 55 want := `parse error: unknown GTID flavor "unknown flavor !@$!@"` 56 err := recover() 57 assert.NotNil(t, err, "wrong error, got %#v, want %#v", err, want) 58 59 got, ok := err.(error) 60 if !ok || !strings.HasPrefix(got.Error(), want) { 61 t.Errorf("wrong error, got %#v, want %#v", got, want) 62 } 63 }() 64 65 MustParseGTID("unknown flavor !@$!@", "yowzah") 66 } 67 68 func TestParseUnknownFlavor(t *testing.T) { 69 want := `parse error: unknown GTID flavor "foobar8675309"` 70 71 _, err := ParseGTID("foobar8675309", "foo") 72 assert.True(t, strings.HasPrefix(err.Error(), want), "wrong error, got '%v', want '%v'", err, want) 73 74 } 75 76 func TestEncodeGTID(t *testing.T) { 77 input := fakeGTID{ 78 flavor: "myflav", 79 value: "1:2:3-4-5-6", 80 } 81 want := "myflav/1:2:3-4-5-6" 82 83 if got := EncodeGTID(input); got != want { 84 t.Errorf("EncodeGTID(%#v) = %#v, want %#v", input, got, want) 85 } 86 } 87 88 func TestDecodeGTID(t *testing.T) { 89 gtidParsers["flavorflav"] = func(s string) (GTID, error) { 90 return fakeGTID{value: s}, nil 91 } 92 input := "flavorflav/123-456:789" 93 want := fakeGTID{value: "123-456:789"} 94 95 got, err := DecodeGTID(input) 96 assert.NoError(t, err, "unexpected error: %v", err) 97 assert.Equal(t, want, got, "DecodeGTID(%#v) = %#v, want %#v", input, got, want) 98 99 } 100 101 func TestMustDecodeGTID(t *testing.T) { 102 gtidParsers["flavorflav"] = func(s string) (GTID, error) { 103 return fakeGTID{value: s}, nil 104 } 105 input := "flavorflav/123-456:789" 106 want := fakeGTID{value: "123-456:789"} 107 108 got := MustDecodeGTID(input) 109 assert.Equal(t, want, got, "DecodeGTID(%#v) = %#v, want %#v", input, got, want) 110 111 } 112 113 func TestMustDecodeGTIDError(t *testing.T) { 114 defer func() { 115 want := `parse error: unknown GTID flavor "unknown flavor !@$!@"` 116 err := recover() 117 assert.NotNil(t, err, "wrong error, got %#v, want %#v", err, want) 118 119 got, ok := err.(error) 120 if !ok || !strings.HasPrefix(got.Error(), want) { 121 t.Errorf("wrong error, got %#v, want %#v", got, want) 122 } 123 }() 124 125 MustDecodeGTID("unknown flavor !@$!@/yowzah") 126 } 127 128 func TestEncodeNilGTID(t *testing.T) { 129 input := GTID(nil) 130 want := "" 131 132 if got := EncodeGTID(input); got != want { 133 t.Errorf("EncodeGTID(%#v) = %#v, want %#v", input, got, want) 134 } 135 } 136 137 func TestDecodeNilGTID(t *testing.T) { 138 input := "" 139 want := GTID(nil) 140 141 got, err := DecodeGTID(input) 142 assert.NoError(t, err, "unexpected error: %v", err) 143 assert.Equal(t, want, got, "DecodeGTID(%#v) = %#v, want %#v", input, got, want) 144 145 } 146 147 func TestDecodeNoFlavor(t *testing.T) { 148 gtidParsers[""] = func(s string) (GTID, error) { 149 return fakeGTID{value: s}, nil 150 } 151 input := "12345" 152 want := fakeGTID{value: "12345"} 153 154 got, err := DecodeGTID(input) 155 assert.NoError(t, err, "unexpected error: %v", err) 156 assert.Equal(t, want, got, "DecodeGTID(%#v) = %#v, want %#v", input, got, want) 157 158 } 159 160 func TestDecodeGTIDWithSeparator(t *testing.T) { 161 gtidParsers["moobar"] = func(s string) (GTID, error) { 162 return fakeGTID{value: s}, nil 163 } 164 input := "moobar/GTID containing / a slash" 165 want := fakeGTID{value: "GTID containing / a slash"} 166 167 got, err := DecodeGTID(input) 168 assert.NoError(t, err, "unexpected error: %v", err) 169 assert.Equal(t, want, got, "DecodeGTID(%#v) = %#v, want %#v", input, got, want) 170 171 } 172 173 type fakeGTID struct { 174 flavor, value string 175 } 176 177 func (f fakeGTID) String() string { return f.value } 178 func (f fakeGTID) Last() string { panic("not implemented") } 179 func (f fakeGTID) Flavor() string { return f.flavor } 180 func (fakeGTID) SourceServer() any { return int(1) } 181 func (fakeGTID) SequenceNumber() any { return int(1) } 182 func (fakeGTID) SequenceDomain() any { return int(1) } 183 func (f fakeGTID) GTIDSet() GTIDSet { return nil } 184 185 func (fakeGTID) ContainsGTID(GTID) bool { return false } 186 func (fakeGTID) Contains(GTIDSet) bool { return false } 187 func (f fakeGTID) Union(GTIDSet) GTIDSet { return f } 188 func (f fakeGTID) Equal(other GTIDSet) bool { 189 otherFake, ok := other.(fakeGTID) 190 if !ok { 191 return false 192 } 193 return f == otherFake 194 } 195 func (fakeGTID) AddGTID(GTID) GTIDSet { return nil }