vitess.io/vitess@v0.16.2/go/vt/vttablet/tabletserver/messager/cache_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 messager
    18  
    19  import (
    20  	"reflect"
    21  	"testing"
    22  
    23  	"vitess.io/vitess/go/sqltypes"
    24  )
    25  
    26  func TestMessagerCacheOrder(t *testing.T) {
    27  	mc := newCache(10)
    28  	if !mc.Add(&MessageRow{
    29  		Priority: 1,
    30  		TimeNext: 1,
    31  		Epoch:    0,
    32  		Row:      []sqltypes.Value{sqltypes.NewVarBinary("row01")},
    33  	}) {
    34  		t.Fatal("Add returned false")
    35  	}
    36  	if !mc.Add(&MessageRow{
    37  		Priority: 1,
    38  		TimeNext: 2,
    39  		Epoch:    0,
    40  		Row:      []sqltypes.Value{sqltypes.NewVarBinary("row02")},
    41  	}) {
    42  		t.Fatal("Add returned false")
    43  	}
    44  	if !mc.Add(&MessageRow{
    45  		Priority: 2,
    46  		TimeNext: 2,
    47  		Epoch:    1,
    48  		Row:      []sqltypes.Value{sqltypes.NewVarBinary("row12")},
    49  	}) {
    50  		t.Fatal("Add returned false")
    51  	}
    52  	if !mc.Add(&MessageRow{
    53  		Priority: 2,
    54  		TimeNext: 1,
    55  		Epoch:    1,
    56  		Row:      []sqltypes.Value{sqltypes.NewVarBinary("row11")},
    57  	}) {
    58  		t.Fatal("Add returned false")
    59  	}
    60  	if !mc.Add(&MessageRow{
    61  		Priority: 1,
    62  		TimeNext: 3,
    63  		Epoch:    0,
    64  		Row:      []sqltypes.Value{sqltypes.NewVarBinary("row03")},
    65  	}) {
    66  		t.Fatal("Add returned false")
    67  	}
    68  	var rows []string
    69  	for i := 0; i < 5; i++ {
    70  		rows = append(rows, mc.Pop().Row[0].ToString())
    71  	}
    72  	want := []string{
    73  		"row03",
    74  		"row02",
    75  		"row01",
    76  		"row12",
    77  		"row11",
    78  	}
    79  	if !reflect.DeepEqual(rows, want) {
    80  		t.Errorf("Pop order: %+v, want %+v", rows, want)
    81  	}
    82  }
    83  
    84  func TestMessagerCacheDupKey(t *testing.T) {
    85  	mc := newCache(10)
    86  	if !mc.Add(&MessageRow{
    87  		TimeNext: 1,
    88  		Epoch:    0,
    89  		Row:      []sqltypes.Value{sqltypes.NewVarBinary("row01")},
    90  	}) {
    91  		t.Fatal("Add returned false")
    92  	}
    93  	if !mc.Add(&MessageRow{
    94  		TimeNext: 1,
    95  		Epoch:    0,
    96  		Row:      []sqltypes.Value{sqltypes.NewVarBinary("row01")},
    97  	}) {
    98  		t.Error("Add(dup): returned false, want true")
    99  	}
   100  	_ = mc.Pop()
   101  	if !mc.Add(&MessageRow{
   102  		TimeNext: 1,
   103  		Epoch:    0,
   104  		Row:      []sqltypes.Value{sqltypes.NewVarBinary("row01")},
   105  	}) {
   106  		t.Error("Add(dup): returned false, want true")
   107  	}
   108  	mc.Discard([]string{"row01"})
   109  	if !mc.Add(&MessageRow{
   110  		TimeNext: 1,
   111  		Epoch:    0,
   112  		Row:      []sqltypes.Value{sqltypes.NewVarBinary("row01")},
   113  	}) {
   114  		t.Fatal("Add returned false")
   115  	}
   116  }
   117  
   118  func TestMessagerCacheDiscard(t *testing.T) {
   119  	mc := newCache(10)
   120  	if !mc.Add(&MessageRow{
   121  		TimeNext: 1,
   122  		Epoch:    0,
   123  		Row:      []sqltypes.Value{sqltypes.NewVarBinary("row01")},
   124  	}) {
   125  		t.Fatal("Add returned false")
   126  	}
   127  	mc.Discard([]string{"row01"})
   128  	if row := mc.Pop(); row != nil {
   129  		t.Errorf("Pop: want nil, got %v", row.Row[0])
   130  	}
   131  	if !mc.Add(&MessageRow{
   132  		TimeNext: 1,
   133  		Epoch:    0,
   134  		Row:      []sqltypes.Value{sqltypes.NewVarBinary("row01")},
   135  	}) {
   136  		t.Fatal("Add returned false")
   137  	}
   138  	if row := mc.Pop(); row == nil || row.Row[0].ToString() != "row01" {
   139  		t.Errorf("Pop: want row01, got %v", row)
   140  	}
   141  
   142  	// Add will be a no-op.
   143  	if !mc.Add(&MessageRow{
   144  		TimeNext: 1,
   145  		Epoch:    0,
   146  		Row:      []sqltypes.Value{sqltypes.NewVarBinary("row01")},
   147  	}) {
   148  		t.Fatal("Add returned false")
   149  	}
   150  	if row := mc.Pop(); row != nil {
   151  		t.Errorf("Pop: want nil, got %v", row.Row[0])
   152  	}
   153  	mc.Discard([]string{"row01"})
   154  
   155  	// Now we can add.
   156  	if !mc.Add(&MessageRow{
   157  		TimeNext: 1,
   158  		Epoch:    0,
   159  		Row:      []sqltypes.Value{sqltypes.NewVarBinary("row01")},
   160  	}) {
   161  		t.Fatal("Add returned false")
   162  	}
   163  	if row := mc.Pop(); row == nil || row.Row[0].ToString() != "row01" {
   164  		t.Errorf("Pop: want row01, got %v", row)
   165  	}
   166  }
   167  
   168  func TestMessagerCacheFull(t *testing.T) {
   169  	mc := newCache(2)
   170  	if !mc.Add(&MessageRow{
   171  		TimeNext: 1,
   172  		Epoch:    0,
   173  		Row:      []sqltypes.Value{sqltypes.NewVarBinary("row01")},
   174  	}) {
   175  		t.Fatal("Add returned false")
   176  	}
   177  	if !mc.Add(&MessageRow{
   178  		TimeNext: 2,
   179  		Epoch:    0,
   180  		Row:      []sqltypes.Value{sqltypes.NewVarBinary("row02")},
   181  	}) {
   182  		t.Fatal("Add returned false")
   183  	}
   184  	if mc.Add(&MessageRow{
   185  		TimeNext: 2,
   186  		Epoch:    1,
   187  		Row:      []sqltypes.Value{sqltypes.NewVarBinary("row12")},
   188  	}) {
   189  		t.Error("Add(full): returned true, want false")
   190  	}
   191  }
   192  
   193  func TestMessagerCacheEmpty(t *testing.T) {
   194  	mc := newCache(2)
   195  	if !mc.Add(&MessageRow{
   196  		TimeNext: 1,
   197  		Epoch:    0,
   198  		Row:      []sqltypes.Value{sqltypes.NewVarBinary("row01")},
   199  	}) {
   200  		t.Fatal("Add returned false")
   201  	}
   202  	mc.Clear()
   203  	if row := mc.Pop(); row != nil {
   204  		t.Errorf("Pop(empty): %v, want nil", row)
   205  	}
   206  	if !mc.Add(&MessageRow{
   207  		TimeNext: 1,
   208  		Epoch:    0,
   209  		Row:      []sqltypes.Value{sqltypes.NewVarBinary("row01")},
   210  	}) {
   211  		t.Fatal("Add returned false")
   212  	}
   213  	if row := mc.Pop(); row == nil {
   214  		t.Errorf("Pop(non-empty): nil, want %v", row)
   215  	}
   216  }