github.com/pingcap/tiflow@v0.0.0-20240520035814-5bf52d54e205/dm/pkg/conn/basedb_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 conn 15 16 import ( 17 "context" 18 "database/sql" 19 "fmt" 20 "net" 21 "testing" 22 "time" 23 24 "github.com/DATA-DOG/go-sqlmock" 25 "github.com/phayes/freeport" 26 "github.com/pingcap/tiflow/dm/config/dbconfig" 27 tcontext "github.com/pingcap/tiflow/dm/pkg/context" 28 "github.com/stretchr/testify/require" 29 ) 30 31 func TestGetBaseConn(t *testing.T) { 32 db, mock, err := sqlmock.New() 33 require.NoError(t, err) 34 35 baseDB := NewBaseDBForTest(db) 36 37 tctx := tcontext.Background() 38 39 dbConn, err := baseDB.GetBaseConn(tctx.Context()) 40 require.NoError(t, err) 41 require.NotNil(t, dbConn) 42 43 mock.ExpectQuery("select 1").WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow("1")) 44 // nolint:sqlclosecheck,rowserrcheck 45 rows, err := dbConn.QuerySQL(tctx, "select 1") 46 require.NoError(t, err) 47 ids := make([]int, 0, 1) 48 for rows.Next() { 49 var id int 50 err = rows.Scan(&id) 51 require.NoError(t, err) 52 ids = append(ids, id) 53 } 54 require.Equal(t, []int{1}, ids) 55 56 mock.ExpectBegin() 57 mock.ExpectExec("create database test").WillReturnResult(sqlmock.NewResult(1, 1)) 58 mock.ExpectCommit() 59 affected, err := dbConn.ExecuteSQL(tctx, nil, "test", []string{"create database test"}) 60 require.NoError(t, err) 61 require.Equal(t, 1, affected) 62 require.NoError(t, baseDB.Close()) 63 } 64 65 func TestFailDBPing(t *testing.T) { 66 netTimeout = time.Second 67 defer func() { 68 netTimeout = DefaultDBTimeout 69 }() 70 port := freeport.GetPort() 71 addr := fmt.Sprintf("127.0.0.1:%d", port) 72 73 l, err := net.Listen("tcp", addr) 74 require.NoError(t, err) 75 defer l.Close() 76 77 cfg := &dbconfig.DBConfig{User: "root", Host: "127.0.0.1", Port: port} 78 cfg.Adjust() 79 db, err := GetUpstreamDB(cfg) 80 require.Error(t, err) 81 require.Nil(t, db) 82 } 83 84 func TestGetBaseConnWontBlock(t *testing.T) { 85 netTimeout = time.Second 86 defer func() { 87 netTimeout = DefaultDBTimeout 88 }() 89 ctx := context.Background() 90 91 port := freeport.GetPort() 92 addr := fmt.Sprintf("127.0.0.1:%d", port) 93 94 l, err := net.Listen("tcp", addr) 95 require.NoError(t, err) 96 defer l.Close() 97 98 // no such MySQL listening on port, so Conn will block 99 db, err := sql.Open("mysql", "root:@tcp("+addr+")/test") 100 require.NoError(t, err) 101 102 baseDB := NewBaseDBForTest(db) 103 104 _, err = baseDB.GetBaseConn(ctx) 105 require.Error(t, err) 106 }