vitess.io/vitess@v0.16.2/go/mysql/replication_status_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  	"testing"
    21  
    22  	"github.com/stretchr/testify/require"
    23  )
    24  
    25  func TestStatusReplicationRunning(t *testing.T) {
    26  	input := &ReplicationStatus{
    27  		IOState:  ReplicationStatusToState("yes"),
    28  		SQLState: ReplicationStatusToState("yes"),
    29  	}
    30  	want := true
    31  	if got := input.Running(); got != want {
    32  		t.Errorf("%#v.Running() = %v, want %v", input, got, want)
    33  	}
    34  }
    35  
    36  func TestStatusIOThreadNotRunning(t *testing.T) {
    37  	input := &ReplicationStatus{
    38  		IOState:  ReplicationStatusToState("no"),
    39  		SQLState: ReplicationStatusToState("yes"),
    40  	}
    41  	want := false
    42  	if got := input.Running(); got != want {
    43  		t.Errorf("%#v.Running() = %v, want %v", input, got, want)
    44  	}
    45  }
    46  
    47  func TestStatusSQLThreadNotRunning(t *testing.T) {
    48  	input := &ReplicationStatus{
    49  		IOState:  ReplicationStatusToState("yes"),
    50  		SQLState: ReplicationStatusToState("no"),
    51  	}
    52  	want := false
    53  	if got := input.Running(); got != want {
    54  		t.Errorf("%#v.Running() = %v, want %v", input, got, want)
    55  	}
    56  }
    57  
    58  func TestFindErrantGTIDs(t *testing.T) {
    59  	sid1 := SID{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
    60  	sid2 := SID{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16}
    61  	sid3 := SID{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17}
    62  	sid4 := SID{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 18}
    63  	sourceSID := SID{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 19}
    64  
    65  	set1 := Mysql56GTIDSet{
    66  		sid1:      []interval{{20, 30}, {35, 39}, {40, 53}, {55, 75}},
    67  		sid2:      []interval{{1, 7}, {20, 50}, {60, 70}},
    68  		sid4:      []interval{{1, 30}},
    69  		sourceSID: []interval{{1, 7}, {20, 30}},
    70  	}
    71  
    72  	set2 := Mysql56GTIDSet{
    73  		sid1:      []interval{{20, 30}, {35, 37}, {50, 60}},
    74  		sid2:      []interval{{3, 5}, {22, 25}, {32, 37}, {67, 70}},
    75  		sid3:      []interval{{1, 45}},
    76  		sourceSID: []interval{{2, 6}, {15, 40}},
    77  	}
    78  
    79  	set3 := Mysql56GTIDSet{
    80  		sid1:      []interval{{20, 30}, {35, 38}, {50, 70}},
    81  		sid2:      []interval{{3, 5}, {22, 25}, {32, 37}, {67, 70}},
    82  		sid3:      []interval{{1, 45}},
    83  		sourceSID: []interval{{2, 6}, {15, 45}},
    84  	}
    85  
    86  	testcases := []struct {
    87  		mainRepStatus    *ReplicationStatus
    88  		otherRepStatuses []*ReplicationStatus
    89  		want             Mysql56GTIDSet
    90  	}{{
    91  		mainRepStatus: &ReplicationStatus{SourceUUID: sourceSID, RelayLogPosition: Position{GTIDSet: set1}},
    92  		otherRepStatuses: []*ReplicationStatus{
    93  			{SourceUUID: sourceSID, RelayLogPosition: Position{GTIDSet: set2}},
    94  			{SourceUUID: sourceSID, RelayLogPosition: Position{GTIDSet: set3}},
    95  		},
    96  		want: Mysql56GTIDSet{
    97  			sid1: []interval{{39, 39}, {40, 49}, {71, 75}},
    98  			sid2: []interval{{1, 2}, {6, 7}, {20, 21}, {26, 31}, {38, 50}, {60, 66}},
    99  			sid4: []interval{{1, 30}},
   100  		},
   101  	}, {
   102  		mainRepStatus:    &ReplicationStatus{SourceUUID: sourceSID, RelayLogPosition: Position{GTIDSet: set1}},
   103  		otherRepStatuses: []*ReplicationStatus{{SourceUUID: sid1, RelayLogPosition: Position{GTIDSet: set1}}},
   104  		// servers with the same GTID sets should not be diagnosed with errant GTIDs
   105  		want: nil,
   106  	}}
   107  
   108  	for _, testcase := range testcases {
   109  		t.Run("", func(t *testing.T) {
   110  			got, err := testcase.mainRepStatus.FindErrantGTIDs(testcase.otherRepStatuses)
   111  			require.NoError(t, err)
   112  			require.Equal(t, testcase.want, got)
   113  		})
   114  	}
   115  }