github.com/pingcap/tiflow@v0.0.0-20240520035814-5bf52d54e205/dm/pkg/streamer/hub_test.go (about) 1 // Copyright 2019 PingCAP, Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // See the License for the specific language governing permissions and 12 // limitations under the License. 13 14 package streamer 15 16 import ( 17 "path/filepath" 18 "testing" 19 20 "github.com/stretchr/testify/require" 21 ) 22 23 func TestRelayLogInfo(t *testing.T) { 24 t.Parallel() 25 rli1 := RelayLogInfo{} 26 rli1.SubDirSuffix = 1 27 rli2 := RelayLogInfo{} 28 rli2.SubDirSuffix = 2 29 30 // compare by UUIDSuffix 31 require.False(t, rli1.Earlier(&rli1)) 32 require.True(t, rli1.Earlier(&rli2)) 33 require.False(t, rli2.Earlier(&rli1)) 34 require.False(t, rli2.Earlier(&rli2)) 35 36 // compare by filename 37 rli3 := RelayLogInfo{} 38 rli3.SubDirSuffix = 1 39 40 rli1.Filename = "mysql-bin.000001" 41 rli3.Filename = "mysql-bin.000001" // equal 42 require.False(t, rli1.Earlier(&rli3)) 43 require.False(t, rli3.Earlier(&rli1)) 44 45 rli3.Filename = "mysql-bin.000003" 46 require.True(t, rli1.Earlier(&rli3)) 47 require.False(t, rli3.Earlier(&rli1)) 48 49 // string representation 50 rli3.SubDir = "c6ae5afe-c7a3-11e8-a19d-0242ac130006.000001" 51 require.Equal(t, filepath.Join(rli3.SubDir, rli3.Filename), rli3.String()) 52 } 53 54 func TestRelayLogInfoHub(t *testing.T) { 55 t.Parallel() 56 rlih := newRelayLogInfoHub() 57 taskName, earliest := rlih.earliest() 58 require.Equal(t, "", taskName) 59 require.Nil(t, earliest) 60 61 // update with invalid args 62 err := rlih.update("invalid-task", "invalid.uuid", "mysql-bin.000006") 63 require.Error(t, err) 64 err = rlih.update("invalid-task", "c6ae5afe-c7a3-11e8-a19d-0242ac130006.000002", "invalid.binlog") 65 require.Error(t, err) 66 taskName, earliest = rlih.earliest() 67 require.Equal(t, "", taskName) 68 require.Nil(t, earliest) 69 70 cases := []struct { 71 taskName string 72 uuid string 73 filename string 74 }{ 75 {"task-1", "c6ae5afe-c7a3-11e8-a19d-0242ac130006.000004", "mysql-bin.000001"}, 76 {"task-2", "e9540a0d-f16d-11e8-8cb7-0242ac130008.000003", "mysql-bin.000002"}, 77 {"task-3", "c6ae5afe-c7a3-11e8-a19d-0242ac130006.000002", "mysql-bin.000003"}, 78 {"task-3", "c6ae5afe-c7a3-11e8-a19d-0242ac130006.000002", "mysql-bin.000002"}, 79 } 80 81 // update from later to earlier 82 for _, cs := range cases { 83 err = rlih.update(cs.taskName, cs.uuid, cs.filename) 84 require.NoError(t, err) 85 taskName, earliest = rlih.earliest() 86 require.Equal(t, cs.taskName, taskName) 87 require.Equal(t, cs.uuid, earliest.SubDir) 88 require.Equal(t, cs.filename, earliest.Filename) 89 } 90 require.Len(t, rlih.logs, 3) 91 92 // remove earliest 93 cs := cases[3] 94 rlih.remove(cs.taskName) 95 require.Len(t, rlih.logs, 2) 96 97 taskName, earliest = rlih.earliest() 98 cs = cases[1] 99 require.Equal(t, cs.taskName, taskName) 100 require.Equal(t, cs.uuid, earliest.SubDir) 101 require.Equal(t, cs.filename, earliest.Filename) 102 103 // remove non-earliest 104 cs = cases[0] 105 rlih.remove(cs.taskName) 106 require.Len(t, rlih.logs, 1) 107 108 taskName, earliest = rlih.earliest() 109 cs = cases[1] 110 require.Equal(t, cs.taskName, taskName) 111 require.Equal(t, cs.uuid, earliest.SubDir) 112 require.Equal(t, cs.filename, earliest.Filename) 113 114 // all removed 115 cs = cases[1] 116 rlih.remove(cs.taskName) 117 require.Len(t, rlih.logs, 0) 118 119 taskName, earliest = rlih.earliest() 120 require.Equal(t, "", taskName) 121 require.Nil(t, earliest) 122 } 123 124 func TestReaderHub(t *testing.T) { 125 t.Parallel() 126 h := GetReaderHub() 127 require.NotNil(t, h) 128 129 h2 := GetReaderHub() 130 require.NotNil(t, h2) 131 require.Equal(t, h, h2) 132 133 // no earliest 134 erli := h.EarliestActiveRelayLog() 135 require.Nil(t, erli) 136 137 // update one 138 err := h.UpdateActiveRelayLog("task-1", "c6ae5afe-c7a3-11e8-a19d-0242ac130006.000004", "mysql-bin.000001") 139 require.NoError(t, err) 140 141 // the only one is the earliest 142 erli = h.EarliestActiveRelayLog() 143 require.NotNil(t, erli) 144 require.Equal(t, "c6ae5afe-c7a3-11e8-a19d-0242ac130006.000004", erli.SubDir) 145 require.Equal(t, "mysql-bin.000001", erli.Filename) 146 147 // update an earlier one 148 err = h.UpdateActiveRelayLog("task-2", "c6ae5afe-c7a3-11e8-a19d-0242ac130006.000002", "mysql-bin.000002") 149 require.NoError(t, err) 150 151 // the earlier one is the earliest 152 erli = h.EarliestActiveRelayLog() 153 require.NotNil(t, erli) 154 require.Equal(t, "c6ae5afe-c7a3-11e8-a19d-0242ac130006.000002", erli.SubDir) 155 require.Equal(t, "mysql-bin.000002", erli.Filename) 156 157 // remove the earlier one 158 h.RemoveActiveRelayLog("task-2") 159 160 // the only one is the earliest 161 erli = h.EarliestActiveRelayLog() 162 require.NotNil(t, erli) 163 require.Equal(t, "c6ae5afe-c7a3-11e8-a19d-0242ac130006.000004", erli.SubDir) 164 require.Equal(t, "mysql-bin.000001", erli.Filename) 165 166 // remove the only one 167 h.RemoveActiveRelayLog("task-1") 168 169 // no earliest 170 erli = h.EarliestActiveRelayLog() 171 require.Nil(t, erli) 172 }