vitess.io/vitess@v0.16.2/go/vt/binlog/eventtoken/compare_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 eventtoken
    18  
    19  import (
    20  	"testing"
    21  
    22  	querypb "vitess.io/vitess/go/vt/proto/query"
    23  )
    24  
    25  func TestFresher(t *testing.T) {
    26  	testcases := []struct {
    27  		ev1      *querypb.EventToken
    28  		ev2      *querypb.EventToken
    29  		expected int
    30  	}{{
    31  		// Test cases with no shards.
    32  		ev1:      nil,
    33  		ev2:      nil,
    34  		expected: -1,
    35  	}, {
    36  		ev1: &querypb.EventToken{
    37  			Timestamp: 123,
    38  		},
    39  		ev2:      nil,
    40  		expected: -1,
    41  	}, {
    42  		ev1: nil,
    43  		ev2: &querypb.EventToken{
    44  			Timestamp: 123,
    45  		},
    46  		expected: -1,
    47  	}, {
    48  		ev1: &querypb.EventToken{
    49  			Timestamp: 123,
    50  		},
    51  		ev2: &querypb.EventToken{
    52  			Timestamp: 123,
    53  		},
    54  		expected: -1,
    55  	}, {
    56  		ev1: &querypb.EventToken{
    57  			Timestamp: 200,
    58  		},
    59  		ev2: &querypb.EventToken{
    60  			Timestamp: 100,
    61  		},
    62  		expected: 100,
    63  	}, {
    64  		ev1: &querypb.EventToken{
    65  			Timestamp: 100,
    66  		},
    67  		ev2: &querypb.EventToken{
    68  			Timestamp: 200,
    69  		},
    70  		expected: -100,
    71  	}, {
    72  		// Test cases with not enough information to compare.
    73  		ev1: &querypb.EventToken{
    74  			Timestamp: 100,
    75  		},
    76  		ev2: &querypb.EventToken{
    77  			Timestamp: 100,
    78  		},
    79  		expected: -1,
    80  	}, {
    81  		ev1: &querypb.EventToken{
    82  			Timestamp: 100,
    83  			Shard:     "s1",
    84  		},
    85  		ev2: &querypb.EventToken{
    86  			Timestamp: 100,
    87  			Shard:     "s2",
    88  		},
    89  		expected: -1,
    90  	}, {
    91  		ev1: &querypb.EventToken{
    92  			Timestamp: 100,
    93  			Shard:     "s1",
    94  		},
    95  		ev2: &querypb.EventToken{
    96  			Timestamp: 100,
    97  			Shard:     "s1",
    98  		},
    99  		expected: -1,
   100  	}, {
   101  		ev1: &querypb.EventToken{
   102  			Timestamp: 100,
   103  			Shard:     "s1",
   104  			Position:  "pos1",
   105  		},
   106  		ev2: &querypb.EventToken{
   107  			Timestamp: 100,
   108  			Shard:     "s1",
   109  		},
   110  		expected: -1,
   111  	}, {
   112  		ev1: &querypb.EventToken{
   113  			Timestamp: 100,
   114  			Shard:     "s1",
   115  		},
   116  		ev2: &querypb.EventToken{
   117  			Timestamp: 100,
   118  			Shard:     "s1",
   119  			Position:  "pos2",
   120  		},
   121  		expected: -1,
   122  	}, {
   123  		ev1: &querypb.EventToken{
   124  			Timestamp: 100,
   125  			Shard:     "s1",
   126  			Position:  "pos1", // invalid on purpose
   127  		},
   128  		ev2: &querypb.EventToken{
   129  			Timestamp: 100,
   130  			Shard:     "s1",
   131  			Position:  "pos2", // invalid on purpose
   132  		},
   133  		expected: -1,
   134  	}, {
   135  		ev1: &querypb.EventToken{
   136  			Timestamp: 100,
   137  			Shard:     "s1",
   138  			Position:  "MariaDB/0-1-123", // valid but different
   139  		},
   140  		ev2: &querypb.EventToken{
   141  			Timestamp: 100,
   142  			Shard:     "s1",
   143  			Position:  "MySQL56/33333333-3333-3333-3333-333333333333:456-789",
   144  		},
   145  		expected: -1,
   146  	}, {
   147  		// MariaDB test cases.
   148  		ev1: &querypb.EventToken{
   149  			Timestamp: 100,
   150  			Shard:     "s1",
   151  			Position:  "MariaDB/0-1-200",
   152  		},
   153  		ev2: &querypb.EventToken{
   154  			Timestamp: 100,
   155  			Shard:     "s1",
   156  			Position:  "MariaDB/0-1-100",
   157  		},
   158  		expected: 1,
   159  	}, {
   160  		ev1: &querypb.EventToken{
   161  			Timestamp: 100,
   162  			Shard:     "s1",
   163  			Position:  "MariaDB/0-1-100",
   164  		},
   165  		ev2: &querypb.EventToken{
   166  			Timestamp: 100,
   167  			Shard:     "s1",
   168  			Position:  "MariaDB/0-1-200",
   169  		},
   170  		expected: -1,
   171  	}, {
   172  		ev1: &querypb.EventToken{
   173  			Timestamp: 100,
   174  			Shard:     "s1",
   175  			Position:  "MariaDB/0-1-100",
   176  		},
   177  		ev2: &querypb.EventToken{
   178  			Timestamp: 100,
   179  			Shard:     "s1",
   180  			Position:  "MariaDB/0-1-100",
   181  		},
   182  		expected: 0,
   183  	}, {
   184  		// MySQL56 test cases.
   185  		ev1: &querypb.EventToken{
   186  			Timestamp: 100,
   187  			Shard:     "s1",
   188  			Position:  "MySQL56/33333333-3333-3333-3333-333333333333:1-200",
   189  		},
   190  		ev2: &querypb.EventToken{
   191  			Timestamp: 100,
   192  			Shard:     "s1",
   193  			Position:  "MySQL56/33333333-3333-3333-3333-333333333333:1-100",
   194  		},
   195  		expected: 1,
   196  	}, {
   197  		ev1: &querypb.EventToken{
   198  			Timestamp: 100,
   199  			Shard:     "s1",
   200  			Position:  "MySQL56/33333333-3333-3333-3333-333333333333:1-100",
   201  		},
   202  		ev2: &querypb.EventToken{
   203  			Timestamp: 100,
   204  			Shard:     "s1",
   205  			Position:  "MySQL56/33333333-3333-3333-3333-333333333333:1-200",
   206  		},
   207  		expected: -1,
   208  	}, {
   209  		ev1: &querypb.EventToken{
   210  			Timestamp: 100,
   211  			Shard:     "s1",
   212  			Position:  "MySQL56/33333333-3333-3333-3333-333333333333:1-100",
   213  		},
   214  		ev2: &querypb.EventToken{
   215  			Timestamp: 100,
   216  			Shard:     "s1",
   217  			Position:  "MySQL56/33333333-3333-3333-3333-333333333333:1-100",
   218  		},
   219  		expected: 0,
   220  	}}
   221  
   222  	for _, tcase := range testcases {
   223  		got := Fresher(tcase.ev1, tcase.ev2)
   224  		if got != tcase.expected {
   225  			t.Errorf("got %v but expected %v for Fresher(%v, %v)", got, tcase.expected, tcase.ev1, tcase.ev2)
   226  		}
   227  	}
   228  }