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 }