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 }