vitess.io/vitess@v0.16.2/go/mysql/mariadb_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  	"github.com/stretchr/testify/require"
    25  )
    26  
    27  func TestParseMariaGTID(t *testing.T) {
    28  	input := "12-345-6789"
    29  	want := MariadbGTID{Domain: 12, Server: 345, Sequence: 6789}
    30  
    31  	got, err := parseMariadbGTID(input)
    32  	assert.NoError(t, err, "%v", err)
    33  	assert.Equal(t, want, got.(MariadbGTID), "parseMariadbGTID(%v) = %v, want %v", input, got, want)
    34  
    35  }
    36  
    37  func TestParseInvalidMariaGTID(t *testing.T) {
    38  	input := "12345"
    39  	want := "invalid MariaDB GTID"
    40  
    41  	_, err := parseMariadbGTID(input)
    42  	assert.Error(t, err, "expected error for invalid input (%v)", input)
    43  	assert.True(t, strings.HasPrefix(err.Error(), want), "wrong error message, got '%v', want '%v'", err, want)
    44  
    45  }
    46  
    47  func TestParseMariaGTIDInvalidDomain(t *testing.T) {
    48  	input := "1x-33-142"
    49  	want := "invalid MariaDB GTID Domain ID"
    50  
    51  	_, err := parseMariadbGTID(input)
    52  	assert.Error(t, err, "expected error for invalid input (%v)", input)
    53  	assert.True(t, strings.HasPrefix(err.Error(), want), "wrong error message, got '%v', want '%v'", err, want)
    54  
    55  }
    56  
    57  func TestParseMariaGTIDInvalidServer(t *testing.T) {
    58  	input := "1-2c3-142"
    59  	want := "invalid MariaDB GTID Server ID"
    60  
    61  	_, err := parseMariadbGTID(input)
    62  	assert.Error(t, err, "expected error for invalid input (%v)", input)
    63  	assert.True(t, strings.HasPrefix(err.Error(), want), "wrong error message, got '%v', want '%v'", err, want)
    64  
    65  }
    66  
    67  func TestParseMariaGTIDInvalidSequence(t *testing.T) {
    68  	input := "1-33-a142"
    69  	want := "invalid MariaDB GTID Sequence number"
    70  
    71  	_, err := parseMariadbGTID(input)
    72  	assert.Error(t, err, "expected error for invalid input (%v)", input)
    73  	assert.True(t, strings.HasPrefix(err.Error(), want), "wrong error message, got '%v', want '%v'", err, want)
    74  
    75  }
    76  
    77  func TestParseMariaGTIDSet(t *testing.T) {
    78  	input := "12-34-5678,11-22-3333"
    79  	want := MariadbGTIDSet{
    80  		12: MariadbGTID{Domain: 12, Server: 34, Sequence: 5678},
    81  		11: MariadbGTID{Domain: 11, Server: 22, Sequence: 3333},
    82  	}
    83  
    84  	got, err := parseMariadbGTIDSet(input)
    85  	assert.NoError(t, err, "%v", err)
    86  	assert.True(t, got.Equal(want), "parseMariadbGTIDSet(%#v) = %#v, want %#v", input, got, want)
    87  
    88  }
    89  
    90  func TestParseInvalidMariaGTIDSet(t *testing.T) {
    91  	input := "12-34-5678,11-22-33e33"
    92  	want := "invalid MariaDB GTID Sequence number"
    93  
    94  	_, err := parseMariadbGTIDSet(input)
    95  	if err == nil {
    96  		t.Errorf("expected error for invalid input (%#v)", input)
    97  		return
    98  	}
    99  	if got := err.Error(); !strings.HasPrefix(got, want) {
   100  		t.Errorf("parseMariadbGTIDSet(%#v) error = %#v, want %#v", input, got, want)
   101  	}
   102  }
   103  
   104  func TestMariaGTIDString(t *testing.T) {
   105  	input := MariadbGTID{Domain: 5, Server: 4727, Sequence: 1737373}
   106  	want := "5-4727-1737373"
   107  
   108  	got := input.String()
   109  	assert.Equal(t, want, got, "%#v.String() = '%v', want '%v'", input, got, want)
   110  
   111  }
   112  
   113  func TestMariaGTIDFlavor(t *testing.T) {
   114  	input := MariadbGTID{Domain: 1, Server: 2, Sequence: 123}
   115  	want := "MariaDB"
   116  
   117  	got := input.Flavor()
   118  	assert.Equal(t, want, got, "%#v.Flavor() = '%v', want '%v'", input, got, want)
   119  
   120  }
   121  
   122  func TestMariaGTIDSequenceDomain(t *testing.T) {
   123  	input := MariadbGTID{Domain: 12, Server: 345, Sequence: 6789}
   124  	want := any(uint32(12))
   125  
   126  	got := input.SequenceDomain()
   127  	assert.Equal(t, want, got, "%#v.SequenceDomain() = %#v, want %#v", input, got, want)
   128  
   129  }
   130  
   131  func TestMariaGTIDSourceServer(t *testing.T) {
   132  	input := MariadbGTID{Domain: 12, Server: 345, Sequence: 6789}
   133  	want := any(uint32(345))
   134  
   135  	got := input.SourceServer()
   136  	assert.Equal(t, want, got, "%#v.SourceServer() = %#v, want %#v", input, got, want)
   137  
   138  }
   139  
   140  func TestMariaGTIDSequenceNumber(t *testing.T) {
   141  	input := MariadbGTID{Domain: 12, Server: 345, Sequence: 6789}
   142  	want := any(uint64(6789))
   143  
   144  	got := input.SequenceNumber()
   145  	assert.Equal(t, want, got, "%#v.SequenceNumber() = %#v, want %#v", input, got, want)
   146  
   147  }
   148  
   149  func TestMariaGTIDGTIDSet(t *testing.T) {
   150  	input := MariadbGTID{Domain: 12, Server: 345, Sequence: 6789}
   151  	want := MariadbGTIDSet{12: input}
   152  
   153  	got := input.GTIDSet()
   154  	assert.True(t, got.Equal(want), "%#v.GTIDSet() = %#v, want %#v", input, got, want)
   155  
   156  }
   157  
   158  func TestMariaGTIDSetString(t *testing.T) {
   159  	input := MariadbGTIDSet{
   160  		5: MariadbGTID{Domain: 5, Server: 4727, Sequence: 1737373},
   161  		3: MariadbGTID{Domain: 3, Server: 4321, Sequence: 9876},
   162  		1: MariadbGTID{Domain: 1, Server: 1234, Sequence: 5678},
   163  	}
   164  	want := "1-1234-5678,3-4321-9876,5-4727-1737373"
   165  
   166  	got := input.String()
   167  	assert.Equal(t, want, got, "%#v.String() = '%v', want '%v'", input, got, want)
   168  
   169  }
   170  
   171  func TestMariaGTIDSetContainsLess(t *testing.T) {
   172  	input1 := MariadbGTIDSet{5: MariadbGTID{Domain: 5, Server: 4727, Sequence: 300}}
   173  	input2 := MariadbGTIDSet{5: MariadbGTID{Domain: 5, Server: 4727, Sequence: 700}}
   174  	want := false
   175  
   176  	if got := input1.Contains(input2); got != want {
   177  		t.Errorf("%#v.Contains(%#v) = %v, want %v", input1, input2, got, want)
   178  	}
   179  }
   180  
   181  func TestMariaGTIDSetContainsGreater(t *testing.T) {
   182  	input1 := MariadbGTIDSet{5: MariadbGTID{Domain: 5, Server: 4727, Sequence: 9000}}
   183  	input2 := MariadbGTIDSet{5: MariadbGTID{Domain: 5, Server: 5555, Sequence: 100}}
   184  	want := true
   185  
   186  	if got := input1.Contains(input2); got != want {
   187  		t.Errorf("%#v.Contains(%#v) = %v, want %v", input1, input2, got, want)
   188  	}
   189  }
   190  
   191  func TestMariaGTIDSetContainsEqual(t *testing.T) {
   192  	input1 := MariadbGTIDSet{
   193  		1: MariadbGTID{Domain: 1, Server: 4321, Sequence: 100},
   194  		5: MariadbGTID{Domain: 5, Server: 4727, Sequence: 1234},
   195  	}
   196  	input2 := MariadbGTIDSet{
   197  		1: MariadbGTID{Domain: 1, Server: 4321, Sequence: 100},
   198  		5: MariadbGTID{Domain: 5, Server: 4727, Sequence: 1234},
   199  	}
   200  	want := true
   201  
   202  	if got := input1.Contains(input2); got != want {
   203  		t.Errorf("%#v.Contains(%#v) = %v, want %v", input1, input2, got, want)
   204  	}
   205  }
   206  
   207  func TestMariaGTIDSetMultipleContainsLess(t *testing.T) {
   208  	input1 := MariadbGTIDSet{
   209  		4: MariadbGTID{Domain: 4, Server: 1, Sequence: 123},
   210  		5: MariadbGTID{Domain: 5, Server: 5, Sequence: 24601},
   211  	}
   212  	input2 := MariadbGTIDSet{
   213  		4: MariadbGTID{Domain: 4, Server: 1, Sequence: 124},
   214  	}
   215  	want := false
   216  
   217  	if got := input1.Contains(input2); got != want {
   218  		t.Errorf("%#v.Contains(%#v) = %v, want %v", input1, input2, got, want)
   219  	}
   220  }
   221  
   222  func TestMariaGTIDSetMultipleContainsGreater(t *testing.T) {
   223  	input1 := MariadbGTIDSet{
   224  		4: MariadbGTID{Domain: 4, Server: 1, Sequence: 123},
   225  		5: MariadbGTID{Domain: 5, Server: 5, Sequence: 24601},
   226  	}
   227  	input2 := MariadbGTIDSet{
   228  		4: MariadbGTID{Domain: 4, Server: 2, Sequence: 122},
   229  	}
   230  	want := true
   231  
   232  	if got := input1.Contains(input2); got != want {
   233  		t.Errorf("%#v.Contains(%#v) = %v, want %v", input1, input2, got, want)
   234  	}
   235  }
   236  
   237  func TestMariaGTIDSetMultipleContainsMultipleGreater(t *testing.T) {
   238  	input1 := MariadbGTIDSet{
   239  		4: MariadbGTID{Domain: 4, Server: 1, Sequence: 123},
   240  		5: MariadbGTID{Domain: 5, Server: 5, Sequence: 24601},
   241  	}
   242  	input2 := MariadbGTIDSet{
   243  		4: MariadbGTID{Domain: 4, Server: 1, Sequence: 122},
   244  		5: MariadbGTID{Domain: 5, Server: 4, Sequence: 1999},
   245  	}
   246  	want := true
   247  
   248  	if got := input1.Contains(input2); got != want {
   249  		t.Errorf("%#v.Contains(%#v) = %v, want %v", input1, input2, got, want)
   250  	}
   251  }
   252  
   253  func TestMariaGTIDSetMultipleContainsOneLess(t *testing.T) {
   254  	input1 := MariadbGTIDSet{
   255  		4: MariadbGTID{Domain: 4, Server: 1, Sequence: 123},
   256  		5: MariadbGTID{Domain: 5, Server: 5, Sequence: 24601},
   257  	}
   258  	input2 := MariadbGTIDSet{
   259  		4: MariadbGTID{Domain: 4, Server: 1, Sequence: 122},
   260  		5: MariadbGTID{Domain: 5, Server: 4, Sequence: 24602},
   261  	}
   262  	want := false
   263  
   264  	if got := input1.Contains(input2); got != want {
   265  		t.Errorf("%#v.Contains(%#v) = %v, want %v", input1, input2, got, want)
   266  	}
   267  }
   268  
   269  func TestMariaGTIDSetSingleContainsMultiple(t *testing.T) {
   270  	input1 := MariadbGTIDSet{
   271  		4: MariadbGTID{Domain: 4, Server: 1, Sequence: 123},
   272  	}
   273  	input2 := MariadbGTIDSet{
   274  		4: MariadbGTID{Domain: 4, Server: 1, Sequence: 122},
   275  		5: MariadbGTID{Domain: 5, Server: 4, Sequence: 24602},
   276  	}
   277  	want := false
   278  
   279  	if got := input1.Contains(input2); got != want {
   280  		t.Errorf("%#v.Contains(%#v) = %v, want %v", input1, input2, got, want)
   281  	}
   282  }
   283  
   284  func TestMariaGTIDSetContainsConcreteNil(t *testing.T) {
   285  	input1 := MariadbGTIDSet{1: MariadbGTID{Domain: 1, Server: 2, Sequence: 123}}
   286  	input2 := MariadbGTIDSet(nil)
   287  	want := true
   288  
   289  	if got := input1.Contains(input2); got != want {
   290  		t.Errorf("%#v.Contains(%#v) = %v, want %v", input1, input2, got, want)
   291  	}
   292  }
   293  
   294  func TestMariaGTIDSetFailsNil(t *testing.T) {
   295  	input1 := MariadbGTIDSet{6: MariadbGTID{Domain: 23, Server: 1, Sequence: 456}}
   296  	input2 := GTIDSet(nil)
   297  	want := false
   298  
   299  	if got := input1.Contains(input2); got != want {
   300  		t.Errorf("%#v.Contains(%#v) = %v, want %v", input1, input2, got, want)
   301  	}
   302  }
   303  
   304  func TestMariaGTIDSetContainsWrongType(t *testing.T) {
   305  	input1 := MariadbGTIDSet{5: MariadbGTID{Domain: 5, Server: 4727, Sequence: 1234}}
   306  	input2 := fakeGTID{}
   307  	want := false
   308  
   309  	if got := input1.Contains(input2); got != want {
   310  		t.Errorf("%#v.Contains(%#v) = %v, want %v", input1, input2, got, want)
   311  	}
   312  }
   313  
   314  func TestMariaGTIDSetContainsDifferentDomain(t *testing.T) {
   315  	input1 := MariadbGTIDSet{3: MariadbGTID{Domain: 3, Server: 4727, Sequence: 1235}}
   316  	input2 := MariadbGTIDSet{5: MariadbGTID{Domain: 5, Server: 4727, Sequence: 1234}}
   317  	want := false
   318  
   319  	if got := input1.Contains(input2); got != want {
   320  		t.Errorf("%#v.Contains(%#v) = %v, want %v", input1, input2, got, want)
   321  	}
   322  }
   323  
   324  func TestMariaGTIDSetContainsDifferentServer(t *testing.T) {
   325  	input1 := MariadbGTIDSet{3: MariadbGTID{Domain: 3, Server: 4727, Sequence: 1235}}
   326  	input2 := MariadbGTIDSet{3: MariadbGTID{Domain: 3, Server: 5555, Sequence: 1234}}
   327  	want := true
   328  
   329  	if got := input1.Contains(input2); got != want {
   330  		t.Errorf("%#v.Contains(%#v) = %v, want %v", input1, input2, got, want)
   331  	}
   332  }
   333  
   334  func TestMariaGTIDSetContainsGTIDLess(t *testing.T) {
   335  	input1 := MariadbGTIDSet{5: MariadbGTID{Domain: 5, Server: 4727, Sequence: 300}}
   336  	input2 := MariadbGTID{Domain: 5, Server: 4727, Sequence: 700}
   337  	want := false
   338  
   339  	if got := input1.ContainsGTID(input2); got != want {
   340  		t.Errorf("%#v.ContainsGTID(%#v) = %v, want %v", input1, input2, got, want)
   341  	}
   342  }
   343  
   344  func TestMariaGTIDSetContainsGTIDGreater(t *testing.T) {
   345  	input1 := MariadbGTIDSet{5: MariadbGTID{Domain: 5, Server: 4727, Sequence: 9000}}
   346  	input2 := MariadbGTID{Domain: 5, Server: 4727, Sequence: 100}
   347  	want := true
   348  
   349  	if got := input1.ContainsGTID(input2); got != want {
   350  		t.Errorf("%#v.ContainsGTID(%#v) = %v, want %v", input1, input2, got, want)
   351  	}
   352  }
   353  
   354  func TestMariaGTIDSetContainsGTIDEqual(t *testing.T) {
   355  	input1 := MariadbGTIDSet{5: MariadbGTID{Domain: 5, Server: 4727, Sequence: 1234}}
   356  	input2 := MariadbGTID{Domain: 5, Server: 4727, Sequence: 1234}
   357  	want := true
   358  
   359  	if got := input1.ContainsGTID(input2); got != want {
   360  		t.Errorf("%#v.ContainsGTID(%#v) = %v, want %v", input1, input2, got, want)
   361  	}
   362  }
   363  
   364  func TestMariaGTIDSetContainsGTIDNil(t *testing.T) {
   365  	input1 := MariadbGTIDSet{1: MariadbGTID{Domain: 1, Server: 2, Sequence: 123}}
   366  	input2 := GTID(nil)
   367  	want := true
   368  
   369  	if got := input1.ContainsGTID(input2); got != want {
   370  		t.Errorf("%#v.ContainsGTID(%#v) = %v, want %v", input1, input2, got, want)
   371  	}
   372  }
   373  
   374  func TestMariaGTIDSetContainsGTIDWrongType(t *testing.T) {
   375  	input1 := MariadbGTIDSet{5: MariadbGTID{Domain: 5, Server: 4727, Sequence: 1234}}
   376  	input2 := fakeGTID{}
   377  	want := false
   378  
   379  	if got := input1.ContainsGTID(input2); got != want {
   380  		t.Errorf("%#v.ContainsGTID(%#v) = %v, want %v", input1, input2, got, want)
   381  	}
   382  }
   383  
   384  func TestMariaGTIDSetContainsGTIDDifferentDomain(t *testing.T) {
   385  	input1 := MariadbGTIDSet{3: MariadbGTID{Domain: 3, Server: 4727, Sequence: 1235}}
   386  	input2 := MariadbGTID{Domain: 5, Server: 4727, Sequence: 1234}
   387  	want := false
   388  
   389  	if got := input1.ContainsGTID(input2); got != want {
   390  		t.Errorf("%#v.ContainsGTID(%#v) = %v, want %v", input1, input2, got, want)
   391  	}
   392  }
   393  
   394  func TestMariaGTIDSetContainsGTIDDifferentServer(t *testing.T) {
   395  	input1 := MariadbGTIDSet{3: MariadbGTID{Domain: 3, Server: 4727, Sequence: 1235}}
   396  	input2 := MariadbGTID{Domain: 3, Server: 5555, Sequence: 1234}
   397  	want := true
   398  
   399  	if got := input1.ContainsGTID(input2); got != want {
   400  		t.Errorf("%#v.ContainsGTID(%#v) = %v, want %v", input1, input2, got, want)
   401  	}
   402  }
   403  
   404  func TestMariaGTIDSetEqual(t *testing.T) {
   405  	input1 := MariadbGTIDSet{
   406  		1: MariadbGTID{Domain: 1, Server: 1234, Sequence: 5678},
   407  		3: MariadbGTID{Domain: 3, Server: 5555, Sequence: 1234},
   408  	}
   409  	input2 := MariadbGTIDSet{
   410  		1: MariadbGTID{Domain: 1, Server: 1234, Sequence: 5678},
   411  		3: MariadbGTID{Domain: 3, Server: 5555, Sequence: 1234},
   412  	}
   413  	want := true
   414  
   415  	if got := input1.Equal(input2); got != want {
   416  		t.Errorf("%#v.Equal(%#v) = %v, want %v", input1, input2, got, want)
   417  	}
   418  }
   419  
   420  func TestMariaGTIDSetNotEqual(t *testing.T) {
   421  	input1 := MariadbGTIDSet{
   422  		3: MariadbGTID{Domain: 3, Server: 5555, Sequence: 1234},
   423  		4: MariadbGTID{Domain: 4, Server: 4555, Sequence: 1234},
   424  	}
   425  	input2 := MariadbGTIDSet{
   426  		3: MariadbGTID{Domain: 3, Server: 4555, Sequence: 1234},
   427  		4: MariadbGTID{Domain: 4, Server: 4555, Sequence: 1234},
   428  	}
   429  	want := false
   430  
   431  	if got := input1.Equal(input2); got != want {
   432  		t.Errorf("%#v.Equal(%#v) = %v, want %v", input1, input2, got, want)
   433  	}
   434  }
   435  
   436  func TestMariaGTIDSetNotEqualDifferentDomain(t *testing.T) {
   437  	input1 := MariadbGTIDSet{
   438  		3: MariadbGTID{Domain: 3, Server: 5555, Sequence: 1234},
   439  		4: MariadbGTID{Domain: 4, Server: 4555, Sequence: 1234},
   440  	}
   441  	input2 := MariadbGTIDSet{
   442  		3: MariadbGTID{Domain: 3, Server: 5555, Sequence: 1234},
   443  		5: MariadbGTID{Domain: 5, Server: 4555, Sequence: 1234},
   444  	}
   445  	want := false
   446  
   447  	if got := input1.Equal(input2); got != want {
   448  		t.Errorf("%#v.Equal(%#v) = %v, want %v", input1, input2, got, want)
   449  	}
   450  }
   451  
   452  func TestMariaGTIDSetNotEqualExtraDomain(t *testing.T) {
   453  	input1 := MariadbGTIDSet{
   454  		3: MariadbGTID{Domain: 3, Server: 5555, Sequence: 1234},
   455  	}
   456  	input2 := MariadbGTIDSet{
   457  		3: MariadbGTID{Domain: 3, Server: 5555, Sequence: 1234},
   458  		4: MariadbGTID{Domain: 4, Server: 4555, Sequence: 1234},
   459  	}
   460  	want := false
   461  
   462  	if got := input1.Equal(input2); got != want {
   463  		t.Errorf("%#v.Equal(%#v) = %v, want %v", input1, input2, got, want)
   464  	}
   465  }
   466  
   467  func TestMariaGTIDSetEqualWrongType(t *testing.T) {
   468  	input1 := MariadbGTIDSet{3: MariadbGTID{Domain: 3, Server: 5555, Sequence: 1234}}
   469  	input2 := fakeGTID{}
   470  	want := false
   471  
   472  	if got := input1.Equal(input2); got != want {
   473  		t.Errorf("%#v.Equal(%#v) = %v, want %v", input1, input2, got, want)
   474  	}
   475  }
   476  
   477  func TestMariaGTIDSetEqualNil(t *testing.T) {
   478  	input1 := MariadbGTIDSet{3: MariadbGTID{Domain: 3, Server: 5555, Sequence: 1234}}
   479  	input2 := GTIDSet(nil)
   480  	want := false
   481  
   482  	if got := input1.Equal(input2); got != want {
   483  		t.Errorf("%#v.Equal(%#v) = %v, want %v", input1, input2, got, want)
   484  	}
   485  }
   486  
   487  func TestMariaGTIDSetAddGTIDEqual(t *testing.T) {
   488  	input1 := MariadbGTIDSet{3: MariadbGTID{Domain: 3, Server: 5555, Sequence: 1234}}
   489  	input2 := MariadbGTID{Domain: 3, Server: 5555, Sequence: 1234}
   490  	want := input1
   491  
   492  	if got := input1.AddGTID(input2); !got.Equal(want) {
   493  		t.Errorf("%#v.AddGTID(%#v) = %v, want %v", input1, input2, got, want)
   494  	}
   495  }
   496  
   497  func TestMariaGTIDSetAddGTIDGreater(t *testing.T) {
   498  	input1 := MariadbGTIDSet{3: MariadbGTID{Domain: 3, Server: 5555, Sequence: 5234}}
   499  	input2 := MariadbGTID{Domain: 3, Server: 5555, Sequence: 1234}
   500  	want := input1
   501  
   502  	if got := input1.AddGTID(input2); !got.Equal(want) {
   503  		t.Errorf("%#v.AddGTID(%#v) = %v, want %v", input1, input2, got, want)
   504  	}
   505  }
   506  
   507  func TestMariaGTIDSetAddGTIDLess(t *testing.T) {
   508  	input1 := MariadbGTIDSet{3: MariadbGTID{Domain: 3, Server: 5555, Sequence: 1234}}
   509  	input2 := MariadbGTID{Domain: 3, Server: 5555, Sequence: 5234}
   510  	want := MariadbGTIDSet{3: MariadbGTID{Domain: 3, Server: 5555, Sequence: 5234}}
   511  
   512  	if got := input1.AddGTID(input2); !got.Equal(want) {
   513  		t.Errorf("%#v.AddGTID(%#v) = %v, want %v", input1, input2, got, want)
   514  	}
   515  }
   516  
   517  func TestMariaGTIDSetAddGTIDWrongType(t *testing.T) {
   518  	input1 := MariadbGTIDSet{3: MariadbGTID{Domain: 3, Server: 5555, Sequence: 1234}}
   519  	input2 := fakeGTID{}
   520  	want := input1
   521  
   522  	if got := input1.AddGTID(input2); !got.Equal(want) {
   523  		t.Errorf("%#v.AddGTID(%#v) = %v, want %v", input1, input2, got, want)
   524  	}
   525  }
   526  
   527  func TestMariaGTIDSetAddGTIDNil(t *testing.T) {
   528  	input1 := MariadbGTIDSet{3: MariadbGTID{Domain: 3, Server: 5555, Sequence: 1234}}
   529  	input2 := GTID(nil)
   530  	want := input1
   531  
   532  	if got := input1.AddGTID(input2); !got.Equal(want) {
   533  		t.Errorf("%#v.AddGTID(%#v) = %v, want %v", input1, input2, got, want)
   534  	}
   535  }
   536  
   537  func TestMariaGTIDSetAddGTIDDifferentServer(t *testing.T) {
   538  	input1 := MariadbGTIDSet{3: MariadbGTID{Domain: 3, Server: 5555, Sequence: 1234}}
   539  	input2 := MariadbGTID{Domain: 3, Server: 4444, Sequence: 5234}
   540  	want := MariadbGTIDSet{3: MariadbGTID{Domain: 3, Server: 4444, Sequence: 5234}}
   541  
   542  	if got := input1.AddGTID(input2); !got.Equal(want) {
   543  		t.Errorf("%#v.AddGTID(%#v) = %v, want %v", input1, input2, got, want)
   544  	}
   545  }
   546  
   547  func TestMariaGTIDSetAddGTIDDifferentDomain(t *testing.T) {
   548  	input1 := MariadbGTIDSet{3: MariadbGTID{Domain: 3, Server: 5555, Sequence: 1234}}
   549  	input2 := MariadbGTID{Domain: 5, Server: 5555, Sequence: 5234}
   550  	want := MariadbGTIDSet{
   551  		3: MariadbGTID{Domain: 3, Server: 5555, Sequence: 1234},
   552  		5: MariadbGTID{Domain: 5, Server: 5555, Sequence: 5234},
   553  	}
   554  
   555  	if got := input1.AddGTID(input2); !got.Equal(want) {
   556  		t.Errorf("%#v.AddGTID(%#v) = %v, want %v", input1, input2, got, want)
   557  	}
   558  }
   559  
   560  func TestMariaGTIDSetUnion(t *testing.T) {
   561  	set1 := MariadbGTIDSet{
   562  		3: MariadbGTID{Domain: 3, Server: 1, Sequence: 1},
   563  		4: MariadbGTID{Domain: 4, Server: 1, Sequence: 2},
   564  		5: MariadbGTID{Domain: 5, Server: 1, Sequence: 3},
   565  	}
   566  	set2 := MariadbGTIDSet{
   567  		3: MariadbGTID{Domain: 3, Server: 1, Sequence: 2},
   568  		4: MariadbGTID{Domain: 4, Server: 1, Sequence: 1},
   569  		5: MariadbGTID{Domain: 5, Server: 1, Sequence: 4},
   570  	}
   571  
   572  	got := set1.Union(set2)
   573  
   574  	want := MariadbGTIDSet{
   575  		3: MariadbGTID{Domain: 3, Server: 1, Sequence: 2},
   576  		4: MariadbGTID{Domain: 4, Server: 1, Sequence: 2},
   577  		5: MariadbGTID{Domain: 5, Server: 1, Sequence: 4},
   578  	}
   579  	assert.True(t, got.Equal(want), "set1: %#v, set1.Union(%#v) = %#v, want %#v", set1, set2, got, want)
   580  
   581  }
   582  
   583  func TestMariaGTIDSetUnionNewDomain(t *testing.T) {
   584  	set1 := MariadbGTIDSet{
   585  		3: MariadbGTID{Domain: 3, Server: 1, Sequence: 1},
   586  		4: MariadbGTID{Domain: 4, Server: 1, Sequence: 2},
   587  		5: MariadbGTID{Domain: 5, Server: 1, Sequence: 3},
   588  	}
   589  	set2 := MariadbGTIDSet{
   590  		3: MariadbGTID{Domain: 3, Server: 1, Sequence: 2},
   591  		4: MariadbGTID{Domain: 4, Server: 1, Sequence: 1},
   592  		5: MariadbGTID{Domain: 5, Server: 1, Sequence: 4},
   593  		6: MariadbGTID{Domain: 6, Server: 1, Sequence: 7},
   594  	}
   595  
   596  	got := set1.Union(set2)
   597  
   598  	want := MariadbGTIDSet{
   599  		3: MariadbGTID{Domain: 3, Server: 1, Sequence: 2},
   600  		4: MariadbGTID{Domain: 4, Server: 1, Sequence: 2},
   601  		5: MariadbGTID{Domain: 5, Server: 1, Sequence: 4},
   602  		6: MariadbGTID{Domain: 6, Server: 1, Sequence: 7},
   603  	}
   604  	assert.True(t, got.Equal(want), "set1: %#v, set1.Union(%#v) = %#v, want %#v", set1, set2, got, want)
   605  
   606  	switch g := got.(type) {
   607  	case MariadbGTIDSet:
   608  		// Enforce order of want. Results should be sorted by domain.
   609  		if g[0] != want[0] || g[1] != want[1] || g[2] != want[2] || g[3] != want[3] {
   610  			t.Error("Set was not sorted by domain when returned.")
   611  		}
   612  	default:
   613  		t.Error("Union result was not of type MariadbGTIDSet.")
   614  	}
   615  }
   616  
   617  func TestMariaGTIDSetLast(t *testing.T) {
   618  
   619  	testCases := map[string]string{
   620  		"12-34-5678,11-22-3333,24-52-4523": "24-52-4523",
   621  		"12-34-5678":                       "12-34-5678",
   622  	}
   623  	for input, want := range testCases {
   624  		got, err := parseMariadbGTIDSet(input)
   625  		require.NoError(t, err)
   626  		assert.Equal(t, want, got.Last())
   627  	}
   628  }