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  }